Skip to content

Instantly share code, notes, and snippets.

@gzeoneth
Created September 9, 2022 20:43
Show Gist options
  • Save gzeoneth/99ac30932bf07f91661d7bc621ba1f50 to your computer and use it in GitHub Desktop.
Save gzeoneth/99ac30932bf07f91661d7bc621ba1f50 to your computer and use it in GitHub Desktop.
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