{ skip to content }

Solidity 0.8.29 Release Announcement

Posted by Solidity Team on March 12, 2025

Releases

We are excited to announce the release of the Solidity Compiler v0.8.29.

This latest version of the compiler brings experimental support for EVM Object Format, support for custom storage layouts, initial supoort for ethdebug, and more!

Notable Features

Experimental Support for EVM Object Format

0.8.29 brings us experimental support for EVM Object Format (EOF). Please note that the feature can only be enabled when compiling for the Osaka EVM version, which has not yet been deployed to mainnet or testnets.

The experimental backend is still incomplete and implements only a subset of EOF features. This subset, however, is already sufficient to support compiling arbitrary Solidity contracts. The missing elements are, for the most part, opcodes like RJUMPV or EXCHANGE, which will let us generate more efficient code in the future, but were not strictly necessary to be able to generate working bytecode.

Note that existing contracts may not compile without adjustments, due to some features no longer existing on EOF. For example, gas and code introspection are no longer possible, which means that it is impossible to generate code for the gas call option on external calls or builtins like gasleft() and <address>.code. The changes to contract creation also affect the operator new, which now always uses a salt. The salt has a default value (0), but will soon become mandatory, since using the same value with the same contract results in the same deployment address (unlike new outside of EOF, which uses an account's nonce to generate a unique address for every deployment). Finally, many opcodes were removed or replaced, in particular the external calls, so contracts making heavy use of inline assembly will likely not compile as-is.

Due to the experimental nature of the feature, not all of the syntax differences are covered by analysis checks at the moment and in certain cases you may encounter internal compiler errors when attempting to use them. Please bear with us, and note that these should not be reported as bugs in the implementation. They will be addressed in subsequent releases.

Furthermore, compilation to EOF can only be performed via IR and only with the optimiser enabled. The current implementation, however, does not include any low-level optimisations, which may lead to increased code size in some cases. We expect to mitigate this in future releases and even make significant improvements by porting the libevmasm optimiser to the EOF target. This should alleviate any possible code size regressions users may still see in the current state of the implementation.

Please keep in mind that at the time of this release the scope of the Fusaka upgrade has not yet been finalized and the EOF specification was still undergoing changes in the recent months. Our implementation does not account for these changes yet and was based on the unified EOF specification as of 2024-09-05 and tested against evmone 0.13.0.

To try it out with your contract, use --experimental-eof-version 1 on the command line or settings.eofVersion: 1 in Standard JSON and remember to select an EVM version that supports it (--evm-version osaka/settings.evmVersion: "osaka").

We would like to thank the Ipsilon team for their amazing work on EOF, and in particular Radek Zagórowicz for his work on the Solidity implementation.

Support for Custom Storage Layouts

This release introduces syntax for relocating contract's storage variables to an arbitrary location.

contract C layout at 2**255 - 42 {
    uint x;
}

The support for specifying storage locations is one of the oldest and most discussed feature requests in our issue tracker, but the multitude of use cases and potentially conflicting requirements so far prevented us from settling on a specific solution. With the inclusion of EIP-7702: Set EOA account code in the Pectra upgrade, it has now become critical for safe implementation of account abstraction and we decided to prioritize that use case above all others.

Currently the syntax is very limited: the base location can only be a literal expression and applies to the whole inheritance tree. As the next step we are planning to allow using constants and add special-purpose helpers for the most commonly used layouts (in particular ERC-7201: Namespaced Storage Layout). Eventually we may support the full range of features described in the initial syntax proposal, though we want to do that gradually to avoid overcomplicating it and address the most relevant use cases first. The community feedback will drive the future of this feature, so do not hesitate to share your opinion on our forum and tell us which aspects are the most important for your contract.

To learn more about the new feature, please consult the custom storage layout documentation.

Initial Support for ethdebug

This release also introduces the first experimental step towards supporting ethdebug - a debugging data format suitable for smart contracts.

The ethdebug specification is still under development. Join the ethdebug Matrix channel or watch the ethdebug repository on Github to follow the ongoing development. There is an ethdebug meeting every second week on Thursdays at 17:00 Berlin time. Meetings are announced on the Matrix channel.

The current implementation supports the generation of instructions and source ranges. This initial version only supports unoptimized compilation via IR and is still missing many important features.

If you want to give it a try, you can enable the ethdebug output on the command line with --ethdebug/--ethdebug-runtime. To request the ethdebug artifacts in Standard JSON, add "evm.bytecode.ethdebug"/"evm.deployedBytecode.ethdebug" in settings.outputSelection (note that the "*" wildard does not enable it). Please also remember that settings.viaIR: true/--via-ir is necessary for the feature to work.

Full Changelog

Language Features

  • Allow relocating contract storage to an arbitrary location.

Compiler Features

  • Error Reporting: Errors reported during code generation now point at the location of the contract when more fine-grained location is not available.
  • EVM: Support for the EVM version "Osaka".
  • EVM Assembly Import: Allow enabling opcode-based optimizer.
  • General: The experimental EOF backend implements a subset of EOF sufficient to compile arbitrary high-level Solidity syntax via IR with optimization enabled.
  • SMTChecker: Support block.blobbasefee and blobhash.
  • SMTChecker: The option --model-checker-print-query` no longer requires --model-checker-solvers smtlib2`.
  • SMTChecker: Z3 is now a runtime dependency, not a build dependency (except for emscripten build).
  • Yul Parser: Make name clash with a builtin a non-fatal error.

Bugfixes

  • Commandline Interface: Report StackTooDeep errors in compiler mode as proper errors instead of printing diagnostic information meant for internal compiler errors.
  • Error Reporting: Fix error locations not being shown for source files with empty names.
  • General: Fix internal compiler error when requesting IR AST outputs for interfaces and abstract contracts.
  • Metadata: Fix custom cleanup sequence missing from metadata when other optimizer settings have default values.
  • SMTChecker: Fix internal compiler error when analyzing overflowing expressions or bitwise negation of unsigned types involving constants.
  • SMTChecker: Fix reporting on targets that are safe in the context of one contract but unsafe in the context of another contract.
  • SMTChecker: Fix SMT logic error when analyzing cross-contract getter call with BMC.
  • SMTChecker: Fix SMT logic error when contract deployment involves string literal to fixed bytes conversion.
  • SMTChecker: Fix SMT logic error when external call has extra effectless parentheses.
  • SMTChecker: Fix SMT logic error when initializing a fixed-sized-bytes array using string literals.
  • SMTChecker: Fix SMT logic error when translating invariants involving array store and select operations.
  • SMTChecker: Fix wrong encoding of string literals as arguments of ecrecover precompile.
  • Standard JSON Interface: Fix generatedSources and sourceMap being generated internally even when not requested.
  • TypeChecker: Fix spurious compilation errors due to incorrect computation of contract storage size which erroneously included transient storage variables.
  • Yul: Fix internal compiler error when a code generation error should be reported instead.
  • Yul Optimizer: Fix failing debug assertion due to dereferencing of an empty optional value.

Build System

  • Linux release builds are fully static again and no longer depend on glibc.
  • Switch from C++17 to C++20 as the target standard.

Solc-Js:

  • The wrapper now requires at least nodejs v12.

How to Install/Upgrade?

To upgrade to the latest version of the Solidity Compiler, please follow the installation instructions available in our documentation. You can download the new version of Solidity here: v0.8.29.

If you want to build from the source code, do not use the source archives generated automatically by GitHub. Instead, use the solidity_0.8.29.tar.gz source tarball or check out the v0.8.29 tag via git.

And last but not least, we would like to give a big thank you to all the contributors who helped make this release possible!

Next post

Get involved

GitHub

Twitter

Mastodon

Matrix

Discover more

BlogDocumentationUse casesContributeAboutForum

2025 Solidity Team

Security Policy

Code of Conduct