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
|
@@ -48,7 +48,6 @@ import {
|
|
|
48
48
|
Uint256Ty,
|
|
49
49
|
} from "./logger";
|
|
50
50
|
import {
|
|
51
|
-
CallMessageTrace,
|
|
52
51
|
EvmMessageTrace,
|
|
53
52
|
isCallTrace,
|
|
54
53
|
isEvmStep,
|
|
@@ -77,18 +76,9 @@ export class ConsoleLogger {
|
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
public getLogMessages(maybeDecodedMessageTrace: MessageTrace): string[] {
|
|
80
|
-
return this.getExecutionLogs(maybeDecodedMessageTrace).map(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// special case for console.log()
|
|
86
|
-
if (log.length === 0) {
|
|
87
|
-
return "";
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return util.format(log[0], ...log.slice(1));
|
|
91
|
-
});
|
|
79
|
+
return this.getExecutionLogs(maybeDecodedMessageTrace).map(
|
|
80
|
+
consoleLogToString
|
|
81
|
+
);
|
|
92
82
|
}
|
|
93
83
|
|
|
94
84
|
public getExecutionLogs(
|
|
@@ -113,7 +103,7 @@ export class ConsoleLogger {
|
|
|
113
103
|
isCallTrace(messageTrace) &&
|
|
114
104
|
bufferToHex(messageTrace.address) === CONSOLE_ADDRESS.toLowerCase()
|
|
115
105
|
) {
|
|
116
|
-
const log = this._maybeConsoleLog(messageTrace);
|
|
106
|
+
const log = this._maybeConsoleLog(Buffer.from(messageTrace.calldata));
|
|
117
107
|
if (log !== undefined) {
|
|
118
108
|
logs.push(log);
|
|
119
109
|
}
|
|
@@ -125,9 +115,25 @@ export class ConsoleLogger {
|
|
|
125
115
|
}
|
|
126
116
|
}
|
|
127
117
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Temporary code to print console.sol messages that come from EDR
|
|
120
|
+
*/
|
|
121
|
+
public getDecodedLogs(messages: Buffer[]): string[] {
|
|
122
|
+
const logs: string[] = [];
|
|
123
|
+
|
|
124
|
+
for (const message of messages) {
|
|
125
|
+
const log = this._maybeConsoleLog(message);
|
|
126
|
+
if (log !== undefined) {
|
|
127
|
+
logs.push(consoleLogToString(log));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return logs;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private _maybeConsoleLog(calldata: Buffer): ConsoleLogs | undefined {
|
|
135
|
+
const sig = bytesToInt(calldata.slice(0, 4));
|
|
136
|
+
const parameters = calldata.slice(4);
|
|
131
137
|
|
|
132
138
|
const types = this._consoleLogs[sig];
|
|
133
139
|
if (types === undefined) {
|
|
@@ -162,7 +168,7 @@ export class ConsoleLogger {
|
|
|
162
168
|
}
|
|
163
169
|
}
|
|
164
170
|
|
|
165
|
-
private _decode(data:
|
|
171
|
+
private _decode(data: Buffer, types: string[]): ConsoleLogs {
|
|
166
172
|
return types.map((type, i) => {
|
|
167
173
|
const position: number = i * 32;
|
|
168
174
|
switch (types[i]) {
|
|
@@ -187,9 +193,9 @@ export class ConsoleLogger {
|
|
|
187
193
|
data.slice(position, position + REGISTER_SIZE)
|
|
188
194
|
);
|
|
189
195
|
const sLen = bytesToInt(data.slice(sStart, sStart + REGISTER_SIZE));
|
|
190
|
-
return
|
|
191
|
-
|
|
192
|
-
|
|
196
|
+
return data
|
|
197
|
+
.slice(sStart + REGISTER_SIZE, sStart + REGISTER_SIZE + sLen)
|
|
198
|
+
.toString();
|
|
193
199
|
|
|
194
200
|
case AddressTy:
|
|
195
201
|
return bufferToHex(
|
|
@@ -276,3 +282,16 @@ export class ConsoleLogger {
|
|
|
276
282
|
});
|
|
277
283
|
}
|
|
278
284
|
}
|
|
285
|
+
|
|
286
|
+
export function consoleLogToString(log: ConsoleLogs): string {
|
|
287
|
+
if (log === undefined) {
|
|
288
|
+
return "";
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// special case for console.log()
|
|
292
|
+
if (log.length === 0) {
|
|
293
|
+
return "";
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return util.format(log[0], ...log.slice(1));
|
|
297
|
+
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { bytesToHex
|
|
1
|
+
import { bytesToHex } from "@nomicfoundation/ethereumjs-util";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
normalizeLibraryRuntimeBytecodeIfNecessary,
|
|
5
5
|
zeroOutAddresses,
|
|
6
6
|
zeroOutSlices,
|
|
7
7
|
} from "./library-utils";
|
|
8
|
-
import { EvmMessageTrace, isCreateTrace } from "./message-trace";
|
|
9
8
|
import { Bytecode } from "./model";
|
|
10
9
|
import { getOpcodeLength, Opcode } from "./opcodes";
|
|
11
10
|
|
|
@@ -100,16 +99,15 @@ export class ContractsIdentifier {
|
|
|
100
99
|
this._cache.clear();
|
|
101
100
|
}
|
|
102
101
|
|
|
103
|
-
public
|
|
104
|
-
|
|
102
|
+
public getBytecodeForCall(
|
|
103
|
+
code: Uint8Array,
|
|
104
|
+
isCreate: boolean
|
|
105
105
|
): Bytecode | undefined {
|
|
106
|
-
const normalizedCode = normalizeLibraryRuntimeBytecodeIfNecessary(
|
|
107
|
-
trace.code
|
|
108
|
-
);
|
|
106
|
+
const normalizedCode = normalizeLibraryRuntimeBytecodeIfNecessary(code);
|
|
109
107
|
|
|
110
108
|
let normalizedCodeHex: string | undefined;
|
|
111
109
|
if (this._enableCache) {
|
|
112
|
-
normalizedCodeHex =
|
|
110
|
+
normalizedCodeHex = bytesToHex(normalizedCode);
|
|
113
111
|
const cached = this._cache.get(normalizedCodeHex);
|
|
114
112
|
|
|
115
113
|
if (cached !== undefined) {
|
|
@@ -117,7 +115,7 @@ export class ContractsIdentifier {
|
|
|
117
115
|
}
|
|
118
116
|
}
|
|
119
117
|
|
|
120
|
-
const result = this._searchBytecode(
|
|
118
|
+
const result = this._searchBytecode(isCreate, normalizedCode);
|
|
121
119
|
|
|
122
120
|
if (this._enableCache) {
|
|
123
121
|
if (result !== undefined) {
|
|
@@ -129,7 +127,7 @@ export class ContractsIdentifier {
|
|
|
129
127
|
}
|
|
130
128
|
|
|
131
129
|
private _searchBytecode(
|
|
132
|
-
|
|
130
|
+
isCreate: boolean,
|
|
133
131
|
code: Uint8Array,
|
|
134
132
|
normalizeLibraries = true,
|
|
135
133
|
trie = this._trie,
|
|
@@ -159,7 +157,7 @@ export class ContractsIdentifier {
|
|
|
159
157
|
// We take advantage of this last observation, and just return the bytecode that exactly
|
|
160
158
|
// matched the searchResult (sub)trie that we got.
|
|
161
159
|
if (
|
|
162
|
-
|
|
160
|
+
isCreate &&
|
|
163
161
|
searchResult.match !== undefined &&
|
|
164
162
|
searchResult.match.isDeployment
|
|
165
163
|
) {
|
|
@@ -186,7 +184,7 @@ export class ContractsIdentifier {
|
|
|
186
184
|
);
|
|
187
185
|
|
|
188
186
|
const normalizedResult = this._searchBytecode(
|
|
189
|
-
|
|
187
|
+
isCreate,
|
|
190
188
|
normalizedCode,
|
|
191
189
|
false,
|
|
192
190
|
searchResult,
|
|
@@ -58,8 +58,8 @@ export function printCreateTrace(trace: CreateMessageTrace, depth: number) {
|
|
|
58
58
|
);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
if (trace.
|
|
62
|
-
console.log(`${margin} error: ${trace.
|
|
61
|
+
if (trace.exit.isError()) {
|
|
62
|
+
console.log(`${margin} error: ${trace.exit.getReason()}`);
|
|
63
63
|
|
|
64
64
|
// The return data is the deployed-bytecode if there was no error, so we don't show it
|
|
65
65
|
console.log(`${margin} returnData: ${bufferToHex(trace.returnData)}`);
|
|
@@ -79,8 +79,8 @@ export function printPrecompileTrace(
|
|
|
79
79
|
console.log(`${margin} value: ${trace.value.toString(10)}`);
|
|
80
80
|
console.log(`${margin} calldata: ${bufferToHex(trace.calldata)}`);
|
|
81
81
|
|
|
82
|
-
if (trace.
|
|
83
|
-
console.log(`${margin} error: ${trace.
|
|
82
|
+
if (trace.exit.isError()) {
|
|
83
|
+
console.log(`${margin} error: ${trace.exit.getReason()}`);
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
console.log(`${margin} returnData: ${bufferToHex(trace.returnData)}`);
|
|
@@ -104,8 +104,8 @@ export function printCallTrace(trace: CallMessageTrace, depth: number) {
|
|
|
104
104
|
console.log(`${margin} value: ${trace.value.toString(10)}`);
|
|
105
105
|
console.log(`${margin} calldata: ${bufferToHex(trace.calldata)}`);
|
|
106
106
|
|
|
107
|
-
if (trace.
|
|
108
|
-
console.log(`${margin} error: ${trace.
|
|
107
|
+
if (trace.exit.isError()) {
|
|
108
|
+
console.log(`${margin} error: ${trace.exit.getReason()}`);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
console.log(`${margin} returnData: ${bufferToHex(trace.returnData)}`);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/* eslint "@typescript-eslint/no-non-null-assertion": "error" */
|
|
2
2
|
import { defaultAbiCoder as abi } from "@ethersproject/abi";
|
|
3
|
-
import { ERROR } from "@nomicfoundation/ethereumjs-evm/dist/cjs/exceptions";
|
|
4
3
|
import { equalsBytes } from "@nomicfoundation/ethereumjs-util";
|
|
5
4
|
import semver from "semver";
|
|
6
5
|
|
|
7
6
|
import { assertHardhatInvariant } from "../../core/errors";
|
|
8
7
|
import { AbiHelpers } from "../../util/abi-helpers";
|
|
9
8
|
import { ReturnData } from "../provider/return-data";
|
|
9
|
+
import { ExitCode } from "../provider/vm/exit";
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
12
|
DecodedCallMessageTrace,
|
|
@@ -275,8 +275,7 @@ export class ErrorInferrer {
|
|
|
275
275
|
callInst
|
|
276
276
|
);
|
|
277
277
|
|
|
278
|
-
const lastMessageFailed =
|
|
279
|
-
lastSubmessageData.messageTrace.error !== undefined;
|
|
278
|
+
const lastMessageFailed = lastSubmessageData.messageTrace.exit.isError();
|
|
280
279
|
if (lastMessageFailed) {
|
|
281
280
|
// add the call/create that generated the message to the stack trace
|
|
282
281
|
inferredStacktrace.push(callStackFrame);
|
|
@@ -579,6 +578,10 @@ export class ErrorInferrer {
|
|
|
579
578
|
functionJumpdests: Instruction[],
|
|
580
579
|
jumpedIntoFunction: boolean
|
|
581
580
|
): SolidityStackTrace | undefined {
|
|
581
|
+
if (trace.steps.length === 0) {
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
|
|
582
585
|
const lastStep = trace.steps[trace.steps.length - 1];
|
|
583
586
|
|
|
584
587
|
if (!isEvmStep(lastStep)) {
|
|
@@ -1211,6 +1214,10 @@ export class ErrorInferrer {
|
|
|
1211
1214
|
}
|
|
1212
1215
|
|
|
1213
1216
|
private _solidity063MaybeUnmappedRevert(trace: DecodedEvmMessageTrace) {
|
|
1217
|
+
if (trace.steps.length === 0) {
|
|
1218
|
+
return false;
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1214
1221
|
const lastStep = trace.steps[trace.steps.length - 1];
|
|
1215
1222
|
if (!isEvmStep(lastStep)) {
|
|
1216
1223
|
return false;
|
|
@@ -1425,7 +1432,7 @@ export class ErrorInferrer {
|
|
|
1425
1432
|
}
|
|
1426
1433
|
|
|
1427
1434
|
private _isContractTooLargeError(trace: DecodedCreateMessageTrace) {
|
|
1428
|
-
return trace.
|
|
1435
|
+
return trace.exit.kind === ExitCode.CODESIZE_EXCEEDS_MAXIMUM;
|
|
1429
1436
|
}
|
|
1430
1437
|
|
|
1431
1438
|
private _solidity063CorrectLineNumber(
|
|
@@ -1629,8 +1636,8 @@ export class ErrorInferrer {
|
|
|
1629
1636
|
}
|
|
1630
1637
|
|
|
1631
1638
|
if (
|
|
1632
|
-
trace.
|
|
1633
|
-
call.
|
|
1639
|
+
trace.exit.kind === ExitCode.OUT_OF_GAS &&
|
|
1640
|
+
call.exit.kind === ExitCode.OUT_OF_GAS
|
|
1634
1641
|
) {
|
|
1635
1642
|
return true;
|
|
1636
1643
|
}
|
|
@@ -1719,12 +1726,12 @@ export class ErrorInferrer {
|
|
|
1719
1726
|
return false;
|
|
1720
1727
|
}
|
|
1721
1728
|
|
|
1722
|
-
if (trace.
|
|
1729
|
+
if (trace.exit.kind !== ExitCode.REVERT) {
|
|
1723
1730
|
return false;
|
|
1724
1731
|
}
|
|
1725
1732
|
|
|
1726
1733
|
const call = trace.steps[callStepIndex] as MessageTrace;
|
|
1727
|
-
if (call.
|
|
1734
|
+
if (call.exit.kind !== ExitCode.OUT_OF_GAS) {
|
|
1728
1735
|
return false;
|
|
1729
1736
|
}
|
|
1730
1737
|
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import type { EvmError } from "@nomicfoundation/ethereumjs-evm";
|
|
2
|
-
|
|
3
1
|
import type { Bytecode } from "./model";
|
|
2
|
+
import type { Exit } from "../provider/vm/exit";
|
|
3
|
+
import type {
|
|
4
|
+
CallOutput,
|
|
5
|
+
CreateOutput,
|
|
6
|
+
HaltResult,
|
|
7
|
+
RevertResult,
|
|
8
|
+
SuccessResult,
|
|
9
|
+
} from "@nomicfoundation/edr";
|
|
4
10
|
|
|
5
11
|
export type MessageTrace =
|
|
6
12
|
| CreateMessageTrace
|
|
@@ -16,7 +22,7 @@ export type DecodedEvmMessageTrace =
|
|
|
16
22
|
export interface BaseMessageTrace {
|
|
17
23
|
value: bigint;
|
|
18
24
|
returnData: Uint8Array;
|
|
19
|
-
|
|
25
|
+
exit: Exit;
|
|
20
26
|
gasUsed: bigint;
|
|
21
27
|
depth: number;
|
|
22
28
|
}
|
|
@@ -30,7 +36,6 @@ export interface BaseEvmMessageTrace extends BaseMessageTrace {
|
|
|
30
36
|
code: Uint8Array;
|
|
31
37
|
value: bigint;
|
|
32
38
|
returnData: Uint8Array;
|
|
33
|
-
error?: EvmError;
|
|
34
39
|
steps: MessageTraceStep[];
|
|
35
40
|
bytecode?: Bytecode;
|
|
36
41
|
// The following is just an optimization: When processing this traces it's useful to know ahead of
|
|
@@ -93,3 +98,34 @@ export type MessageTraceStep = MessageTrace | EvmStep;
|
|
|
93
98
|
export interface EvmStep {
|
|
94
99
|
pc: number;
|
|
95
100
|
}
|
|
101
|
+
|
|
102
|
+
export function isCallOutput(
|
|
103
|
+
output: CallOutput | CreateOutput
|
|
104
|
+
): output is CallOutput {
|
|
105
|
+
return !isCreateOutput(output);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function isCreateOutput(
|
|
109
|
+
output: CallOutput | CreateOutput
|
|
110
|
+
): output is CreateOutput {
|
|
111
|
+
return "address" in output;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function isSuccessResult(
|
|
115
|
+
result: SuccessResult | RevertResult | HaltResult
|
|
116
|
+
): result is SuccessResult {
|
|
117
|
+
// Only need to check for one unique field
|
|
118
|
+
return "gasRefunded" in result;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function isRevertResult(
|
|
122
|
+
result: SuccessResult | RevertResult | HaltResult
|
|
123
|
+
): result is RevertResult {
|
|
124
|
+
return !("reason" in result);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function isHaltResult(
|
|
128
|
+
result: SuccessResult | RevertResult | HaltResult
|
|
129
|
+
): result is HaltResult {
|
|
130
|
+
return !("output" in result);
|
|
131
|
+
}
|
|
@@ -308,6 +308,49 @@ export class Instruction {
|
|
|
308
308
|
public readonly pushData?: Buffer,
|
|
309
309
|
public readonly location?: SourceLocation
|
|
310
310
|
) {}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Checks equality with another Instruction.
|
|
314
|
+
*/
|
|
315
|
+
public equals(other: Instruction): boolean {
|
|
316
|
+
if (this.pc !== other.pc) {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (this.opcode !== other.opcode) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (this.jumpType !== other.jumpType) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (this.pushData !== undefined) {
|
|
329
|
+
if (other.pushData === undefined) {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
if (!this.pushData.equals(other.pushData)) {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
} else if (other.pushData !== undefined) {
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (this.location !== undefined) {
|
|
341
|
+
if (other.location === undefined) {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (!this.location.equals(other.location)) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
} else if (other.location !== undefined) {
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
311
354
|
}
|
|
312
355
|
|
|
313
356
|
interface ImmutableReference {
|
|
@@ -345,4 +388,22 @@ export class Bytecode {
|
|
|
345
388
|
public hasInstruction(pc: number): boolean {
|
|
346
389
|
return this._pcToInstruction.has(pc);
|
|
347
390
|
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Checks equality with another Bytecode.
|
|
394
|
+
*/
|
|
395
|
+
public equals(other: Bytecode): boolean {
|
|
396
|
+
if (this._pcToInstruction.size !== other._pcToInstruction.size) {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
for (const [key, val] of this._pcToInstruction) {
|
|
401
|
+
const otherVal = other._pcToInstruction.get(key);
|
|
402
|
+
if (otherVal === undefined || !val.equals(otherVal)) {
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
348
409
|
}
|
|
@@ -306,6 +306,10 @@ export enum Opcode {
|
|
|
306
306
|
SELFDESTRUCT = 0xff,
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
+
export function opcodeName(opcode: number): string {
|
|
310
|
+
return Opcode[opcode] ?? `<unrecognized opcode ${opcode}>`;
|
|
311
|
+
}
|
|
312
|
+
|
|
309
313
|
export function isPush(opcode: Opcode) {
|
|
310
314
|
return opcode >= Opcode.PUSH1 && opcode <= Opcode.PUSH32;
|
|
311
315
|
}
|
|
@@ -66,8 +66,8 @@ export function encodeSolidityStackTrace(
|
|
|
66
66
|
if (previousStack !== undefined) {
|
|
67
67
|
stack = previousStack;
|
|
68
68
|
} else {
|
|
69
|
-
// We remove
|
|
70
|
-
stack.splice(0,
|
|
69
|
+
// We remove error management related stack traces
|
|
70
|
+
stack.splice(0, 1);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
for (const entry of stackTrace) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { ERROR } from "@nomicfoundation/ethereumjs-evm/dist/cjs/exceptions";
|
|
2
1
|
import { equalsBytes } from "@nomicfoundation/ethereumjs-util";
|
|
2
|
+
|
|
3
3
|
import { ReturnData } from "../provider/return-data";
|
|
4
|
+
import { ExitCode } from "../provider/vm/exit";
|
|
4
5
|
|
|
5
6
|
import {
|
|
6
7
|
ErrorInferrer,
|
|
@@ -39,7 +40,7 @@ export class SolidityTracer {
|
|
|
39
40
|
public getStackTrace(
|
|
40
41
|
maybeDecodedMessageTrace: MessageTrace
|
|
41
42
|
): SolidityStackTrace {
|
|
42
|
-
if (maybeDecodedMessageTrace.
|
|
43
|
+
if (!maybeDecodedMessageTrace.exit.isError()) {
|
|
43
44
|
return [];
|
|
44
45
|
}
|
|
45
46
|
|
|
@@ -80,7 +81,7 @@ export class SolidityTracer {
|
|
|
80
81
|
// This is not a very exact heuristic, but most of the time it will be right, as solidity
|
|
81
82
|
// reverts if a call fails, and most contracts are in solidity
|
|
82
83
|
if (
|
|
83
|
-
subtrace.
|
|
84
|
+
subtrace.exit.isError() &&
|
|
84
85
|
equalsBytes(trace.returnData, subtrace.returnData)
|
|
85
86
|
) {
|
|
86
87
|
let unrecognizedEntry: SolidityStackTraceEntry;
|
|
@@ -100,7 +101,7 @@ export class SolidityTracer {
|
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
if (trace.
|
|
104
|
+
if (trace.exit.kind === ExitCode.CODESIZE_EXCEEDS_MAXIMUM) {
|
|
104
105
|
return [
|
|
105
106
|
{
|
|
106
107
|
type: StackTraceEntryType.CONTRACT_TOO_LARGE_ERROR,
|
|
@@ -108,7 +109,7 @@ export class SolidityTracer {
|
|
|
108
109
|
];
|
|
109
110
|
}
|
|
110
111
|
|
|
111
|
-
const isInvalidOpcodeError = trace.
|
|
112
|
+
const isInvalidOpcodeError = trace.exit.kind === ExitCode.INVALID_OPCODE;
|
|
112
113
|
|
|
113
114
|
if (isCreateTrace(trace)) {
|
|
114
115
|
return [
|
|
@@ -1,10 +1,72 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import debug from "debug";
|
|
3
|
+
import { Reporter } from "../../sentry/reporter";
|
|
4
|
+
import { TracingConfig } from "../provider/node-types";
|
|
5
|
+
import { createModelsAndDecodeBytecodes } from "./compiler-to-model";
|
|
1
6
|
import { ContractsIdentifier } from "./contracts-identifier";
|
|
2
|
-
import {
|
|
3
|
-
|
|
7
|
+
import {
|
|
8
|
+
isCreateTrace,
|
|
9
|
+
isEvmStep,
|
|
10
|
+
isPrecompileTrace,
|
|
11
|
+
MessageTrace,
|
|
12
|
+
} from "./message-trace";
|
|
13
|
+
import { Bytecode, ContractFunctionType } from "./model";
|
|
14
|
+
import {
|
|
15
|
+
FALLBACK_FUNCTION_NAME,
|
|
16
|
+
RECEIVE_FUNCTION_NAME,
|
|
17
|
+
UNRECOGNIZED_CONTRACT_NAME,
|
|
18
|
+
UNRECOGNIZED_FUNCTION_NAME,
|
|
19
|
+
} from "./solidity-stack-trace";
|
|
20
|
+
|
|
21
|
+
const log = debug("hardhat:core:hardhat-network:node");
|
|
4
22
|
|
|
5
23
|
export class VmTraceDecoder {
|
|
6
24
|
constructor(private readonly _contractsIdentifier: ContractsIdentifier) {}
|
|
7
25
|
|
|
26
|
+
public getContractAndFunctionNamesForCall(
|
|
27
|
+
code: Buffer,
|
|
28
|
+
calldata?: Buffer
|
|
29
|
+
): { contractName: string; functionName?: string } {
|
|
30
|
+
const isCreate = calldata === undefined;
|
|
31
|
+
const bytecode = this._contractsIdentifier.getBytecodeForCall(
|
|
32
|
+
code,
|
|
33
|
+
isCreate
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const contractName = bytecode?.contract.name ?? UNRECOGNIZED_CONTRACT_NAME;
|
|
37
|
+
|
|
38
|
+
if (isCreate) {
|
|
39
|
+
return {
|
|
40
|
+
contractName,
|
|
41
|
+
};
|
|
42
|
+
} else {
|
|
43
|
+
if (bytecode === undefined) {
|
|
44
|
+
return {
|
|
45
|
+
contractName,
|
|
46
|
+
functionName: "",
|
|
47
|
+
};
|
|
48
|
+
} else {
|
|
49
|
+
const func = bytecode.contract.getFunctionFromSelector(
|
|
50
|
+
calldata.slice(0, 4)
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const functionName: string =
|
|
54
|
+
func === undefined
|
|
55
|
+
? UNRECOGNIZED_FUNCTION_NAME
|
|
56
|
+
: func.type === ContractFunctionType.FALLBACK
|
|
57
|
+
? FALLBACK_FUNCTION_NAME
|
|
58
|
+
: func.type === ContractFunctionType.RECEIVE
|
|
59
|
+
? RECEIVE_FUNCTION_NAME
|
|
60
|
+
: func.name;
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
contractName,
|
|
64
|
+
functionName,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
8
70
|
public tryToDecodeMessageTrace(messageTrace: MessageTrace): MessageTrace {
|
|
9
71
|
if (isPrecompileTrace(messageTrace)) {
|
|
10
72
|
return messageTrace;
|
|
@@ -12,8 +74,10 @@ export class VmTraceDecoder {
|
|
|
12
74
|
|
|
13
75
|
return {
|
|
14
76
|
...messageTrace,
|
|
15
|
-
bytecode:
|
|
16
|
-
|
|
77
|
+
bytecode: this._contractsIdentifier.getBytecodeForCall(
|
|
78
|
+
messageTrace.code,
|
|
79
|
+
isCreateTrace(messageTrace)
|
|
80
|
+
),
|
|
17
81
|
steps: messageTrace.steps.map((s) =>
|
|
18
82
|
isEvmStep(s) ? s : this.tryToDecodeMessageTrace(s)
|
|
19
83
|
),
|
|
@@ -24,3 +88,48 @@ export class VmTraceDecoder {
|
|
|
24
88
|
this._contractsIdentifier.addBytecode(bytecode);
|
|
25
89
|
}
|
|
26
90
|
}
|
|
91
|
+
|
|
92
|
+
export function initializeVmTraceDecoder(
|
|
93
|
+
vmTraceDecoder: VmTraceDecoder,
|
|
94
|
+
tracingConfig: TracingConfig
|
|
95
|
+
) {
|
|
96
|
+
if (tracingConfig.buildInfos === undefined) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
for (const buildInfo of tracingConfig.buildInfos) {
|
|
102
|
+
const bytecodes = createModelsAndDecodeBytecodes(
|
|
103
|
+
buildInfo.solcVersion,
|
|
104
|
+
buildInfo.input,
|
|
105
|
+
buildInfo.output
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
for (const bytecode of bytecodes) {
|
|
109
|
+
if (
|
|
110
|
+
tracingConfig.ignoreContracts === true &&
|
|
111
|
+
bytecode.contract.name.startsWith("Ignored")
|
|
112
|
+
) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
vmTraceDecoder.addBytecode(bytecode);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.warn(
|
|
121
|
+
chalk.yellow(
|
|
122
|
+
"The Hardhat Network tracing engine could not be initialized. Run Hardhat with --verbose to learn more."
|
|
123
|
+
)
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
log(
|
|
127
|
+
"Hardhat Network tracing disabled: ContractsIdentifier failed to be initialized. Please report this to help us improve Hardhat.\n",
|
|
128
|
+
error
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (error instanceof Error) {
|
|
132
|
+
Reporter.reportError(error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|