@nomiclabs/hardhat-waffle
Version:
Hardhat plugin to test smart contracts with Waffle
70 lines (62 loc) • 2.14 kB
text/typescript
import { BigNumber } from "ethers";
let processRequest: any;
export function skipEstimateGas(
hardhatWaffleProvider: any,
estimateResult: string
) {
let estimateGasResult: BigNumber;
try {
estimateGasResult = BigNumber.from(estimateResult);
} catch {
throw new Error(
`The value of the skipEstimateGas (${estimateResult}) in \n` +
"hardhat config property must be a valid BigNumber string"
);
}
const init =
hardhatWaffleProvider._hardhatNetwork.provider._wrapped._wrapped._wrapped
._init;
hardhatWaffleProvider._hardhatNetwork.provider._wrapped._wrapped._wrapped._init =
async function () {
await init.apply(this);
if (
getHardhatVMEventEmitter(hardhatWaffleProvider)?.listenerCount(
"beforeMessage"
) < 2
) {
overrideProcessRequest(hardhatWaffleProvider, estimateGasResult);
}
};
}
function overrideProcessRequest(provider: any, estimateGasResult: BigNumber) {
const curProcessRequest =
provider._hardhatNetwork.provider._wrapped._wrapped._wrapped._ethModule
.processRequest;
if (curProcessRequest !== processRequest) {
const originalProcess =
provider._hardhatNetwork.provider._wrapped._wrapped._wrapped._ethModule.processRequest.bind(
provider._hardhatNetwork.provider._wrapped._wrapped._wrapped._ethModule
);
provider._hardhatNetwork.provider._wrapped._wrapped._wrapped._ethModule.processRequest =
(method: string, params: any[]) => {
if (method === "eth_estimateGas") {
return estimateGasResult.toHexString();
} else {
return originalProcess(method, params);
}
};
processRequest =
provider._hardhatNetwork.provider._wrapped._wrapped._wrapped._ethModule
.processRequest;
}
}
function getHardhatVMEventEmitter(provider: any) {
const vm =
provider?._hardhatNetwork.provider?._wrapped._wrapped?._wrapped?._node
?._vmTracer?._vm;
/**
* There were changes related to the location of event emitter introduced
* in Hardhat version 2.11.0.
*/
return vm?.evm?.events ?? vm;
}