hardhat 2.20.0 → 2.21.0-dev.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/internal/core/jsonrpc/types/input/blockTag.d.ts +3 -3
- package/internal/core/jsonrpc/types/input/filterRequest.d.ts +6 -6
- package/internal/core/providers/construction.d.ts.map +1 -1
- package/internal/core/providers/construction.js +28 -4
- package/internal/core/providers/construction.js.map +1 -1
- package/internal/core/providers/http.d.ts +2 -0
- package/internal/core/providers/http.d.ts.map +1 -1
- package/internal/core/providers/http.js +2 -1
- package/internal/core/providers/http.js.map +1 -1
- package/internal/core/runtime-environment.d.ts.map +1 -1
- package/internal/core/runtime-environment.js.map +1 -1
- package/internal/hardhat-network/jsonrpc/client.d.ts +0 -2
- package/internal/hardhat-network/jsonrpc/client.d.ts.map +1 -1
- package/internal/hardhat-network/jsonrpc/client.js +0 -16
- package/internal/hardhat-network/jsonrpc/client.js.map +1 -1
- package/internal/hardhat-network/jsonrpc/handler.js +9 -1
- package/internal/hardhat-network/jsonrpc/handler.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 +0 -7
- package/internal/hardhat-network/provider/HardhatBlockchain.d.ts.map +1 -1
- package/internal/hardhat-network/provider/HardhatBlockchain.js +2 -14
- package/internal/hardhat-network/provider/HardhatBlockchain.js.map +1 -1
- package/internal/hardhat-network/provider/TxPool.d.ts +3 -2
- 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 +6 -5
- 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 +0 -7
- package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkBlockchain.js +4 -21
- package/internal/hardhat-network/provider/fork/ForkBlockchain.js.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts +13 -19
- package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkStateManager.js +61 -59
- 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 +0 -3
- 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/fork/rpcToTxData.js +1 -1
- package/internal/hardhat-network/provider/fork/rpcToTxData.js.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 +9 -16
- package/internal/hardhat-network/provider/modules/eth.js.map +1 -1
- package/internal/hardhat-network/provider/modules/logger.d.ts +6 -84
- package/internal/hardhat-network/provider/modules/logger.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/logger.js +3 -530
- package/internal/hardhat-network/provider/modules/logger.js.map +1 -1
- package/internal/hardhat-network/provider/node-types.d.ts +2 -65
- package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
- package/internal/hardhat-network/provider/node-types.js +0 -5
- package/internal/hardhat-network/provider/node-types.js.map +1 -1
- package/internal/hardhat-network/provider/node.d.ts +2 -6
- package/internal/hardhat-network/provider/node.d.ts.map +1 -1
- package/internal/hardhat-network/provider/node.js +79 -148
- package/internal/hardhat-network/provider/node.js.map +1 -1
- package/internal/hardhat-network/provider/output.d.ts +0 -14
- package/internal/hardhat-network/provider/output.d.ts.map +1 -1
- package/internal/hardhat-network/provider/output.js +0 -264
- package/internal/hardhat-network/provider/output.js.map +1 -1
- package/internal/hardhat-network/provider/provider.d.ts +26 -25
- package/internal/hardhat-network/provider/provider.d.ts.map +1 -1
- package/internal/hardhat-network/provider/provider.js +342 -186
- package/internal/hardhat-network/provider/provider.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts +10 -8
- 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 +10 -8
- 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 +10 -9
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +7 -6
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts +6 -5
- 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 +5 -4
- 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 +8 -7
- 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 +8 -7
- 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 +5 -4
- package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/convertToEdr.d.ts +14 -0
- package/internal/hardhat-network/provider/utils/convertToEdr.d.ts.map +1 -0
- package/internal/hardhat-network/provider/utils/convertToEdr.js +191 -0
- package/internal/hardhat-network/provider/utils/convertToEdr.js.map +1 -0
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.d.ts +0 -1
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.js +1 -5
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeCommon.d.ts +1 -1
- package/internal/hardhat-network/provider/utils/makeCommon.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeCommon.js +1 -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 +1 -15
- package/internal/hardhat-network/provider/utils/makeFakeSignature.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeForkClient.d.ts +10 -1
- package/internal/hardhat-network/provider/utils/makeForkClient.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeForkClient.js +38 -18
- package/internal/hardhat-network/provider/utils/makeForkClient.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 +3 -1
- package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/putGenesisBlock.js +2 -6
- package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
- package/internal/hardhat-network/provider/utils/random.d.ts +1 -0
- package/internal/hardhat-network/provider/utils/random.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/random.js +7 -1
- package/internal/hardhat-network/provider/utils/random.js.map +1 -1
- package/internal/hardhat-network/provider/utils/reorgs-protection.d.ts +1 -1
- package/internal/hardhat-network/provider/utils/reorgs-protection.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/reorgs-protection.js +5 -5
- package/internal/hardhat-network/provider/utils/reorgs-protection.js.map +1 -1
- package/internal/hardhat-network/provider/vm/exit.d.ts +22 -0
- package/internal/hardhat-network/provider/vm/exit.d.ts.map +1 -0
- package/internal/hardhat-network/provider/vm/exit.js +93 -0
- package/internal/hardhat-network/provider/vm/exit.js.map +1 -0
- package/internal/hardhat-network/provider/vm/minimal-vm.d.ts +29 -0
- package/internal/hardhat-network/provider/vm/minimal-vm.d.ts.map +1 -0
- package/internal/hardhat-network/provider/vm/minimal-vm.js +46 -0
- package/internal/hardhat-network/provider/vm/minimal-vm.js.map +1 -0
- package/internal/hardhat-network/provider/vm/proxy-vm.d.ts +36 -0
- package/internal/hardhat-network/provider/vm/proxy-vm.d.ts.map +1 -0
- package/internal/hardhat-network/provider/vm/proxy-vm.js +73 -0
- package/internal/hardhat-network/provider/vm/proxy-vm.js.map +1 -0
- package/internal/hardhat-network/provider/vm/types.d.ts +27 -0
- package/internal/hardhat-network/provider/vm/types.d.ts.map +1 -0
- package/internal/hardhat-network/provider/vm/types.js +3 -0
- package/internal/hardhat-network/provider/vm/types.js.map +1 -0
- package/internal/hardhat-network/stack-traces/consoleLogger.d.ts +6 -0
- package/internal/hardhat-network/stack-traces/consoleLogger.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/consoleLogger.js +33 -16
- package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
- package/internal/hardhat-network/stack-traces/contracts-identifier.d.ts +1 -2
- package/internal/hardhat-network/stack-traces/contracts-identifier.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/contracts-identifier.js +6 -7
- package/internal/hardhat-network/stack-traces/contracts-identifier.js.map +1 -1
- package/internal/hardhat-network/stack-traces/debug.js +6 -6
- 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 +13 -7
- package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/message-trace.d.ts +8 -3
- package/internal/hardhat-network/stack-traces/message-trace.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/message-trace.js +22 -1
- package/internal/hardhat-network/stack-traces/message-trace.js.map +1 -1
- package/internal/hardhat-network/stack-traces/model.d.ts +8 -0
- package/internal/hardhat-network/stack-traces/model.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/model.js +52 -0
- package/internal/hardhat-network/stack-traces/model.js.map +1 -1
- package/internal/hardhat-network/stack-traces/opcodes.d.ts +1 -0
- package/internal/hardhat-network/stack-traces/opcodes.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/opcodes.js +5 -1
- package/internal/hardhat-network/stack-traces/opcodes.js.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-errors.js +2 -2
- package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.js +5 -5
- 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 +28 -34
- package/internal/hardhat-network/stack-traces/vm-debug-tracer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-trace-decoder.d.ts +7 -0
- package/internal/hardhat-network/stack-traces/vm-trace-decoder.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-trace-decoder.js +69 -2
- package/internal/hardhat-network/stack-traces/vm-trace-decoder.js.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-tracer.d.ts +7 -12
- package/internal/hardhat-network/stack-traces/vm-tracer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-tracer.js +46 -65
- package/internal/hardhat-network/stack-traces/vm-tracer.js.map +1 -1
- package/internal/util/date.d.ts +1 -0
- package/internal/util/date.d.ts.map +1 -1
- package/internal/util/date.js +5 -1
- package/internal/util/date.js.map +1 -1
- package/internal/util/hardforks.d.ts +2 -0
- package/internal/util/hardforks.d.ts.map +1 -1
- package/internal/util/hardforks.js +27 -1
- package/internal/util/hardforks.js.map +1 -1
- package/package.json +18 -16
- package/src/internal/core/providers/construction.ts +7 -9
- package/src/internal/core/providers/http.ts +3 -1
- package/src/internal/core/runtime-environment.ts +2 -1
- package/src/internal/hardhat-network/jsonrpc/client.ts +1 -28
- package/src/internal/hardhat-network/jsonrpc/handler.ts +9 -1
- package/src/internal/hardhat-network/provider/modules/logger.ts +6 -801
- package/src/internal/hardhat-network/provider/node-types.ts +2 -89
- package/src/internal/hardhat-network/provider/output.ts +0 -352
- package/src/internal/hardhat-network/provider/provider.ts +482 -263
- package/src/internal/hardhat-network/provider/utils/convertToEdr.ts +228 -0
- package/src/internal/hardhat-network/provider/utils/getCurrentTimestamp.ts +0 -4
- package/src/internal/hardhat-network/provider/utils/makeCommon.ts +1 -12
- package/src/internal/hardhat-network/provider/utils/makeForkClient.ts +63 -24
- package/src/internal/hardhat-network/provider/utils/random.ts +8 -1
- package/src/internal/hardhat-network/provider/utils/reorgs-protection.ts +5 -5
- package/src/internal/hardhat-network/provider/vm/exit.ts +101 -0
- package/src/internal/hardhat-network/provider/vm/minimal-vm.ts +101 -0
- package/src/internal/hardhat-network/provider/vm/types.ts +31 -0
- package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +40 -21
- package/src/internal/hardhat-network/stack-traces/contracts-identifier.ts +10 -12
- package/src/internal/hardhat-network/stack-traces/debug.ts +6 -6
- package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +15 -8
- package/src/internal/hardhat-network/stack-traces/message-trace.ts +40 -4
- package/src/internal/hardhat-network/stack-traces/model.ts +61 -0
- package/src/internal/hardhat-network/stack-traces/opcodes.ts +4 -0
- package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +2 -2
- package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +6 -5
- package/src/internal/hardhat-network/stack-traces/vm-trace-decoder.ts +113 -4
- package/src/internal/hardhat-network/stack-traces/vm-tracer.ts +67 -95
- package/src/internal/util/date.ts +4 -0
- package/src/internal/util/hardforks.ts +52 -0
- package/src/internal/hardhat-network/provider/BlockchainBase.ts +0 -185
- package/src/internal/hardhat-network/provider/BlockchainData.ts +0 -261
- package/src/internal/hardhat-network/provider/HardhatBlockchain.ts +0 -140
- package/src/internal/hardhat-network/provider/PoolState.ts +0 -48
- package/src/internal/hardhat-network/provider/TransactionQueue.ts +0 -158
- package/src/internal/hardhat-network/provider/TxPool.ts +0 -715
- package/src/internal/hardhat-network/provider/ethereumjs-workarounds.ts +0 -21
- package/src/internal/hardhat-network/provider/filter.ts +0 -142
- package/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts +0 -433
- package/src/internal/hardhat-network/provider/fork/ForkStateManager.ts +0 -480
- package/src/internal/hardhat-network/provider/fork/rpcToBlockData.ts +0 -35
- package/src/internal/hardhat-network/provider/fork/rpcToTxData.ts +0 -44
- package/src/internal/hardhat-network/provider/modules/base.ts +0 -156
- package/src/internal/hardhat-network/provider/modules/debug.ts +0 -104
- package/src/internal/hardhat-network/provider/modules/eth.ts +0 -1781
- package/src/internal/hardhat-network/provider/modules/evm.ts +0 -249
- package/src/internal/hardhat-network/provider/modules/hardhat.ts +0 -481
- package/src/internal/hardhat-network/provider/modules/net.ts +0 -60
- package/src/internal/hardhat-network/provider/modules/personal.ts +0 -40
- package/src/internal/hardhat-network/provider/modules/web3.ts +0 -49
- package/src/internal/hardhat-network/provider/node.ts +0 -2993
- package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +0 -226
- package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +0 -224
- package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +0 -216
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.ts +0 -143
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.ts +0 -144
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.ts +0 -171
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidUnknownTypeTransaction.ts +0 -169
- package/src/internal/hardhat-network/provider/types/HardhatBlockchainInterface.ts +0 -25
- package/src/internal/hardhat-network/provider/utils/makeFakeSignature.ts +0 -60
- package/src/internal/hardhat-network/provider/utils/makeStateTrie.ts +0 -29
- package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +0 -61
- package/src/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.ts +0 -45
- package/src/internal/hardhat-network/provider/utils/txMapToArray.ts +0 -7
- package/src/internal/hardhat-network/stack-traces/vm-debug-tracer.ts +0 -630
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SpecId,
|
|
3
|
+
MineOrdering,
|
|
4
|
+
IntervalRange,
|
|
5
|
+
DebugTraceResult,
|
|
6
|
+
TracingMessage,
|
|
7
|
+
TracingMessageResult,
|
|
8
|
+
TracingStep,
|
|
9
|
+
} from "@nomicfoundation/edr";
|
|
10
|
+
import { Address } from "@nomicfoundation/ethereumjs-util";
|
|
11
|
+
|
|
12
|
+
import { HardforkName } from "../../../util/hardforks";
|
|
13
|
+
import { IntervalMiningConfig, MempoolOrder } from "../node-types";
|
|
14
|
+
import { RpcDebugTraceOutput, RpcStructLog } from "../output";
|
|
15
|
+
import {
|
|
16
|
+
MinimalEVMResult,
|
|
17
|
+
MinimalInterpreterStep,
|
|
18
|
+
MinimalMessage,
|
|
19
|
+
} from "../vm/types";
|
|
20
|
+
|
|
21
|
+
/* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
|
|
22
|
+
|
|
23
|
+
export function ethereumsjsHardforkToEdrSpecId(hardfork: HardforkName): SpecId {
|
|
24
|
+
switch (hardfork) {
|
|
25
|
+
case HardforkName.FRONTIER:
|
|
26
|
+
return SpecId.Frontier;
|
|
27
|
+
case HardforkName.HOMESTEAD:
|
|
28
|
+
return SpecId.Homestead;
|
|
29
|
+
case HardforkName.DAO:
|
|
30
|
+
return SpecId.DaoFork;
|
|
31
|
+
case HardforkName.TANGERINE_WHISTLE:
|
|
32
|
+
return SpecId.Tangerine;
|
|
33
|
+
case HardforkName.SPURIOUS_DRAGON:
|
|
34
|
+
return SpecId.SpuriousDragon;
|
|
35
|
+
case HardforkName.BYZANTIUM:
|
|
36
|
+
return SpecId.Byzantium;
|
|
37
|
+
case HardforkName.CONSTANTINOPLE:
|
|
38
|
+
return SpecId.Constantinople;
|
|
39
|
+
case HardforkName.PETERSBURG:
|
|
40
|
+
return SpecId.Petersburg;
|
|
41
|
+
case HardforkName.ISTANBUL:
|
|
42
|
+
return SpecId.Istanbul;
|
|
43
|
+
case HardforkName.MUIR_GLACIER:
|
|
44
|
+
return SpecId.MuirGlacier;
|
|
45
|
+
case HardforkName.BERLIN:
|
|
46
|
+
return SpecId.Berlin;
|
|
47
|
+
case HardforkName.LONDON:
|
|
48
|
+
return SpecId.London;
|
|
49
|
+
case HardforkName.ARROW_GLACIER:
|
|
50
|
+
return SpecId.ArrowGlacier;
|
|
51
|
+
case HardforkName.GRAY_GLACIER:
|
|
52
|
+
return SpecId.GrayGlacier;
|
|
53
|
+
case HardforkName.MERGE:
|
|
54
|
+
return SpecId.Merge;
|
|
55
|
+
case HardforkName.SHANGHAI:
|
|
56
|
+
return SpecId.Shanghai;
|
|
57
|
+
case HardforkName.CANCUN:
|
|
58
|
+
return SpecId.Cancun;
|
|
59
|
+
default:
|
|
60
|
+
const _exhaustiveCheck: never = hardfork;
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Unknown hardfork name '${hardfork as string}', this shouldn't happen`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function edrSpecIdToEthereumHardfork(specId: SpecId): HardforkName {
|
|
68
|
+
switch (specId) {
|
|
69
|
+
case SpecId.Frontier:
|
|
70
|
+
return HardforkName.FRONTIER;
|
|
71
|
+
case SpecId.Homestead:
|
|
72
|
+
return HardforkName.HOMESTEAD;
|
|
73
|
+
case SpecId.DaoFork:
|
|
74
|
+
return HardforkName.DAO;
|
|
75
|
+
case SpecId.Tangerine:
|
|
76
|
+
return HardforkName.TANGERINE_WHISTLE;
|
|
77
|
+
case SpecId.SpuriousDragon:
|
|
78
|
+
return HardforkName.SPURIOUS_DRAGON;
|
|
79
|
+
case SpecId.Byzantium:
|
|
80
|
+
return HardforkName.BYZANTIUM;
|
|
81
|
+
case SpecId.Constantinople:
|
|
82
|
+
return HardforkName.CONSTANTINOPLE;
|
|
83
|
+
case SpecId.Petersburg:
|
|
84
|
+
return HardforkName.PETERSBURG;
|
|
85
|
+
case SpecId.Istanbul:
|
|
86
|
+
return HardforkName.ISTANBUL;
|
|
87
|
+
case SpecId.MuirGlacier:
|
|
88
|
+
return HardforkName.MUIR_GLACIER;
|
|
89
|
+
case SpecId.Berlin:
|
|
90
|
+
return HardforkName.BERLIN;
|
|
91
|
+
case SpecId.London:
|
|
92
|
+
return HardforkName.LONDON;
|
|
93
|
+
case SpecId.ArrowGlacier:
|
|
94
|
+
return HardforkName.ARROW_GLACIER;
|
|
95
|
+
case SpecId.GrayGlacier:
|
|
96
|
+
return HardforkName.GRAY_GLACIER;
|
|
97
|
+
case SpecId.Merge:
|
|
98
|
+
return HardforkName.MERGE;
|
|
99
|
+
case SpecId.Shanghai:
|
|
100
|
+
return HardforkName.SHANGHAI;
|
|
101
|
+
// HACK: EthereumJS doesn't support Cancun, so report Shanghai
|
|
102
|
+
case SpecId.Cancun:
|
|
103
|
+
return HardforkName.SHANGHAI;
|
|
104
|
+
|
|
105
|
+
default:
|
|
106
|
+
throw new Error(`Unknown spec id '${specId}', this shouldn't happen`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function ethereumjsIntervalMiningConfigToEdr(
|
|
111
|
+
config: IntervalMiningConfig
|
|
112
|
+
): bigint | IntervalRange | undefined {
|
|
113
|
+
if (typeof config === "number") {
|
|
114
|
+
// Is interval mining disabled?
|
|
115
|
+
if (config === 0) {
|
|
116
|
+
return undefined;
|
|
117
|
+
} else {
|
|
118
|
+
return BigInt(config);
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
return {
|
|
122
|
+
min: BigInt(config[0]),
|
|
123
|
+
max: BigInt(config[1]),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function ethereumjsMempoolOrderToEdrMineOrdering(
|
|
129
|
+
mempoolOrder: MempoolOrder
|
|
130
|
+
): MineOrdering {
|
|
131
|
+
switch (mempoolOrder) {
|
|
132
|
+
case "fifo":
|
|
133
|
+
return MineOrdering.Fifo;
|
|
134
|
+
case "priority":
|
|
135
|
+
return MineOrdering.Priority;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function edrRpcDebugTraceToHardhat(
|
|
140
|
+
rpcDebugTrace: DebugTraceResult
|
|
141
|
+
): RpcDebugTraceOutput {
|
|
142
|
+
const structLogs = rpcDebugTrace.structLogs.map((log) => {
|
|
143
|
+
const result: RpcStructLog = {
|
|
144
|
+
depth: Number(log.depth),
|
|
145
|
+
gas: Number(log.gas),
|
|
146
|
+
gasCost: Number(log.gasCost),
|
|
147
|
+
op: log.opName,
|
|
148
|
+
pc: Number(log.pc),
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
if (log.memory !== undefined) {
|
|
152
|
+
result.memory = log.memory;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (log.stack !== undefined) {
|
|
156
|
+
// Remove 0x prefix which is required by EIP-3155, but not expected by Hardhat.
|
|
157
|
+
result.stack = log.stack?.map((item) => item.slice(2));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (log.storage !== undefined) {
|
|
161
|
+
result.storage = Object.fromEntries(
|
|
162
|
+
Object.entries(log.storage).map(([key, value]) => {
|
|
163
|
+
return [key.slice(2), value.slice(2)];
|
|
164
|
+
})
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (log.error !== undefined) {
|
|
169
|
+
result.error = {
|
|
170
|
+
message: log.error,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return result;
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// REVM trace adds initial STOP that Hardhat doesn't expect
|
|
178
|
+
if (structLogs.length > 0 && structLogs[0].op === "STOP") {
|
|
179
|
+
structLogs.shift();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let returnValue = rpcDebugTrace.output?.toString("hex") ?? "";
|
|
183
|
+
if (returnValue === "0x") {
|
|
184
|
+
returnValue = "";
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
failed: !rpcDebugTrace.pass,
|
|
189
|
+
gas: Number(rpcDebugTrace.gasUsed),
|
|
190
|
+
returnValue,
|
|
191
|
+
structLogs,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function edrTracingStepToMinimalInterpreterStep(
|
|
196
|
+
step: TracingStep
|
|
197
|
+
): MinimalInterpreterStep {
|
|
198
|
+
return {
|
|
199
|
+
pc: Number(step.pc),
|
|
200
|
+
depth: step.depth,
|
|
201
|
+
opcode: {
|
|
202
|
+
name: step.opcode,
|
|
203
|
+
},
|
|
204
|
+
stack: step.stackTop !== undefined ? [step.stackTop] : [],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export function edrTracingMessageResultToMinimalEVMResult(
|
|
209
|
+
tracingMessageResult: TracingMessageResult
|
|
210
|
+
): MinimalEVMResult {
|
|
211
|
+
return {
|
|
212
|
+
execResult: {
|
|
213
|
+
executionGasUsed: tracingMessageResult.executionResult.result.gasUsed,
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export function edrTracingMessageToMinimalMessage(
|
|
219
|
+
message: TracingMessage
|
|
220
|
+
): MinimalMessage {
|
|
221
|
+
return {
|
|
222
|
+
to: message.to !== undefined ? new Address(message.to) : undefined,
|
|
223
|
+
data: message.data,
|
|
224
|
+
value: message.value,
|
|
225
|
+
caller: new Address(message.caller),
|
|
226
|
+
gasLimit: message.gasLimit,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -2,19 +2,8 @@ import { Common } from "@nomicfoundation/ethereumjs-common";
|
|
|
2
2
|
|
|
3
3
|
import { LocalNodeConfig } from "../node-types";
|
|
4
4
|
import { HardforkName } from "../../../util/hardforks";
|
|
5
|
-
import { assertTransientStorageCompatibility } from "../node";
|
|
6
|
-
|
|
7
|
-
export function makeCommon({
|
|
8
|
-
chainId,
|
|
9
|
-
networkId,
|
|
10
|
-
hardfork,
|
|
11
|
-
enableTransientStorage,
|
|
12
|
-
}: LocalNodeConfig) {
|
|
13
|
-
assertTransientStorageCompatibility(
|
|
14
|
-
enableTransientStorage,
|
|
15
|
-
hardfork as HardforkName
|
|
16
|
-
);
|
|
17
5
|
|
|
6
|
+
export function makeCommon({ chainId, networkId, hardfork }: LocalNodeConfig) {
|
|
18
7
|
const common = Common.custom(
|
|
19
8
|
{
|
|
20
9
|
chainId,
|
|
@@ -23,47 +23,49 @@ import {
|
|
|
23
23
|
// anymore, so this really should be revisited.
|
|
24
24
|
const FORK_HTTP_TIMEOUT = 35000;
|
|
25
25
|
|
|
26
|
-
export async function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
): Promise<{
|
|
30
|
-
forkClient: JsonRpcClient;
|
|
26
|
+
export async function makeForkProvider(forkConfig: ForkConfig): Promise<{
|
|
27
|
+
forkProvider: HttpProvider;
|
|
28
|
+
networkId: number;
|
|
31
29
|
forkBlockNumber: bigint;
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
latestBlockNumber: bigint;
|
|
31
|
+
maxReorg: bigint;
|
|
34
32
|
}> {
|
|
35
|
-
const
|
|
33
|
+
const forkProvider = new HttpProvider(
|
|
36
34
|
forkConfig.jsonRpcUrl,
|
|
37
35
|
HARDHAT_NETWORK_NAME,
|
|
38
36
|
forkConfig.httpHeaders,
|
|
39
37
|
FORK_HTTP_TIMEOUT
|
|
40
38
|
);
|
|
41
39
|
|
|
42
|
-
const networkId = await getNetworkId(
|
|
40
|
+
const networkId = await getNetworkId(forkProvider);
|
|
43
41
|
const actualMaxReorg = getLargestPossibleReorg(networkId);
|
|
44
42
|
const maxReorg = actualMaxReorg ?? FALLBACK_MAX_REORG;
|
|
45
43
|
|
|
46
|
-
const
|
|
47
|
-
const
|
|
44
|
+
const latestBlockNumber = await getLatestBlockNumber(forkProvider);
|
|
45
|
+
const lastSafeBlockNumber = getLastSafeBlockNumber(
|
|
46
|
+
latestBlockNumber,
|
|
47
|
+
maxReorg
|
|
48
|
+
);
|
|
48
49
|
|
|
49
50
|
let forkBlockNumber;
|
|
50
51
|
if (forkConfig.blockNumber !== undefined) {
|
|
51
|
-
if (forkConfig.blockNumber >
|
|
52
|
+
if (forkConfig.blockNumber > latestBlockNumber) {
|
|
52
53
|
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
|
|
53
54
|
throw new Error(
|
|
54
|
-
`Trying to initialize a provider with block ${forkConfig.blockNumber} but the current block is ${
|
|
55
|
+
`Trying to initialize a provider with block ${forkConfig.blockNumber} but the current block is ${latestBlockNumber}`
|
|
55
56
|
);
|
|
56
57
|
}
|
|
57
58
|
|
|
58
|
-
if (forkConfig.blockNumber >
|
|
59
|
-
const confirmations =
|
|
59
|
+
if (forkConfig.blockNumber > lastSafeBlockNumber) {
|
|
60
|
+
const confirmations =
|
|
61
|
+
latestBlockNumber - BigInt(forkConfig.blockNumber) + 1n;
|
|
60
62
|
const requiredConfirmations = maxReorg + 1n;
|
|
61
63
|
console.warn(
|
|
62
64
|
chalk.yellow(
|
|
63
65
|
`You are forking from block ${
|
|
64
66
|
forkConfig.blockNumber
|
|
65
67
|
}, which has less than ${requiredConfirmations} confirmations, and will affect Hardhat Network's performance.
|
|
66
|
-
Please use block number ${
|
|
68
|
+
Please use block number ${lastSafeBlockNumber} or wait for the block to get ${
|
|
67
69
|
requiredConfirmations - confirmations
|
|
68
70
|
} more confirmations.`
|
|
69
71
|
)
|
|
@@ -72,10 +74,37 @@ Please use block number ${lastSafeBlock} or wait for the block to get ${
|
|
|
72
74
|
|
|
73
75
|
forkBlockNumber = BigInt(forkConfig.blockNumber);
|
|
74
76
|
} else {
|
|
75
|
-
forkBlockNumber = BigInt(
|
|
77
|
+
forkBlockNumber = BigInt(lastSafeBlockNumber);
|
|
76
78
|
}
|
|
77
79
|
|
|
78
|
-
|
|
80
|
+
return {
|
|
81
|
+
forkProvider,
|
|
82
|
+
networkId,
|
|
83
|
+
forkBlockNumber,
|
|
84
|
+
latestBlockNumber,
|
|
85
|
+
maxReorg,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function makeForkClient(
|
|
90
|
+
forkConfig: ForkConfig,
|
|
91
|
+
forkCachePath?: string
|
|
92
|
+
): Promise<{
|
|
93
|
+
forkClient: JsonRpcClient;
|
|
94
|
+
forkBlockNumber: bigint;
|
|
95
|
+
forkBlockTimestamp: number;
|
|
96
|
+
forkBlockHash: string;
|
|
97
|
+
forkBlockStateRoot: string;
|
|
98
|
+
}> {
|
|
99
|
+
const {
|
|
100
|
+
forkProvider,
|
|
101
|
+
networkId,
|
|
102
|
+
forkBlockNumber,
|
|
103
|
+
latestBlockNumber,
|
|
104
|
+
maxReorg,
|
|
105
|
+
} = await makeForkProvider(forkConfig);
|
|
106
|
+
|
|
107
|
+
const block = await getBlockByNumber(forkProvider, forkBlockNumber);
|
|
79
108
|
|
|
80
109
|
const forkBlockTimestamp = rpcQuantityToNumber(block.timestamp) * 1000;
|
|
81
110
|
|
|
@@ -83,9 +112,9 @@ Please use block number ${lastSafeBlock} or wait for the block to get ${
|
|
|
83
112
|
forkConfig.blockNumber !== undefined && forkCachePath !== undefined;
|
|
84
113
|
|
|
85
114
|
const forkClient = new JsonRpcClient(
|
|
86
|
-
|
|
115
|
+
forkProvider,
|
|
87
116
|
networkId,
|
|
88
|
-
|
|
117
|
+
latestBlockNumber,
|
|
89
118
|
maxReorg,
|
|
90
119
|
cacheToDiskEnabled ? forkCachePath : undefined
|
|
91
120
|
);
|
|
@@ -97,7 +126,15 @@ Please use block number ${lastSafeBlock} or wait for the block to get ${
|
|
|
97
126
|
"Forked block should have a hash"
|
|
98
127
|
);
|
|
99
128
|
|
|
100
|
-
|
|
129
|
+
const forkBlockStateRoot = block.stateRoot;
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
forkClient,
|
|
133
|
+
forkBlockNumber,
|
|
134
|
+
forkBlockTimestamp,
|
|
135
|
+
forkBlockHash,
|
|
136
|
+
forkBlockStateRoot,
|
|
137
|
+
};
|
|
101
138
|
}
|
|
102
139
|
|
|
103
140
|
async function getBlockByNumber(
|
|
@@ -128,11 +165,13 @@ async function getLatestBlockNumber(provider: HttpProvider) {
|
|
|
128
165
|
return latestBlock;
|
|
129
166
|
}
|
|
130
167
|
|
|
131
|
-
export function
|
|
132
|
-
|
|
168
|
+
export function getLastSafeBlockNumber(
|
|
169
|
+
latestBlockNumber: bigint,
|
|
133
170
|
maxReorg: bigint
|
|
134
171
|
): bigint {
|
|
135
172
|
// Design choice: if latestBlock - maxReorg results in a negative number then the latestBlock block will be used.
|
|
136
173
|
// This decision is based on the assumption that if maxReorg > latestBlock then there is a high probability that the fork is occurring on a devnet.
|
|
137
|
-
return
|
|
174
|
+
return latestBlockNumber - maxReorg >= 0
|
|
175
|
+
? latestBlockNumber - maxReorg
|
|
176
|
+
: latestBlockNumber;
|
|
138
177
|
}
|
|
@@ -22,6 +22,10 @@ export class RandomBufferGenerator {
|
|
|
22
22
|
return valueToReturn;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
public seed(): Uint8Array {
|
|
26
|
+
return this._nextValue;
|
|
27
|
+
}
|
|
28
|
+
|
|
25
29
|
public setNext(nextValue: Buffer) {
|
|
26
30
|
this._nextValue = Buffer.from(nextValue);
|
|
27
31
|
}
|
|
@@ -54,4 +58,7 @@ export const randomAddressString = () => {
|
|
|
54
58
|
return bufferToHex(randomAddressBuffer());
|
|
55
59
|
};
|
|
56
60
|
|
|
57
|
-
|
|
61
|
+
const addressGenerator = RandomBufferGenerator.create("seed");
|
|
62
|
+
export const randomAddressBuffer = (): Uint8Array => {
|
|
63
|
+
return addressGenerator.next().slice(0, 20);
|
|
64
|
+
};
|
|
@@ -8,22 +8,22 @@
|
|
|
8
8
|
export function getLargestPossibleReorg(networkId: number): bigint | undefined {
|
|
9
9
|
// mainnet
|
|
10
10
|
if (networkId === 1) {
|
|
11
|
-
return
|
|
11
|
+
return 32n;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
// Kovan
|
|
15
15
|
if (networkId === 42) {
|
|
16
|
-
return
|
|
16
|
+
return 32n;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// Goerli
|
|
20
20
|
if (networkId === 5) {
|
|
21
|
-
return
|
|
21
|
+
return 32n;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// Rinkeby
|
|
25
25
|
if (networkId === 4) {
|
|
26
|
-
return
|
|
26
|
+
return 32n;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// Ropsten
|
|
@@ -37,4 +37,4 @@ export function getLargestPossibleReorg(networkId: number): bigint | undefined {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
export const FALLBACK_MAX_REORG =
|
|
40
|
+
export const FALLBACK_MAX_REORG = 128n;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ExceptionalHalt, SuccessReason } from "@nomicfoundation/edr";
|
|
2
|
+
|
|
3
|
+
export enum ExitCode {
|
|
4
|
+
SUCCESS,
|
|
5
|
+
REVERT,
|
|
6
|
+
OUT_OF_GAS,
|
|
7
|
+
INTERNAL_ERROR,
|
|
8
|
+
INVALID_OPCODE,
|
|
9
|
+
STACK_UNDERFLOW,
|
|
10
|
+
CODESIZE_EXCEEDS_MAXIMUM,
|
|
11
|
+
CREATE_COLLISION,
|
|
12
|
+
STATIC_STATE_CHANGE,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class Exit {
|
|
16
|
+
public static fromEdrSuccessReason(reason: SuccessReason): Exit {
|
|
17
|
+
switch (reason) {
|
|
18
|
+
case SuccessReason.Stop:
|
|
19
|
+
case SuccessReason.Return:
|
|
20
|
+
case SuccessReason.SelfDestruct:
|
|
21
|
+
return new Exit(ExitCode.SUCCESS);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const _exhaustiveCheck: never = reason;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public static fromEdrExceptionalHalt(halt: ExceptionalHalt): Exit {
|
|
28
|
+
switch (halt) {
|
|
29
|
+
case ExceptionalHalt.OutOfGas:
|
|
30
|
+
return new Exit(ExitCode.OUT_OF_GAS);
|
|
31
|
+
|
|
32
|
+
case ExceptionalHalt.OpcodeNotFound:
|
|
33
|
+
case ExceptionalHalt.InvalidFEOpcode:
|
|
34
|
+
// Returned when an opcode is not implemented for the hardfork
|
|
35
|
+
case ExceptionalHalt.NotActivated:
|
|
36
|
+
return new Exit(ExitCode.INVALID_OPCODE);
|
|
37
|
+
|
|
38
|
+
case ExceptionalHalt.StackUnderflow:
|
|
39
|
+
return new Exit(ExitCode.STACK_UNDERFLOW);
|
|
40
|
+
|
|
41
|
+
case ExceptionalHalt.CreateCollision:
|
|
42
|
+
return new Exit(ExitCode.CREATE_COLLISION);
|
|
43
|
+
|
|
44
|
+
case ExceptionalHalt.CreateContractSizeLimit:
|
|
45
|
+
return new Exit(ExitCode.CODESIZE_EXCEEDS_MAXIMUM);
|
|
46
|
+
|
|
47
|
+
default: {
|
|
48
|
+
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
|
|
49
|
+
throw new Error(`Unmatched EDR exceptional halt: ${halt}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
constructor(public kind: ExitCode) {}
|
|
55
|
+
|
|
56
|
+
public isError(): boolean {
|
|
57
|
+
return this.kind !== ExitCode.SUCCESS;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public getReason(): string {
|
|
61
|
+
switch (this.kind) {
|
|
62
|
+
case ExitCode.SUCCESS:
|
|
63
|
+
return "Success";
|
|
64
|
+
case ExitCode.REVERT:
|
|
65
|
+
return "Reverted";
|
|
66
|
+
case ExitCode.OUT_OF_GAS:
|
|
67
|
+
return "Out of gas";
|
|
68
|
+
case ExitCode.INTERNAL_ERROR:
|
|
69
|
+
return "Internal error";
|
|
70
|
+
case ExitCode.INVALID_OPCODE:
|
|
71
|
+
return "Invalid opcode";
|
|
72
|
+
case ExitCode.STACK_UNDERFLOW:
|
|
73
|
+
return "Stack underflow";
|
|
74
|
+
case ExitCode.CODESIZE_EXCEEDS_MAXIMUM:
|
|
75
|
+
return "Codesize exceeds maximum";
|
|
76
|
+
case ExitCode.CREATE_COLLISION:
|
|
77
|
+
return "Create collision";
|
|
78
|
+
case ExitCode.STATIC_STATE_CHANGE:
|
|
79
|
+
return "Static state change";
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const _exhaustiveCheck: never = this.kind;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public getEdrExceptionalHalt(): ExceptionalHalt {
|
|
86
|
+
switch (this.kind) {
|
|
87
|
+
case ExitCode.OUT_OF_GAS:
|
|
88
|
+
return ExceptionalHalt.OutOfGas;
|
|
89
|
+
case ExitCode.INVALID_OPCODE:
|
|
90
|
+
return ExceptionalHalt.OpcodeNotFound;
|
|
91
|
+
case ExitCode.CODESIZE_EXCEEDS_MAXIMUM:
|
|
92
|
+
return ExceptionalHalt.CreateContractSizeLimit;
|
|
93
|
+
case ExitCode.CREATE_COLLISION:
|
|
94
|
+
return ExceptionalHalt.CreateCollision;
|
|
95
|
+
|
|
96
|
+
default:
|
|
97
|
+
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
|
|
98
|
+
throw new Error(`Unmatched exit code: ${this.kind}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { Provider as EdrProviderT } from "@nomicfoundation/edr";
|
|
2
|
+
import type { Address } from "@nomicfoundation/ethereumjs-util";
|
|
3
|
+
import type {
|
|
4
|
+
MinimalEVMResult,
|
|
5
|
+
MinimalInterpreterStep,
|
|
6
|
+
MinimalMessage,
|
|
7
|
+
} from "./types";
|
|
8
|
+
|
|
9
|
+
import { AsyncEventEmitter } from "@nomicfoundation/ethereumjs-util";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Used by the provider to keep the `_vm` variable used by some plugins. This
|
|
13
|
+
* interface only has the things used by those plugins.
|
|
14
|
+
*/
|
|
15
|
+
export interface MinimalEthereumJsVm {
|
|
16
|
+
evm: {
|
|
17
|
+
events: AsyncEventEmitter<MinimalEthereumJsVmEvents>;
|
|
18
|
+
};
|
|
19
|
+
stateManager: {
|
|
20
|
+
putContractCode: (address: Address, code: Buffer) => Promise<void>;
|
|
21
|
+
getContractStorage: (address: Address, slotHash: Buffer) => Promise<Buffer>;
|
|
22
|
+
putContractStorage: (
|
|
23
|
+
address: Address,
|
|
24
|
+
slotHash: Buffer,
|
|
25
|
+
slotValue: Buffer
|
|
26
|
+
) => Promise<void>;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// we need to use a type instead of an interface to satisfy the type constarint
|
|
31
|
+
// of the AsyncEventEmitter type param
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
|
33
|
+
type MinimalEthereumJsVmEvents = {
|
|
34
|
+
beforeMessage: (
|
|
35
|
+
data: MinimalMessage,
|
|
36
|
+
resolve?: (result?: any) => void
|
|
37
|
+
) => void;
|
|
38
|
+
afterMessage: (
|
|
39
|
+
data: MinimalEVMResult,
|
|
40
|
+
resolve?: (result?: any) => void
|
|
41
|
+
) => void;
|
|
42
|
+
step: (
|
|
43
|
+
data: MinimalInterpreterStep,
|
|
44
|
+
resolve?: (result?: any) => void
|
|
45
|
+
) => void;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export class MinimalEthereumJsVmEventEmitter extends AsyncEventEmitter<MinimalEthereumJsVmEvents> {}
|
|
49
|
+
|
|
50
|
+
export function getMinimalEthereumJsVm(
|
|
51
|
+
provider: EdrProviderT
|
|
52
|
+
): MinimalEthereumJsVm {
|
|
53
|
+
const minimalEthereumJsVm: MinimalEthereumJsVm = {
|
|
54
|
+
evm: {
|
|
55
|
+
events: new MinimalEthereumJsVmEventEmitter(),
|
|
56
|
+
},
|
|
57
|
+
stateManager: {
|
|
58
|
+
putContractCode: async (address: Address, code: Buffer) => {
|
|
59
|
+
await provider.handleRequest(
|
|
60
|
+
JSON.stringify({
|
|
61
|
+
method: "hardhat_setCode",
|
|
62
|
+
params: [`0x${address.toString()}`, `0x${code.toString("hex")}`],
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
},
|
|
66
|
+
getContractStorage: async (address: Address, slotHash: Buffer) => {
|
|
67
|
+
const responseObject = await provider.handleRequest(
|
|
68
|
+
JSON.stringify({
|
|
69
|
+
method: "eth_getStorageAt",
|
|
70
|
+
params: [
|
|
71
|
+
`0x${address.toString()}`,
|
|
72
|
+
`0x${slotHash.toString("hex")}`,
|
|
73
|
+
],
|
|
74
|
+
})
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const response = JSON.parse(responseObject.json);
|
|
78
|
+
|
|
79
|
+
return Buffer.from(response.result.slice(2), "hex");
|
|
80
|
+
},
|
|
81
|
+
putContractStorage: async (
|
|
82
|
+
address: Address,
|
|
83
|
+
slotHash: Buffer,
|
|
84
|
+
slotValue: Buffer
|
|
85
|
+
) => {
|
|
86
|
+
await provider.handleRequest(
|
|
87
|
+
JSON.stringify({
|
|
88
|
+
method: "hardhat_setStorageAt",
|
|
89
|
+
params: [
|
|
90
|
+
`0x${address.toString()}`,
|
|
91
|
+
`0x${slotHash.toString("hex")}`,
|
|
92
|
+
`0x${slotValue.toString("hex")}`,
|
|
93
|
+
],
|
|
94
|
+
})
|
|
95
|
+
);
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
return minimalEthereumJsVm;
|
|
101
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Address } from "@nomicfoundation/ethereumjs-util";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* These types are minimal versions of the values returned by ethereumjs
|
|
5
|
+
* in the event listeners.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface MinimalInterpreterStep {
|
|
9
|
+
pc: number;
|
|
10
|
+
depth: number;
|
|
11
|
+
opcode: {
|
|
12
|
+
name: string;
|
|
13
|
+
};
|
|
14
|
+
stack: bigint[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface MinimalExecResult {
|
|
18
|
+
executionGasUsed: bigint;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface MinimalEVMResult {
|
|
22
|
+
execResult: MinimalExecResult;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface MinimalMessage {
|
|
26
|
+
to?: Address;
|
|
27
|
+
value: bigint;
|
|
28
|
+
data: Uint8Array;
|
|
29
|
+
caller: Address;
|
|
30
|
+
gasLimit: bigint;
|
|
31
|
+
}
|