hardhat 2.10.1 → 2.11.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/README.md +1 -1
- package/builtin-tasks/compile.js +6 -8
- package/builtin-tasks/compile.js.map +1 -1
- package/builtin-tasks/node.js +9 -12
- package/builtin-tasks/node.js.map +1 -1
- package/builtin-tasks/test.js +2 -3
- package/builtin-tasks/test.js.map +1 -1
- package/console.sol +444 -444
- package/internal/artifacts.js +1 -1
- package/internal/artifacts.js.map +1 -1
- package/internal/cli/ArgumentsParser.js +5 -2
- package/internal/cli/ArgumentsParser.js.map +1 -1
- package/internal/cli/analytics.js +2 -2
- package/internal/cli/analytics.js.map +1 -1
- package/internal/cli/autocomplete.js +20 -32
- package/internal/cli/autocomplete.js.map +1 -1
- package/internal/cli/cli.js +1 -1
- package/internal/cli/cli.js.map +1 -1
- package/internal/cli/project-creation.js +14 -4
- package/internal/cli/project-creation.js.map +1 -1
- package/internal/constants.d.ts.map +1 -1
- package/internal/constants.js +2 -0
- package/internal/constants.js.map +1 -1
- package/internal/core/config/config-loading.js +2 -3
- package/internal/core/config/config-loading.js.map +1 -1
- package/internal/core/config/config-resolution.d.ts.map +1 -1
- package/internal/core/config/config-resolution.js +84 -35
- package/internal/core/config/config-resolution.js.map +1 -1
- package/internal/core/config/config-validation.js +38 -20
- package/internal/core/config/config-validation.js.map +1 -1
- package/internal/core/config/default-config.d.ts.map +1 -1
- package/internal/core/config/default-config.js +17 -4
- package/internal/core/config/default-config.js.map +1 -1
- package/internal/core/errors.js +4 -2
- package/internal/core/errors.js.map +1 -1
- package/internal/core/execution-mode.js +2 -2
- package/internal/core/execution-mode.js.map +1 -1
- package/internal/core/flamegraph.d.ts +10 -0
- package/internal/core/flamegraph.d.ts.map +1 -0
- package/internal/core/flamegraph.js +245 -0
- package/internal/core/flamegraph.js.map +1 -0
- package/internal/core/jsonrpc/types/base-types.d.ts +7 -8
- package/internal/core/jsonrpc/types/base-types.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/base-types.js +24 -24
- package/internal/core/jsonrpc/types/base-types.js.map +1 -1
- package/internal/core/jsonrpc/types/input/blockTag.d.ts +15 -10
- package/internal/core/jsonrpc/types/input/blockTag.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/input/blockTag.js +2 -0
- package/internal/core/jsonrpc/types/input/blockTag.js.map +1 -1
- package/internal/core/jsonrpc/types/input/callRequest.d.ts +5 -6
- package/internal/core/jsonrpc/types/input/callRequest.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/input/callRequest.js.map +1 -1
- package/internal/core/jsonrpc/types/input/filterRequest.d.ts +6 -7
- package/internal/core/jsonrpc/types/input/filterRequest.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/input/filterRequest.js.map +1 -1
- package/internal/core/jsonrpc/types/input/transactionRequest.d.ts +7 -8
- package/internal/core/jsonrpc/types/input/transactionRequest.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/input/transactionRequest.js.map +1 -1
- package/internal/core/jsonrpc/types/output/block.d.ts +29 -30
- package/internal/core/jsonrpc/types/output/block.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/output/block.js +8 -2
- package/internal/core/jsonrpc/types/output/block.js.map +1 -1
- package/internal/core/jsonrpc/types/output/log.d.ts +3 -4
- package/internal/core/jsonrpc/types/output/log.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/output/log.js.map +1 -1
- package/internal/core/jsonrpc/types/output/receipt.d.ts +10 -11
- package/internal/core/jsonrpc/types/output/receipt.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/output/receipt.js.map +1 -1
- package/internal/core/jsonrpc/types/output/transaction.d.ts +13 -14
- package/internal/core/jsonrpc/types/output/transaction.d.ts.map +1 -1
- package/internal/core/jsonrpc/types/output/transaction.js.map +1 -1
- package/internal/core/providers/accounts.d.ts.map +1 -1
- package/internal/core/providers/accounts.js +30 -24
- package/internal/core/providers/accounts.js.map +1 -1
- package/internal/core/providers/chainId.js +1 -1
- package/internal/core/providers/chainId.js.map +1 -1
- package/internal/core/providers/construction.d.ts.map +1 -1
- package/internal/core/providers/construction.js +5 -5
- package/internal/core/providers/construction.js.map +1 -1
- package/internal/core/providers/gas-providers.d.ts +4 -4
- package/internal/core/providers/gas-providers.d.ts.map +1 -1
- package/internal/core/providers/gas-providers.js +16 -15
- package/internal/core/providers/gas-providers.js.map +1 -1
- package/internal/core/providers/http.js +7 -2
- package/internal/core/providers/http.js.map +1 -1
- package/internal/core/providers/util.js +5 -8
- package/internal/core/providers/util.js.map +1 -1
- package/internal/core/runtime-environment.js +1 -1
- package/internal/core/runtime-environment.js.map +1 -1
- package/internal/core/task-profiling.d.ts +18 -0
- package/internal/core/task-profiling.d.ts.map +1 -0
- package/internal/core/task-profiling.js +50 -0
- package/internal/core/task-profiling.js.map +1 -0
- package/internal/core/typescript-support.js +3 -3
- package/internal/core/typescript-support.js.map +1 -1
- package/internal/hardhat-network/jsonrpc/client.d.ts +39 -39
- package/internal/hardhat-network/jsonrpc/client.d.ts.map +1 -1
- package/internal/hardhat-network/jsonrpc/client.js +14 -14
- package/internal/hardhat-network/jsonrpc/client.js.map +1 -1
- package/internal/hardhat-network/provider/BlockchainBase.d.ts +13 -10
- package/internal/hardhat-network/provider/BlockchainBase.d.ts.map +1 -1
- package/internal/hardhat-network/provider/BlockchainBase.js +38 -16
- package/internal/hardhat-network/provider/BlockchainBase.js.map +1 -1
- package/internal/hardhat-network/provider/BlockchainData.d.ts +15 -16
- package/internal/hardhat-network/provider/BlockchainData.d.ts.map +1 -1
- package/internal/hardhat-network/provider/BlockchainData.js +33 -29
- package/internal/hardhat-network/provider/BlockchainData.js.map +1 -1
- package/internal/hardhat-network/provider/HardhatBlockchain.d.ts +7 -8
- package/internal/hardhat-network/provider/HardhatBlockchain.d.ts.map +1 -1
- package/internal/hardhat-network/provider/HardhatBlockchain.js +13 -14
- package/internal/hardhat-network/provider/HardhatBlockchain.js.map +1 -1
- package/internal/hardhat-network/provider/PoolState.d.ts +1 -1
- package/internal/hardhat-network/provider/PoolState.d.ts.map +1 -1
- package/internal/hardhat-network/provider/PoolState.js +2 -3
- package/internal/hardhat-network/provider/PoolState.js.map +1 -1
- package/internal/hardhat-network/provider/TransactionQueue.d.ts +2 -3
- package/internal/hardhat-network/provider/TransactionQueue.d.ts.map +1 -1
- package/internal/hardhat-network/provider/TransactionQueue.js +3 -3
- package/internal/hardhat-network/provider/TransactionQueue.js.map +1 -1
- package/internal/hardhat-network/provider/TxPool.d.ts +8 -8
- package/internal/hardhat-network/provider/TxPool.d.ts.map +1 -1
- package/internal/hardhat-network/provider/TxPool.js +66 -68
- package/internal/hardhat-network/provider/TxPool.js.map +1 -1
- package/internal/hardhat-network/provider/ethereumjs-workarounds.js +2 -2
- package/internal/hardhat-network/provider/ethereumjs-workarounds.js.map +1 -1
- package/internal/hardhat-network/provider/filter.d.ts +5 -6
- package/internal/hardhat-network/provider/filter.d.ts.map +1 -1
- package/internal/hardhat-network/provider/filter.js +7 -8
- package/internal/hardhat-network/provider/filter.js.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts +10 -11
- package/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkBlockchain.js +51 -47
- package/internal/hardhat-network/provider/fork/ForkBlockchain.js.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts +8 -10
- package/internal/hardhat-network/provider/fork/ForkStateManager.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/ForkStateManager.js +51 -69
- package/internal/hardhat-network/provider/fork/ForkStateManager.js.map +1 -1
- package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts +1 -1
- package/internal/hardhat-network/provider/fork/rpcToBlockData.d.ts.map +1 -1
- package/internal/hardhat-network/provider/fork/rpcToBlockData.js +2 -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 +7 -11
- package/internal/hardhat-network/provider/fork/rpcToTxData.js.map +1 -1
- package/internal/hardhat-network/provider/modules/eth.d.ts +2 -1
- package/internal/hardhat-network/provider/modules/eth.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/eth.js +92 -68
- package/internal/hardhat-network/provider/modules/eth.js.map +1 -1
- package/internal/hardhat-network/provider/modules/evm.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/evm.js +14 -14
- package/internal/hardhat-network/provider/modules/evm.js.map +1 -1
- package/internal/hardhat-network/provider/modules/hardhat.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/hardhat.js +13 -13
- package/internal/hardhat-network/provider/modules/hardhat.js.map +1 -1
- package/internal/hardhat-network/provider/modules/logger.d.ts +7 -8
- package/internal/hardhat-network/provider/modules/logger.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/logger.js +29 -32
- package/internal/hardhat-network/provider/modules/logger.js.map +1 -1
- package/internal/hardhat-network/provider/modules/net.d.ts +1 -1
- package/internal/hardhat-network/provider/modules/net.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/personal.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/personal.js +3 -3
- package/internal/hardhat-network/provider/modules/personal.js.map +1 -1
- package/internal/hardhat-network/provider/modules/web3.d.ts.map +1 -1
- package/internal/hardhat-network/provider/modules/web3.js +5 -4
- package/internal/hardhat-network/provider/modules/web3.js.map +1 -1
- package/internal/hardhat-network/provider/node-types.d.ts +30 -29
- package/internal/hardhat-network/provider/node-types.d.ts.map +1 -1
- package/internal/hardhat-network/provider/node.d.ts +47 -42
- package/internal/hardhat-network/provider/node.d.ts.map +1 -1
- package/internal/hardhat-network/provider/node.js +262 -208
- package/internal/hardhat-network/provider/node.js.map +1 -1
- package/internal/hardhat-network/provider/output.d.ts +5 -6
- package/internal/hardhat-network/provider/output.d.ts.map +1 -1
- package/internal/hardhat-network/provider/output.js +39 -36
- package/internal/hardhat-network/provider/output.js.map +1 -1
- package/internal/hardhat-network/provider/provider.d.ts +1 -2
- package/internal/hardhat-network/provider/provider.d.ts.map +1 -1
- package/internal/hardhat-network/provider/provider.js.map +1 -1
- package/internal/hardhat-network/provider/return-data.d.ts +2 -2
- package/internal/hardhat-network/provider/return-data.d.ts.map +1 -1
- package/internal/hardhat-network/provider/return-data.js +4 -1
- package/internal/hardhat-network/provider/return-data.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts +5 -5
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js +60 -17
- package/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts +4 -4
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js +59 -16
- package/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts +3 -3
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js +41 -9
- package/internal/hardhat-network/provider/transactions/FakeSenderTransaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts +4 -4
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js +7 -23
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts +3 -3
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js +7 -22
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.js.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts +3 -3
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.d.ts.map +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js +1 -1
- package/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.js.map +1 -1
- package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts +5 -6
- package/internal/hardhat-network/provider/types/HardhatBlockchainInterface.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/fork-recomendations-banner.js +2 -3
- package/internal/hardhat-network/provider/utils/fork-recomendations-banner.js.map +1 -1
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.d.ts +1 -0
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.js +5 -1
- package/internal/hardhat-network/provider/utils/getCurrentTimestamp.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeAccount.d.ts +1 -1
- package/internal/hardhat-network/provider/utils/makeAccount.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeAccount.js +6 -6
- package/internal/hardhat-network/provider/utils/makeAccount.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeCommon.d.ts +2 -2
- package/internal/hardhat-network/provider/utils/makeCommon.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeCommon.js +7 -23
- package/internal/hardhat-network/provider/utils/makeCommon.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeForkClient.d.ts +1 -2
- package/internal/hardhat-network/provider/utils/makeForkClient.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeForkClient.js +7 -8
- package/internal/hardhat-network/provider/utils/makeForkClient.js.map +1 -1
- package/internal/hardhat-network/provider/utils/makeStateTrie.d.ts +1 -1
- package/internal/hardhat-network/provider/utils/makeStateTrie.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/makeStateTrie.js +4 -4
- package/internal/hardhat-network/provider/utils/makeStateTrie.js.map +1 -1
- package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts +6 -3
- package/internal/hardhat-network/provider/utils/putGenesisBlock.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/putGenesisBlock.js +22 -4
- package/internal/hardhat-network/provider/utils/putGenesisBlock.js.map +1 -1
- package/internal/hardhat-network/provider/utils/random.d.ts +15 -0
- package/internal/hardhat-network/provider/utils/random.d.ts.map +1 -0
- package/internal/hardhat-network/provider/utils/random.js +48 -0
- package/internal/hardhat-network/provider/utils/random.js.map +1 -0
- package/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.d.ts +1 -2
- package/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.js +5 -4
- package/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.js.map +1 -1
- package/internal/hardhat-network/provider/utils/reorgs-protection.d.ts +2 -2
- package/internal/hardhat-network/provider/utils/reorgs-protection.d.ts.map +1 -1
- package/internal/hardhat-network/provider/utils/reorgs-protection.js +7 -7
- package/internal/hardhat-network/provider/utils/reorgs-protection.js.map +1 -1
- package/internal/hardhat-network/provider/utils/txMapToArray.d.ts +1 -1
- package/internal/hardhat-network/provider/utils/txMapToArray.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/compiler-to-model.js +6 -8
- package/internal/hardhat-network/stack-traces/compiler-to-model.js.map +1 -1
- package/internal/hardhat-network/stack-traces/consoleLogger.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/consoleLogger.js +51 -47
- package/internal/hardhat-network/stack-traces/consoleLogger.js.map +1 -1
- package/internal/hardhat-network/stack-traces/constants.d.ts +3 -0
- package/internal/hardhat-network/stack-traces/constants.d.ts.map +1 -0
- package/internal/hardhat-network/stack-traces/constants.js +6 -0
- package/internal/hardhat-network/stack-traces/constants.js.map +1 -0
- package/internal/hardhat-network/stack-traces/contracts-identifier.js +2 -2
- package/internal/hardhat-network/stack-traces/contracts-identifier.js.map +1 -1
- package/internal/hardhat-network/stack-traces/debug.js +29 -19
- 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 +48 -26
- package/internal/hardhat-network/stack-traces/error-inferrer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/logger.d.ts +223 -2
- package/internal/hardhat-network/stack-traces/logger.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/logger.js +445 -224
- package/internal/hardhat-network/stack-traces/logger.js.map +1 -1
- package/internal/hardhat-network/stack-traces/message-trace.d.ts +6 -7
- package/internal/hardhat-network/stack-traces/message-trace.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/message-trace.js.map +1 -1
- package/internal/hardhat-network/stack-traces/model.js +6 -6
- package/internal/hardhat-network/stack-traces/model.js.map +1 -1
- package/internal/hardhat-network/stack-traces/panic-errors.d.ts +1 -2
- package/internal/hardhat-network/stack-traces/panic-errors.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/panic-errors.js +1 -1
- package/internal/hardhat-network/stack-traces/panic-errors.js.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-errors.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-errors.js +21 -12
- package/internal/hardhat-network/stack-traces/solidity-errors.js.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts +6 -5
- package/internal/hardhat-network/stack-traces/solidity-stack-trace.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/solidity-stack-trace.js.map +1 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.d.ts +1 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.js +5 -1
- package/internal/hardhat-network/stack-traces/solidityTracer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-debug-tracer.d.ts +2 -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 +79 -78
- package/internal/hardhat-network/stack-traces/vm-debug-tracer.js.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-trace-decoder.js +5 -1
- package/internal/hardhat-network/stack-traces/vm-trace-decoder.js.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-tracer.d.ts +3 -2
- package/internal/hardhat-network/stack-traces/vm-tracer.d.ts.map +1 -1
- package/internal/hardhat-network/stack-traces/vm-tracer.js +15 -16
- package/internal/hardhat-network/stack-traces/vm-tracer.js.map +1 -1
- package/internal/reset.js +1 -1
- package/internal/reset.js.map +1 -1
- package/internal/sentry/anonymizer.js +2 -3
- package/internal/sentry/anonymizer.js.map +1 -1
- package/internal/sentry/subprocess.js +1 -1
- package/internal/sentry/subprocess.js.map +1 -1
- package/internal/sentry/transport.js +3 -4
- package/internal/sentry/transport.js.map +1 -1
- package/internal/solidity/compilation-job.js +2 -4
- package/internal/solidity/compilation-job.js.map +1 -1
- package/internal/solidity/compiler/downloader.d.ts.map +1 -1
- package/internal/solidity/compiler/downloader.js +6 -6
- package/internal/solidity/compiler/downloader.js.map +1 -1
- package/internal/solidity/dependencyGraph.js +3 -5
- package/internal/solidity/dependencyGraph.js.map +1 -1
- package/internal/solidity/parse.js +1 -1
- package/internal/solidity/parse.js.map +1 -1
- package/internal/solidity/resolver.js +4 -1
- package/internal/solidity/resolver.js.map +1 -1
- package/internal/util/abi-helpers.js +1 -1
- package/internal/util/abi-helpers.js.map +1 -1
- package/internal/util/bigint.d.ts +25 -0
- package/internal/util/bigint.d.ts.map +1 -0
- package/internal/util/bigint.js +67 -0
- package/internal/util/bigint.js.map +1 -0
- package/internal/util/download.js +1 -1
- package/internal/util/download.js.map +1 -1
- package/internal/util/fs-utils.d.ts +32 -0
- package/internal/util/fs-utils.d.ts.map +1 -0
- package/internal/util/fs-utils.js +151 -0
- package/internal/util/fs-utils.js.map +1 -0
- package/internal/util/hardforks.d.ts +3 -3
- package/internal/util/hardforks.d.ts.map +1 -1
- package/internal/util/hardforks.js +5 -28
- package/internal/util/hardforks.js.map +1 -1
- package/internal/util/jsonrpc.js +1 -1
- package/internal/util/jsonrpc.js.map +1 -1
- package/internal/util/lazy.js +2 -2
- package/internal/util/lazy.js.map +1 -1
- package/internal/util/packageInfo.js +1 -1
- package/internal/util/packageInfo.js.map +1 -1
- package/internal/util/scripts-runner.js +5 -2
- package/internal/util/scripts-runner.js.map +1 -1
- package/internal/util/wei-values.d.ts +1 -2
- package/internal/util/wei-values.d.ts.map +1 -1
- package/internal/util/wei-values.js +9 -10
- package/internal/util/wei-values.js.map +1 -1
- package/internal/vendor/await-semaphore/index.d.ts +12 -0
- package/internal/vendor/await-semaphore/index.d.ts.map +1 -0
- package/internal/vendor/await-semaphore/index.js +64 -0
- package/internal/vendor/await-semaphore/index.js.map +1 -0
- package/package.json +13 -9
- package/profiling.d.ts +18 -0
- package/profiling.d.ts.map +1 -0
- package/profiling.js +32 -0
- package/profiling.js.map +1 -0
- package/sample-projects/javascript/scripts/deploy.js +3 -1
- package/sample-projects/javascript/test/Lock.js +1 -1
- package/sample-projects/typescript/scripts/deploy.ts +1 -1
- package/sample-projects/typescript/test/Lock.ts +1 -1
- package/src/builtin-tasks/node.ts +4 -6
- package/src/internal/constants.ts +3 -1
- package/src/internal/core/config/config-resolution.ts +30 -7
- package/src/internal/core/config/default-config.ts +12 -4
- package/src/internal/core/jsonrpc/types/base-types.ts +23 -24
- package/src/internal/core/jsonrpc/types/input/blockTag.ts +2 -4
- package/src/internal/core/jsonrpc/types/input/callRequest.ts +0 -4
- package/src/internal/core/jsonrpc/types/input/filterRequest.ts +0 -4
- package/src/internal/core/jsonrpc/types/input/transactionRequest.ts +0 -4
- package/src/internal/core/jsonrpc/types/output/block.ts +0 -4
- package/src/internal/core/jsonrpc/types/output/log.ts +0 -4
- package/src/internal/core/jsonrpc/types/output/receipt.ts +0 -4
- package/src/internal/core/jsonrpc/types/output/transaction.ts +0 -4
- package/src/internal/core/providers/accounts.ts +16 -26
- package/src/internal/core/providers/construction.ts +5 -3
- package/src/internal/core/providers/gas-providers.ts +25 -33
- package/src/internal/core/providers/util.ts +1 -1
- package/src/internal/hardhat-network/jsonrpc/client.ts +22 -22
- package/src/internal/hardhat-network/provider/BlockchainBase.ts +62 -25
- package/src/internal/hardhat-network/provider/BlockchainData.ts +39 -42
- package/src/internal/hardhat-network/provider/HardhatBlockchain.ts +21 -21
- package/src/internal/hardhat-network/provider/PoolState.ts +3 -4
- package/src/internal/hardhat-network/provider/TransactionQueue.ts +11 -8
- package/src/internal/hardhat-network/provider/TxPool.ts +62 -64
- package/src/internal/hardhat-network/provider/ethereumjs-workarounds.ts +3 -3
- package/src/internal/hardhat-network/provider/filter.ts +9 -12
- package/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts +52 -50
- package/src/internal/hardhat-network/provider/fork/ForkStateManager.ts +35 -60
- package/src/internal/hardhat-network/provider/fork/rpcToBlockData.ts +2 -2
- package/src/internal/hardhat-network/provider/fork/rpcToTxData.ts +3 -3
- package/src/internal/hardhat-network/provider/modules/eth.ts +88 -63
- package/src/internal/hardhat-network/provider/modules/evm.ts +19 -22
- package/src/internal/hardhat-network/provider/modules/hardhat.ts +21 -19
- package/src/internal/hardhat-network/provider/modules/logger.ts +33 -40
- package/src/internal/hardhat-network/provider/modules/net.ts +1 -1
- package/src/internal/hardhat-network/provider/modules/personal.ts +2 -1
- package/src/internal/hardhat-network/provider/modules/web3.ts +5 -4
- package/src/internal/hardhat-network/provider/node-types.ts +32 -31
- package/src/internal/hardhat-network/provider/node.ts +379 -343
- package/src/internal/hardhat-network/provider/output.ts +32 -37
- package/src/internal/hardhat-network/provider/provider.ts +5 -6
- package/src/internal/hardhat-network/provider/return-data.ts +6 -3
- package/src/internal/hardhat-network/provider/transactions/FakeSenderAccessListEIP2930Transaction.ts +51 -24
- package/src/internal/hardhat-network/provider/transactions/FakeSenderEIP1559Transaction.ts +50 -23
- package/src/internal/hardhat-network/provider/transactions/FakeSenderTransaction.ts +29 -11
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP1559Transaction.ts +12 -24
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidEIP2930Transaction.ts +11 -22
- package/src/internal/hardhat-network/provider/transactions/ReadOnlyValidTransaction.ts +3 -3
- package/src/internal/hardhat-network/provider/types/HardhatBlockchainInterface.ts +8 -9
- package/src/internal/hardhat-network/provider/utils/getCurrentTimestamp.ts +4 -0
- package/src/internal/hardhat-network/provider/utils/makeAccount.ts +4 -10
- package/src/internal/hardhat-network/provider/utils/makeCommon.ts +8 -34
- package/src/internal/hardhat-network/provider/utils/makeForkClient.ts +8 -9
- package/src/internal/hardhat-network/provider/utils/makeStateTrie.ts +3 -3
- package/src/internal/hardhat-network/provider/utils/putGenesisBlock.ts +34 -6
- package/src/internal/hardhat-network/provider/utils/random.ts +54 -0
- package/src/internal/hardhat-network/provider/utils/reorganizeTransactionsLists.ts +6 -7
- package/src/internal/hardhat-network/provider/utils/reorgs-protection.ts +8 -8
- package/src/internal/hardhat-network/stack-traces/consoleLogger.ts +16 -6
- package/src/internal/hardhat-network/stack-traces/contracts-identifier.ts +1 -1
- package/src/internal/hardhat-network/stack-traces/debug.ts +1 -1
- package/src/internal/hardhat-network/stack-traces/error-inferrer.ts +11 -7
- package/src/internal/hardhat-network/stack-traces/logger.ts +444 -223
- package/src/internal/hardhat-network/stack-traces/message-trace.ts +6 -7
- package/src/internal/hardhat-network/stack-traces/model.ts +1 -1
- package/src/internal/hardhat-network/stack-traces/panic-errors.ts +3 -5
- package/src/internal/hardhat-network/stack-traces/solidity-errors.ts +16 -1
- package/src/internal/hardhat-network/stack-traces/solidity-stack-trace.ts +6 -6
- package/src/internal/hardhat-network/stack-traces/solidityTracer.ts +6 -1
- package/src/internal/hardhat-network/stack-traces/vm-debug-tracer.ts +106 -103
- package/src/internal/hardhat-network/stack-traces/vm-tracer.ts +23 -18
- package/src/internal/solidity/compiler/downloader.ts +5 -2
- package/src/internal/util/bigint.ts +84 -0
- package/src/internal/util/hardforks.ts +4 -29
- package/src/internal/util/wei-values.ts +11 -13
- package/src/types/config.ts +8 -10
- package/types/config.d.ts +8 -9
- package/types/config.d.ts.map +1 -1
- package/src/internal/hardhat-network/provider/fork/random.ts +0 -33
- package/src/internal/hardhat-network/provider/utils/bnToHex.ts +0 -5
- package/src/internal/hardhat-network/provider/utils/makeForkCommon.ts +0 -15
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { BN } from "ethereumjs-util";
|
|
1
|
+
import type { EvmError } from "@ignored/evm";
|
|
3
2
|
|
|
4
3
|
import type { Bytecode } from "./model";
|
|
5
4
|
|
|
@@ -15,10 +14,10 @@ export type DecodedEvmMessageTrace =
|
|
|
15
14
|
| DecodedCallMessageTrace;
|
|
16
15
|
|
|
17
16
|
export interface BaseMessageTrace {
|
|
18
|
-
value:
|
|
17
|
+
value: bigint;
|
|
19
18
|
returnData: Buffer;
|
|
20
|
-
error?:
|
|
21
|
-
gasUsed:
|
|
19
|
+
error?: EvmError;
|
|
20
|
+
gasUsed: bigint;
|
|
22
21
|
depth: number;
|
|
23
22
|
}
|
|
24
23
|
|
|
@@ -29,9 +28,9 @@ export interface PrecompileMessageTrace extends BaseMessageTrace {
|
|
|
29
28
|
|
|
30
29
|
export interface BaseEvmMessageTrace extends BaseMessageTrace {
|
|
31
30
|
code: Buffer;
|
|
32
|
-
value:
|
|
31
|
+
value: bigint;
|
|
33
32
|
returnData: Buffer;
|
|
34
|
-
error?:
|
|
33
|
+
error?: EvmError;
|
|
35
34
|
steps: MessageTraceStep[];
|
|
36
35
|
bytecode?: Bytecode;
|
|
37
36
|
// The following is just an optimization: When processing this traces it's useful to know ahead of
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function panicErrorCodeToMessage(errorCode: BN): string {
|
|
1
|
+
export function panicErrorCodeToMessage(errorCode: number): string {
|
|
4
2
|
const reason = panicErrorCodeToReason(errorCode);
|
|
5
3
|
|
|
6
4
|
if (reason !== undefined) {
|
|
@@ -10,8 +8,8 @@ export function panicErrorCodeToMessage(errorCode: BN): string {
|
|
|
10
8
|
return `reverted with unknown panic code 0x${errorCode.toString(16)}`;
|
|
11
9
|
}
|
|
12
10
|
|
|
13
|
-
function panicErrorCodeToReason(errorCode:
|
|
14
|
-
switch (errorCode
|
|
11
|
+
function panicErrorCodeToReason(errorCode: number): string | undefined {
|
|
12
|
+
switch (errorCode) {
|
|
15
13
|
case 0x1:
|
|
16
14
|
return "Assertion error";
|
|
17
15
|
case 0x11:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { bufferToHex } from "
|
|
1
|
+
import { bufferToHex } from "@ignored/util";
|
|
2
2
|
|
|
3
3
|
import { panicErrorCodeToMessage } from "./panic-errors";
|
|
4
4
|
import {
|
|
@@ -263,6 +263,21 @@ function getMessageFromLastStackTraceEntry(
|
|
|
263
263
|
return `VM Exception while processing transaction: reverted with reason string '${stackTraceEntry.message.decodeError()}'`;
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
+
if (stackTraceEntry.message.isPanicReturnData()) {
|
|
267
|
+
const message = panicErrorCodeToMessage(
|
|
268
|
+
stackTraceEntry.message.decodePanic()
|
|
269
|
+
);
|
|
270
|
+
return `VM Exception while processing transaction: ${message}`;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (!stackTraceEntry.message.isEmpty()) {
|
|
274
|
+
return `VM Exception while processing transaction: reverted with an unrecognized custom error`;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (stackTraceEntry.isInvalidOpcodeError) {
|
|
278
|
+
return "VM Exception while processing transaction: invalid opcode";
|
|
279
|
+
}
|
|
280
|
+
|
|
266
281
|
return "Transaction reverted without a reason string";
|
|
267
282
|
|
|
268
283
|
case StackTraceEntryType.REVERT_ERROR:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { BN } from "ethereumjs-util";
|
|
2
|
-
|
|
3
1
|
import { ReturnData } from "../provider/return-data";
|
|
4
2
|
|
|
5
3
|
import { ContractFunctionType } from "./model";
|
|
@@ -82,7 +80,7 @@ export interface RevertErrorStackTraceEntry {
|
|
|
82
80
|
|
|
83
81
|
export interface PanicErrorStackTraceEntry {
|
|
84
82
|
type: StackTraceEntryType.PANIC_ERROR;
|
|
85
|
-
errorCode:
|
|
83
|
+
errorCode: number;
|
|
86
84
|
sourceReference: SourceReference;
|
|
87
85
|
}
|
|
88
86
|
|
|
@@ -100,7 +98,7 @@ export interface UnmappedSolc063RevertErrorStackTraceEntry {
|
|
|
100
98
|
|
|
101
99
|
export interface FunctionNotPayableErrorStackTraceEntry {
|
|
102
100
|
type: StackTraceEntryType.FUNCTION_NOT_PAYABLE_ERROR;
|
|
103
|
-
value:
|
|
101
|
+
value: bigint;
|
|
104
102
|
sourceReference: SourceReference;
|
|
105
103
|
}
|
|
106
104
|
|
|
@@ -111,13 +109,13 @@ export interface InvalidParamsErrorStackTraceEntry {
|
|
|
111
109
|
|
|
112
110
|
export interface FallbackNotPayableErrorStackTraceEntry {
|
|
113
111
|
type: StackTraceEntryType.FALLBACK_NOT_PAYABLE_ERROR;
|
|
114
|
-
value:
|
|
112
|
+
value: bigint;
|
|
115
113
|
sourceReference: SourceReference;
|
|
116
114
|
}
|
|
117
115
|
|
|
118
116
|
export interface FallbackNotPayableAndNoReceiveErrorStackTraceEntry {
|
|
119
117
|
type: StackTraceEntryType.FALLBACK_NOT_PAYABLE_AND_NO_RECEIVE_ERROR;
|
|
120
|
-
value:
|
|
118
|
+
value: bigint;
|
|
121
119
|
sourceReference: SourceReference;
|
|
122
120
|
}
|
|
123
121
|
|
|
@@ -155,6 +153,7 @@ export interface UnrecognizedCreateErrorStackTraceEntry {
|
|
|
155
153
|
type: StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR;
|
|
156
154
|
message: ReturnData;
|
|
157
155
|
sourceReference?: undefined;
|
|
156
|
+
isInvalidOpcodeError: boolean;
|
|
158
157
|
}
|
|
159
158
|
|
|
160
159
|
export interface UnrecognizedContractErrorStackTraceEntry {
|
|
@@ -162,6 +161,7 @@ export interface UnrecognizedContractErrorStackTraceEntry {
|
|
|
162
161
|
address: Buffer;
|
|
163
162
|
message: ReturnData;
|
|
164
163
|
sourceReference?: undefined;
|
|
164
|
+
isInvalidOpcodeError: boolean;
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
export interface OtherExecutionErrorStackTraceEntry {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ERROR } from "@ignored/evm/dist/exceptions";
|
|
1
2
|
import { ReturnData } from "../provider/return-data";
|
|
2
3
|
|
|
3
4
|
import {
|
|
@@ -31,7 +32,7 @@ import {
|
|
|
31
32
|
StackTraceEntryType,
|
|
32
33
|
} from "./solidity-stack-trace";
|
|
33
34
|
|
|
34
|
-
export const SUPPORTED_SOLIDITY_VERSION_RANGE = "<=0.8.
|
|
35
|
+
export const SUPPORTED_SOLIDITY_VERSION_RANGE = "<=0.8.16";
|
|
35
36
|
export const FIRST_SOLC_VERSION_SUPPORTED = "0.5.1";
|
|
36
37
|
|
|
37
38
|
export class SolidityTracer {
|
|
@@ -101,11 +102,14 @@ export class SolidityTracer {
|
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
|
|
105
|
+
const isInvalidOpcodeError = trace.error?.error === ERROR.INVALID_OPCODE;
|
|
106
|
+
|
|
104
107
|
if (isCreateTrace(trace)) {
|
|
105
108
|
return [
|
|
106
109
|
{
|
|
107
110
|
type: StackTraceEntryType.UNRECOGNIZED_CREATE_ERROR,
|
|
108
111
|
message: new ReturnData(trace.returnData),
|
|
112
|
+
isInvalidOpcodeError,
|
|
109
113
|
},
|
|
110
114
|
];
|
|
111
115
|
}
|
|
@@ -115,6 +119,7 @@ export class SolidityTracer {
|
|
|
115
119
|
type: StackTraceEntryType.UNRECOGNIZED_CONTRACT_ERROR,
|
|
116
120
|
address: trace.address,
|
|
117
121
|
message: new ReturnData(trace.returnData),
|
|
122
|
+
isInvalidOpcodeError,
|
|
118
123
|
},
|
|
119
124
|
];
|
|
120
125
|
}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import { TypedTransaction } from "@
|
|
2
|
-
import VM from "@
|
|
3
|
-
import { EVMResult } from "@
|
|
4
|
-
import { InterpreterStep } from "@
|
|
5
|
-
import Message from "@
|
|
1
|
+
import { TypedTransaction } from "@ignored/tx";
|
|
2
|
+
import { AfterTxEvent, VM } from "@ignored/vm";
|
|
3
|
+
import { EVM, EVMResult } from "@ignored/evm";
|
|
4
|
+
import { InterpreterStep } from "@ignored/evm/dist/interpreter";
|
|
5
|
+
import { Message } from "@ignored/evm/dist/message";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
Address,
|
|
8
|
+
bufferToBigInt,
|
|
9
|
+
setLengthLeft,
|
|
10
|
+
toBuffer,
|
|
11
|
+
} from "@ignored/util";
|
|
11
12
|
|
|
12
13
|
import { assertHardhatInvariant } from "../../core/errors";
|
|
13
14
|
import { RpcDebugTracingConfig } from "../../core/jsonrpc/types/input/debugTraceTransaction";
|
|
14
15
|
import { InvalidInputError } from "../../core/providers/errors";
|
|
15
16
|
import { RpcDebugTraceOutput, RpcStructLog } from "../provider/output";
|
|
17
|
+
import { BigIntUtils } from "../../util/bigint";
|
|
16
18
|
|
|
17
19
|
/* eslint-disable @nomiclabs/hardhat-internal-rules/only-hardhat-error */
|
|
18
20
|
|
|
@@ -54,6 +56,8 @@ export class VMDebugTracer {
|
|
|
54
56
|
private _messages: DebugMessage[] = [];
|
|
55
57
|
private _addressToStorage: Record<string, Storage> = {};
|
|
56
58
|
|
|
59
|
+
private _error: any;
|
|
60
|
+
|
|
57
61
|
constructor(private readonly _vm: VM) {
|
|
58
62
|
this._beforeMessageHandler = this._beforeMessageHandler.bind(this);
|
|
59
63
|
this._afterMessageHandler = this._afterMessageHandler.bind(this);
|
|
@@ -75,6 +79,10 @@ export class VMDebugTracer {
|
|
|
75
79
|
|
|
76
80
|
await action();
|
|
77
81
|
|
|
82
|
+
if (this._error !== undefined) {
|
|
83
|
+
throw this._error;
|
|
84
|
+
}
|
|
85
|
+
|
|
78
86
|
return this._getDebugTrace();
|
|
79
87
|
} finally {
|
|
80
88
|
this._disableTracing();
|
|
@@ -83,19 +91,25 @@ export class VMDebugTracer {
|
|
|
83
91
|
|
|
84
92
|
private _enableTracing(config: RpcDebugTracingConfig) {
|
|
85
93
|
this._vm.on("beforeTx", this._beforeTxHandler);
|
|
86
|
-
this._vm.on("beforeMessage", this._beforeMessageHandler);
|
|
87
|
-
this._vm.on("step", this._stepHandler);
|
|
88
|
-
this._vm.on("afterMessage", this._afterMessageHandler);
|
|
94
|
+
(this._vm.evm as EVM).on("beforeMessage", this._beforeMessageHandler);
|
|
95
|
+
(this._vm.evm as EVM).on("step", this._stepHandler);
|
|
96
|
+
(this._vm.evm as EVM).on("afterMessage", this._afterMessageHandler);
|
|
89
97
|
this._vm.on("afterTx", this._afterTxHandler);
|
|
90
98
|
this._config = config;
|
|
91
99
|
}
|
|
92
100
|
|
|
93
101
|
private _disableTracing() {
|
|
94
102
|
this._vm.removeListener("beforeTx", this._beforeTxHandler);
|
|
95
|
-
this._vm.removeListener(
|
|
96
|
-
|
|
103
|
+
(this._vm.evm as EVM).removeListener(
|
|
104
|
+
"beforeMessage",
|
|
105
|
+
this._beforeMessageHandler
|
|
106
|
+
);
|
|
107
|
+
(this._vm.evm as EVM).removeListener("step", this._stepHandler);
|
|
108
|
+
(this._vm.evm as EVM).removeListener(
|
|
109
|
+
"afterMessage",
|
|
110
|
+
this._afterMessageHandler
|
|
111
|
+
);
|
|
97
112
|
this._vm.removeListener("afterTx", this._afterTxHandler);
|
|
98
|
-
this._vm.removeListener("afterMessage", this._afterMessageHandler);
|
|
99
113
|
this._config = undefined;
|
|
100
114
|
}
|
|
101
115
|
|
|
@@ -133,13 +147,20 @@ export class VMDebugTracer {
|
|
|
133
147
|
}
|
|
134
148
|
|
|
135
149
|
private async _stepHandler(step: InterpreterStep, next: any) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
150
|
+
try {
|
|
151
|
+
assertHardhatInvariant(
|
|
152
|
+
this._messages.length > 0,
|
|
153
|
+
"Step handler should be called after at least one beforeMessage handler"
|
|
154
|
+
);
|
|
140
155
|
|
|
141
|
-
|
|
142
|
-
|
|
156
|
+
const structLog = await this._stepToStructLog(step);
|
|
157
|
+
this._messages[this._messages.length - 1].structLogs.push(structLog);
|
|
158
|
+
} catch (e: any) {
|
|
159
|
+
// errors thrown in event handlers are lost, so we save this error to
|
|
160
|
+
// re-throw it in the `trace` function
|
|
161
|
+
this._error = e;
|
|
162
|
+
this._disableTracing();
|
|
163
|
+
}
|
|
143
164
|
|
|
144
165
|
next();
|
|
145
166
|
}
|
|
@@ -156,7 +177,7 @@ export class VMDebugTracer {
|
|
|
156
177
|
next();
|
|
157
178
|
}
|
|
158
179
|
|
|
159
|
-
private async _afterTxHandler(result:
|
|
180
|
+
private async _afterTxHandler(result: AfterTxEvent, next: any) {
|
|
160
181
|
const { default: flattenDeep } = await import("lodash/flattenDeep");
|
|
161
182
|
const topLevelMessage = this._messages[0];
|
|
162
183
|
|
|
@@ -192,7 +213,7 @@ export class VMDebugTracer {
|
|
|
192
213
|
}
|
|
193
214
|
|
|
194
215
|
this._lastTrace = {
|
|
195
|
-
gas: result.
|
|
216
|
+
gas: Number(result.totalGasSpent),
|
|
196
217
|
failed: result.execResult.exceptionError !== undefined,
|
|
197
218
|
returnValue: result.execResult.returnValue.toString("hex"),
|
|
198
219
|
structLogs: rpcStructLogs,
|
|
@@ -289,7 +310,7 @@ export class VMDebugTracer {
|
|
|
289
310
|
private _getStack(step: InterpreterStep): string[] {
|
|
290
311
|
const stack = step.stack
|
|
291
312
|
.slice()
|
|
292
|
-
.map((el:
|
|
313
|
+
.map((el: bigint) => el.toString(16).padStart(64, "0"));
|
|
293
314
|
return stack;
|
|
294
315
|
}
|
|
295
316
|
|
|
@@ -320,26 +341,25 @@ export class VMDebugTracer {
|
|
|
320
341
|
storage[key] = storageValue;
|
|
321
342
|
} else if (step.opcode.name === "REVERT") {
|
|
322
343
|
const [offsetBuffer, lengthBuffer] = this._getFromStack(stack, 2);
|
|
323
|
-
const length =
|
|
324
|
-
const offset =
|
|
344
|
+
const length = bufferToBigInt(lengthBuffer);
|
|
345
|
+
const offset = bufferToBigInt(offsetBuffer);
|
|
325
346
|
|
|
326
347
|
const [gasIncrease, addedWords] = this._memoryExpansion(
|
|
327
|
-
memory.length,
|
|
328
|
-
length
|
|
348
|
+
BigInt(memory.length),
|
|
349
|
+
length + offset
|
|
329
350
|
);
|
|
330
351
|
|
|
331
|
-
gasCost += gasIncrease;
|
|
352
|
+
gasCost += Number(gasIncrease);
|
|
332
353
|
|
|
333
354
|
for (let i = 0; i < addedWords; i++) {
|
|
334
355
|
memory.push(EMPTY_MEMORY_WORD);
|
|
335
356
|
}
|
|
336
357
|
} else if (step.opcode.name === "CREATE2") {
|
|
337
358
|
const [, , memoryUsedBuffer] = this._getFromStack(stack, 3);
|
|
338
|
-
const memoryUsed =
|
|
339
|
-
const sha3ExtraCost =
|
|
340
|
-
.
|
|
341
|
-
|
|
342
|
-
gasCost += sha3ExtraCost;
|
|
359
|
+
const memoryUsed = bufferToBigInt(memoryUsedBuffer);
|
|
360
|
+
const sha3ExtraCost =
|
|
361
|
+
BigIntUtils.divUp(memoryUsed, 32n) * this._sha3WordGas();
|
|
362
|
+
gasCost += Number(sha3ExtraCost);
|
|
343
363
|
} else if (
|
|
344
364
|
step.opcode.name === "CALL" ||
|
|
345
365
|
step.opcode.name === "STATICCALL" ||
|
|
@@ -371,22 +391,22 @@ export class VMDebugTracer {
|
|
|
371
391
|
] = this._getFromStack(stack, 7);
|
|
372
392
|
}
|
|
373
393
|
|
|
374
|
-
const callCost =
|
|
394
|
+
const callCost = bufferToBigInt(callCostBuffer);
|
|
375
395
|
|
|
376
|
-
const value =
|
|
396
|
+
const value = bufferToBigInt(valueBuffer);
|
|
377
397
|
|
|
378
|
-
const memoryLength = memory.length;
|
|
379
|
-
const inBN =
|
|
380
|
-
const inSizeBN =
|
|
381
|
-
const inPosition = inSizeBN
|
|
382
|
-
const outBN =
|
|
383
|
-
const outSizeBN =
|
|
384
|
-
const outPosition = outSizeBN
|
|
385
|
-
const memSize = inPosition
|
|
398
|
+
const memoryLength = BigInt(memory.length);
|
|
399
|
+
const inBN = bufferToBigInt(inBuffer);
|
|
400
|
+
const inSizeBN = bufferToBigInt(inSizeBuffer);
|
|
401
|
+
const inPosition = inSizeBN === 0n ? inSizeBN : inBN + inSizeBN;
|
|
402
|
+
const outBN = bufferToBigInt(outBuffer);
|
|
403
|
+
const outSizeBN = bufferToBigInt(outSizeBuffer);
|
|
404
|
+
const outPosition = outSizeBN === 0n ? outSizeBN : outBN + outSizeBN;
|
|
405
|
+
const memSize = inPosition > outPosition ? inPosition : outPosition;
|
|
386
406
|
const toAddress = new Address(recipientAddressBuffer.slice(-20));
|
|
387
407
|
|
|
388
408
|
const constantGas = this._callConstantGas();
|
|
389
|
-
const availableGas = step.gasLeft
|
|
409
|
+
const availableGas = step.gasLeft - constantGas;
|
|
390
410
|
|
|
391
411
|
const [memoryGas] = this._memoryExpansion(memoryLength, memSize);
|
|
392
412
|
|
|
@@ -398,7 +418,7 @@ export class VMDebugTracer {
|
|
|
398
418
|
callCost
|
|
399
419
|
);
|
|
400
420
|
|
|
401
|
-
gasCost = constantGas + dynamicGas;
|
|
421
|
+
gasCost = Number(constantGas + dynamicGas);
|
|
402
422
|
} else if (step.opcode.name === "CALLCODE") {
|
|
403
423
|
// finding an existing tx that uses CALLCODE or compiling a contract
|
|
404
424
|
// so that it uses this opcode is hard,
|
|
@@ -417,13 +437,13 @@ export class VMDebugTracer {
|
|
|
417
437
|
const structLog: StructLog = {
|
|
418
438
|
pc: step.pc,
|
|
419
439
|
op,
|
|
420
|
-
gas: step.gasLeft
|
|
440
|
+
gas: Number(step.gasLeft),
|
|
421
441
|
gasCost,
|
|
422
442
|
depth: step.depth + 1,
|
|
423
443
|
stack,
|
|
424
444
|
memory,
|
|
425
445
|
storage,
|
|
426
|
-
memSize: step.memoryWordCount
|
|
446
|
+
memSize: Number(step.memoryWordCount),
|
|
427
447
|
};
|
|
428
448
|
|
|
429
449
|
if (error !== undefined) {
|
|
@@ -433,15 +453,15 @@ export class VMDebugTracer {
|
|
|
433
453
|
return structLog;
|
|
434
454
|
}
|
|
435
455
|
|
|
436
|
-
private _memoryGas():
|
|
456
|
+
private _memoryGas(): bigint {
|
|
437
457
|
return this._vm._common.param("gasPrices", "memory");
|
|
438
458
|
}
|
|
439
459
|
|
|
440
|
-
private _sha3WordGas():
|
|
460
|
+
private _sha3WordGas(): bigint {
|
|
441
461
|
return this._vm._common.param("gasPrices", "sha3Word");
|
|
442
462
|
}
|
|
443
463
|
|
|
444
|
-
private _callConstantGas():
|
|
464
|
+
private _callConstantGas(): bigint {
|
|
445
465
|
if (this._vm._common.gteHardfork("berlin")) {
|
|
446
466
|
return this._vm._common.param("gasPrices", "warmstorageread");
|
|
447
467
|
}
|
|
@@ -449,15 +469,15 @@ export class VMDebugTracer {
|
|
|
449
469
|
return this._vm._common.param("gasPrices", "call");
|
|
450
470
|
}
|
|
451
471
|
|
|
452
|
-
private _callNewAccountGas():
|
|
472
|
+
private _callNewAccountGas(): bigint {
|
|
453
473
|
return this._vm._common.param("gasPrices", "callNewAccount");
|
|
454
474
|
}
|
|
455
475
|
|
|
456
|
-
private _callValueTransferGas():
|
|
476
|
+
private _callValueTransferGas(): bigint {
|
|
457
477
|
return this._vm._common.param("gasPrices", "callValueTransfer");
|
|
458
478
|
}
|
|
459
479
|
|
|
460
|
-
private _quadCoeffDiv():
|
|
480
|
+
private _quadCoeffDiv(): bigint {
|
|
461
481
|
return this._vm._common.param("gasPrices", "quadCoeffDiv");
|
|
462
482
|
}
|
|
463
483
|
|
|
@@ -475,23 +495,14 @@ export class VMDebugTracer {
|
|
|
475
495
|
|
|
476
496
|
private async _callDynamicGas(
|
|
477
497
|
address: Address,
|
|
478
|
-
value:
|
|
479
|
-
availableGas:
|
|
480
|
-
memoryGas:
|
|
481
|
-
callCost:
|
|
482
|
-
): Promise<
|
|
498
|
+
value: bigint,
|
|
499
|
+
availableGas: bigint,
|
|
500
|
+
memoryGas: bigint,
|
|
501
|
+
callCost: bigint
|
|
502
|
+
): Promise<bigint> {
|
|
483
503
|
// The available gas is reduced when the address is cold
|
|
484
504
|
if (this._vm._common.gteHardfork("berlin")) {
|
|
485
|
-
const
|
|
486
|
-
| StateManager
|
|
487
|
-
| EIP2929StateManager;
|
|
488
|
-
|
|
489
|
-
assertHardhatInvariant(
|
|
490
|
-
"isWarmedAddress" in stateManager,
|
|
491
|
-
"The VM should have an EIP2929StateManger when berlin is enabled"
|
|
492
|
-
);
|
|
493
|
-
|
|
494
|
-
const isWarmed = stateManager.isWarmedAddress(address.toBuffer());
|
|
505
|
+
const isWarmed = this._vm.eei.isWarmedAddress(address.toBuffer());
|
|
495
506
|
|
|
496
507
|
const coldCost =
|
|
497
508
|
this._vm._common.param("gasPrices", "coldaccountaccess") -
|
|
@@ -505,9 +516,9 @@ export class VMDebugTracer {
|
|
|
505
516
|
}
|
|
506
517
|
}
|
|
507
518
|
|
|
508
|
-
let gas =
|
|
519
|
+
let gas = 0n;
|
|
509
520
|
|
|
510
|
-
const transfersValue =
|
|
521
|
+
const transfersValue = value !== 0n;
|
|
511
522
|
const addressIsEmpty = await this._isAddressEmpty(address);
|
|
512
523
|
|
|
513
524
|
if (transfersValue && addressIsEmpty) {
|
|
@@ -525,41 +536,45 @@ export class VMDebugTracer {
|
|
|
525
536
|
return gas;
|
|
526
537
|
}
|
|
527
538
|
|
|
528
|
-
private _callGas(
|
|
539
|
+
private _callGas(
|
|
540
|
+
availableGas: bigint,
|
|
541
|
+
base: bigint,
|
|
542
|
+
callCost: bigint
|
|
543
|
+
): bigint {
|
|
529
544
|
availableGas -= base;
|
|
530
545
|
|
|
531
|
-
const gas = availableGas -
|
|
546
|
+
const gas = availableGas - availableGas / 64n;
|
|
532
547
|
|
|
533
|
-
if (callCost
|
|
548
|
+
if (callCost > gas) {
|
|
534
549
|
return gas;
|
|
535
550
|
}
|
|
536
551
|
|
|
537
|
-
return callCost
|
|
552
|
+
return callCost;
|
|
538
553
|
}
|
|
539
554
|
|
|
540
555
|
/**
|
|
541
556
|
* Returns the increase in gas and the number of added words
|
|
542
557
|
*/
|
|
543
558
|
private _memoryExpansion(
|
|
544
|
-
currentWords:
|
|
545
|
-
newSize:
|
|
546
|
-
): [
|
|
547
|
-
const currentSize =
|
|
548
|
-
const currentWordsLength = currentSize
|
|
549
|
-
const newWordsLength = newSize
|
|
559
|
+
currentWords: bigint,
|
|
560
|
+
newSize: bigint
|
|
561
|
+
): [bigint, bigint] {
|
|
562
|
+
const currentSize = currentWords * 32n;
|
|
563
|
+
const currentWordsLength = (currentSize + 31n) / 32n;
|
|
564
|
+
const newWordsLength = (newSize + 31n) / 32n;
|
|
550
565
|
|
|
551
|
-
const wordsDiff = newWordsLength
|
|
566
|
+
const wordsDiff = newWordsLength - currentWordsLength;
|
|
552
567
|
|
|
553
|
-
if (newSize
|
|
568
|
+
if (newSize > currentSize) {
|
|
554
569
|
const newTotalFee = this._memoryFee(newWordsLength);
|
|
555
570
|
const currentTotalFee = this._memoryFee(currentWordsLength);
|
|
556
571
|
|
|
557
|
-
const fee = newTotalFee
|
|
572
|
+
const fee = newTotalFee - currentTotalFee;
|
|
558
573
|
|
|
559
|
-
return [fee
|
|
574
|
+
return [fee, wordsDiff];
|
|
560
575
|
}
|
|
561
576
|
|
|
562
|
-
return [
|
|
577
|
+
return [0n, 0n];
|
|
563
578
|
}
|
|
564
579
|
|
|
565
580
|
private _getFromStack(stack: string[], count: number): Buffer[] {
|
|
@@ -570,28 +585,16 @@ export class VMDebugTracer {
|
|
|
570
585
|
.map(toBuffer);
|
|
571
586
|
}
|
|
572
587
|
|
|
573
|
-
private _memoryFee(words:
|
|
574
|
-
const square = words
|
|
575
|
-
const linCoef = words
|
|
576
|
-
const quadCoef = square
|
|
577
|
-
const newTotalFee = linCoef
|
|
588
|
+
private _memoryFee(words: bigint): bigint {
|
|
589
|
+
const square = words * words;
|
|
590
|
+
const linCoef = words * this._memoryGas();
|
|
591
|
+
const quadCoef = square / this._quadCoeffDiv();
|
|
592
|
+
const newTotalFee = linCoef + quadCoef;
|
|
578
593
|
|
|
579
594
|
return newTotalFee;
|
|
580
595
|
}
|
|
581
596
|
}
|
|
582
597
|
|
|
583
|
-
function divUp(x: BN, y: number | BN): BN {
|
|
584
|
-
y = new BN(y);
|
|
585
|
-
|
|
586
|
-
let result = x.div(y);
|
|
587
|
-
|
|
588
|
-
if (!x.mod(y).eqn(0)) {
|
|
589
|
-
result = result.addn(1);
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
return result;
|
|
593
|
-
}
|
|
594
|
-
|
|
595
598
|
function toWord(b: Buffer): string {
|
|
596
599
|
return b.toString("hex").padStart(64, "0");
|
|
597
600
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import { Address, BN } from "ethereumjs-util";
|
|
1
|
+
import { EVM, EVMResult, getActivePrecompiles } from "@ignored/evm";
|
|
2
|
+
import { InterpreterStep } from "@ignored/evm/dist/interpreter";
|
|
3
|
+
import { Message } from "@ignored/evm/dist/message";
|
|
4
|
+
import { Address, bufferToBigInt } from "@ignored/util";
|
|
5
|
+
import { VM } from "@ignored/vm";
|
|
7
6
|
|
|
8
7
|
import {
|
|
9
8
|
CallMessageTrace,
|
|
@@ -16,14 +15,14 @@ import {
|
|
|
16
15
|
|
|
17
16
|
/* eslint-disable @nomiclabs/hardhat-internal-rules/only-hardhat-error */
|
|
18
17
|
|
|
19
|
-
const MAX_PRECOMPILE_NUMBER = Object.keys(precompiles).length + 1;
|
|
20
18
|
const DUMMY_RETURN_DATA = Buffer.from([]);
|
|
21
|
-
const DUMMY_GAS_USED =
|
|
19
|
+
const DUMMY_GAS_USED = 0n;
|
|
22
20
|
|
|
23
21
|
export class VMTracer {
|
|
24
22
|
private _messageTraces: MessageTrace[] = [];
|
|
25
23
|
private _enabled = false;
|
|
26
24
|
private _lastError: Error | undefined;
|
|
25
|
+
private _maxPrecompileNumber = getActivePrecompiles(this._vm._common).size;
|
|
27
26
|
|
|
28
27
|
constructor(
|
|
29
28
|
private readonly _vm: VM,
|
|
@@ -39,9 +38,9 @@ export class VMTracer {
|
|
|
39
38
|
if (this._enabled) {
|
|
40
39
|
return;
|
|
41
40
|
}
|
|
42
|
-
this._vm.on("beforeMessage", this._beforeMessageHandler);
|
|
43
|
-
this._vm.on("step", this._stepHandler);
|
|
44
|
-
this._vm.on("afterMessage", this._afterMessageHandler);
|
|
41
|
+
(this._vm.evm as EVM).on("beforeMessage", this._beforeMessageHandler);
|
|
42
|
+
(this._vm.evm as EVM).on("step", this._stepHandler);
|
|
43
|
+
(this._vm.evm as EVM).on("afterMessage", this._afterMessageHandler);
|
|
45
44
|
this._enabled = true;
|
|
46
45
|
}
|
|
47
46
|
|
|
@@ -49,9 +48,15 @@ export class VMTracer {
|
|
|
49
48
|
if (!this._enabled) {
|
|
50
49
|
return;
|
|
51
50
|
}
|
|
52
|
-
this._vm.removeListener(
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
(this._vm.evm as EVM).removeListener(
|
|
52
|
+
"beforeMessage",
|
|
53
|
+
this._beforeMessageHandler
|
|
54
|
+
);
|
|
55
|
+
(this._vm.evm as EVM).removeListener("step", this._stepHandler);
|
|
56
|
+
(this._vm.evm as EVM).removeListener(
|
|
57
|
+
"afterMessage",
|
|
58
|
+
this._afterMessageHandler
|
|
59
|
+
);
|
|
55
60
|
this._enabled = false;
|
|
56
61
|
}
|
|
57
62
|
|
|
@@ -106,11 +111,11 @@ export class VMTracer {
|
|
|
106
111
|
|
|
107
112
|
trace = createTrace;
|
|
108
113
|
} else {
|
|
109
|
-
const
|
|
114
|
+
const toAsNumber = bufferToBigInt(message.to.toBuffer());
|
|
110
115
|
|
|
111
|
-
if (
|
|
116
|
+
if (toAsNumber > 0 && toAsNumber <= this._maxPrecompileNumber) {
|
|
112
117
|
const precompileTrace: PrecompileMessageTrace = {
|
|
113
|
-
precompile:
|
|
118
|
+
precompile: Number(toAsNumber),
|
|
114
119
|
calldata: message.data,
|
|
115
120
|
value: message.value,
|
|
116
121
|
returnData: DUMMY_RETURN_DATA,
|
|
@@ -204,7 +209,7 @@ export class VMTracer {
|
|
|
204
209
|
|
|
205
210
|
trace.error = result.execResult.exceptionError;
|
|
206
211
|
trace.returnData = result.execResult.returnValue;
|
|
207
|
-
trace.gasUsed = result.
|
|
212
|
+
trace.gasUsed = result.execResult.executionGasUsed;
|
|
208
213
|
|
|
209
214
|
if (isCreateTrace(trace)) {
|
|
210
215
|
trace.deployedContract = result?.createdAddress?.toBuffer();
|