diff --git a/.github/actions/get-solc/action.yml b/.github/actions/get-solc/action.yml index e5feb2d..db8b3d2 100644 --- a/.github/actions/get-solc/action.yml +++ b/.github/actions/get-solc/action.yml @@ -19,7 +19,7 @@ runs: shell: bash run: | mkdir -p solc - curl -sSL --output solc/solc https://github.com/argotorg/solidity/releases/download/v0.8.34/${SOLC_NAME} + curl -sSL --output solc/solc https://github.com/argotorg/solidity/releases/download/v0.8.35/${SOLC_NAME} - name: Make Solc Executable if: ${{ runner.os == 'Windows' }} diff --git a/.github/workflows/differential-tests.yml b/.github/workflows/differential-tests.yml index f6cc211..9a82f72 100644 --- a/.github/workflows/differential-tests.yml +++ b/.github/workflows/differential-tests.yml @@ -6,7 +6,7 @@ on: env: # The compiler modes to use for compilation by retester. MODES: "Y M0 S+, Y M3 S+, Y Mz S+" - SOLC_VERSION: "0.8.34" + SOLC_VERSION: "0.8.35" jobs: build: diff --git a/.github/workflows/reusable-build.yml b/.github/workflows/reusable-build.yml index 669d9e5..8b30d73 100644 --- a/.github/workflows/reusable-build.yml +++ b/.github/workflows/reusable-build.yml @@ -297,7 +297,7 @@ jobs: - name: Basic Sanity Check run: | mkdir -p solc - curl -sSLo solc/soljson.js https://github.com/argotorg/solidity/releases/download/v0.8.34/soljson.js + curl -sSLo solc/soljson.js https://github.com/argotorg/solidity/releases/download/v0.8.35/soljson.js node -e " // Make sure to require './solc/soljson' and not 'solc/soljson' in order to use // the explicitly downloaded solc, rather than resolving an npm package potentially diff --git a/CHANGELOG.md b/CHANGELOG.md index 60de528..d0a947d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ - Updated `LLVM` from `21.1.8` to LLVM `22.1.4` +### Added +- Support for solc v0.8.35. + ## v1.1.0 Supported `polkadot-sdk` rev: `2603` diff --git a/crates/integration/contracts/ERC7201.sol b/crates/integration/contracts/ERC7201.sol new file mode 100644 index 0000000..400b28e --- /dev/null +++ b/crates/integration/contracts/ERC7201.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.35; + +/* runner.json +{ + "differential": true, + "actions": [ + { + "Instantiate": { + "code": { + "Solidity": { + "contract": "ERC7201" + } + } + } + } + ] +} +*/ + +/// Tests the `erc7201` builtin introduced in solc 0.8.35. +/// Reference: https://eips.ethereum.org/EIPS/eip-7201 +contract ERC7201 { + /// Reference implementation of the ERC-7201 base slot formula in pure + /// Solidity. Used to cross-check the builtin output. + function referenceSlot(string memory id) internal pure returns (uint256) { + return uint256( + keccak256(bytes.concat(bytes32(uint256(keccak256(bytes(id))) - 1))) + & ~bytes32(uint256(0xff)) + ); + } + + constructor() payable { + // Compile-time path: literal argument, solc folds the result into a + // numeric constant in the emitted Yul. + assert(erc7201("example.main") == referenceSlot("example.main")); + assert( + erc7201("erc7201:openzeppelin.storage.Initializable") + == referenceSlot("erc7201:openzeppelin.storage.Initializable") + ); + assert(erc7201("") == referenceSlot("")); + + // Runtime path: non-literal argument, solc emits a Yul utility + // function that performs the keccak256 hashes at runtime. + string memory id = "example.main"; + assert(erc7201(id) == referenceSlot(id)); + + string memory empty = ""; + assert(erc7201(empty) == referenceSlot(empty)); + + // The two paths must agree. + assert(erc7201("example.main") == erc7201(id)); + } +} diff --git a/crates/integration/src/tests.rs b/crates/integration/src/tests.rs index 24144e8..6172054 100644 --- a/crates/integration/src/tests.rs +++ b/crates/integration/src/tests.rs @@ -67,6 +67,7 @@ test_spec!(add_mod_mul_mod, "AddModMulModTester", "AddModMulMod.sol"); test_spec!(memory_bounds, "MemoryBounds", "MemoryBounds.sol"); test_spec!(selfdestruct, "Selfdestruct", "Selfdestruct.sol"); test_spec!(clz, "CountLeadingZeros", "CountLeadingZeros.sol"); +test_spec!(erc7201, "ERC7201", "ERC7201.sol"); test_spec!(call_gas, "CallGas", "CallGas.sol"); test_spec!(linker_symbol, "Linked", "Linked.sol"); test_spec!( diff --git a/crates/resolc/src/solc/mod.rs b/crates/resolc/src/solc/mod.rs index af1ce47..768f652 100644 --- a/crates/resolc/src/solc/mod.rs +++ b/crates/resolc/src/solc/mod.rs @@ -23,7 +23,7 @@ pub mod version; pub const FIRST_SUPPORTED_VERSION: semver::Version = semver::Version::new(0, 8, 0); /// The last supported version of `solc`. -pub const LAST_SUPPORTED_VERSION: semver::Version = semver::Version::new(0, 8, 34); +pub const LAST_SUPPORTED_VERSION: semver::Version = semver::Version::new(0, 8, 35); /// The Solidity compiler. pub trait Compiler { diff --git a/js/emscripten/build.js b/js/emscripten/build.js index 1ce5a86..7515352 100644 --- a/js/emscripten/build.js +++ b/js/emscripten/build.js @@ -3,7 +3,7 @@ const path = require("path"); const { minify } = require("terser"); const SOLJSON_URI = - "https://binaries.soliditylang.org/wasm/soljson-v0.8.34+commit.80d5c536.js"; + "https://binaries.soliditylang.org/wasm/soljson-v0.8.35+commit.47b9dedd.js"; const RESOLC_WASM_URI = process.env.RELEASE_RESOLC_WASM_URI || "http://127.0.0.1:8080/resolc.wasm"; const RESOLC_WASM_TARGET_DIR = path.join( diff --git a/js/emscripten/package.json b/js/emscripten/package.json index f1d4adc..e22cd78 100644 --- a/js/emscripten/package.json +++ b/js/emscripten/package.json @@ -2,7 +2,7 @@ "name": "revive", "private": true, "dependencies": { - "solc": ">=0.8.0 <=0.8.34" + "solc": ">=0.8.0 <=0.8.35" }, "scripts": { "example:web": "http-server ./examples/web/", diff --git a/js/resolc/package.json b/js/resolc/package.json index d5417c6..3569aa4 100644 --- a/js/resolc/package.json +++ b/js/resolc/package.json @@ -34,6 +34,6 @@ "commander": "^13.1.0", "package-json": "^10.0.1", "resolve-pkg": "^2.0.0", - "solc": ">=0.8.0 <=0.8.34" + "solc": ">=0.8.0 <=0.8.35" } } diff --git a/package-lock.json b/package-lock.json index d6302af..85a894e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "js/emscripten": { "name": "revive", "dependencies": { - "solc": ">=0.8.0 <=0.8.34" + "solc": ">=0.8.0 <=0.8.35" }, "devDependencies": { "@playwright/test": "^1.59.1", @@ -55,7 +55,7 @@ "commander": "^13.1.0", "package-json": "^10.0.1", "resolve-pkg": "^2.0.0", - "solc": ">=0.8.0 <=0.8.34" + "solc": ">=0.8.0 <=0.8.35" }, "bin": { "resolc": "dist/bin.js"