Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
c4efc24
Merge pull request #136 from tronprotocol/release_0.8.29
CodeNinjaEvan Jul 20, 2026
64ca6a0
legacy: Fix handling of storage array boundaries (deletion, cleanup, …
r0qs Dec 17, 2025
321f515
via-ir: Fix handling of storage array boundaries (deletion and cleanup)
r0qs Dec 17, 2025
28c6c02
Add test for arrays at storage boundaries and extend coverage of lega…
r0qs Dec 17, 2025
3e46de9
Test cases
nikola-matic Feb 12, 2026
06cf704
Fix transient/storage collision when deleting
nikola-matic Feb 12, 2026
74d96d4
Move TarjanSCC from libyul to libsolutil
clonker Jun 22, 2026
b5f59ce
Add Yul AST call graph recursion tests
clonker Jun 22, 2026
c16578d
Add tests reproducing spurious memory spilling
clonker Jun 20, 2026
9b997d0
Fix call graph cycle detection for intersecting recursive cycles
clonker Jun 20, 2026
fb4726d
Tests: Add tests demonstrating incorrect behaviour
blishko Jun 29, 2026
500d51c
Analysis: Fix unintentional reversing of linearized based contracts
blishko Jun 29, 2026
3d567ea
Add disambiguator prerequisite to call graph generator
clonker Jun 29, 2026
e169072
Call graph test: output the whole call graph
clonker Jun 29, 2026
0758b9e
Add `resolveFunctionName` overload dealing with instances of `Functio…
clonker Jul 6, 2026
28cc279
Yul: Call graph generator asserts that builtins are never recursive
clonker Jul 6, 2026
4adcd1a
Yul: Call graph generator raises proper exception if input is not dis…
clonker Jul 6, 2026
6fa5691
tests: adapt security backports to TRON 0.8.30
yanghang8612 Jul 16, 2026
6383d6b
Merge pull request #142 from yanghang8612/backport/sol-2025-1-to-sol-…
CodeNinjaEvan Jul 23, 2026
918c6e6
ci: sync GitHub build images with CircleCI
yanghang8612 Jul 16, 2026
82ee920
ci: add Linux ARM64 release binary
yanghang8612 Jul 21, 2026
121a4b7
ci: build release compiler targets only
yanghang8612 Jul 21, 2026
4d99274
ci: migrate binary builds to GitHub-hosted runners
yanghang8612 Jul 22, 2026
470c8d5
ci: fix S3 artifact handoff
yanghang8612 Jul 22, 2026
8d58f5a
ci: use production S3 bucket for uploads
yanghang8612 Jul 22, 2026
71a5e5b
Merge pull request #143 from yanghang8612/backport/ci-pipeline-update…
CodeNinjaEvan Jul 23, 2026
0865432
ci: isolate S3 upload workspace
yanghang8612 Jul 24, 2026
b520850
Merge pull request #144 from yanghang8612/ci/isolate-s3-upload-workspace
CodeNinjaEvan Jul 24, 2026
fd76019
fix(evmasm): align gas estimates with TVM pricing
yanghang8612 Jul 28, 2026
8e73550
fix(codegen): use TVM call price in gasNeededByCaller
yanghang8612 Jul 28, 2026
f8949f5
refactor(evmasm): clarify TVM gas constant names
yanghang8612 Jul 28, 2026
f024f31
Merge pull request #145 from yanghang8612/fix/release-0.8.30-gasmeter…
CodeNinjaEvan Jul 28, 2026
121cd1b
fix: gate experimental and unsupported VM targets
yanghang8612 Jul 28, 2026
acb4608
fix: align TRON builtin semantics across backends
yanghang8612 Jul 28, 2026
5ff386e
chore(codegen): assert TRON builtin arities
yanghang8612 Jul 28, 2026
447974f
fix(abi): restrict TRON address prefixes
yanghang8612 Jul 28, 2026
906913f
fix(smt): havoc TRON state effects conservatively
yanghang8612 Jul 28, 2026
c2bf788
fix: preserve TRON target compatibility
yanghang8612 Jul 28, 2026
d187263
fix: keep Standard JSON viaIR behavior unchanged
yanghang8612 Jul 28, 2026
a7ec301
Merge pull request #146 from yanghang8612/fix/release-0.8.30-runtime-…
CodeNinjaEvan Jul 28, 2026
65b4dfd
fix: clarify TRON builtin parameter names
yanghang8612 Jul 28, 2026
aad81d3
Merge pull request #147 from yanghang8612/fix/release-0.8.30-abi-api-…
CodeNinjaEvan Jul 28, 2026
a297925
fix: harden compiler and regression inputs
yanghang8612 Jul 28, 2026
8072fcf
fix(lsp): avoid scanning the filesystem root
yanghang8612 Jul 28, 2026
70623ec
Merge pull request #148 from yanghang8612/fix/release-0.8.30-input-pa…
CodeNinjaEvan Jul 28, 2026
4b81144
docs: fix bug metadata for TRON 0.8.30 security backports
yanghang8612 Jul 29, 2026
174578f
fix: reject Ethereum units in AST imports
yanghang8612 Jul 29, 2026
b965108
Merge pull request #149 from yanghang8612/fix/release-0.8.30-bugs-doc…
CodeNinjaEvan Jul 29, 2026
0d4fe48
fix: harden SMT, JSON input, and TVM gas estimation
yanghang8612 Jul 30, 2026
364cfd3
fix: align SMT library constraints and JSON validation
yanghang8612 Jul 30, 2026
5df9713
Merge pull request #150 from yanghang8612/fix/release-0.8.30-smt-json…
CodeNinjaEvan Jul 31, 2026
343938e
Merge pull request #151 from tronprotocol/release_0.8.30
CodeNinjaEvan Aug 6, 2026
53f1fdb
Merge remote-tracking branch 'origin/develop' into release_0.8.31
yanghang8612 Aug 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 28 additions & 7 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -239,49 +239,61 @@ jobs:
contents: read

steps:
- name: Prepare artifact workspace
id: artifact-workspace
shell: bash
run: |
artifact_work_dir="${RUNNER_TEMP}/solidity-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
mkdir -p "${artifact_work_dir}/github"
echo "path=${artifact_work_dir}" >> "${GITHUB_OUTPUT}"

- name: Download solc-windows
uses: actions/download-artifact@v7
with:
name: solc-windows
path: github
path: ${{ steps.artifact-workspace.outputs.path }}/github

- name: Download solc-macos
uses: actions/download-artifact@v7
with:
name: solc-macos
path: github
path: ${{ steps.artifact-workspace.outputs.path }}/github

- name: Download solc-linux
uses: actions/download-artifact@v7
with:
name: solc-linux
path: github
path: ${{ steps.artifact-workspace.outputs.path }}/github

- name: Download solc-linux-arm
uses: actions/download-artifact@v7
with:
name: solc-linux-arm
path: github
path: ${{ steps.artifact-workspace.outputs.path }}/github

- name: Download solc-ems
uses: actions/download-artifact@v7
with:
name: solc-ems
path: github
path: ${{ steps.artifact-workspace.outputs.path }}/github

- name: Restore executable permissions
working-directory: ${{ steps.artifact-workspace.outputs.path }}
run: chmod +x github/solc-static-linux github/solc-static-linux-arm github/solc-macos

- name: List all artifacts
working-directory: ${{ steps.artifact-workspace.outputs.path }}
run: |
ls -R github/

- name: Create tarball for use on github
working-directory: ${{ steps.artifact-workspace.outputs.path }}
run: |
cd github
tar --create --file ../github-binaries.tar *

- name: Rename binaries to solc-bin naming convention
working-directory: ${{ steps.artifact-workspace.outputs.path }}
run: |
full_version=$(
github/solc-static-linux --version |
Expand All @@ -301,6 +313,7 @@ jobs:

- name: Upload to S3
shell: bash
working-directory: ${{ steps.artifact-workspace.outputs.path }}
env:
S3_BUCKET: ${{ secrets.S3_BUCKET_PROD }}
run: |
Expand All @@ -313,5 +326,13 @@ jobs:
aws s3 cp solc-static-linux "s3://${S3_BUCKET}/${{ github.sha }}/" --only-show-errors
aws s3 cp solc-static-linux-arm "s3://${S3_BUCKET}/${{ github.sha }}/" --only-show-errors
aws s3 cp soljson.js "s3://${S3_BUCKET}/${{ github.sha }}/" --only-show-errors

cd .. && rm -rf github solc-bin *.tar

- name: Clean artifact workspace
if: always()
shell: bash
env:
ARTIFACT_WORK_DIR: ${{ steps.artifact-workspace.outputs.path }}
run: |
if [[ -n "${ARTIFACT_WORK_DIR}" ]]; then
rm -rf -- "${ARTIFACT_WORK_DIR}"
fi
8 changes: 4 additions & 4 deletions docs/bugs.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"description": "When the compiler detects that a custom layout specifier puts contract's static storage area too close to the end of the address space, it emits a warning. To make the warning more useful, the compiler tries to point at the last storage variable in that area. For this reason it walks the linearized inheritance hierarchy in reverse (from the least to the most derived). The list is calculated once and stored in an AST annotation called ``linearizedBaseContracts``. The direct cause of the bug was the fact that the code that reverses the list was doing it in place rather than on a copy, modifying the annotation. This effectively reversed the order of base contracts seen by any component that runs after layout checks: later phases of analysis, AST export, code generator, SMTChecker, etc. The observable effect was a reversed order of state variable initialization, constructor invocation, virtual function/modifier resolution, leading either to miscompilations or internal compiler errors, depending on the specific usage. Since the source of the bug was in the analysis stage, it was independent of the codegen pipeline or optimizer settings. The main condition necessary to trigger the bug was the presence of the warning in the output. The other is presence of language constructs whose evaluation depends on the inheritance order. While potential effects are very serious, this requirement excludes the vast majority of contracts as intentionally placing the storage variables in the last 2**64 slots is highly discouraged, which was actually the main reason for adding this warning.",
"link": "https://blog.soliditylang.org/2026/07/09/inheritance-order-reversal-on-storage-end-warning-bug/",
"introduced": "0.8.29",
"fixed": "0.8.36",
"fixed": "0.8.30",
"severity": "medium"
},
{
Expand All @@ -16,7 +16,7 @@
"description": "To work around the 16-slot stack access limit of the EVM, the IR-based code generator can move local variables of stack-too-deep functions to fixed memory offsets. This relocation is unsound for recursive functions: a fixed offset would be shared by all activations of the function, so a recursive call would overwrite the caller's value. The stack limit evader therefore must not relocate variables of functions that are part of a recursive call chain. To this end, the call graph was searched for cycles using a path-based depth-first search that, once a function had been fully explored and popped from the search path, short-circuited on it on any later visit. As a result, a function shared between several intersecting cycles could be reached first through a path that did not yet close a cycle through it, get marked as finished, and then be skipped when a later path would have revealed that it does lie on a cycle. Such a function was misclassified as non-recursive. When a misclassified function was complex enough for the stack limit evader to relocate some of its variables, those variables were moved to fixed memory offsets and silently corrupted on recursion, producing wrong results rather than a compile-time error. Triggering the bug requires the IR pipeline, a set of mutually recursive functions whose call graph contains intersecting cycles, at least one of the functions in an undetected part of a cycle being complex enough to require relocation to memory, and an unfortunate processing order of the functions (which depends on the hashes of their Yul names). It is independent of whether the optimizer is enabled.",
"link": "https://blog.soliditylang.org/2026/07/08/unsound-spill-in-mutual-recursion-bug/",
"introduced": "0.7.2",
"fixed": "0.8.36",
"fixed": "0.8.30",
"severity": "medium",
"conditions": {
"viaIR": true
Expand All @@ -29,7 +29,7 @@
"description": "The IR-based code generator provides a set of Yul helper functions for basic operations, such as clearing, copying, encoding or type conversions. Not all functions are used by every contract. The codegen appends them to the generated sources individually, only when an operation that would invoke one of them is encountered. Utility functions are often specialized for different types and locations. Since Yul does not support generic functions, specialization is done by generating multiple versions of the same function, with the information distinguishing the variants embedded in their names. However, if not all the necessary bits of distinguishing information are properly accounted for, two helpers may end up with the same name, causing a collision. In this situation the codegen includes only one of them, with calls to both variants invoking it. This happened with the ``set_to_zero`` helper used when an area of transient or persistent storage needs to be cleared. The helper name was missing the location information, which resulted in a collision between the persistent and transient storage variants for the same type. This meant that contracts clearing both locations would actually clear only one, leaving the other untouched. Which location ended up being cleared depended on the order in which the code generator processed the input. The necessary condition to trigger the bug was the use of ``delete`` operator on a transient storage variable. This was due to value types being the only types supported in transient storage and ``delete`` being the only operation invoking the helper allowed on such types. The other necessary condition was clearing of persistent storage and in this case the range of affected operations was wider: operator ``delete``, array ``pop()`` or assignment that resulted in a longer array being overwritten with a shorter one. The cleared variable itself also did not necessarily have to be of the same type. It was enough that a matching value type was nested in it. It also did not always have to be the exact same value type - clearing operations on reference types are usually performed at slot granularity, treating every slot as ``uint256`` rather than clearing every value packed into it individually. To trigger the bug both operations had to be present within the same piece of bytecode. Independent contracts, not related through inheritance, would not affect each other this way. The presence of one operation only in creation code and the other only in deployed code would not trigger the bug either.",
"link": "https://blog.soliditylang.org/2026/02/18/transient-storage-clearing-helper-collision-bug/",
"introduced": "0.8.28",
"fixed": "0.8.34",
"fixed": "0.8.30",
"severity": "high",
"conditions": {
"viaIR": true,
Expand All @@ -43,7 +43,7 @@
"description": "Solidity makes it possible to define variables that extend past the last (2**256-th) slot of storage, which results in wrap-around back to slot zero. Since EVM uses 256-bit integer arithmetic, most operations on such variables just work. The only situation which requires special attention is iteration against absolute slot addresses: the invariant that the last slot belonging to a variable has the highest address does not hold. When implemented incorrectly, a loop over an array will immediately terminate if the container spans the end of storage - due to the initial position already being greater than the end position. This affected storage array clearing loops generated by both evmasm and IR pipelines. Additionally, (only in the evmasm pipeline) copying operations whose source was an array straddling the end of storage were also affected. At the language level, the buggy code would be generated for array assignment, array initialization, delete operator, <array>.pop() and <array>.push(). Note that a clearing loop is inserted by the compiler not only for invocations of the delete operator, but also to zero storage when overwriting a longer array with a shorter one, popping an element or even pushing an empty element to a dynamic array. Since clearing is a separate loop, it is possible for the bug to only affect it and not the copy operation it follows (which is always the case in the IR pipeline). The bug is extremely unlikely to be triggered accidentally due to the probabilistic impossibility of a short dynamic array being allocated right at the storage boundary. On the other hand, scenarios in which a user may place a static array there intentionally do not seem realistic and are limited to unusual layouts, in which a contract does not place any storage variables at slot zero (otherwise they would overlap the array).",
"link": "https://blog.soliditylang.org/2025/12/18/lost-storage-array-write-on-slot-overflow-bug/",
"introduced": "0.1.0",
"fixed": "0.8.32",
"fixed": "0.8.30",
"severity": "low"
},
{
Expand Down
44 changes: 2 additions & 42 deletions docs/bugs_by_version.json
Original file line number Diff line number Diff line change
Expand Up @@ -2070,53 +2070,13 @@
"released": "2021-03-23"
},
"0.8.30": {
"bugs": [
"InheritanceOrderReversalOnStorageEndWarning",
"UnsoundSpillInMutualRecursion",
"TransientStorageClearingHelperCollision",
"LostStorageArrayWriteOnSlotOverflow"
],
"bugs": [],
"released": "2025-05-07"
},
"0.8.31": {
"bugs": [
"InheritanceOrderReversalOnStorageEndWarning",
"UnsoundSpillInMutualRecursion",
"TransientStorageClearingHelperCollision",
"LostStorageArrayWriteOnSlotOverflow"
],
"bugs": [],
"released": "2025-12-03"
},
"0.8.32": {
"bugs": [
"InheritanceOrderReversalOnStorageEndWarning",
"UnsoundSpillInMutualRecursion",
"TransientStorageClearingHelperCollision"
],
"released": "2025-12-18"
},
"0.8.33": {
"bugs": [
"InheritanceOrderReversalOnStorageEndWarning",
"UnsoundSpillInMutualRecursion",
"TransientStorageClearingHelperCollision"
],
"released": "2025-12-18"
},
"0.8.34": {
"bugs": [
"InheritanceOrderReversalOnStorageEndWarning",
"UnsoundSpillInMutualRecursion"
],
"released": "2026-02-18"
},
"0.8.35": {
"bugs": [
"InheritanceOrderReversalOnStorageEndWarning",
"UnsoundSpillInMutualRecursion"
],
"released": "2026-04-29"
},
"0.8.4": {
"bugs": [
"UnsoundSpillInMutualRecursion",
Expand Down
2 changes: 1 addition & 1 deletion libevmasm/ConstantOptimiser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ bigint ComputeMethod::gasNeeded(AssemblyItems const& _routine) const
{
auto numExps = static_cast<size_t>(count(_routine.begin(), _routine.end(), Instruction::EXP));
return combineGas(
simpleRunGas(_routine, m_params.evmVersion) + numExps * (GasCosts::expGas + GasCosts::expByteGas(m_params.evmVersion)),
simpleRunGas(_routine, m_params.evmVersion) + numExps * GasCosts::expByteGasInTVM,
// Data gas for routine: Some bytes are zero, but we ignore them.
bytesRequired(_routine, m_params.evmVersion) * (m_params.isCreation ? GasCosts::txDataNonZeroGas(m_params.evmVersion) : GasCosts::createDataGas),
0
Expand Down
Loading