hardhat 2.20.1 → 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 -153
- 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 -2999
- 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
|
@@ -1,630 +0,0 @@
|
|
|
1
|
-
import { Journal } from "@nomicfoundation/ethereumjs-evm/dist/cjs/journal";
|
|
2
|
-
import { TypedTransaction } from "@nomicfoundation/ethereumjs-tx";
|
|
3
|
-
import { AfterTxEvent, VM } from "@nomicfoundation/ethereumjs-vm";
|
|
4
|
-
import {
|
|
5
|
-
EVMResult,
|
|
6
|
-
InterpreterStep,
|
|
7
|
-
Message,
|
|
8
|
-
} from "@nomicfoundation/ethereumjs-evm";
|
|
9
|
-
import {
|
|
10
|
-
Address,
|
|
11
|
-
bytesToBigInt,
|
|
12
|
-
setLengthLeft,
|
|
13
|
-
toBytes,
|
|
14
|
-
} from "@nomicfoundation/ethereumjs-util";
|
|
15
|
-
|
|
16
|
-
import { assertHardhatInvariant } from "../../core/errors";
|
|
17
|
-
import { RpcDebugTracingConfig } from "../../core/jsonrpc/types/input/debugTraceTransaction";
|
|
18
|
-
import { InvalidInputError } from "../../core/providers/errors";
|
|
19
|
-
import { RpcDebugTraceOutput, RpcStructLog } from "../provider/output";
|
|
20
|
-
import * as BigIntUtils from "../../util/bigint";
|
|
21
|
-
|
|
22
|
-
/* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
|
|
23
|
-
|
|
24
|
-
interface StructLog {
|
|
25
|
-
depth: number;
|
|
26
|
-
gas: number;
|
|
27
|
-
gasCost: number;
|
|
28
|
-
op: string;
|
|
29
|
-
pc: number;
|
|
30
|
-
memory: string[];
|
|
31
|
-
stack: string[];
|
|
32
|
-
storage: Record<string, string>;
|
|
33
|
-
memSize: number;
|
|
34
|
-
error?: object;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
type Storage = Record<string, string>;
|
|
38
|
-
|
|
39
|
-
interface DebugMessage {
|
|
40
|
-
structLogs: Array<StructLog | DebugMessage>;
|
|
41
|
-
to: string;
|
|
42
|
-
result?: EVMResult;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
type NestedStructLogs = Array<StructLog | NestedStructLogs>;
|
|
46
|
-
|
|
47
|
-
function isStructLog(
|
|
48
|
-
message: StructLog | DebugMessage | undefined
|
|
49
|
-
): message is StructLog {
|
|
50
|
-
return message !== undefined && !("structLogs" in message);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const EMPTY_MEMORY_WORD = "0".repeat(64);
|
|
54
|
-
|
|
55
|
-
export class VMDebugTracer {
|
|
56
|
-
private _lastTrace?: RpcDebugTraceOutput;
|
|
57
|
-
private _config: RpcDebugTracingConfig;
|
|
58
|
-
|
|
59
|
-
private _messages: DebugMessage[] = [];
|
|
60
|
-
private _addressToStorage: Record<string, Storage> = {};
|
|
61
|
-
|
|
62
|
-
private _error: any;
|
|
63
|
-
|
|
64
|
-
constructor(private readonly _vm: VM) {
|
|
65
|
-
this._beforeMessageHandler = this._beforeMessageHandler.bind(this);
|
|
66
|
-
this._afterMessageHandler = this._afterMessageHandler.bind(this);
|
|
67
|
-
this._beforeTxHandler = this._beforeTxHandler.bind(this);
|
|
68
|
-
this._stepHandler = this._stepHandler.bind(this);
|
|
69
|
-
this._afterTxHandler = this._afterTxHandler.bind(this);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Run the `action` callback and trace its execution
|
|
74
|
-
*/
|
|
75
|
-
public async trace(
|
|
76
|
-
action: () => Promise<void>,
|
|
77
|
-
config: RpcDebugTracingConfig
|
|
78
|
-
): Promise<RpcDebugTraceOutput> {
|
|
79
|
-
try {
|
|
80
|
-
this._enableTracing(config);
|
|
81
|
-
this._config = config;
|
|
82
|
-
|
|
83
|
-
await action();
|
|
84
|
-
|
|
85
|
-
if (this._error !== undefined) {
|
|
86
|
-
throw this._error;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
return this._getDebugTrace();
|
|
90
|
-
} finally {
|
|
91
|
-
this._disableTracing();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
private _enableTracing(config: RpcDebugTracingConfig) {
|
|
96
|
-
assertHardhatInvariant(
|
|
97
|
-
this._vm.evm.events !== undefined,
|
|
98
|
-
"EVM should have an 'events' property"
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
this._vm.events.on("beforeTx", this._beforeTxHandler);
|
|
102
|
-
|
|
103
|
-
this._vm.evm.events.on("beforeMessage", this._beforeMessageHandler);
|
|
104
|
-
this._vm.evm.events.on("step", this._stepHandler);
|
|
105
|
-
this._vm.evm.events.on("afterMessage", this._afterMessageHandler);
|
|
106
|
-
|
|
107
|
-
this._vm.events.on("afterTx", this._afterTxHandler);
|
|
108
|
-
|
|
109
|
-
this._config = config;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
private _disableTracing() {
|
|
113
|
-
assertHardhatInvariant(
|
|
114
|
-
this._vm.evm.events !== undefined,
|
|
115
|
-
"EVM should have an 'events' property"
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
this._vm.events.removeListener("beforeTx", this._beforeTxHandler);
|
|
119
|
-
|
|
120
|
-
this._vm.evm.events.removeListener(
|
|
121
|
-
"beforeMessage",
|
|
122
|
-
this._beforeMessageHandler
|
|
123
|
-
);
|
|
124
|
-
this._vm.evm.events.removeListener("step", this._stepHandler);
|
|
125
|
-
this._vm.evm.events.removeListener(
|
|
126
|
-
"afterMessage",
|
|
127
|
-
this._afterMessageHandler
|
|
128
|
-
);
|
|
129
|
-
this._vm.events.removeListener("afterTx", this._afterTxHandler);
|
|
130
|
-
this._config = undefined;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
private _getDebugTrace(): RpcDebugTraceOutput {
|
|
134
|
-
if (this._lastTrace === undefined) {
|
|
135
|
-
throw new Error(
|
|
136
|
-
"No debug trace available. Please run the transaction first"
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
return this._lastTrace;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
private async _beforeTxHandler(_tx: TypedTransaction, next: any) {
|
|
143
|
-
this._lastTrace = undefined;
|
|
144
|
-
this._messages = [];
|
|
145
|
-
this._addressToStorage = {};
|
|
146
|
-
next();
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
private async _beforeMessageHandler(message: Message, next: any) {
|
|
150
|
-
const debugMessage: DebugMessage = {
|
|
151
|
-
structLogs: [],
|
|
152
|
-
to: message.to?.toString() ?? "",
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
if (this._messages.length > 0) {
|
|
156
|
-
const previousMessage = this._messages[this._messages.length - 1];
|
|
157
|
-
|
|
158
|
-
previousMessage.structLogs.push(debugMessage);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
this._messages.push(debugMessage);
|
|
162
|
-
|
|
163
|
-
next();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
private async _stepHandler(step: InterpreterStep, next: any) {
|
|
167
|
-
try {
|
|
168
|
-
assertHardhatInvariant(
|
|
169
|
-
this._messages.length > 0,
|
|
170
|
-
"Step handler should be called after at least one beforeMessage handler"
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
const structLog = await this._stepToStructLog(step);
|
|
174
|
-
this._messages[this._messages.length - 1].structLogs.push(structLog);
|
|
175
|
-
} catch (e: any) {
|
|
176
|
-
// errors thrown in event handlers are lost, so we save this error to
|
|
177
|
-
// re-throw it in the `trace` function
|
|
178
|
-
this._error = e;
|
|
179
|
-
this._disableTracing();
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
next();
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
private async _afterMessageHandler(result: EVMResult, next: any) {
|
|
186
|
-
const lastMessage = this._messages[this._messages.length - 1];
|
|
187
|
-
|
|
188
|
-
lastMessage.result = result;
|
|
189
|
-
|
|
190
|
-
if (this._messages.length > 1) {
|
|
191
|
-
this._messages.pop();
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
next();
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
private async _afterTxHandler(result: AfterTxEvent, next: any) {
|
|
198
|
-
const { default: flattenDeep } = await import("lodash/flattenDeep");
|
|
199
|
-
const topLevelMessage = this._messages[0];
|
|
200
|
-
|
|
201
|
-
const nestedStructLogs = await this._messageToNestedStructLogs(
|
|
202
|
-
topLevelMessage,
|
|
203
|
-
topLevelMessage.to
|
|
204
|
-
);
|
|
205
|
-
|
|
206
|
-
const rpcStructLogs: RpcStructLog[] = flattenDeep(nestedStructLogs).map(
|
|
207
|
-
(structLog) => {
|
|
208
|
-
const rpcStructLog: RpcStructLog = structLog;
|
|
209
|
-
|
|
210
|
-
// geth doesn't return this value
|
|
211
|
-
delete rpcStructLog.memSize;
|
|
212
|
-
|
|
213
|
-
if (this._config?.disableMemory === true) {
|
|
214
|
-
delete rpcStructLog.memory;
|
|
215
|
-
}
|
|
216
|
-
if (this._config?.disableStack === true) {
|
|
217
|
-
delete rpcStructLog.stack;
|
|
218
|
-
}
|
|
219
|
-
if (this._config?.disableStorage === true) {
|
|
220
|
-
delete rpcStructLog.storage;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
return rpcStructLog;
|
|
224
|
-
}
|
|
225
|
-
);
|
|
226
|
-
|
|
227
|
-
// geth does this for some reason
|
|
228
|
-
if (
|
|
229
|
-
rpcStructLogs.length > 0 &&
|
|
230
|
-
result.execResult.exceptionError?.error === "out of gas"
|
|
231
|
-
) {
|
|
232
|
-
rpcStructLogs[rpcStructLogs.length - 1].error = {};
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
this._lastTrace = {
|
|
236
|
-
gas: Number(result.totalGasSpent),
|
|
237
|
-
failed: result.execResult.exceptionError !== undefined,
|
|
238
|
-
returnValue: Buffer.from(result.execResult.returnValue).toString("hex"),
|
|
239
|
-
structLogs: rpcStructLogs,
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
next();
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
private async _messageToNestedStructLogs(
|
|
246
|
-
message: DebugMessage,
|
|
247
|
-
address: string
|
|
248
|
-
): Promise<NestedStructLogs> {
|
|
249
|
-
const nestedStructLogs: NestedStructLogs = [];
|
|
250
|
-
|
|
251
|
-
for (const [i, messageOrStructLog] of message.structLogs.entries()) {
|
|
252
|
-
if (isStructLog(messageOrStructLog)) {
|
|
253
|
-
const structLog: StructLog = messageOrStructLog;
|
|
254
|
-
|
|
255
|
-
nestedStructLogs.push(structLog);
|
|
256
|
-
|
|
257
|
-
// update the storage of the current address
|
|
258
|
-
const addressStorage = this._addressToStorage[address] ?? {};
|
|
259
|
-
structLog.storage = {
|
|
260
|
-
...addressStorage,
|
|
261
|
-
...structLog.storage,
|
|
262
|
-
};
|
|
263
|
-
this._addressToStorage[address] = {
|
|
264
|
-
...structLog.storage,
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
if (i === 0) {
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
let previousStructLog = nestedStructLogs[nestedStructLogs.length - 2];
|
|
272
|
-
|
|
273
|
-
if (Array.isArray(previousStructLog)) {
|
|
274
|
-
previousStructLog = nestedStructLogs[nestedStructLogs.length - 3];
|
|
275
|
-
} else {
|
|
276
|
-
// if the previous log is not a message, we update its gasCost
|
|
277
|
-
// using the gas difference between both steps
|
|
278
|
-
previousStructLog.gasCost = previousStructLog.gas - structLog.gas;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
assertHardhatInvariant(
|
|
282
|
-
!Array.isArray(previousStructLog),
|
|
283
|
-
"There shouldn't be two messages one after another"
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
// memory opcodes reflect the expanded memory in that step,
|
|
287
|
-
// so we correct them
|
|
288
|
-
if (
|
|
289
|
-
previousStructLog.op === "MSTORE" ||
|
|
290
|
-
previousStructLog.op === "MLOAD"
|
|
291
|
-
) {
|
|
292
|
-
const memoryLengthDifference =
|
|
293
|
-
structLog.memory.length - previousStructLog.memory.length;
|
|
294
|
-
for (let k = 0; k < memoryLengthDifference; k++) {
|
|
295
|
-
previousStructLog.memory.push(EMPTY_MEMORY_WORD);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
} else {
|
|
299
|
-
const subMessage: DebugMessage = messageOrStructLog;
|
|
300
|
-
|
|
301
|
-
const lastStructLog = nestedStructLogs[nestedStructLogs.length - 1];
|
|
302
|
-
|
|
303
|
-
assertHardhatInvariant(
|
|
304
|
-
!Array.isArray(lastStructLog),
|
|
305
|
-
"There shouldn't be two messages one after another"
|
|
306
|
-
);
|
|
307
|
-
|
|
308
|
-
const isDelegateCall = lastStructLog.op === "DELEGATECALL";
|
|
309
|
-
|
|
310
|
-
const messageNestedStructLogs = await this._messageToNestedStructLogs(
|
|
311
|
-
subMessage,
|
|
312
|
-
isDelegateCall ? address : subMessage.to
|
|
313
|
-
);
|
|
314
|
-
|
|
315
|
-
nestedStructLogs.push(messageNestedStructLogs);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
return nestedStructLogs;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
private _getMemory(step: InterpreterStep): string[] {
|
|
323
|
-
const rawMemory =
|
|
324
|
-
Buffer.from(step.memory)
|
|
325
|
-
.toString("hex")
|
|
326
|
-
.match(/.{1,64}/g) ?? [];
|
|
327
|
-
|
|
328
|
-
// Remove the additional non allocated memory
|
|
329
|
-
return rawMemory.slice(0, Number(step.memoryWordCount));
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
private _getStack(step: InterpreterStep): string[] {
|
|
333
|
-
const stack = step.stack
|
|
334
|
-
.slice()
|
|
335
|
-
.map((el: bigint) => el.toString(16).padStart(64, "0"));
|
|
336
|
-
return stack;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
private async _stepToStructLog(step: InterpreterStep): Promise<StructLog> {
|
|
340
|
-
const memory = this._getMemory(step);
|
|
341
|
-
const stack = this._getStack(step);
|
|
342
|
-
|
|
343
|
-
let gasCost = step.opcode.fee;
|
|
344
|
-
|
|
345
|
-
let op = step.opcode.name === "KECCAK256" ? "SHA3" : step.opcode.name;
|
|
346
|
-
let error: object | undefined;
|
|
347
|
-
|
|
348
|
-
const storage: Storage = {};
|
|
349
|
-
|
|
350
|
-
if (step.opcode.name === "SLOAD") {
|
|
351
|
-
const address = step.address;
|
|
352
|
-
const [keyBuffer] = this._getFromStack(stack, 1);
|
|
353
|
-
const key: Uint8Array = setLengthLeft(keyBuffer, 32);
|
|
354
|
-
|
|
355
|
-
const storageValue = await this._getContractStorage(address, key);
|
|
356
|
-
|
|
357
|
-
storage[toWord(key)] = toWord(storageValue);
|
|
358
|
-
} else if (step.opcode.name === "SSTORE") {
|
|
359
|
-
const [keyBuffer, valueBuffer] = this._getFromStack(stack, 2);
|
|
360
|
-
const key = toWord(keyBuffer);
|
|
361
|
-
const storageValue = toWord(valueBuffer);
|
|
362
|
-
|
|
363
|
-
storage[key] = storageValue;
|
|
364
|
-
} else if (step.opcode.name === "REVERT") {
|
|
365
|
-
const [offsetBuffer, lengthBuffer] = this._getFromStack(stack, 2);
|
|
366
|
-
const length = bytesToBigInt(lengthBuffer);
|
|
367
|
-
const offset = bytesToBigInt(offsetBuffer);
|
|
368
|
-
|
|
369
|
-
const [gasIncrease, addedWords] = this._memoryExpansion(
|
|
370
|
-
BigInt(memory.length),
|
|
371
|
-
length + offset
|
|
372
|
-
);
|
|
373
|
-
|
|
374
|
-
gasCost += Number(gasIncrease);
|
|
375
|
-
|
|
376
|
-
for (let i = 0; i < addedWords; i++) {
|
|
377
|
-
memory.push(EMPTY_MEMORY_WORD);
|
|
378
|
-
}
|
|
379
|
-
} else if (step.opcode.name === "CREATE2") {
|
|
380
|
-
const [, , memoryUsedBuffer] = this._getFromStack(stack, 3);
|
|
381
|
-
const memoryUsed = bytesToBigInt(memoryUsedBuffer);
|
|
382
|
-
const sha3ExtraCost =
|
|
383
|
-
BigIntUtils.divUp(memoryUsed, 32n) * this._sha3WordGas();
|
|
384
|
-
gasCost += Number(sha3ExtraCost);
|
|
385
|
-
} else if (
|
|
386
|
-
step.opcode.name === "CALL" ||
|
|
387
|
-
step.opcode.name === "STATICCALL" ||
|
|
388
|
-
step.opcode.name === "DELEGATECALL"
|
|
389
|
-
) {
|
|
390
|
-
// this is a port of what geth does to compute the
|
|
391
|
-
// gasCost of a *CALL step, with some simplifications
|
|
392
|
-
// because we don't support pre-spuriousDragon hardforks
|
|
393
|
-
let valueBuffer = Uint8Array.from([]);
|
|
394
|
-
let [
|
|
395
|
-
callCostBuffer,
|
|
396
|
-
recipientAddressBuffer,
|
|
397
|
-
inBuffer,
|
|
398
|
-
inSizeBuffer,
|
|
399
|
-
outBuffer,
|
|
400
|
-
outSizeBuffer,
|
|
401
|
-
] = this._getFromStack(stack, 6);
|
|
402
|
-
|
|
403
|
-
// CALL has 7 parameters
|
|
404
|
-
if (step.opcode.name === "CALL") {
|
|
405
|
-
[
|
|
406
|
-
callCostBuffer,
|
|
407
|
-
recipientAddressBuffer,
|
|
408
|
-
valueBuffer,
|
|
409
|
-
inBuffer,
|
|
410
|
-
inSizeBuffer,
|
|
411
|
-
outBuffer,
|
|
412
|
-
outSizeBuffer,
|
|
413
|
-
] = this._getFromStack(stack, 7);
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
const callCost = bytesToBigInt(callCostBuffer);
|
|
417
|
-
|
|
418
|
-
const value = bytesToBigInt(valueBuffer);
|
|
419
|
-
|
|
420
|
-
const memoryLength = BigInt(memory.length);
|
|
421
|
-
const inBN = bytesToBigInt(inBuffer);
|
|
422
|
-
const inSizeBN = bytesToBigInt(inSizeBuffer);
|
|
423
|
-
const inPosition = inSizeBN === 0n ? inSizeBN : inBN + inSizeBN;
|
|
424
|
-
const outBN = bytesToBigInt(outBuffer);
|
|
425
|
-
const outSizeBN = bytesToBigInt(outSizeBuffer);
|
|
426
|
-
const outPosition = outSizeBN === 0n ? outSizeBN : outBN + outSizeBN;
|
|
427
|
-
const memSize = inPosition > outPosition ? inPosition : outPosition;
|
|
428
|
-
const toAddress = new Address(recipientAddressBuffer.slice(-20));
|
|
429
|
-
|
|
430
|
-
const constantGas = this._callConstantGas();
|
|
431
|
-
const availableGas = step.gasLeft - constantGas;
|
|
432
|
-
|
|
433
|
-
const [memoryGas] = this._memoryExpansion(memoryLength, memSize);
|
|
434
|
-
|
|
435
|
-
const dynamicGas = await this._callDynamicGas(
|
|
436
|
-
toAddress,
|
|
437
|
-
value,
|
|
438
|
-
availableGas,
|
|
439
|
-
memoryGas,
|
|
440
|
-
callCost
|
|
441
|
-
);
|
|
442
|
-
|
|
443
|
-
gasCost = Number(constantGas + dynamicGas);
|
|
444
|
-
} else if (step.opcode.name === "CALLCODE") {
|
|
445
|
-
// finding an existing tx that uses CALLCODE or compiling a contract
|
|
446
|
-
// so that it uses this opcode is hard,
|
|
447
|
-
// so we just throw
|
|
448
|
-
throw new InvalidInputError(
|
|
449
|
-
"Transactions that use CALLCODE are not supported by Hardhat's debug_traceTransaction"
|
|
450
|
-
);
|
|
451
|
-
} else if (step.opcode.name === "INVALID") {
|
|
452
|
-
const code = await this._getContractCode(step.codeAddress);
|
|
453
|
-
|
|
454
|
-
const opcodeHex = code[step.pc].toString(16);
|
|
455
|
-
op = `opcode 0x${opcodeHex} not defined`;
|
|
456
|
-
error = {};
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
const structLog: StructLog = {
|
|
460
|
-
pc: step.pc,
|
|
461
|
-
op,
|
|
462
|
-
gas: Number(step.gasLeft),
|
|
463
|
-
gasCost,
|
|
464
|
-
depth: step.depth + 1,
|
|
465
|
-
stack,
|
|
466
|
-
memory,
|
|
467
|
-
storage,
|
|
468
|
-
memSize: Number(step.memoryWordCount),
|
|
469
|
-
};
|
|
470
|
-
|
|
471
|
-
if (error !== undefined) {
|
|
472
|
-
structLog.error = error;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
return structLog;
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
private _memoryGas(): bigint {
|
|
479
|
-
return this._vm.common.param("gasPrices", "memory");
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
private _sha3WordGas(): bigint {
|
|
483
|
-
return this._vm.common.param("gasPrices", "sha3Word");
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
private _callConstantGas(): bigint {
|
|
487
|
-
if (this._vm.common.gteHardfork("berlin")) {
|
|
488
|
-
return this._vm.common.param("gasPrices", "warmstorageread");
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
return this._vm.common.param("gasPrices", "call");
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
private _callNewAccountGas(): bigint {
|
|
495
|
-
return this._vm.common.param("gasPrices", "callNewAccount");
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
private _callValueTransferGas(): bigint {
|
|
499
|
-
return this._vm.common.param("gasPrices", "callValueTransfer");
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
private _quadCoeffDiv(): bigint {
|
|
503
|
-
return this._vm.common.param("gasPrices", "quadCoeffDiv");
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
private async _isAddressEmpty(address: Address): Promise<boolean> {
|
|
507
|
-
const account = await this._vm.stateManager.getAccount(address);
|
|
508
|
-
return account?.isEmpty() ?? true;
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
private _getContractStorage(
|
|
512
|
-
address: Address,
|
|
513
|
-
key: Uint8Array
|
|
514
|
-
): Promise<Uint8Array> {
|
|
515
|
-
return this._vm.stateManager.getContractStorage(address, key);
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
private _getContractCode(address: Address): Promise<Uint8Array> {
|
|
519
|
-
return this._vm.stateManager.getContractCode(address);
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
private async _callDynamicGas(
|
|
523
|
-
address: Address,
|
|
524
|
-
value: bigint,
|
|
525
|
-
availableGas: bigint,
|
|
526
|
-
memoryGas: bigint,
|
|
527
|
-
callCost: bigint
|
|
528
|
-
): Promise<bigint> {
|
|
529
|
-
// The available gas is reduced when the address is cold
|
|
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());
|
|
536
|
-
|
|
537
|
-
const coldCost =
|
|
538
|
-
this._vm.common.param("gasPrices", "coldaccountaccess") -
|
|
539
|
-
this._vm.common.param("gasPrices", "warmstorageread");
|
|
540
|
-
|
|
541
|
-
// This comment is copied verbatim from geth:
|
|
542
|
-
// The WarmStorageReadCostEIP2929 (100) is already deducted in the form of a constant cost, so
|
|
543
|
-
// the cost to charge for cold access, if any, is Cold - Warm
|
|
544
|
-
if (!isWarmed) {
|
|
545
|
-
availableGas -= coldCost;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
let gas = 0n;
|
|
550
|
-
|
|
551
|
-
const transfersValue = value !== 0n;
|
|
552
|
-
const addressIsEmpty = await this._isAddressEmpty(address);
|
|
553
|
-
|
|
554
|
-
if (transfersValue && addressIsEmpty) {
|
|
555
|
-
gas += this._callNewAccountGas();
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
if (transfersValue) {
|
|
559
|
-
gas += this._callValueTransferGas();
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
gas += memoryGas;
|
|
563
|
-
|
|
564
|
-
gas += this._callGas(availableGas, gas, callCost);
|
|
565
|
-
|
|
566
|
-
return gas;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
private _callGas(
|
|
570
|
-
availableGas: bigint,
|
|
571
|
-
base: bigint,
|
|
572
|
-
callCost: bigint
|
|
573
|
-
): bigint {
|
|
574
|
-
availableGas -= base;
|
|
575
|
-
|
|
576
|
-
const gas = availableGas - availableGas / 64n;
|
|
577
|
-
|
|
578
|
-
if (callCost > gas) {
|
|
579
|
-
return gas;
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
return callCost;
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
/**
|
|
586
|
-
* Returns the increase in gas and the number of added words
|
|
587
|
-
*/
|
|
588
|
-
private _memoryExpansion(
|
|
589
|
-
currentWords: bigint,
|
|
590
|
-
newSize: bigint
|
|
591
|
-
): [bigint, bigint] {
|
|
592
|
-
const currentSize = currentWords * 32n;
|
|
593
|
-
const currentWordsLength = (currentSize + 31n) / 32n;
|
|
594
|
-
const newWordsLength = (newSize + 31n) / 32n;
|
|
595
|
-
|
|
596
|
-
const wordsDiff = newWordsLength - currentWordsLength;
|
|
597
|
-
|
|
598
|
-
if (newSize > currentSize) {
|
|
599
|
-
const newTotalFee = this._memoryFee(newWordsLength);
|
|
600
|
-
const currentTotalFee = this._memoryFee(currentWordsLength);
|
|
601
|
-
|
|
602
|
-
const fee = newTotalFee - currentTotalFee;
|
|
603
|
-
|
|
604
|
-
return [fee, wordsDiff];
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
return [0n, 0n];
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
private _getFromStack(stack: string[], count: number): Uint8Array[] {
|
|
611
|
-
return stack
|
|
612
|
-
.slice(-count)
|
|
613
|
-
.reverse()
|
|
614
|
-
.map((value) => `0x${value}`)
|
|
615
|
-
.map(toBytes);
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
private _memoryFee(words: bigint): bigint {
|
|
619
|
-
const square = words * words;
|
|
620
|
-
const linCoef = words * this._memoryGas();
|
|
621
|
-
const quadCoef = square / this._quadCoeffDiv();
|
|
622
|
-
const newTotalFee = linCoef + quadCoef;
|
|
623
|
-
|
|
624
|
-
return newTotalFee;
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
function toWord(b: Uint8Array): string {
|
|
629
|
-
return Buffer.from(b).toString("hex").padStart(64, "0");
|
|
630
|
-
}
|