We are excited to announce the latest release of the Solidity Compiler, Solidity v0.8.19. This latest version includes a range of improvements and it also introduces the support for defining operators on user-defined value types (UDVTs)! You can learn about it at length in our feature deep-dive blogpost.

Notable New Features

These are the features we want to highlight in this release.

Operators for User-Defined Value Types

The ability to use operators is meant to bring the UDVTs closer to being as natural to use as the built-in types and promote the use of type-safe interfaces. All details, code examples, and context on the design considerations for this feature can be found in this blogpost.

Preventing Dead Code in Runtime Bytecode

In earlier releases and in the default legacy code generation, when an internal library function or a free function accessed via a module was called only during contract creation, e.g. only in the constructor, a copy of the function still also occurred in the contract’s runtime bytecode. The underlying reason for this is that, generally, expressions of function type can be stored in storage during contract creation, while being called both during creation and at runtime. However, the bytecode of the function is located at different offsets in creation code vs. in runtime code and function pointers in legacy code generation are encoded as offsets into the bytecode. Therefore, a reference to both of the location in creation code and in runtime code has to be encoded in such function expressions during creation. So a function pointer in creation code also refers to the offset of the function in runtime code, which requires the function to actually be present in runtime code. Of course, this is really only necessary for function pointers that can actually end up being stored in storage, which is generally an unlikely scenario. For direct calls such a double-encoding is unnecessary. That’s why for direct calls to internal contract functions the full encoding of the function expression is bypassed by the compiler. However, this bypassing did not happen for internal library functions and for free functions called via modules, causing the undesirable behaviour that is now fixed in this release. Thanks to @sifislag for reporting this.

Full Changelog

Language Features

  • Allow defining custom operators for user-defined value types via using {f as +} for T global syntax.

Compiler Features

  • SMTChecker: New trusted mode that assumes that any compile-time available code is the actual used code, even in external calls. This can be used via the CLI option --model-checker-ext-calls trusted or the JSON field settings.modelChecker.extCalls: "trusted".


  • Assembler: Avoid duplicating subassembly bytecode where possible.
  • Code Generator: Avoid including references to the deployed label of referenced functions if they are called right away.
  • ContractLevelChecker: Properly distinguish the case of missing base constructor arguments from having an unimplemented base function.
  • SMTChecker: Fix internal error caused by unhandled z3 expressions that come from the solver when bitwise operators are used.
  • SMTChecker: Fix internal error when using the custom NatSpec annotation to abstract free functions.
  • TypeChecker: Also allow external library functions in using for.

As always, a big thank you to all contributors who helped make this release possible!

How to install/upgrade

To upgrade to the latest version of the Solidity Compiler, simply follow the installation instructions available in our documentation. Our team has made sure to provide detailed and straightforward steps to make the upgrade process as seamless as possible. If you have any questions or run into any issues during the upgrade process, don’t hesitate to reach out to our community Matrix channel.

You can download the new version of Solidity here: v0.8.19. If you want to build from the source code, do not use the source archives generated automatically by GitHub, instead please use solidity_0.8.19.tar.gz and take a look at our documentation on how to build from source if you need guidance.

Please note that for those using Solidity versions below 0.8.0, there are breaking changes. We highly recommend reviewing the detailed list of breaking changes in our documentation to ensure a smooth upgrade process. Additionally, we encourage all Solidity users to regularly check for updates to stay up-to-date with the latest improvements and optimizations. We advise all Solidity developers to upgrade to version 0.8.18 to take advantage of these improvements and optimizations.