#error #error-message #generate-typescript #solidity #parse-error #create #generator

app jesper

Jasper is a simple, yet powerful, error generator for Solidity. It allows you to generate typescript errors from your Solidity code, and use them to create custom error messages.

1 unstable release

0.1.0 Jan 29, 2024

#146 in Magic Beans

MIT license

295KB
4K SLoC

TypeScript 3K SLoC // 0.0% comments Rust 758 SLoC // 0.1% comments
Jesper

Jesper

Jesper is a simple, yet powerful, error generator for Solidity. It allows you to generate typescript errors from your Solidity code, and use them to create custom error messages.

Installation

npm install jasper

Usage

Jesper automatically parses the output folder of your framework and generates a typescript file with all the errors in it. You can then import this file and use it to create custom error messages.

You can also optionally leave a message on top of the error which will add a custom message to the error. The error arguments can also be injected into the message by using the {} syntax.

Rules

  • The error message must be on the same line as the error declaration
  • The error message must start with //#Message:
  • The error message must be on the same line as the error declaration
  • The injected arguments must be wrapped in {}
  • The error must be wrapped in quotes ""
contract MyContract {
    error ErrIsContract();
    //#Message: "USDG: NotVetoCouncilMember"
    error ErrNotVetoCouncilMember();
    //#Message: "USDG: PermanentlyFrozen"
    error ErrPermanentlyFrozen();
    //#Message: "USDG: ToCannotBeUSDCReceiver"
    error ToCannotBeUSDCReceiver();
    //#Message: "USDG: CannotSwapZero"
    error ErrCannotSwapZero();

    //#Message: "Cannot send to {user}"
    error ErrCannotSendToUser(address user, address sender);

   //......rest of logic

}

Commands

Init project

This creates a default jesper-config.json file in the root of your project.

jesper init

Generate errors

jesper gen

Config

{
  "outputFolder": "./jesper-bindings", // The folder where the generated typescript file will be placed
  "typescript": true, //does nothing for now, will get JS bindings soon
  "framework": "foundry", //foundry | hardhat
  "contractsPath": "./contracts", //The path where the contracts are located
  "excludedFiles": ["./contracts/Migrations.sol"], //Files to exclude, doesen't work yet
  "extraIncludedFiles": [], //Extra files to include, doesen't work yet
  "modes": ["Viem"] //Viem | EthersV5
}

About The Output

Jesper will output a typescript file with all the errors in it. The file will be named jesper-bindings.ts and will be placed in the outputFolder specified in the config.

Another file will be generated based on the modes specified in the config. This file will be named jesperParseError<mode>.ts and will be placed in the outputFolder specified in the config as well.

It exports a function called jesperParseError which takes in error data and returns a string. This function is used to parse the error message and inject the arguments into the message.

Roadmap

  • Make sure you can't inject an error argument that doesen't exist.
  • Setup tests
  • Setup CI
  • More stuff I can't think of, just did a 12h bender on this

Author

Made by 0xSimon

Dependencies

~5–14MB
~175K SLoC