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,4 +1,5 @@
|
|
|
1
|
-
import { ERROR } from "@nomicfoundation/ethereumjs-evm/dist/exceptions";
|
|
1
|
+
import { ERROR } from "@nomicfoundation/ethereumjs-evm/dist/cjs/exceptions";
|
|
2
|
+
import { equalsBytes } from "@nomicfoundation/ethereumjs-util";
|
|
2
3
|
import { ReturnData } from "../provider/return-data";
|
|
3
4
|
|
|
4
5
|
import {
|
|
@@ -80,7 +81,7 @@ export class SolidityTracer {
|
|
|
80
81
|
// reverts if a call fails, and most contracts are in solidity
|
|
81
82
|
if (
|
|
82
83
|
subtrace.error !== undefined &&
|
|
83
|
-
trace.returnData
|
|
84
|
+
equalsBytes(trace.returnData, subtrace.returnData)
|
|
84
85
|
) {
|
|
85
86
|
let unrecognizedEntry: SolidityStackTraceEntry;
|
|
86
87
|
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
import { Journal } from "@nomicfoundation/ethereumjs-evm/dist/cjs/journal";
|
|
1
2
|
import { TypedTransaction } from "@nomicfoundation/ethereumjs-tx";
|
|
2
3
|
import { AfterTxEvent, VM } from "@nomicfoundation/ethereumjs-vm";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
EVMResult,
|
|
6
|
+
InterpreterStep,
|
|
7
|
+
Message,
|
|
8
|
+
} from "@nomicfoundation/ethereumjs-evm";
|
|
6
9
|
import {
|
|
7
10
|
Address,
|
|
8
|
-
|
|
11
|
+
bytesToBigInt,
|
|
9
12
|
setLengthLeft,
|
|
10
|
-
|
|
13
|
+
toBytes,
|
|
11
14
|
} from "@nomicfoundation/ethereumjs-util";
|
|
12
15
|
|
|
13
16
|
import { assertHardhatInvariant } from "../../core/errors";
|
|
@@ -232,7 +235,7 @@ export class VMDebugTracer {
|
|
|
232
235
|
this._lastTrace = {
|
|
233
236
|
gas: Number(result.totalGasSpent),
|
|
234
237
|
failed: result.execResult.exceptionError !== undefined,
|
|
235
|
-
returnValue: result.execResult.returnValue.toString("hex"),
|
|
238
|
+
returnValue: Buffer.from(result.execResult.returnValue).toString("hex"),
|
|
236
239
|
structLogs: rpcStructLogs,
|
|
237
240
|
};
|
|
238
241
|
|
|
@@ -339,7 +342,7 @@ export class VMDebugTracer {
|
|
|
339
342
|
|
|
340
343
|
let gasCost = step.opcode.fee;
|
|
341
344
|
|
|
342
|
-
let op = step.opcode.name;
|
|
345
|
+
let op = step.opcode.name === "KECCAK256" ? "SHA3" : step.opcode.name;
|
|
343
346
|
let error: object | undefined;
|
|
344
347
|
|
|
345
348
|
const storage: Storage = {};
|
|
@@ -347,7 +350,7 @@ export class VMDebugTracer {
|
|
|
347
350
|
if (step.opcode.name === "SLOAD") {
|
|
348
351
|
const address = step.address;
|
|
349
352
|
const [keyBuffer] = this._getFromStack(stack, 1);
|
|
350
|
-
const key:
|
|
353
|
+
const key: Uint8Array = setLengthLeft(keyBuffer, 32);
|
|
351
354
|
|
|
352
355
|
const storageValue = await this._getContractStorage(address, key);
|
|
353
356
|
|
|
@@ -360,8 +363,8 @@ export class VMDebugTracer {
|
|
|
360
363
|
storage[key] = storageValue;
|
|
361
364
|
} else if (step.opcode.name === "REVERT") {
|
|
362
365
|
const [offsetBuffer, lengthBuffer] = this._getFromStack(stack, 2);
|
|
363
|
-
const length =
|
|
364
|
-
const offset =
|
|
366
|
+
const length = bytesToBigInt(lengthBuffer);
|
|
367
|
+
const offset = bytesToBigInt(offsetBuffer);
|
|
365
368
|
|
|
366
369
|
const [gasIncrease, addedWords] = this._memoryExpansion(
|
|
367
370
|
BigInt(memory.length),
|
|
@@ -375,7 +378,7 @@ export class VMDebugTracer {
|
|
|
375
378
|
}
|
|
376
379
|
} else if (step.opcode.name === "CREATE2") {
|
|
377
380
|
const [, , memoryUsedBuffer] = this._getFromStack(stack, 3);
|
|
378
|
-
const memoryUsed =
|
|
381
|
+
const memoryUsed = bytesToBigInt(memoryUsedBuffer);
|
|
379
382
|
const sha3ExtraCost =
|
|
380
383
|
BigIntUtils.divUp(memoryUsed, 32n) * this._sha3WordGas();
|
|
381
384
|
gasCost += Number(sha3ExtraCost);
|
|
@@ -387,7 +390,7 @@ export class VMDebugTracer {
|
|
|
387
390
|
// this is a port of what geth does to compute the
|
|
388
391
|
// gasCost of a *CALL step, with some simplifications
|
|
389
392
|
// because we don't support pre-spuriousDragon hardforks
|
|
390
|
-
let valueBuffer =
|
|
393
|
+
let valueBuffer = Uint8Array.from([]);
|
|
391
394
|
let [
|
|
392
395
|
callCostBuffer,
|
|
393
396
|
recipientAddressBuffer,
|
|
@@ -410,16 +413,16 @@ export class VMDebugTracer {
|
|
|
410
413
|
] = this._getFromStack(stack, 7);
|
|
411
414
|
}
|
|
412
415
|
|
|
413
|
-
const callCost =
|
|
416
|
+
const callCost = bytesToBigInt(callCostBuffer);
|
|
414
417
|
|
|
415
|
-
const value =
|
|
418
|
+
const value = bytesToBigInt(valueBuffer);
|
|
416
419
|
|
|
417
420
|
const memoryLength = BigInt(memory.length);
|
|
418
|
-
const inBN =
|
|
419
|
-
const inSizeBN =
|
|
421
|
+
const inBN = bytesToBigInt(inBuffer);
|
|
422
|
+
const inSizeBN = bytesToBigInt(inSizeBuffer);
|
|
420
423
|
const inPosition = inSizeBN === 0n ? inSizeBN : inBN + inSizeBN;
|
|
421
|
-
const outBN =
|
|
422
|
-
const outSizeBN =
|
|
424
|
+
const outBN = bytesToBigInt(outBuffer);
|
|
425
|
+
const outSizeBN = bytesToBigInt(outSizeBuffer);
|
|
423
426
|
const outPosition = outSizeBN === 0n ? outSizeBN : outBN + outSizeBN;
|
|
424
427
|
const memSize = inPosition > outPosition ? inPosition : outPosition;
|
|
425
428
|
const toAddress = new Address(recipientAddressBuffer.slice(-20));
|
|
@@ -473,42 +476,46 @@ export class VMDebugTracer {
|
|
|
473
476
|
}
|
|
474
477
|
|
|
475
478
|
private _memoryGas(): bigint {
|
|
476
|
-
return this._vm.
|
|
479
|
+
return this._vm.common.param("gasPrices", "memory");
|
|
477
480
|
}
|
|
478
481
|
|
|
479
482
|
private _sha3WordGas(): bigint {
|
|
480
|
-
return this._vm.
|
|
483
|
+
return this._vm.common.param("gasPrices", "sha3Word");
|
|
481
484
|
}
|
|
482
485
|
|
|
483
486
|
private _callConstantGas(): bigint {
|
|
484
|
-
if (this._vm.
|
|
485
|
-
return this._vm.
|
|
487
|
+
if (this._vm.common.gteHardfork("berlin")) {
|
|
488
|
+
return this._vm.common.param("gasPrices", "warmstorageread");
|
|
486
489
|
}
|
|
487
490
|
|
|
488
|
-
return this._vm.
|
|
491
|
+
return this._vm.common.param("gasPrices", "call");
|
|
489
492
|
}
|
|
490
493
|
|
|
491
494
|
private _callNewAccountGas(): bigint {
|
|
492
|
-
return this._vm.
|
|
495
|
+
return this._vm.common.param("gasPrices", "callNewAccount");
|
|
493
496
|
}
|
|
494
497
|
|
|
495
498
|
private _callValueTransferGas(): bigint {
|
|
496
|
-
return this._vm.
|
|
499
|
+
return this._vm.common.param("gasPrices", "callValueTransfer");
|
|
497
500
|
}
|
|
498
501
|
|
|
499
502
|
private _quadCoeffDiv(): bigint {
|
|
500
|
-
return this._vm.
|
|
503
|
+
return this._vm.common.param("gasPrices", "quadCoeffDiv");
|
|
501
504
|
}
|
|
502
505
|
|
|
503
|
-
private _isAddressEmpty(address: Address): Promise<boolean> {
|
|
504
|
-
|
|
506
|
+
private async _isAddressEmpty(address: Address): Promise<boolean> {
|
|
507
|
+
const account = await this._vm.stateManager.getAccount(address);
|
|
508
|
+
return account?.isEmpty() ?? true;
|
|
505
509
|
}
|
|
506
510
|
|
|
507
|
-
private _getContractStorage(
|
|
511
|
+
private _getContractStorage(
|
|
512
|
+
address: Address,
|
|
513
|
+
key: Uint8Array
|
|
514
|
+
): Promise<Uint8Array> {
|
|
508
515
|
return this._vm.stateManager.getContractStorage(address, key);
|
|
509
516
|
}
|
|
510
517
|
|
|
511
|
-
private _getContractCode(address: Address): Promise<
|
|
518
|
+
private _getContractCode(address: Address): Promise<Uint8Array> {
|
|
512
519
|
return this._vm.stateManager.getContractCode(address);
|
|
513
520
|
}
|
|
514
521
|
|
|
@@ -520,12 +527,16 @@ export class VMDebugTracer {
|
|
|
520
527
|
callCost: bigint
|
|
521
528
|
): Promise<bigint> {
|
|
522
529
|
// The available gas is reduced when the address is cold
|
|
523
|
-
if (this._vm.
|
|
524
|
-
const
|
|
530
|
+
if (this._vm.common.gteHardfork("berlin")) {
|
|
531
|
+
const journal = this._vm.evm.journal;
|
|
532
|
+
if (!(journal instanceof Journal)) {
|
|
533
|
+
throw new Error("evm.journal is not an instance of Journal");
|
|
534
|
+
}
|
|
535
|
+
const isWarmed = journal.isWarmedAddress(address.toBytes());
|
|
525
536
|
|
|
526
537
|
const coldCost =
|
|
527
|
-
this._vm.
|
|
528
|
-
this._vm.
|
|
538
|
+
this._vm.common.param("gasPrices", "coldaccountaccess") -
|
|
539
|
+
this._vm.common.param("gasPrices", "warmstorageread");
|
|
529
540
|
|
|
530
541
|
// This comment is copied verbatim from geth:
|
|
531
542
|
// The WarmStorageReadCostEIP2929 (100) is already deducted in the form of a constant cost, so
|
|
@@ -596,12 +607,12 @@ export class VMDebugTracer {
|
|
|
596
607
|
return [0n, 0n];
|
|
597
608
|
}
|
|
598
609
|
|
|
599
|
-
private _getFromStack(stack: string[], count: number):
|
|
610
|
+
private _getFromStack(stack: string[], count: number): Uint8Array[] {
|
|
600
611
|
return stack
|
|
601
612
|
.slice(-count)
|
|
602
613
|
.reverse()
|
|
603
614
|
.map((value) => `0x${value}`)
|
|
604
|
-
.map(
|
|
615
|
+
.map(toBytes);
|
|
605
616
|
}
|
|
606
617
|
|
|
607
618
|
private _memoryFee(words: bigint): bigint {
|
|
@@ -614,6 +625,6 @@ export class VMDebugTracer {
|
|
|
614
625
|
}
|
|
615
626
|
}
|
|
616
627
|
|
|
617
|
-
function toWord(b:
|
|
618
|
-
return b.toString("hex").padStart(64, "0");
|
|
628
|
+
function toWord(b: Uint8Array): string {
|
|
629
|
+
return Buffer.from(b).toString("hex").padStart(64, "0");
|
|
619
630
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EVMResult,
|
|
3
3
|
getActivePrecompiles,
|
|
4
|
+
InterpreterStep,
|
|
5
|
+
Message,
|
|
4
6
|
} from "@nomicfoundation/ethereumjs-evm";
|
|
5
|
-
import {
|
|
6
|
-
import { Message } from "@nomicfoundation/ethereumjs-evm/dist/message";
|
|
7
|
-
import { Address, bufferToBigInt } from "@nomicfoundation/ethereumjs-util";
|
|
7
|
+
import { Address, bytesToBigInt } from "@nomicfoundation/ethereumjs-util";
|
|
8
8
|
import { VM } from "@nomicfoundation/ethereumjs-vm";
|
|
9
9
|
import { assertHardhatInvariant } from "../../core/errors";
|
|
10
10
|
|
|
@@ -19,18 +19,20 @@ import {
|
|
|
19
19
|
|
|
20
20
|
/* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
|
|
21
21
|
|
|
22
|
-
const DUMMY_RETURN_DATA =
|
|
22
|
+
const DUMMY_RETURN_DATA = Uint8Array.from([]);
|
|
23
23
|
const DUMMY_GAS_USED = 0n;
|
|
24
24
|
|
|
25
25
|
export class VMTracer {
|
|
26
26
|
private _messageTraces: MessageTrace[] = [];
|
|
27
27
|
private _enabled = false;
|
|
28
28
|
private _lastError: Error | undefined;
|
|
29
|
-
private _maxPrecompileNumber = getActivePrecompiles(this._vm.
|
|
29
|
+
private _maxPrecompileNumber = getActivePrecompiles(this._vm.common).size;
|
|
30
30
|
|
|
31
31
|
constructor(
|
|
32
32
|
private readonly _vm: VM,
|
|
33
|
-
private readonly _getContractCode: (
|
|
33
|
+
private readonly _getContractCode: (
|
|
34
|
+
address: Address
|
|
35
|
+
) => Promise<Uint8Array>,
|
|
34
36
|
private readonly _throwErrors = true
|
|
35
37
|
) {
|
|
36
38
|
this._beforeMessageHandler = this._beforeMessageHandler.bind(this);
|
|
@@ -114,7 +116,7 @@ export class VMTracer {
|
|
|
114
116
|
|
|
115
117
|
if (message.to === undefined) {
|
|
116
118
|
const createTrace: CreateMessageTrace = {
|
|
117
|
-
code: message.data,
|
|
119
|
+
code: new Uint8Array(message.data),
|
|
118
120
|
steps: [],
|
|
119
121
|
value: message.value,
|
|
120
122
|
returnData: DUMMY_RETURN_DATA,
|
|
@@ -126,12 +128,12 @@ export class VMTracer {
|
|
|
126
128
|
|
|
127
129
|
trace = createTrace;
|
|
128
130
|
} else {
|
|
129
|
-
const toAsBigInt =
|
|
131
|
+
const toAsBigInt = bytesToBigInt(message.to.toBytes());
|
|
130
132
|
|
|
131
133
|
if (toAsBigInt > 0 && toAsBigInt <= this._maxPrecompileNumber) {
|
|
132
134
|
const precompileTrace: PrecompileMessageTrace = {
|
|
133
135
|
precompile: Number(toAsBigInt),
|
|
134
|
-
calldata: message.data,
|
|
136
|
+
calldata: new Uint8Array(message.data),
|
|
135
137
|
value: message.value,
|
|
136
138
|
returnData: DUMMY_RETURN_DATA,
|
|
137
139
|
depth: message.depth,
|
|
@@ -146,15 +148,15 @@ export class VMTracer {
|
|
|
146
148
|
|
|
147
149
|
const callTrace: CallMessageTrace = {
|
|
148
150
|
code,
|
|
149
|
-
calldata: message.data,
|
|
151
|
+
calldata: new Uint8Array(message.data),
|
|
150
152
|
steps: [],
|
|
151
153
|
value: message.value,
|
|
152
154
|
returnData: DUMMY_RETURN_DATA,
|
|
153
|
-
address: message.to.
|
|
155
|
+
address: message.to.toBytes(),
|
|
154
156
|
numberOfSubtraces: 0,
|
|
155
157
|
depth: message.depth,
|
|
156
158
|
gasUsed: DUMMY_GAS_USED,
|
|
157
|
-
codeAddress: codeAddress.
|
|
159
|
+
codeAddress: codeAddress.toBytes(),
|
|
158
160
|
};
|
|
159
161
|
|
|
160
162
|
trace = callTrace;
|
|
@@ -227,7 +229,7 @@ export class VMTracer {
|
|
|
227
229
|
trace.gasUsed = result.execResult.executionGasUsed;
|
|
228
230
|
|
|
229
231
|
if (isCreateTrace(trace)) {
|
|
230
|
-
trace.deployedContract = result?.createdAddress?.
|
|
232
|
+
trace.deployedContract = result?.createdAddress?.toBytes();
|
|
231
233
|
}
|
|
232
234
|
|
|
233
235
|
if (this._messageTraces.length > 1) {
|
|
@@ -316,13 +316,14 @@ export class CompilerDownloader implements ICompilerDownloader {
|
|
|
316
316
|
build: CompilerBuild,
|
|
317
317
|
downloadPath: string
|
|
318
318
|
): Promise<boolean> {
|
|
319
|
-
const
|
|
319
|
+
const { bytesToHex } =
|
|
320
|
+
require("@nomicfoundation/ethereumjs-util") as typeof import("@nomicfoundation/ethereumjs-util");
|
|
320
321
|
const { keccak256 } = await import("../../util/keccak");
|
|
321
322
|
|
|
322
323
|
const expectedKeccak256 = build.keccak256;
|
|
323
324
|
const compiler = await fsExtra.readFile(downloadPath);
|
|
324
325
|
|
|
325
|
-
const compilerKeccak256 =
|
|
326
|
+
const compilerKeccak256 = bytesToHex(keccak256(compiler));
|
|
326
327
|
|
|
327
328
|
if (expectedKeccak256 !== compilerKeccak256) {
|
|
328
329
|
await fsExtra.unlink(downloadPath);
|
|
@@ -10,7 +10,7 @@ export class AbiHelpers {
|
|
|
10
10
|
public static computeSelector(
|
|
11
11
|
name: string,
|
|
12
12
|
inputs: any[]
|
|
13
|
-
):
|
|
13
|
+
): Uint8Array | undefined {
|
|
14
14
|
try {
|
|
15
15
|
const fragment = abi.FunctionFragment.from({
|
|
16
16
|
type: "function",
|
|
@@ -26,7 +26,7 @@ export class AbiHelpers {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
public static isValidCalldata(inputs: any[], calldata:
|
|
29
|
+
public static isValidCalldata(inputs: any[], calldata: Uint8Array): boolean {
|
|
30
30
|
try {
|
|
31
31
|
abi.defaultAbiCoder.decode(inputs, calldata);
|
|
32
32
|
return true;
|
|
@@ -34,13 +34,13 @@ export function toEvmWord(x: bigint | number): string {
|
|
|
34
34
|
return x.toString(16).padStart(64, "0");
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
function bufferToBigInt(x:
|
|
38
|
-
const hex = `0x${x.toString("hex")}`;
|
|
37
|
+
function bufferToBigInt(x: Uint8Array): bigint {
|
|
38
|
+
const hex = `0x${Buffer.from(x).toString("hex")}`;
|
|
39
39
|
return hex === "0x" ? 0n : BigInt(hex);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
export function fromBigIntLike(
|
|
43
|
-
x: string | number | bigint |
|
|
43
|
+
x: string | number | bigint | Uint8Array | undefined
|
|
44
44
|
): bigint | undefined {
|
|
45
45
|
if (x === undefined || typeof x === "bigint") {
|
|
46
46
|
return x;
|
|
@@ -48,7 +48,7 @@ export function fromBigIntLike(
|
|
|
48
48
|
if (typeof x === "number" || typeof x === "string") {
|
|
49
49
|
return BigInt(x);
|
|
50
50
|
}
|
|
51
|
-
if (
|
|
51
|
+
if (x instanceof Uint8Array) {
|
|
52
52
|
return bufferToBigInt(x);
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -17,6 +17,7 @@ export enum HardforkName {
|
|
|
17
17
|
GRAY_GLACIER = "grayGlacier",
|
|
18
18
|
MERGE = "merge",
|
|
19
19
|
SHANGHAI = "shanghai",
|
|
20
|
+
CANCUN = "cancun",
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
const HARDFORKS_ORDER: HardforkName[] = [
|
|
@@ -36,6 +37,7 @@ const HARDFORKS_ORDER: HardforkName[] = [
|
|
|
36
37
|
HardforkName.GRAY_GLACIER,
|
|
37
38
|
HardforkName.MERGE,
|
|
38
39
|
HardforkName.SHANGHAI,
|
|
40
|
+
HardforkName.CANCUN,
|
|
39
41
|
];
|
|
40
42
|
|
|
41
43
|
export function getHardforkName(name: string): HardforkName {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import createKeccakHash from "keccak";
|
|
2
2
|
|
|
3
|
-
export function keccak256(data:
|
|
4
|
-
return createKeccakHash("keccak256").update(data).digest();
|
|
3
|
+
export function keccak256(data: Uint8Array): Uint8Array {
|
|
4
|
+
return createKeccakHash("keccak256").update(Buffer.from(data)).digest();
|
|
5
5
|
}
|