-
-
Save gzeoneth/99ac30932bf07f91661d7bc621ba1f50 to your computer and use it in GitHub Desktop.
hardhat patch for https://github.com/NomicFoundation/hardhat/issues/2995, use with https://www.npmjs.com/package/patch-package
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/node_modules/hardhat/builtin-tasks/node.js b/node_modules/hardhat/builtin-tasks/node.js | |
index 3a8cb63..c1f54ca 100644 | |
--- a/node_modules/hardhat/builtin-tasks/node.js | |
+++ b/node_modules/hardhat/builtin-tasks/node.js | |
@@ -56,8 +56,9 @@ Private Key: ${privateKey}`; | |
(0, config_env_1.subtask)(task_names_1.TASK_NODE_GET_PROVIDER) | |
.addOptionalParam("forkUrl", undefined, undefined, config_env_1.types.string) | |
.addOptionalParam("forkBlockNumber", undefined, undefined, config_env_1.types.int) | |
- .setAction(async ({ forkBlockNumber: forkBlockNumberParam, forkUrl: forkUrlParam, }, { artifacts, config, network, userConfig }) => { | |
- var _a, _b, _c, _d, _e; | |
+ .addOptionalParam("forkIgnoreUnknownTxType", undefined, undefined, config_env_1.types.boolean) | |
+ .setAction(async ({ forkBlockNumber: forkBlockNumberParam, forkUrl: forkUrlParam, forkIgnoreUnknownTxType: forkIgnoreUnknownTxTypeParam, }, { artifacts, config, network, userConfig }) => { | |
+ var _a, _b, _c, _d, _e, _f; | |
let provider = network.provider; | |
if (network.name !== constants_1.HARDHAT_NETWORK_NAME) { | |
const networkConfig = config.networks[constants_1.HARDHAT_NETWORK_NAME]; | |
@@ -67,8 +68,10 @@ Private Key: ${privateKey}`; | |
const hardhatNetworkConfig = config.networks[constants_1.HARDHAT_NETWORK_NAME]; | |
const forkUrlConfig = (_a = hardhatNetworkConfig.forking) === null || _a === void 0 ? void 0 : _a.url; | |
const forkBlockNumberConfig = (_b = hardhatNetworkConfig.forking) === null || _b === void 0 ? void 0 : _b.blockNumber; | |
+ const forkIgnoreUnknownTxTypeConfig = (_c = hardhatNetworkConfig.forking) === null || _c === void 0 ? void 0 : _c.ignoreUnknownTxType; | |
const forkUrl = forkUrlParam !== null && forkUrlParam !== void 0 ? forkUrlParam : forkUrlConfig; | |
const forkBlockNumber = forkBlockNumberParam !== null && forkBlockNumberParam !== void 0 ? forkBlockNumberParam : forkBlockNumberConfig; | |
+ const forkIgnoreUnknownTxType = forkIgnoreUnknownTxTypeParam !== null && forkIgnoreUnknownTxTypeParam !== void 0 ? forkIgnoreUnknownTxTypeParam : forkIgnoreUnknownTxTypeConfig; | |
// we throw an error if the user specified a forkBlockNumber but not a | |
// forkUrl | |
if (forkBlockNumber !== undefined && forkUrl === undefined) { | |
@@ -84,17 +87,17 @@ Private Key: ${privateKey}`; | |
{ | |
forking: { | |
jsonRpcUrl: forkUrl, | |
- blockNumber: forkBlockNumber, | |
+ blockNumber: forkBlockNumber | |
}, | |
}, | |
], | |
}); | |
} | |
- const hardhatNetworkUserConfig = (_d = (_c = userConfig.networks) === null || _c === void 0 ? void 0 : _c[constants_1.HARDHAT_NETWORK_NAME]) !== null && _d !== void 0 ? _d : {}; | |
+ const hardhatNetworkUserConfig = (_e = (_d = userConfig.networks) === null || _d === void 0 ? void 0 : _d[constants_1.HARDHAT_NETWORK_NAME]) !== null && _e !== void 0 ? _e : {}; | |
// enable logging | |
await provider.request({ | |
method: "hardhat_setLoggingEnabled", | |
- params: [(_e = hardhatNetworkUserConfig.loggingEnabled) !== null && _e !== void 0 ? _e : true], | |
+ params: [(_f = hardhatNetworkUserConfig.loggingEnabled) !== null && _f !== void 0 ? _f : true], | |
}); | |
return provider; | |
}); | |
@@ -142,7 +145,8 @@ Private Key: ${privateKey}`; | |
.addOptionalParam("port", "The port on which to listen for new connections", 8545, config_env_1.types.int) | |
.addOptionalParam("fork", "The URL of the JSON-RPC server to fork from", undefined, config_env_1.types.string) | |
.addOptionalParam("forkBlockNumber", "The block number to fork from", undefined, config_env_1.types.int) | |
- .setAction(async ({ forkBlockNumber, fork: forkUrl, hostname: hostnameParam, port, }, { config, hardhatArguments, network, run }) => { | |
+ .addOptionalParam("forkIgnoreUnknownTxType", "To ignore unknown transaction types", false, config_env_1.types.boolean) | |
+ .setAction(async ({ forkBlockNumber, fork: forkUrl, hostname: hostnameParam, port, forkIgnoreUnknownTxType, }, { config, hardhatArguments, network, run }) => { | |
// we throw if the user specified a network argument and it's not hardhat | |
if (network.name !== constants_1.HARDHAT_NETWORK_NAME && | |
hardhatArguments.network !== undefined) { | |
@@ -152,6 +156,7 @@ Private Key: ${privateKey}`; | |
const provider = await run(task_names_1.TASK_NODE_GET_PROVIDER, { | |
forkBlockNumber, | |
forkUrl, | |
+ forkIgnoreUnknownTxType, | |
}); | |
// the default hostname is "127.0.0.1" unless we are inside a docker | |
// container, in that case we use "0.0.0.0" | |
diff --git a/node_modules/hardhat/internal/core/config/config-resolution.js b/node_modules/hardhat/internal/core/config/config-resolution.js | |
index 4caff72..b892397 100644 | |
--- a/node_modules/hardhat/internal/core/config/config-resolution.js | |
+++ b/node_modules/hardhat/internal/core/config/config-resolution.js | |
@@ -75,7 +75,7 @@ function normalizeHexString(str) { | |
return `0x${normalized}`; | |
} | |
function resolveHardhatNetworkConfig(hardhatNetworkConfig = {}) { | |
- var _a, _b, _c, _d, _e, _f, _g, _h; | |
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j; | |
const clonedDefaultHardhatNetworkParams = (0, cloneDeep_1.default)(default_config_1.defaultHardhatNetworkParams); | |
const accounts = hardhatNetworkConfig.accounts === undefined | |
? default_config_1.defaultHardhatNetworkHdAccountsConfigParams | |
@@ -101,12 +101,16 @@ function resolveHardhatNetworkConfig(hardhatNetworkConfig = {}) { | |
if (httpHeaders !== undefined) { | |
forking.httpHeaders = httpHeaders; | |
} | |
+ const ignoreUnknownTxType = (_e = hardhatNetworkConfig.forking) === null || _e === void 0 ? void 0 : _e.ignoreUnknownTxType; | |
+ if (ignoreUnknownTxType !== undefined) { | |
+ forking.ignoreUnknownTxType = ignoreUnknownTxType; | |
+ } | |
} | |
const mining = resolveMiningConfig(hardhatNetworkConfig.mining); | |
- const minGasPrice = new ethereumjs_util_1.BN((_e = hardhatNetworkConfig.minGasPrice) !== null && _e !== void 0 ? _e : clonedDefaultHardhatNetworkParams.minGasPrice); | |
- const blockGasLimit = (_f = hardhatNetworkConfig.blockGasLimit) !== null && _f !== void 0 ? _f : clonedDefaultHardhatNetworkParams.blockGasLimit; | |
- const gas = (_g = hardhatNetworkConfig.gas) !== null && _g !== void 0 ? _g : blockGasLimit; | |
- const initialDate = (_h = hardhatNetworkConfig.initialDate) !== null && _h !== void 0 ? _h : new Date().toISOString(); | |
+ const minGasPrice = new ethereumjs_util_1.BN((_f = hardhatNetworkConfig.minGasPrice) !== null && _f !== void 0 ? _f : clonedDefaultHardhatNetworkParams.minGasPrice); | |
+ const blockGasLimit = (_g = hardhatNetworkConfig.blockGasLimit) !== null && _g !== void 0 ? _g : clonedDefaultHardhatNetworkParams.blockGasLimit; | |
+ const gas = (_h = hardhatNetworkConfig.gas) !== null && _h !== void 0 ? _h : blockGasLimit; | |
+ const initialDate = (_j = hardhatNetworkConfig.initialDate) !== null && _j !== void 0 ? _j : new Date().toISOString(); | |
const chains = new Map(default_config_1.defaultHardhatNetworkParams.chains); | |
if (hardhatNetworkConfig.chains !== undefined) { | |
for (const [chainId, userChainConfig] of Object.entries(hardhatNetworkConfig.chains)) { | |
diff --git a/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.d.ts b/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.d.ts | |
index c5a11d8..2ceff08 100644 | |
--- a/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.d.ts | |
+++ b/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.d.ts | |
@@ -5,12 +5,14 @@ export declare const rpcForkConfig: t.Type<{ | |
httpHeaders: { | |
[x: string]: string; | |
} | undefined; | |
+ ignoreUnknownTxType: boolean | undefined; | |
} | undefined, { | |
jsonRpcUrl: string; | |
blockNumber: number | undefined; | |
httpHeaders: { | |
[x: string]: string; | |
} | undefined; | |
+ ignoreUnknownTxType: boolean | undefined; | |
} | undefined, unknown>; | |
export declare type RpcForkConfig = t.TypeOf<typeof rpcForkConfig>; | |
export declare const rpcHardhatNetworkConfig: t.TypeC<{ | |
@@ -20,12 +22,14 @@ export declare const rpcHardhatNetworkConfig: t.TypeC<{ | |
httpHeaders: { | |
[x: string]: string; | |
} | undefined; | |
+ ignoreUnknownTxType: boolean | undefined; | |
} | undefined, { | |
jsonRpcUrl: string; | |
blockNumber: number | undefined; | |
httpHeaders: { | |
[x: string]: string; | |
} | undefined; | |
+ ignoreUnknownTxType: boolean | undefined; | |
} | undefined, unknown>; | |
}>; | |
export declare type RpcHardhatNetworkConfig = t.TypeOf<typeof rpcHardhatNetworkConfig>; | |
@@ -36,6 +40,7 @@ export declare const optionalRpcHardhatNetworkConfig: t.Type<{ | |
httpHeaders: { | |
[x: string]: string; | |
} | undefined; | |
+ ignoreUnknownTxType: boolean | undefined; | |
} | undefined; | |
} | undefined, { | |
forking: { | |
@@ -44,6 +49,7 @@ export declare const optionalRpcHardhatNetworkConfig: t.Type<{ | |
httpHeaders: { | |
[x: string]: string; | |
} | undefined; | |
+ ignoreUnknownTxType: boolean | undefined; | |
} | undefined; | |
} | undefined, unknown>; | |
export declare const rpcIntervalMining: t.UnionC<[t.Type<number, number, unknown>, t.Type<[number, number], [number, number], unknown>]>; | |
diff --git a/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.js b/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.js | |
index f9d502e..6f1613a 100644 | |
--- a/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.js | |
+++ b/node_modules/hardhat/internal/core/jsonrpc/types/input/hardhat-network.js | |
@@ -27,6 +27,7 @@ exports.rpcForkConfig = (0, io_ts_1.optional)(t.type({ | |
jsonRpcUrl: t.string, | |
blockNumber: (0, io_ts_1.optional)(t.number), | |
httpHeaders: (0, io_ts_1.optional)(t.record(t.string, t.string, "httpHeaders")), | |
+ ignoreUnknownTxType: (0, io_ts_1.optional)(t.boolean), | |
}, "RpcForkConfig")); | |
exports.rpcHardhatNetworkConfig = t.type({ | |
forking: (0, io_ts_1.optional)(exports.rpcForkConfig), | |
diff --git a/node_modules/hardhat/internal/core/providers/construction.js b/node_modules/hardhat/internal/core/providers/construction.js | |
index 15ce847..fd0e8b5 100644 | |
--- a/node_modules/hardhat/internal/core/providers/construction.js | |
+++ b/node_modules/hardhat/internal/core/providers/construction.js | |
@@ -34,6 +34,7 @@ function createProvider(networkName, networkConfig, paths, artifacts, experiment | |
jsonRpcUrl: (_c = hardhatNetConfig.forking) === null || _c === void 0 ? void 0 : _c.url, | |
blockNumber: (_d = hardhatNetConfig.forking) === null || _d === void 0 ? void 0 : _d.blockNumber, | |
httpHeaders: hardhatNetConfig.forking.httpHeaders, | |
+ ignoreUnknownTxType: hardhatNetConfig.forking.ignoreUnknownTxType, | |
}; | |
} | |
const accounts = (0, util_1.normalizeHardhatNetworkAccountsConfig)(hardhatNetConfig.accounts); | |
diff --git a/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts b/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts | |
index b851c8b..42bedf7 100644 | |
--- a/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts | |
+++ b/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.d.ts | |
@@ -11,8 +11,9 @@ import { HardhatBlockchainInterface } from "../types/HardhatBlockchainInterface" | |
export declare class ForkBlockchain extends BlockchainBase implements HardhatBlockchainInterface { | |
private _jsonRpcClient; | |
private _forkBlockNumber; | |
+ private _forkIgnoreUnknownTxType; | |
private _latestBlockNumber; | |
- constructor(_jsonRpcClient: JsonRpcClient, _forkBlockNumber: BN, common: Common); | |
+ constructor(_jsonRpcClient: JsonRpcClient, _forkBlockNumber: BN, common: Common, _forkIgnoreUnknownTxType: boolean); | |
getLatestBlockNumber(): BN; | |
getBlock(blockHashOrNumber: Buffer | number | BN): Promise<Block | null>; | |
addBlock(block: Block): Promise<Block>; | |
diff --git a/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.js b/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.js | |
index 5aa8404..dcc5bc7 100644 | |
--- a/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.js | |
+++ b/node_modules/hardhat/internal/hardhat-network/provider/fork/ForkBlockchain.js | |
@@ -1,8 +1,12 @@ | |
"use strict"; | |
+var __importDefault = (this && this.__importDefault) || function (mod) { | |
+ return (mod && mod.__esModule) ? mod : { "default": mod }; | |
+}; | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.ForkBlockchain = void 0; | |
const block_1 = require("@ethereumjs/block"); | |
const ethereumjs_util_1 = require("ethereumjs-util"); | |
+const chalk_1 = __importDefault(require("chalk")); | |
const errors_1 = require("../../../core/providers/errors"); | |
const BlockchainBase_1 = require("../BlockchainBase"); | |
const output_1 = require("../output"); | |
@@ -13,10 +17,11 @@ const rpcToBlockData_1 = require("./rpcToBlockData"); | |
const rpcToTxData_1 = require("./rpcToTxData"); | |
/* eslint-disable @nomiclabs/hardhat-internal-rules/only-hardhat-error */ | |
class ForkBlockchain extends BlockchainBase_1.BlockchainBase { | |
- constructor(_jsonRpcClient, _forkBlockNumber, common) { | |
+ constructor(_jsonRpcClient, _forkBlockNumber, common, _forkIgnoreUnknownTxType) { | |
super(common); | |
this._jsonRpcClient = _jsonRpcClient; | |
this._forkBlockNumber = _forkBlockNumber; | |
+ this._forkIgnoreUnknownTxType = _forkIgnoreUnknownTxType; | |
this._latestBlockNumber = this._forkBlockNumber; | |
} | |
getLatestBlockNumber() { | |
@@ -199,7 +204,13 @@ class ForkBlockchain extends BlockchainBase_1.BlockchainBase { | |
tx = new ReadOnlyValidEIP1559Transaction_1.ReadOnlyValidEIP1559Transaction(new ethereumjs_util_1.Address(transaction.from), (0, rpcToTxData_1.rpcToTxData)(transaction)); | |
} | |
else { | |
- throw new errors_1.InternalError(`Unknown transaction type ${transaction.type.toString()}`); | |
+ if (this._forkIgnoreUnknownTxType) { | |
+ console.log(chalk_1.default.yellow(`Ignored a tx with unknown type ${transaction.type}`)); | |
+ continue; | |
+ } | |
+ else { | |
+ throw new errors_1.InternalError(`Unknown transaction type ${transaction.type.toString()}, set --fork-ignore-unknown-tx-type true to ignore`); | |
+ } | |
} | |
block.transactions.push(tx); | |
} | |
diff --git a/node_modules/hardhat/internal/hardhat-network/provider/node-types.d.ts b/node_modules/hardhat/internal/hardhat-network/provider/node-types.d.ts | |
index 1dbf710..6361315 100644 | |
--- a/node_modules/hardhat/internal/hardhat-network/provider/node-types.d.ts | |
+++ b/node_modules/hardhat/internal/hardhat-network/provider/node-types.d.ts | |
@@ -32,6 +32,7 @@ export interface ForkConfig { | |
httpHeaders?: { | |
[name: string]: string; | |
}; | |
+ ignoreUnknownTxType?: boolean; | |
} | |
export interface ForkedNodeConfig extends CommonConfig { | |
forkConfig: ForkConfig; | |
diff --git a/node_modules/hardhat/internal/hardhat-network/provider/node.js b/node_modules/hardhat/internal/hardhat-network/provider/node.js | |
index f60f762..06dcebd 100644 | |
--- a/node_modules/hardhat/internal/hardhat-network/provider/node.js | |
+++ b/node_modules/hardhat/internal/hardhat-network/provider/node.js | |
@@ -128,7 +128,7 @@ class HardhatNode extends events_1.default { | |
const hardfork = (0, hardforks_1.getHardforkName)(config.hardfork); | |
let forkClient; | |
if ((0, node_types_1.isForkedNodeConfig)(config)) { | |
- const { forkClient: _forkClient, forkBlockNumber, forkBlockTimestamp, } = await (0, makeForkClient_1.makeForkClient)(config.forkConfig, config.forkCachePath); | |
+ const { forkClient: _forkClient, forkBlockNumber, forkBlockTimestamp, forkIgnoreUnknownTxType, } = await (0, makeForkClient_1.makeForkClient)(config.forkConfig, config.forkCachePath); | |
forkClient = _forkClient; | |
common = await (0, makeForkCommon_1.makeForkCommon)(config); | |
forkNetworkId = forkClient.getNetworkId(); | |
@@ -137,7 +137,7 @@ class HardhatNode extends events_1.default { | |
const forkStateManager = new ForkStateManager_1.ForkStateManager(forkClient, forkBlockNumber); | |
await forkStateManager.initializeGenesisAccounts(genesisAccounts); | |
stateManager = forkStateManager; | |
- blockchain = new ForkBlockchain_1.ForkBlockchain(forkClient, forkBlockNumber, common); | |
+ blockchain = new ForkBlockchain_1.ForkBlockchain(forkClient, forkBlockNumber, common, forkIgnoreUnknownTxType); | |
initialBlockTimeOffset = new ethereumjs_util_1.BN((0, date_1.getDifferenceInSeconds)(new Date(forkBlockTimestamp), new Date())); | |
// If the hardfork is London or later we need a base fee per gas for the | |
// first local block. If initialBaseFeePerGas config was provided we use | |
diff --git a/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.d.ts b/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.d.ts | |
index f79dccb..1f3cb03 100644 | |
--- a/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.d.ts | |
+++ b/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.d.ts | |
@@ -5,5 +5,6 @@ export declare function makeForkClient(forkConfig: ForkConfig, forkCachePath?: s | |
forkClient: JsonRpcClient; | |
forkBlockNumber: BN; | |
forkBlockTimestamp: number; | |
+ forkIgnoreUnknownTxType: boolean; | |
}>; | |
//# sourceMappingURL=makeForkClient.d.ts.map | |
\ No newline at end of file | |
diff --git a/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.js b/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.js | |
index dd37a51..697670d 100644 | |
--- a/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.js | |
+++ b/node_modules/hardhat/internal/hardhat-network/provider/utils/makeForkClient.js | |
@@ -18,6 +18,7 @@ const reorgs_protection_1 = require("./reorgs-protection"); | |
// anymore, so this really should be revisited. | |
const FORK_HTTP_TIMEOUT = 35000; | |
async function makeForkClient(forkConfig, forkCachePath) { | |
+ var _a; | |
const provider = new http_1.HttpProvider(forkConfig.jsonRpcUrl, constants_1.HARDHAT_NETWORK_NAME, forkConfig.httpHeaders, FORK_HTTP_TIMEOUT); | |
const networkId = await getNetworkId(provider); | |
const actualMaxReorg = (0, reorgs_protection_1.getLargestPossibleReorg)(networkId); | |
@@ -43,11 +44,17 @@ Please use block number ${lastSafeBlock} or wait for the block to get ${required | |
} | |
const block = await getBlockByNumber(provider, forkBlockNumber); | |
const forkBlockTimestamp = (0, base_types_1.rpcQuantityToNumber)(block.timestamp) * 1000; | |
+ const forkIgnoreUnknownTxType = (_a = forkConfig.ignoreUnknownTxType) !== null && _a !== void 0 ? _a : false; | |
const cacheToDiskEnabled = forkConfig.blockNumber !== undefined && | |
forkCachePath !== undefined && | |
actualMaxReorg !== undefined; | |
const forkClient = new client_1.JsonRpcClient(provider, networkId, latestBlock, maxReorg, cacheToDiskEnabled ? forkCachePath : undefined); | |
- return { forkClient, forkBlockNumber, forkBlockTimestamp }; | |
+ return { | |
+ forkClient, | |
+ forkBlockNumber, | |
+ forkBlockTimestamp, | |
+ forkIgnoreUnknownTxType, | |
+ }; | |
} | |
exports.makeForkClient = makeForkClient; | |
async function getBlockByNumber(provider, blockNumber) { | |
diff --git a/node_modules/hardhat/src/builtin-tasks/node.ts b/node_modules/hardhat/src/builtin-tasks/node.ts | |
index 5f608c2..3c05631 100644 | |
--- a/node_modules/hardhat/src/builtin-tasks/node.ts | |
+++ b/node_modules/hardhat/src/builtin-tasks/node.ts | |
@@ -97,14 +97,22 @@ Private Key: ${privateKey}`; | |
subtask(TASK_NODE_GET_PROVIDER) | |
.addOptionalParam("forkUrl", undefined, undefined, types.string) | |
.addOptionalParam("forkBlockNumber", undefined, undefined, types.int) | |
+ .addOptionalParam( | |
+ "forkIgnoreUnknownTxType", | |
+ undefined, | |
+ undefined, | |
+ types.boolean | |
+ ) | |
.setAction( | |
async ( | |
{ | |
forkBlockNumber: forkBlockNumberParam, | |
forkUrl: forkUrlParam, | |
+ forkIgnoreUnknownTxType: forkIgnoreUnknownTxTypeParam, | |
}: { | |
forkBlockNumber?: number; | |
forkUrl?: string; | |
+ forkIgnoreUnknownTxType?: boolean; | |
}, | |
{ artifacts, config, network, userConfig } | |
): Promise<EthereumProvider> => { | |
@@ -126,9 +134,13 @@ subtask(TASK_NODE_GET_PROVIDER) | |
const forkUrlConfig = hardhatNetworkConfig.forking?.url; | |
const forkBlockNumberConfig = hardhatNetworkConfig.forking?.blockNumber; | |
+ const forkIgnoreUnknownTxTypeConfig = | |
+ hardhatNetworkConfig.forking?.ignoreUnknownTxType; | |
const forkUrl = forkUrlParam ?? forkUrlConfig; | |
const forkBlockNumber = forkBlockNumberParam ?? forkBlockNumberConfig; | |
+ const forkIgnoreUnknownTxType = | |
+ forkIgnoreUnknownTxTypeParam ?? forkIgnoreUnknownTxTypeConfig; | |
// we throw an error if the user specified a forkBlockNumber but not a | |
// forkUrl | |
@@ -150,7 +162,7 @@ subtask(TASK_NODE_GET_PROVIDER) | |
{ | |
forking: { | |
jsonRpcUrl: forkUrl, | |
- blockNumber: forkBlockNumber, | |
+ blockNumber: forkBlockNumber | |
}, | |
}, | |
], | |
@@ -275,6 +287,12 @@ task(TASK_NODE, "Starts a JSON-RPC server on top of Hardhat Network") | |
undefined, | |
types.int | |
) | |
+ .addOptionalParam( | |
+ "forkIgnoreUnknownTxType", | |
+ "To ignore unknown transaction types", | |
+ false, | |
+ types.boolean | |
+ ) | |
.setAction( | |
async ( | |
{ | |
@@ -282,11 +300,13 @@ task(TASK_NODE, "Starts a JSON-RPC server on top of Hardhat Network") | |
fork: forkUrl, | |
hostname: hostnameParam, | |
port, | |
+ forkIgnoreUnknownTxType, | |
}: { | |
forkBlockNumber?: number; | |
fork?: string; | |
hostname?: string; | |
port: number; | |
+ forkIgnoreUnknownTxType?: boolean; | |
}, | |
{ config, hardhatArguments, network, run } | |
) => { | |
@@ -304,6 +324,7 @@ task(TASK_NODE, "Starts a JSON-RPC server on top of Hardhat Network") | |
const provider: EthereumProvider = await run(TASK_NODE_GET_PROVIDER, { | |
forkBlockNumber, | |
forkUrl, | |
+ forkIgnoreUnknownTxType, | |
}); | |
// the default hostname is "127.0.0.1" unless we are inside a docker | |
diff --git a/node_modules/hardhat/src/internal/core/config/config-resolution.ts b/node_modules/hardhat/src/internal/core/config/config-resolution.ts | |
index 6d7a262..ea33a89 100644 | |
--- a/node_modules/hardhat/src/internal/core/config/config-resolution.ts | |
+++ b/node_modules/hardhat/src/internal/core/config/config-resolution.ts | |
@@ -164,6 +164,11 @@ function resolveHardhatNetworkConfig( | |
if (httpHeaders !== undefined) { | |
forking.httpHeaders = httpHeaders; | |
} | |
+ | |
+ const ignoreUnknownTxType = hardhatNetworkConfig.forking?.ignoreUnknownTxType; | |
+ if (ignoreUnknownTxType !== undefined) { | |
+ forking.ignoreUnknownTxType = ignoreUnknownTxType; | |
+ } | |
} | |
const mining = resolveMiningConfig(hardhatNetworkConfig.mining); | |
diff --git a/node_modules/hardhat/src/internal/core/jsonrpc/types/input/hardhat-network.ts b/node_modules/hardhat/src/internal/core/jsonrpc/types/input/hardhat-network.ts | |
index 446427b..e17145c 100644 | |
--- a/node_modules/hardhat/src/internal/core/jsonrpc/types/input/hardhat-network.ts | |
+++ b/node_modules/hardhat/src/internal/core/jsonrpc/types/input/hardhat-network.ts | |
@@ -9,6 +9,7 @@ export const rpcForkConfig = optional( | |
jsonRpcUrl: t.string, | |
blockNumber: optional(t.number), | |
httpHeaders: optional(t.record(t.string, t.string, "httpHeaders")), | |
+ ignoreUnknownTxType: optional(t.boolean), | |
}, | |
"RpcForkConfig" | |
) | |
diff --git a/node_modules/hardhat/src/internal/core/providers/construction.ts b/node_modules/hardhat/src/internal/core/providers/construction.ts | |
index e695b65..56bf077 100644 | |
--- a/node_modules/hardhat/src/internal/core/providers/construction.ts | |
+++ b/node_modules/hardhat/src/internal/core/providers/construction.ts | |
@@ -74,6 +74,7 @@ export function createProvider( | |
jsonRpcUrl: hardhatNetConfig.forking?.url, | |
blockNumber: hardhatNetConfig.forking?.blockNumber, | |
httpHeaders: hardhatNetConfig.forking.httpHeaders, | |
+ ignoreUnknownTxType: hardhatNetConfig.forking.ignoreUnknownTxType, | |
}; | |
} | |
diff --git a/node_modules/hardhat/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts b/node_modules/hardhat/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts | |
index 1f04ad1..c5e28a7 100644 | |
--- a/node_modules/hardhat/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts | |
+++ b/node_modules/hardhat/src/internal/hardhat-network/provider/fork/ForkBlockchain.ts | |
@@ -4,6 +4,7 @@ import { TypedTransaction } from "@ethereumjs/tx"; | |
import { Address, BN } from "ethereumjs-util"; | |
import { FeeMarketEIP1559TxData } from "@ethereumjs/tx/dist/types"; | |
+import chalk from "chalk"; | |
import { RpcBlockWithTransactions } from "../../../core/jsonrpc/types/output/block"; | |
import { RpcTransactionReceipt } from "../../../core/jsonrpc/types/output/receipt"; | |
import { RpcTransaction } from "../../../core/jsonrpc/types/output/transaction"; | |
@@ -38,7 +39,8 @@ export class ForkBlockchain | |
constructor( | |
private _jsonRpcClient: JsonRpcClient, | |
private _forkBlockNumber: BN, | |
- common: Common | |
+ common: Common, | |
+ private _forkIgnoreUnknownTxType: boolean | |
) { | |
super(common); | |
} | |
@@ -295,9 +297,16 @@ export class ForkBlockchain | |
rpcToTxData(transaction) as FeeMarketEIP1559TxData | |
); | |
} else { | |
- throw new InternalError( | |
- `Unknown transaction type ${transaction.type.toString()}` | |
- ); | |
+ if (this._forkIgnoreUnknownTxType) { | |
+ console.log( | |
+ chalk.yellow(`Ignored a tx with unknown type ${transaction.type}`) | |
+ ); | |
+ continue; | |
+ } else { | |
+ throw new InternalError( | |
+ `Unknown transaction type ${transaction.type.toString()}, set --fork-ignore-unknown-tx-type true to ignore` | |
+ ); | |
+ } | |
} | |
block.transactions.push(tx); | |
diff --git a/node_modules/hardhat/src/internal/hardhat-network/provider/node-types.ts b/node_modules/hardhat/src/internal/hardhat-network/provider/node-types.ts | |
index 5181177..740ee0b 100644 | |
--- a/node_modules/hardhat/src/internal/hardhat-network/provider/node-types.ts | |
+++ b/node_modules/hardhat/src/internal/hardhat-network/provider/node-types.ts | |
@@ -40,6 +40,7 @@ export interface ForkConfig { | |
jsonRpcUrl: string; | |
blockNumber?: number; | |
httpHeaders?: { [name: string]: string }; | |
+ ignoreUnknownTxType?: boolean; | |
} | |
export interface ForkedNodeConfig extends CommonConfig { | |
diff --git a/node_modules/hardhat/src/internal/hardhat-network/provider/node.ts b/node_modules/hardhat/src/internal/hardhat-network/provider/node.ts | |
index 172cfc3..0b711bf 100644 | |
--- a/node_modules/hardhat/src/internal/hardhat-network/provider/node.ts | |
+++ b/node_modules/hardhat/src/internal/hardhat-network/provider/node.ts | |
@@ -158,6 +158,7 @@ export class HardhatNode extends EventEmitter { | |
forkClient: _forkClient, | |
forkBlockNumber, | |
forkBlockTimestamp, | |
+ forkIgnoreUnknownTxType, | |
} = await makeForkClient(config.forkConfig, config.forkCachePath); | |
forkClient = _forkClient; | |
common = await makeForkCommon(config); | |
@@ -178,7 +179,12 @@ export class HardhatNode extends EventEmitter { | |
await forkStateManager.initializeGenesisAccounts(genesisAccounts); | |
stateManager = forkStateManager; | |
- blockchain = new ForkBlockchain(forkClient, forkBlockNumber, common); | |
+ blockchain = new ForkBlockchain( | |
+ forkClient, | |
+ forkBlockNumber, | |
+ common, | |
+ forkIgnoreUnknownTxType | |
+ ); | |
initialBlockTimeOffset = new BN( | |
getDifferenceInSeconds(new Date(forkBlockTimestamp), new Date()) | |
diff --git a/node_modules/hardhat/src/internal/hardhat-network/provider/utils/makeForkClient.ts b/node_modules/hardhat/src/internal/hardhat-network/provider/utils/makeForkClient.ts | |
index 51a8c6f..6d1762b 100644 | |
--- a/node_modules/hardhat/src/internal/hardhat-network/provider/utils/makeForkClient.ts | |
+++ b/node_modules/hardhat/src/internal/hardhat-network/provider/utils/makeForkClient.ts | |
@@ -30,6 +30,7 @@ export async function makeForkClient( | |
forkClient: JsonRpcClient; | |
forkBlockNumber: BN; | |
forkBlockTimestamp: number; | |
+ forkIgnoreUnknownTxType: boolean; | |
}> { | |
const provider = new HttpProvider( | |
forkConfig.jsonRpcUrl, | |
@@ -78,6 +79,8 @@ Please use block number ${lastSafeBlock} or wait for the block to get ${ | |
const forkBlockTimestamp = rpcQuantityToNumber(block.timestamp) * 1000; | |
+ const forkIgnoreUnknownTxType = forkConfig.ignoreUnknownTxType ?? false; | |
+ | |
const cacheToDiskEnabled = | |
forkConfig.blockNumber !== undefined && | |
forkCachePath !== undefined && | |
@@ -91,7 +94,12 @@ Please use block number ${lastSafeBlock} or wait for the block to get ${ | |
cacheToDiskEnabled ? forkCachePath : undefined | |
); | |
- return { forkClient, forkBlockNumber, forkBlockTimestamp }; | |
+ return { | |
+ forkClient, | |
+ forkBlockNumber, | |
+ forkBlockTimestamp, | |
+ forkIgnoreUnknownTxType, | |
+ }; | |
} | |
async function getBlockByNumber( | |
diff --git a/node_modules/hardhat/src/types/config.ts b/node_modules/hardhat/src/types/config.ts | |
index bb53022..083c351 100644 | |
--- a/node_modules/hardhat/src/types/config.ts | |
+++ b/node_modules/hardhat/src/types/config.ts | |
@@ -91,6 +91,7 @@ export interface HardhatNetworkForkingUserConfig { | |
url: string; | |
blockNumber?: number; | |
httpHeaders?: { [name: string]: string }; | |
+ ignoreUnknownTxType?: boolean; | |
} | |
export type HttpNetworkAccountsUserConfig = | |
@@ -178,6 +179,7 @@ export interface HardhatNetworkForkingConfig { | |
url: string; | |
blockNumber?: number; | |
httpHeaders: { [name: string]: string }; | |
+ ignoreUnknownTxType?: boolean; | |
} | |
export interface HttpNetworkConfig { | |
diff --git a/node_modules/hardhat/types/config.d.ts b/node_modules/hardhat/types/config.d.ts | |
index b5cd480..ea9e51f 100644 | |
--- a/node_modules/hardhat/types/config.d.ts | |
+++ b/node_modules/hardhat/types/config.d.ts | |
@@ -62,6 +62,7 @@ export interface HardhatNetworkForkingUserConfig { | |
httpHeaders?: { | |
[name: string]: string; | |
}; | |
+ ignoreUnknownTxType?: boolean; | |
} | |
export declare type HttpNetworkAccountsUserConfig = "remote" | string[] | HDAccountsUserConfig; | |
export interface HttpNetworkUserConfig { | |
@@ -129,6 +130,7 @@ export interface HardhatNetworkForkingConfig { | |
httpHeaders: { | |
[name: string]: string; | |
}; | |
+ ignoreUnknownTxType?: boolean; | |
} | |
export interface HttpNetworkConfig { | |
chainId?: number; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment