hardhat 2.19.5 → 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/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/project-creation.d.ts +1 -1
- package/internal/cli/project-creation.js +1 -1
- 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-resolution.d.ts.map +1 -1
- package/internal/core/config/config-resolution.js +8 -0
- package/internal/core/config/config-resolution.js.map +1 -1
- package/internal/core/config/config-validation.d.ts.map +1 -1
- package/internal/core/config/config-validation.js +10 -0
- 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/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/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 +2 -2
- package/internal/solidity/compiler/downloader.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/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/package.json +12 -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/node.ts +8 -4
- package/src/internal/cli/analytics.ts +4 -1
- package/src/internal/cli/project-creation.ts +1 -1
- package/src/internal/constants.ts +1 -0
- package/src/internal/core/config/config-resolution.ts +13 -0
- package/src/internal/core/config/config-validation.ts +19 -0
- 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/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/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/solidity/compiler/downloader.ts +3 -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/hardforks.ts +2 -0
- package/src/internal/util/keccak.ts +2 -2
|
@@ -1,36 +1,38 @@
|
|
|
1
1
|
import { Block, HeaderData } from "@nomicfoundation/ethereumjs-block";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
Common,
|
|
4
|
+
EVMStateManagerInterface,
|
|
5
|
+
} from "@nomicfoundation/ethereumjs-common";
|
|
6
|
+
import { ERROR } from "@nomicfoundation/ethereumjs-evm/dist/cjs/exceptions";
|
|
3
7
|
import {
|
|
4
8
|
AccessListEIP2930Transaction,
|
|
5
9
|
FeeMarketEIP1559Transaction,
|
|
6
|
-
|
|
10
|
+
LegacyTransaction,
|
|
7
11
|
TypedTransaction,
|
|
12
|
+
BlobEIP4844Transaction,
|
|
8
13
|
} from "@nomicfoundation/ethereumjs-tx";
|
|
9
14
|
import {
|
|
10
15
|
Address,
|
|
11
16
|
ECDSASignature,
|
|
12
|
-
|
|
13
|
-
bufferToHex,
|
|
17
|
+
bigIntToBytes,
|
|
18
|
+
bytesToHex as bufferToHex,
|
|
14
19
|
ecsign,
|
|
20
|
+
equalsBytes,
|
|
15
21
|
hashPersonalMessage,
|
|
16
22
|
privateToAddress,
|
|
17
23
|
setLengthLeft,
|
|
18
|
-
|
|
19
|
-
|
|
24
|
+
toBytes,
|
|
25
|
+
bytesToBigInt,
|
|
26
|
+
Account,
|
|
20
27
|
} from "@nomicfoundation/ethereumjs-util";
|
|
21
28
|
import {
|
|
22
29
|
Bloom,
|
|
23
|
-
EEI,
|
|
24
30
|
RunBlockResult,
|
|
25
31
|
RunTxResult,
|
|
26
32
|
VM,
|
|
27
33
|
} from "@nomicfoundation/ethereumjs-vm";
|
|
28
34
|
import { EVM, EVMResult } from "@nomicfoundation/ethereumjs-evm";
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
DefaultStateManager,
|
|
32
|
-
StateManager,
|
|
33
|
-
} from "@nomicfoundation/ethereumjs-statemanager";
|
|
35
|
+
import { DefaultStateManager } from "@nomicfoundation/ethereumjs-statemanager";
|
|
34
36
|
import { SignTypedDataVersion, signTypedData } from "@metamask/eth-sig-util";
|
|
35
37
|
import chalk from "chalk";
|
|
36
38
|
import { randomBytes } from "crypto";
|
|
@@ -132,6 +134,10 @@ import { RandomBufferGenerator } from "./utils/random";
|
|
|
132
134
|
|
|
133
135
|
type ExecResult = EVMResult["execResult"];
|
|
134
136
|
|
|
137
|
+
const BEACON_ROOT_ADDRESS = "0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02";
|
|
138
|
+
const BEACON_ROOT_BYTECODE =
|
|
139
|
+
"0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500";
|
|
140
|
+
|
|
135
141
|
const log = debug("hardhat:core:hardhat-network:node");
|
|
136
142
|
|
|
137
143
|
/* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
|
|
@@ -156,7 +162,7 @@ export class HardhatNode extends EventEmitter {
|
|
|
156
162
|
const allowUnlimitedContractSize =
|
|
157
163
|
config.allowUnlimitedContractSize ?? false;
|
|
158
164
|
|
|
159
|
-
let stateManager:
|
|
165
|
+
let stateManager: EVMStateManagerInterface;
|
|
160
166
|
let blockchain: HardhatBlockchainInterface;
|
|
161
167
|
let initialBlockTimeOffset: bigint | undefined;
|
|
162
168
|
let nextBlockBaseFeePerGas: bigint | undefined;
|
|
@@ -172,6 +178,10 @@ export class HardhatNode extends EventEmitter {
|
|
|
172
178
|
|
|
173
179
|
const hardfork = getHardforkName(config.hardfork);
|
|
174
180
|
const mixHashGenerator = RandomBufferGenerator.create("randomMixHashSeed");
|
|
181
|
+
const parentBeaconBlockRootGenerator = RandomBufferGenerator.create(
|
|
182
|
+
"randomParentBeaconBlockRootSeed"
|
|
183
|
+
);
|
|
184
|
+
|
|
175
185
|
let forkClient: JsonRpcClient | undefined;
|
|
176
186
|
|
|
177
187
|
const common = makeCommon(config);
|
|
@@ -200,6 +210,14 @@ export class HardhatNode extends EventEmitter {
|
|
|
200
210
|
forkBlockNumber
|
|
201
211
|
);
|
|
202
212
|
await forkStateManager.initializeGenesisAccounts(genesisAccounts);
|
|
213
|
+
|
|
214
|
+
if (hardforkGte(hardfork, HardforkName.CANCUN)) {
|
|
215
|
+
await forkStateManager.putContractCode(
|
|
216
|
+
Address.fromString(BEACON_ROOT_ADDRESS),
|
|
217
|
+
Buffer.from(toBytes(BEACON_ROOT_BYTECODE))
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
203
221
|
stateManager = forkStateManager;
|
|
204
222
|
|
|
205
223
|
blockchain = new ForkBlockchain(forkClient, forkBlockNumber, common);
|
|
@@ -236,6 +254,13 @@ export class HardhatNode extends EventEmitter {
|
|
|
236
254
|
trie: stateTrie,
|
|
237
255
|
});
|
|
238
256
|
|
|
257
|
+
if (hardforkGte(hardfork, HardforkName.CANCUN)) {
|
|
258
|
+
await stateManager.putContractCode(
|
|
259
|
+
Address.fromString(BEACON_ROOT_ADDRESS),
|
|
260
|
+
Buffer.from(toBytes(BEACON_ROOT_BYTECODE))
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
239
264
|
const hardhatBlockchain = new HardhatBlockchain(common);
|
|
240
265
|
|
|
241
266
|
const genesisBlockBaseFeePerGas = hardforkGte(
|
|
@@ -250,9 +275,10 @@ export class HardhatNode extends EventEmitter {
|
|
|
250
275
|
hardhatBlockchain,
|
|
251
276
|
common,
|
|
252
277
|
config,
|
|
253
|
-
|
|
278
|
+
await stateManager.getStateRoot(),
|
|
254
279
|
hardfork,
|
|
255
280
|
mixHashGenerator.next(),
|
|
281
|
+
parentBeaconBlockRootGenerator.next(),
|
|
256
282
|
genesisBlockBaseFeePerGas
|
|
257
283
|
);
|
|
258
284
|
|
|
@@ -267,11 +293,12 @@ export class HardhatNode extends EventEmitter {
|
|
|
267
293
|
|
|
268
294
|
const txPool = new TxPool(stateManager, BigInt(blockGasLimit), common);
|
|
269
295
|
|
|
270
|
-
const
|
|
271
|
-
const evm = await EVM.create({
|
|
272
|
-
eei,
|
|
296
|
+
const evm = new EVM({
|
|
273
297
|
allowUnlimitedContractSize,
|
|
298
|
+
allowUnlimitedInitCodeSize: allowUnlimitedContractSize,
|
|
299
|
+
blockchain,
|
|
274
300
|
common,
|
|
301
|
+
stateManager,
|
|
275
302
|
});
|
|
276
303
|
|
|
277
304
|
const vm = await VM.create({
|
|
@@ -282,7 +309,7 @@ export class HardhatNode extends EventEmitter {
|
|
|
282
309
|
blockchain,
|
|
283
310
|
});
|
|
284
311
|
|
|
285
|
-
const instanceId =
|
|
312
|
+
const instanceId = bytesToBigInt(randomBytes(32));
|
|
286
313
|
|
|
287
314
|
const node = new HardhatNode(
|
|
288
315
|
vm,
|
|
@@ -301,6 +328,7 @@ export class HardhatNode extends EventEmitter {
|
|
|
301
328
|
hardfork,
|
|
302
329
|
hardforkActivations,
|
|
303
330
|
mixHashGenerator,
|
|
331
|
+
parentBeaconBlockRootGenerator,
|
|
304
332
|
allowUnlimitedContractSize,
|
|
305
333
|
allowBlocksWithSameTimestamp,
|
|
306
334
|
tracingConfig,
|
|
@@ -339,7 +367,7 @@ The hardfork must be at least spuriousDragon, but ${common.hardfork()} was given
|
|
|
339
367
|
return;
|
|
340
368
|
}
|
|
341
369
|
|
|
342
|
-
upstreamCommon.
|
|
370
|
+
upstreamCommon.setHardforkBy({ blockNumber: forkBlockNumber });
|
|
343
371
|
|
|
344
372
|
if (!upstreamCommon.gteHardfork("spuriousDragon")) {
|
|
345
373
|
throw new InternalError(
|
|
@@ -351,7 +379,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
351
379
|
}
|
|
352
380
|
}
|
|
353
381
|
|
|
354
|
-
private readonly _localAccounts: Map<string,
|
|
382
|
+
private readonly _localAccounts: Map<string, Uint8Array> = new Map(); // address => private key
|
|
355
383
|
private readonly _impersonatedAccounts: Set<string> = new Set(); // address
|
|
356
384
|
|
|
357
385
|
private _nextBlockTimestamp: bigint = 0n;
|
|
@@ -370,12 +398,12 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
370
398
|
private _failedStackTraces = 0;
|
|
371
399
|
|
|
372
400
|
// blockNumber => state root
|
|
373
|
-
private _irregularStatesByBlockNumber: Map<bigint,
|
|
401
|
+
private _irregularStatesByBlockNumber: Map<bigint, Uint8Array> = new Map();
|
|
374
402
|
|
|
375
403
|
private constructor(
|
|
376
404
|
private readonly _vm: VM,
|
|
377
405
|
private readonly _instanceId: bigint,
|
|
378
|
-
private readonly _stateManager:
|
|
406
|
+
private readonly _stateManager: EVMStateManagerInterface,
|
|
379
407
|
private readonly _blockchain: HardhatBlockchainInterface,
|
|
380
408
|
private readonly _txPool: TxPool,
|
|
381
409
|
private _automine: boolean,
|
|
@@ -389,6 +417,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
389
417
|
public readonly hardfork: HardforkName,
|
|
390
418
|
private readonly _hardforkActivations: HardforkHistoryConfig,
|
|
391
419
|
private _mixHashGenerator: RandomBufferGenerator,
|
|
420
|
+
private _parentBeaconBlockRootGenerator: RandomBufferGenerator,
|
|
392
421
|
public readonly allowUnlimitedContractSize: boolean,
|
|
393
422
|
private _allowBlocksWithSameTimestamp: boolean,
|
|
394
423
|
tracingConfig?: TracingConfig,
|
|
@@ -461,20 +490,25 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
461
490
|
if (pk !== undefined) {
|
|
462
491
|
let tx: TypedTransaction;
|
|
463
492
|
|
|
464
|
-
if ("
|
|
493
|
+
if ("blobs" in txParams) {
|
|
494
|
+
tx = BlobEIP4844Transaction.fromTxData(txParams, {
|
|
495
|
+
common: this._vm.common,
|
|
496
|
+
allowUnlimitedInitCodeSize: true,
|
|
497
|
+
});
|
|
498
|
+
} else if ("maxFeePerGas" in txParams) {
|
|
465
499
|
tx = FeeMarketEIP1559Transaction.fromTxData(txParams, {
|
|
466
|
-
common: this._vm.
|
|
467
|
-
|
|
500
|
+
common: this._vm.common,
|
|
501
|
+
allowUnlimitedInitCodeSize: true,
|
|
468
502
|
});
|
|
469
503
|
} else if ("accessList" in txParams) {
|
|
470
504
|
tx = AccessListEIP2930Transaction.fromTxData(txParams, {
|
|
471
|
-
common: this._vm.
|
|
472
|
-
|
|
505
|
+
common: this._vm.common,
|
|
506
|
+
allowUnlimitedInitCodeSize: true,
|
|
473
507
|
});
|
|
474
508
|
} else {
|
|
475
|
-
tx =
|
|
476
|
-
common: this._vm.
|
|
477
|
-
|
|
509
|
+
tx = LegacyTransaction.fromTxData(txParams, {
|
|
510
|
+
common: this._vm.common,
|
|
511
|
+
allowUnlimitedInitCodeSize: true,
|
|
478
512
|
});
|
|
479
513
|
}
|
|
480
514
|
|
|
@@ -696,7 +730,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
696
730
|
this._stateManager.getAccount(address)
|
|
697
731
|
);
|
|
698
732
|
|
|
699
|
-
return account
|
|
733
|
+
return account?.balance ?? 0n;
|
|
700
734
|
}
|
|
701
735
|
|
|
702
736
|
public async getNextConfirmedNonce(
|
|
@@ -707,7 +741,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
707
741
|
this._stateManager.getAccount(address)
|
|
708
742
|
);
|
|
709
743
|
|
|
710
|
-
return account
|
|
744
|
+
return account?.nonce ?? 0n;
|
|
711
745
|
}
|
|
712
746
|
|
|
713
747
|
public async getAccountNextPendingNonce(address: Address): Promise<bigint> {
|
|
@@ -881,10 +915,17 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
881
915
|
positionIndex: bigint,
|
|
882
916
|
blockNumberOrPending: bigint | "pending"
|
|
883
917
|
): Promise<Buffer> {
|
|
884
|
-
const key = setLengthLeft(
|
|
918
|
+
const key = setLengthLeft(bigIntToBytes(positionIndex), 32);
|
|
885
919
|
|
|
886
|
-
const data = await this._runInBlockContext(
|
|
887
|
-
|
|
920
|
+
const data = await this._runInBlockContext(
|
|
921
|
+
blockNumberOrPending,
|
|
922
|
+
async () => {
|
|
923
|
+
const account = await this._stateManager.getAccount(address);
|
|
924
|
+
if (account === undefined) {
|
|
925
|
+
return Uint8Array.from([]);
|
|
926
|
+
}
|
|
927
|
+
return this._stateManager.getContractStorage(address, key);
|
|
928
|
+
}
|
|
888
929
|
);
|
|
889
930
|
|
|
890
931
|
const EXPECTED_DATA_SIZE = 32;
|
|
@@ -895,7 +936,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
895
936
|
);
|
|
896
937
|
}
|
|
897
938
|
|
|
898
|
-
return data;
|
|
939
|
+
return Buffer.from(data);
|
|
899
940
|
}
|
|
900
941
|
|
|
901
942
|
public async getBlockByNumber(pending: "pending"): Promise<Block>;
|
|
@@ -945,7 +986,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
945
986
|
blockNumberOrPending: bigint | "pending"
|
|
946
987
|
): Promise<Buffer> {
|
|
947
988
|
return this._runInBlockContext(blockNumberOrPending, () =>
|
|
948
|
-
this._stateManager.getContractCode(address)
|
|
989
|
+
this._stateManager.getContractCode(address).then(Buffer.from)
|
|
949
990
|
);
|
|
950
991
|
}
|
|
951
992
|
|
|
@@ -1002,9 +1043,9 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1002
1043
|
}
|
|
1003
1044
|
|
|
1004
1045
|
public async getTransactionReceipt(
|
|
1005
|
-
hash:
|
|
1046
|
+
hash: Uint8Array | string
|
|
1006
1047
|
): Promise<RpcReceiptOutput | undefined> {
|
|
1007
|
-
const hashBuffer = hash instanceof Buffer ? hash :
|
|
1048
|
+
const hashBuffer = hash instanceof Buffer ? hash : toBytes(hash);
|
|
1008
1049
|
const receipt = await this._blockchain.getTransactionReceipt(hashBuffer);
|
|
1009
1050
|
return receipt ?? undefined;
|
|
1010
1051
|
}
|
|
@@ -1032,7 +1073,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1032
1073
|
const privateKey = this._getLocalAccountPrivateKey(address);
|
|
1033
1074
|
|
|
1034
1075
|
return signTypedData({
|
|
1035
|
-
privateKey,
|
|
1076
|
+
privateKey: Buffer.from(privateKey),
|
|
1036
1077
|
version: SignTypedDataVersion.V4,
|
|
1037
1078
|
data: typedData,
|
|
1038
1079
|
});
|
|
@@ -1058,6 +1099,8 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1058
1099
|
this.getUserProvidedNextBlockBaseFeePerGas(),
|
|
1059
1100
|
coinbase: this.getCoinbaseAddress().toString(),
|
|
1060
1101
|
mixHashGenerator: this._mixHashGenerator.clone(),
|
|
1102
|
+
parentBeaconBlockRootGenerator:
|
|
1103
|
+
this._parentBeaconBlockRootGenerator.clone(),
|
|
1061
1104
|
};
|
|
1062
1105
|
|
|
1063
1106
|
this._irregularStatesByBlockNumber = new Map(
|
|
@@ -1114,6 +1157,8 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1114
1157
|
this._coinbase = snapshot.coinbase;
|
|
1115
1158
|
|
|
1116
1159
|
this._mixHashGenerator = snapshot.mixHashGenerator;
|
|
1160
|
+
this._parentBeaconBlockRootGenerator =
|
|
1161
|
+
snapshot.parentBeaconBlockRootGenerator;
|
|
1117
1162
|
|
|
1118
1163
|
// We delete this and the following snapshots, as they can only be used
|
|
1119
1164
|
// once in Ganache
|
|
@@ -1331,8 +1376,16 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1331
1376
|
newBalance: bigint
|
|
1332
1377
|
): Promise<void> {
|
|
1333
1378
|
const account = await this._stateManager.getAccount(address);
|
|
1334
|
-
|
|
1335
|
-
await this._stateManager.putAccount(
|
|
1379
|
+
|
|
1380
|
+
await this._stateManager.putAccount(
|
|
1381
|
+
address,
|
|
1382
|
+
Account.fromAccountData({
|
|
1383
|
+
nonce: account?.nonce,
|
|
1384
|
+
balance: newBalance,
|
|
1385
|
+
storageRoot: account?.storageRoot,
|
|
1386
|
+
codeHash: account?.codeHash,
|
|
1387
|
+
})
|
|
1388
|
+
);
|
|
1336
1389
|
await this._persistIrregularWorldState();
|
|
1337
1390
|
}
|
|
1338
1391
|
|
|
@@ -1354,13 +1407,21 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1354
1407
|
);
|
|
1355
1408
|
}
|
|
1356
1409
|
const account = await this._stateManager.getAccount(address);
|
|
1357
|
-
|
|
1410
|
+
const accountNonce = account?.nonce ?? 0n;
|
|
1411
|
+
if (newNonce < accountNonce) {
|
|
1358
1412
|
throw new InvalidInputError(
|
|
1359
|
-
`New nonce (${newNonce.toString()}) must not be smaller than the existing nonce (${
|
|
1413
|
+
`New nonce (${newNonce.toString()}) must not be smaller than the existing nonce (${accountNonce.toString()})`
|
|
1360
1414
|
);
|
|
1361
1415
|
}
|
|
1362
|
-
|
|
1363
|
-
|
|
1416
|
+
await this._stateManager.putAccount(
|
|
1417
|
+
address,
|
|
1418
|
+
Account.fromAccountData({
|
|
1419
|
+
nonce: newNonce,
|
|
1420
|
+
balance: account?.balance,
|
|
1421
|
+
storageRoot: account?.storageRoot,
|
|
1422
|
+
codeHash: account?.codeHash,
|
|
1423
|
+
})
|
|
1424
|
+
);
|
|
1364
1425
|
await this._persistIrregularWorldState();
|
|
1365
1426
|
}
|
|
1366
1427
|
|
|
@@ -1371,7 +1432,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1371
1432
|
) {
|
|
1372
1433
|
await this._stateManager.putContractStorage(
|
|
1373
1434
|
address,
|
|
1374
|
-
setLengthLeft(
|
|
1435
|
+
setLengthLeft(bigIntToBytes(positionIndex), 32),
|
|
1375
1436
|
value
|
|
1376
1437
|
);
|
|
1377
1438
|
await this._persistIrregularWorldState();
|
|
@@ -1427,7 +1488,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1427
1488
|
// to avoid having to distinguish between empty and non-existing accounts.
|
|
1428
1489
|
// We *could* do it during the non-forked mode, but for simplicity we just
|
|
1429
1490
|
// don't support it at all.
|
|
1430
|
-
const isPreSpuriousDragon = !vm.
|
|
1491
|
+
const isPreSpuriousDragon = !vm.common.gteHardfork("spuriousDragon");
|
|
1431
1492
|
if (isPreSpuriousDragon) {
|
|
1432
1493
|
throw new InvalidInputError(
|
|
1433
1494
|
"Tracing is not supported for transactions using hardforks older than Spurious Dragon. "
|
|
@@ -1439,19 +1500,19 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1439
1500
|
const sender = tx.getSenderAddress();
|
|
1440
1501
|
if (tx.type === 0) {
|
|
1441
1502
|
txWithCommon = new FakeSenderTransaction(sender, tx, {
|
|
1442
|
-
common: vm.
|
|
1503
|
+
common: vm.common,
|
|
1443
1504
|
});
|
|
1444
1505
|
} else if (tx.type === 1) {
|
|
1445
1506
|
txWithCommon = new FakeSenderAccessListEIP2930Transaction(
|
|
1446
1507
|
sender,
|
|
1447
1508
|
tx,
|
|
1448
|
-
{ common: vm.
|
|
1509
|
+
{ common: vm.common }
|
|
1449
1510
|
);
|
|
1450
1511
|
} else if (tx.type === 2) {
|
|
1451
1512
|
txWithCommon = new FakeSenderEIP1559Transaction(
|
|
1452
1513
|
sender,
|
|
1453
1514
|
{ ...tx, gasPrice: undefined },
|
|
1454
|
-
{ common: vm.
|
|
1515
|
+
{ common: vm.common }
|
|
1455
1516
|
);
|
|
1456
1517
|
} else {
|
|
1457
1518
|
throw new InternalError(
|
|
@@ -1460,7 +1521,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1460
1521
|
}
|
|
1461
1522
|
|
|
1462
1523
|
const txHash = txWithCommon.hash();
|
|
1463
|
-
if (txHash
|
|
1524
|
+
if (equalsBytes(txHash, hash)) {
|
|
1464
1525
|
const vmDebugTracer = new VMDebugTracer(vm);
|
|
1465
1526
|
return vmDebugTracer.trace(async () => {
|
|
1466
1527
|
await vm.runTx({
|
|
@@ -1826,6 +1887,10 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1826
1887
|
headerData.mixHash = this._getNextMixHash();
|
|
1827
1888
|
}
|
|
1828
1889
|
|
|
1890
|
+
if (this.isPostCancunHardfork()) {
|
|
1891
|
+
headerData.parentBeaconBlockRoot = this._getNextParentBeaconBlockRoot();
|
|
1892
|
+
}
|
|
1893
|
+
|
|
1829
1894
|
headerData.baseFeePerGas = await this.getNextBlockBaseFeePerGas();
|
|
1830
1895
|
|
|
1831
1896
|
const blockBuilder = await this._vm.buildBlock({
|
|
@@ -1895,7 +1960,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1895
1960
|
|
|
1896
1961
|
private _getMinimalTransactionFee(): bigint {
|
|
1897
1962
|
// Typically 21_000 gas
|
|
1898
|
-
return this._vm.
|
|
1963
|
+
return this._vm.common.param("gasPrices", "tx");
|
|
1899
1964
|
}
|
|
1900
1965
|
|
|
1901
1966
|
private async _getFakeTransaction(
|
|
@@ -1909,18 +1974,18 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1909
1974
|
|
|
1910
1975
|
if ("maxFeePerGas" in txParams && txParams.maxFeePerGas !== undefined) {
|
|
1911
1976
|
return new FakeSenderEIP1559Transaction(sender, txParams, {
|
|
1912
|
-
common: this._vm.
|
|
1977
|
+
common: this._vm.common,
|
|
1913
1978
|
});
|
|
1914
1979
|
}
|
|
1915
1980
|
|
|
1916
1981
|
if ("accessList" in txParams && txParams.accessList !== undefined) {
|
|
1917
1982
|
return new FakeSenderAccessListEIP2930Transaction(sender, txParams, {
|
|
1918
|
-
common: this._vm.
|
|
1983
|
+
common: this._vm.common,
|
|
1919
1984
|
});
|
|
1920
1985
|
}
|
|
1921
1986
|
|
|
1922
1987
|
return new FakeSenderTransaction(sender, txParams, {
|
|
1923
|
-
common: this._vm.
|
|
1988
|
+
common: this._vm.common,
|
|
1924
1989
|
});
|
|
1925
1990
|
}
|
|
1926
1991
|
|
|
@@ -1948,7 +2013,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
1948
2013
|
}
|
|
1949
2014
|
|
|
1950
2015
|
private _initLocalAccounts(genesisAccounts: GenesisAccount[]) {
|
|
1951
|
-
const privateKeys = genesisAccounts.map((acc) =>
|
|
2016
|
+
const privateKeys = genesisAccounts.map((acc) => toBytes(acc.privateKey));
|
|
1952
2017
|
for (const pk of privateKeys) {
|
|
1953
2018
|
this._localAccounts.set(bufferToHex(privateToAddress(pk)), pk);
|
|
1954
2019
|
}
|
|
@@ -2110,7 +2175,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2110
2175
|
});
|
|
2111
2176
|
}
|
|
2112
2177
|
|
|
2113
|
-
private _getLocalAccountPrivateKey(sender: Address):
|
|
2178
|
+
private _getLocalAccountPrivateKey(sender: Address): Uint8Array {
|
|
2114
2179
|
const senderAddress = sender.toString();
|
|
2115
2180
|
if (!this._localAccounts.has(senderAddress)) {
|
|
2116
2181
|
throw new InvalidInputError(`unknown account ${senderAddress}`);
|
|
@@ -2130,7 +2195,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2130
2195
|
const receipts = getRpcReceiptOutputsFromLocalBlockExecution(
|
|
2131
2196
|
block,
|
|
2132
2197
|
runBlockResult,
|
|
2133
|
-
shouldShowTransactionTypeForHardfork(this._vm.
|
|
2198
|
+
shouldShowTransactionTypeForHardfork(this._vm.common)
|
|
2134
2199
|
);
|
|
2135
2200
|
|
|
2136
2201
|
this._blockchain.addTransactionReceipts(receipts);
|
|
@@ -2155,7 +2220,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2155
2220
|
getRpcBlock(
|
|
2156
2221
|
block,
|
|
2157
2222
|
td,
|
|
2158
|
-
shouldShowTransactionTypeForHardfork(this._vm.
|
|
2223
|
+
shouldShowTransactionTypeForHardfork(this._vm.common),
|
|
2159
2224
|
false
|
|
2160
2225
|
)
|
|
2161
2226
|
);
|
|
@@ -2257,7 +2322,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2257
2322
|
);
|
|
2258
2323
|
}
|
|
2259
2324
|
|
|
2260
|
-
private async _restoreBlockContext(stateRoot:
|
|
2325
|
+
private async _restoreBlockContext(stateRoot: Uint8Array) {
|
|
2261
2326
|
if (this._stateManager instanceof ForkStateManager) {
|
|
2262
2327
|
return this._stateManager.restoreForkBlockContext(stateRoot);
|
|
2263
2328
|
}
|
|
@@ -2385,7 +2450,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2385
2450
|
for (const [addrToOverride, stateOverrideOptions] of Object.entries(
|
|
2386
2451
|
stateOverrideSet
|
|
2387
2452
|
)) {
|
|
2388
|
-
const address = new Address(
|
|
2453
|
+
const address = new Address(toBytes(addrToOverride));
|
|
2389
2454
|
|
|
2390
2455
|
const { balance, nonce, code, state, stateDiff } = stateOverrideOptions;
|
|
2391
2456
|
|
|
@@ -2451,8 +2516,8 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2451
2516
|
for (const [storageKey, value] of Object.entries(newState)) {
|
|
2452
2517
|
await this._stateManager.putContractStorage(
|
|
2453
2518
|
address,
|
|
2454
|
-
|
|
2455
|
-
setLengthLeft(
|
|
2519
|
+
toBytes(storageKey),
|
|
2520
|
+
setLengthLeft(bigIntToBytes(value), 32)
|
|
2456
2521
|
);
|
|
2457
2522
|
}
|
|
2458
2523
|
}
|
|
@@ -2493,9 +2558,14 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2493
2558
|
// know anything about the txs in the current block
|
|
2494
2559
|
}
|
|
2495
2560
|
|
|
2496
|
-
originalCommon = (this._vm as any).
|
|
2561
|
+
originalCommon = (this._vm as any).common;
|
|
2562
|
+
|
|
2563
|
+
assertTransientStorageCompatibility(
|
|
2564
|
+
this._enableTransientStorage,
|
|
2565
|
+
this._vm.common.hardfork() as HardforkName
|
|
2566
|
+
);
|
|
2497
2567
|
|
|
2498
|
-
(this._vm as any).
|
|
2568
|
+
(this._vm as any).common = Common.custom(
|
|
2499
2569
|
{
|
|
2500
2570
|
chainId:
|
|
2501
2571
|
this._forkBlockNumber === undefined ||
|
|
@@ -2506,7 +2576,6 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2506
2576
|
},
|
|
2507
2577
|
{
|
|
2508
2578
|
hardfork: this._selectHardfork(blockContext.header.number),
|
|
2509
|
-
...this._getTransientStorageSettings(),
|
|
2510
2579
|
}
|
|
2511
2580
|
);
|
|
2512
2581
|
|
|
@@ -2527,7 +2596,32 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2527
2596
|
},
|
|
2528
2597
|
{
|
|
2529
2598
|
freeze: false,
|
|
2530
|
-
common: this._vm.
|
|
2599
|
+
common: this._vm.common,
|
|
2600
|
+
|
|
2601
|
+
skipConsensusFormatValidation: true,
|
|
2602
|
+
}
|
|
2603
|
+
);
|
|
2604
|
+
}
|
|
2605
|
+
|
|
2606
|
+
// If this VM is running without cancun, but the block has cancun fields,
|
|
2607
|
+
// we remove them from the block
|
|
2608
|
+
if (
|
|
2609
|
+
!this.isCancunBlock(blockNumberOrPending) &&
|
|
2610
|
+
blockContext.header.blobGasUsed !== undefined
|
|
2611
|
+
) {
|
|
2612
|
+
blockContext = Block.fromBlockData(
|
|
2613
|
+
{
|
|
2614
|
+
...blockContext,
|
|
2615
|
+
header: {
|
|
2616
|
+
...blockContext.header,
|
|
2617
|
+
blobGasUsed: undefined,
|
|
2618
|
+
excessBlobGas: undefined,
|
|
2619
|
+
parentBeaconBlockRoot: undefined,
|
|
2620
|
+
},
|
|
2621
|
+
},
|
|
2622
|
+
{
|
|
2623
|
+
freeze: false,
|
|
2624
|
+
common: this._vm.common,
|
|
2531
2625
|
|
|
2532
2626
|
skipConsensusFormatValidation: true,
|
|
2533
2627
|
}
|
|
@@ -2553,7 +2647,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2553
2647
|
) {
|
|
2554
2648
|
blockContext = Block.fromBlockData(blockContext, {
|
|
2555
2649
|
freeze: false,
|
|
2556
|
-
common: this._vm.
|
|
2650
|
+
common: this._vm.common,
|
|
2557
2651
|
|
|
2558
2652
|
skipConsensusFormatValidation: true,
|
|
2559
2653
|
});
|
|
@@ -2571,7 +2665,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2571
2665
|
});
|
|
2572
2666
|
} finally {
|
|
2573
2667
|
if (originalCommon !== undefined) {
|
|
2574
|
-
(this._vm as any).
|
|
2668
|
+
(this._vm as any).common = originalCommon;
|
|
2575
2669
|
}
|
|
2576
2670
|
await this._stateManager.setStateRoot(initialStateRoot);
|
|
2577
2671
|
}
|
|
@@ -2636,7 +2730,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2636
2730
|
return this._runInBlockContext(blockNumberOrPending, async () => {
|
|
2637
2731
|
const account = await this._stateManager.getAccount(address);
|
|
2638
2732
|
|
|
2639
|
-
return account
|
|
2733
|
+
return account?.nonce ?? 0n;
|
|
2640
2734
|
});
|
|
2641
2735
|
}
|
|
2642
2736
|
|
|
@@ -2673,12 +2767,12 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2673
2767
|
blockNumberOrPending !== undefined &&
|
|
2674
2768
|
blockNumberOrPending !== "pending"
|
|
2675
2769
|
) {
|
|
2676
|
-
return this._vm.
|
|
2770
|
+
return this._vm.common.hardforkGteHardfork(
|
|
2677
2771
|
this._selectHardfork(blockNumberOrPending),
|
|
2678
2772
|
"london"
|
|
2679
2773
|
);
|
|
2680
2774
|
}
|
|
2681
|
-
return this._vm.
|
|
2775
|
+
return this._vm.common.gteHardfork("london");
|
|
2682
2776
|
}
|
|
2683
2777
|
|
|
2684
2778
|
public isEip4895Active(blockNumberOrPending?: bigint | "pending"): boolean {
|
|
@@ -2686,18 +2780,35 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2686
2780
|
blockNumberOrPending !== undefined &&
|
|
2687
2781
|
blockNumberOrPending !== "pending"
|
|
2688
2782
|
) {
|
|
2689
|
-
return this._vm.
|
|
2783
|
+
return this._vm.common.hardforkGteHardfork(
|
|
2690
2784
|
this._selectHardfork(blockNumberOrPending),
|
|
2691
2785
|
"shanghai"
|
|
2692
2786
|
);
|
|
2693
2787
|
}
|
|
2694
|
-
return this._vm.
|
|
2788
|
+
return this._vm.common.gteHardfork("shanghai");
|
|
2789
|
+
}
|
|
2790
|
+
|
|
2791
|
+
public isCancunBlock(blockNumberOrPending?: bigint | "pending"): boolean {
|
|
2792
|
+
if (
|
|
2793
|
+
blockNumberOrPending !== undefined &&
|
|
2794
|
+
blockNumberOrPending !== "pending"
|
|
2795
|
+
) {
|
|
2796
|
+
return this._vm.common.hardforkGteHardfork(
|
|
2797
|
+
this._selectHardfork(blockNumberOrPending),
|
|
2798
|
+
"cancun"
|
|
2799
|
+
);
|
|
2800
|
+
}
|
|
2801
|
+
return this._vm.common.gteHardfork("cancun");
|
|
2695
2802
|
}
|
|
2696
2803
|
|
|
2697
2804
|
public isPostMergeHardfork(): boolean {
|
|
2698
2805
|
return hardforkGte(this.hardfork, HardforkName.MERGE);
|
|
2699
2806
|
}
|
|
2700
2807
|
|
|
2808
|
+
public isPostCancunHardfork(): boolean {
|
|
2809
|
+
return hardforkGte(this.hardfork, HardforkName.CANCUN);
|
|
2810
|
+
}
|
|
2811
|
+
|
|
2701
2812
|
public setPrevRandao(prevRandao: Buffer): void {
|
|
2702
2813
|
this._mixHashGenerator.setNext(prevRandao);
|
|
2703
2814
|
}
|
|
@@ -2716,7 +2827,9 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2716
2827
|
|
|
2717
2828
|
const latestBlock = await this.getLatestBlock();
|
|
2718
2829
|
|
|
2719
|
-
const latestBlockHashHex = latestBlock.header.hash().toString(
|
|
2830
|
+
const latestBlockHashHex = Buffer.from(latestBlock.header.hash()).toString(
|
|
2831
|
+
"hex"
|
|
2832
|
+
);
|
|
2720
2833
|
const latestBlockHash = `0x${latestBlockHashHex}`;
|
|
2721
2834
|
|
|
2722
2835
|
const metadata: HardhatMetadata = {
|
|
@@ -2747,10 +2860,14 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2747
2860
|
return metadata;
|
|
2748
2861
|
}
|
|
2749
2862
|
|
|
2750
|
-
private _getNextMixHash():
|
|
2863
|
+
private _getNextMixHash(): Uint8Array {
|
|
2751
2864
|
return this._mixHashGenerator.next();
|
|
2752
2865
|
}
|
|
2753
2866
|
|
|
2867
|
+
private _getNextParentBeaconBlockRoot(): Uint8Array {
|
|
2868
|
+
return this._parentBeaconBlockRootGenerator.next();
|
|
2869
|
+
}
|
|
2870
|
+
|
|
2754
2871
|
private async _getEstimateGasFeePriceFields(
|
|
2755
2872
|
callParams: CallParams,
|
|
2756
2873
|
blockNumberOrPending: bigint | "pending"
|
|
@@ -2796,7 +2913,7 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2796
2913
|
this._forkBlockNumber === undefined ||
|
|
2797
2914
|
blockNumber >= this._forkBlockNumber
|
|
2798
2915
|
) {
|
|
2799
|
-
return this._vm.
|
|
2916
|
+
return this._vm.common.hardfork() as HardforkName;
|
|
2800
2917
|
}
|
|
2801
2918
|
|
|
2802
2919
|
if (this._hardforkActivations.size === 0) {
|
|
@@ -2835,10 +2952,15 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2835
2952
|
);
|
|
2836
2953
|
}
|
|
2837
2954
|
|
|
2838
|
-
return hardfork;
|
|
2955
|
+
return hardfork === "merge" ? "mergeForkIdTransition" : hardfork;
|
|
2839
2956
|
}
|
|
2840
2957
|
|
|
2841
2958
|
private _getCommonForTracing(networkId: number, blockNumber: bigint): Common {
|
|
2959
|
+
assertTransientStorageCompatibility(
|
|
2960
|
+
this._enableTransientStorage,
|
|
2961
|
+
this._vm.common.hardfork() as HardforkName
|
|
2962
|
+
);
|
|
2963
|
+
|
|
2842
2964
|
try {
|
|
2843
2965
|
const common = Common.custom(
|
|
2844
2966
|
{
|
|
@@ -2847,7 +2969,6 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2847
2969
|
},
|
|
2848
2970
|
{
|
|
2849
2971
|
hardfork: this._selectHardfork(BigInt(blockNumber)),
|
|
2850
|
-
...this._getTransientStorageSettings(),
|
|
2851
2972
|
}
|
|
2852
2973
|
);
|
|
2853
2974
|
|
|
@@ -2858,12 +2979,15 @@ Hardhat Network's forking functionality only works with blocks from at least spu
|
|
|
2858
2979
|
);
|
|
2859
2980
|
}
|
|
2860
2981
|
}
|
|
2982
|
+
}
|
|
2861
2983
|
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2984
|
+
export function assertTransientStorageCompatibility(
|
|
2985
|
+
enableTransientStorage: boolean,
|
|
2986
|
+
hardfork: HardforkName
|
|
2987
|
+
) {
|
|
2988
|
+
if (enableTransientStorage && !hardforkGte(hardfork, HardforkName.CANCUN)) {
|
|
2989
|
+
throw new InternalError(
|
|
2990
|
+
`Transient storage is not compatible with hardfork "${hardfork}". To use transient storage, set the hardfork to "cancun" or later.`
|
|
2991
|
+
);
|
|
2868
2992
|
}
|
|
2869
2993
|
}
|