hardhat
Version:
Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.
116 lines (96 loc) • 3.42 kB
text/typescript
import type { ExceptionalHalt, SuccessReason } from "@nomicfoundation/edr";
import { requireNapiRsModule } from "../../../../common/napi-rs";
export enum ExitCode {
SUCCESS,
REVERT,
OUT_OF_GAS,
INTERNAL_ERROR,
INVALID_OPCODE,
STACK_UNDERFLOW,
CODESIZE_EXCEEDS_MAXIMUM,
CREATE_COLLISION,
STATIC_STATE_CHANGE,
}
export class Exit {
public static fromEdrSuccessReason(reason: SuccessReason): Exit {
const { SuccessReason } = requireNapiRsModule(
"@nomicfoundation/edr"
) as typeof import("@nomicfoundation/edr");
switch (reason) {
case SuccessReason.Stop:
case SuccessReason.Return:
case SuccessReason.SelfDestruct:
return new Exit(ExitCode.SUCCESS);
}
const _exhaustiveCheck: never = reason;
}
public static fromEdrExceptionalHalt(halt: ExceptionalHalt): Exit {
const { ExceptionalHalt } = requireNapiRsModule(
"@nomicfoundation/edr"
) as typeof import("@nomicfoundation/edr");
switch (halt) {
case ExceptionalHalt.OutOfGas:
return new Exit(ExitCode.OUT_OF_GAS);
case ExceptionalHalt.OpcodeNotFound:
case ExceptionalHalt.InvalidFEOpcode:
// Returned when an opcode is not implemented for the hardfork
case ExceptionalHalt.NotActivated:
return new Exit(ExitCode.INVALID_OPCODE);
case ExceptionalHalt.StackUnderflow:
return new Exit(ExitCode.STACK_UNDERFLOW);
case ExceptionalHalt.CreateCollision:
return new Exit(ExitCode.CREATE_COLLISION);
case ExceptionalHalt.CreateContractSizeLimit:
return new Exit(ExitCode.CODESIZE_EXCEEDS_MAXIMUM);
default: {
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
throw new Error(`Unmatched EDR exceptional halt: ${halt}`);
}
}
}
constructor(public kind: ExitCode) {}
public isError(): boolean {
return this.kind !== ExitCode.SUCCESS;
}
public getReason(): string {
switch (this.kind) {
case ExitCode.SUCCESS:
return "Success";
case ExitCode.REVERT:
return "Reverted";
case ExitCode.OUT_OF_GAS:
return "Out of gas";
case ExitCode.INTERNAL_ERROR:
return "Internal error";
case ExitCode.INVALID_OPCODE:
return "Invalid opcode";
case ExitCode.STACK_UNDERFLOW:
return "Stack underflow";
case ExitCode.CODESIZE_EXCEEDS_MAXIMUM:
return "Codesize exceeds maximum";
case ExitCode.CREATE_COLLISION:
return "Create collision";
case ExitCode.STATIC_STATE_CHANGE:
return "Static state change";
}
const _exhaustiveCheck: never = this.kind;
}
public getEdrExceptionalHalt(): ExceptionalHalt {
const { ExceptionalHalt } = requireNapiRsModule(
"@nomicfoundation/edr"
) as typeof import("@nomicfoundation/edr");
switch (this.kind) {
case ExitCode.OUT_OF_GAS:
return ExceptionalHalt.OutOfGas;
case ExitCode.INVALID_OPCODE:
return ExceptionalHalt.OpcodeNotFound;
case ExitCode.CODESIZE_EXCEEDS_MAXIMUM:
return ExceptionalHalt.CreateContractSizeLimit;
case ExitCode.CREATE_COLLISION:
return ExceptionalHalt.CreateCollision;
default:
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
throw new Error(`Unmatched exit code: ${this.kind}`);
}
}
}