// before
mapping(address => uint256) public balanceOf;
// after
mapping(address userAddress => uint256 balance) public balanceOf;
[v0.8.19](https://soliditylang.org/blog/2023/02/22/solidity-0.8.19-release-announcement/):
- User-defined value types, [blog post](https://soliditylang.org/blog/2023/02/22/user-defined-operators/)
[v0.8.20](https://soliditylang.org/blog/2023/05/10/solidity-0.8.20-release-announcement):
- Defaults to EVM version Shanghai
- PUSH0 support: make that the target chain supports it, Arbitrum and Gnosis chain now support it.
- Run `cast call -r <RPC_URL> --create 0x5f`, if it returns 0x then it supports it, otherwise it returns an error.
[v0.8.21](https://soliditylang.org/blog/2023/07/19/solidity-0.8.21-release-announcement)
- Immutable variables initialization is now optional
- Qualified access to foreign events now allows emitting events defined in other contracts not inherited from.
[v0.8.22](https://soliditylang.org/blog/2023/10/25/solidity-0.8.22-release-announcement)
- Ugly unchecked increments in for loops no longer necessary to save gas
- Events can now be defined at file-level, outside a contract
[v0.8.23](https://soliditylang.org/blog/2023/11/08/solidity-0.8.23-release-announcement)
- Nothing at language level
[v0.8.24](https://soliditylang.org/blog/2024/01/26/solidity-0.8.24-release-announcement)
- Support for Cancun features, not enabled by default
- Notable Cancun features
- [EIP-1153: Transient storage TSTORE and TLOAD opcodes](https://soliditylang.org/blog/2024/01/26/transient-storage/), not in Solidity yet.
- EIP-4844: Blob transactions, adds `blobhash()` and `block. blobbasefee`.
- EIP-6780 SELFDESTRUCT limitations: it doesn't clear storage and contract code anymore unless the contract was created in the same transaction.
Related: https://github.com/kleros/kleros-v2/issues/1510
Notable changes
v0.8.18
// after mapping(address userAddress => uint256 balance) public balanceOf;