From f1e4692563916b6e6411b87457d9e8a5eded4bda Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 29 Jul 2026 18:42:55 +0000 Subject: [PATCH 1/3] chore(pragma): pin concrete contracts to =0.8.25 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The convention is `^` for library and abstract files, `=` for concrete contracts including concrete test mocks. All three concrete .sol files in this repo floated `^0.8.25`; they now pin exactly. `src/lib/LibRainDeploy.sol` is a library that downstream soldeer consumers compile, so it keeps `^0.8.25` — a hard pin there would break a consumer on a different 0.8.x. Co-Authored-By: Claude Opus 5 (1M context) --- test/src/lib/LibRainDeploy.t.sol | 2 +- test/src/lib/MockDeployable.sol | 2 +- test/src/lib/MockReverter.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/src/lib/LibRainDeploy.t.sol b/test/src/lib/LibRainDeploy.t.sol index c08ec54..48c7ec9 100644 --- a/test/src/lib/LibRainDeploy.t.sol +++ b/test/src/lib/LibRainDeploy.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibRainDeploy} from "../../../src/lib/LibRainDeploy.sol"; diff --git a/test/src/lib/MockDeployable.sol b/test/src/lib/MockDeployable.sol index 2309443..06790a8 100644 --- a/test/src/lib/MockDeployable.sol +++ b/test/src/lib/MockDeployable.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; /// @title MockDeployable /// Minimal contract used as a deployment target for Zoltu factory tests. diff --git a/test/src/lib/MockReverter.sol b/test/src/lib/MockReverter.sol index 32bb09d..2081d63 100644 --- a/test/src/lib/MockReverter.sol +++ b/test/src/lib/MockReverter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; /// @title MockReverter /// Contract whose constructor always reverts, used to test DeployFailed with From d6fcdf4d0e7e1ea6d1bfdcf47ece790742fa0a41 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 29 Jul 2026 19:00:58 +0000 Subject: [PATCH 2/3] test(deploy): update Zoltu CREATE2 constants for the pinned solc The Zoltu factory is a CREATE2 proxy with a zero salt, so the address it deploys to is a pure function of the creation code. Pinning the concrete test files to =0.8.25 moves the whole compilation unit from solc 0.8.35 (what ^0.8.25 floats to in the rainix toolchain) down to 0.8.25, which changes MockDeployable's creation code and therefore its deployed address and code hash. Address 0xC24016f2..0xC24016f209562fc151e5Ab7F88694ED5775feb36 becomes 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854 and the code hash becomes 0x6ea525f6523fe148810254f04b9a74a379f59ca0f3a7fa83db90b691c78cc299. Both values are confirmed twice over: cast create2 derives the address from the CREATE2 formula given the factory, a zero salt and the 0.8.25 creation code, and live fork execution deploys to exactly that address. Co-Authored-By: Claude Opus 5 (1M context) --- test/src/lib/LibRainDeploy.t.sol | 36 ++++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/test/src/lib/LibRainDeploy.t.sol b/test/src/lib/LibRainDeploy.t.sol index 48c7ec9..9930d32 100644 --- a/test/src/lib/LibRainDeploy.t.sol +++ b/test/src/lib/LibRainDeploy.t.sol @@ -234,11 +234,11 @@ contract LibRainDeployTest is Test { address(this), type(MockDeployable).creationCode, "test/src/lib/MockDeployable.sol:MockDeployable", - 0xC24016f209562fc151e5Ab7F88694ED5775feb36, - 0xc1a263a0b50505687a5140c7964ec5c947329e7d03410306fee68cc3620c5483, + 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854, + 0x6ea525f6523fe148810254f04b9a74a379f59ca0f3a7fa83db90b691c78cc299, dependencies ); - assertEq(result, 0xC24016f209562fc151e5Ab7F88694ED5775feb36); + assertEq(result, 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854); } /// External wrapper for `deployToNetworks` so that `vm.expectRevert` @@ -277,7 +277,7 @@ contract LibRainDeployTest is Test { function testDeployZoltu() external { vm.createSelectFork(LibRainDeploy.ARBITRUM_ONE); address deployed = this.externalDeployZoltu(type(MockDeployable).creationCode); - assertEq(deployed, 0xC24016f209562fc151e5Ab7F88694ED5775feb36); + assertEq(deployed, 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854); } /// `deployZoltu` MUST revert with `DeployFailed` when the Zoltu factory @@ -307,7 +307,7 @@ contract LibRainDeployTest is Test { abi.encodeWithSelector( LibRainDeploy.UnexpectedDeployedAddress.selector, address(0xdead), - 0xC24016f209562fc151e5Ab7F88694ED5775feb36 + 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854 ) ); this.externalDeployToNetworks( @@ -321,13 +321,13 @@ contract LibRainDeployTest is Test { string[] memory networks = new string[](1); networks[0] = LibRainDeploy.ARBITRUM_ONE; address[] memory dependencies = new address[](0); - address expectedAddress = 0xC24016f209562fc151e5Ab7F88694ED5775feb36; + address expectedAddress = 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854; bytes32 wrongCodeHash = bytes32(uint256(1)); vm.expectRevert( abi.encodeWithSelector( LibRainDeploy.UnexpectedDeployedCodeHash.selector, wrongCodeHash, - 0xc1a263a0b50505687a5140c7964ec5c947329e7d03410306fee68cc3620c5483 + 0x6ea525f6523fe148810254f04b9a74a379f59ca0f3a7fa83db90b691c78cc299 ) ); this.externalDeployToNetworks( @@ -346,11 +346,11 @@ contract LibRainDeployTest is Test { 1, type(MockDeployable).creationCode, "test/src/lib/MockDeployable.sol:MockDeployable", - 0xC24016f209562fc151e5Ab7F88694ED5775feb36, - 0xc1a263a0b50505687a5140c7964ec5c947329e7d03410306fee68cc3620c5483, + 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854, + 0x6ea525f6523fe148810254f04b9a74a379f59ca0f3a7fa83db90b691c78cc299, dependencies ); - assertEq(deployed, 0xC24016f209562fc151e5Ab7F88694ED5775feb36); + assertEq(deployed, 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854); } /// `deployToNetworks` MUST skip deployment and return the expected address @@ -360,7 +360,7 @@ contract LibRainDeployTest is Test { vm.createSelectFork(LibRainDeploy.ARBITRUM_ONE); address deployed = this.externalDeployZoltu(type(MockDeployable).creationCode); - assertEq(deployed, 0xC24016f209562fc151e5Ab7F88694ED5775feb36); + assertEq(deployed, 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854); vm.makePersistent(deployed); string[] memory networks = new string[](1); @@ -372,11 +372,11 @@ contract LibRainDeployTest is Test { address(this), type(MockDeployable).creationCode, "test/src/lib/MockDeployable.sol:MockDeployable", - 0xC24016f209562fc151e5Ab7F88694ED5775feb36, - 0xc1a263a0b50505687a5140c7964ec5c947329e7d03410306fee68cc3620c5483, + 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854, + 0x6ea525f6523fe148810254f04b9a74a379f59ca0f3a7fa83db90b691c78cc299, dependencies ); - assertEq(result, 0xC24016f209562fc151e5Ab7F88694ED5775feb36); + assertEq(result, 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854); } /// `deployToNetworks` MUST skip an already-deployed network WITHOUT checking @@ -388,7 +388,7 @@ contract LibRainDeployTest is Test { vm.createSelectFork(LibRainDeploy.ARBITRUM_ONE); address deployed = this.externalDeployZoltu(type(MockDeployable).creationCode); - assertEq(deployed, 0xC24016f209562fc151e5Ab7F88694ED5775feb36); + assertEq(deployed, 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854); vm.makePersistent(deployed); string[] memory networks = new string[](1); @@ -403,11 +403,11 @@ contract LibRainDeployTest is Test { address(this), type(MockDeployable).creationCode, "test/src/lib/MockDeployable.sol:MockDeployable", - 0xC24016f209562fc151e5Ab7F88694ED5775feb36, - 0xc1a263a0b50505687a5140c7964ec5c947329e7d03410306fee68cc3620c5483, + 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854, + 0x6ea525f6523fe148810254f04b9a74a379f59ca0f3a7fa83db90b691c78cc299, dependencies ); - assertEq(result, 0xC24016f209562fc151e5Ab7F88694ED5775feb36); + assertEq(result, 0x1fa1bBf9Cf73B1aCCc1a3D9de5896E81Cd567854); } /// `deployToNetworks` MUST revert with `MissingDependency` when the Zoltu From b5e01fdd1fdae311e15ae71a3aadcc5b1480d5c1 Mon Sep 17 00:00:00 2001 From: David Meister Date: Fri, 14 Aug 2026 14:51:59 +0000 Subject: [PATCH 3/3] chore(pragma): pin every concrete test contract, not just the one #22 enumerated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #22 enumerated three files because three was all the repo had. Its check clause is the category: every concrete contract pins exactly, only libraries and abstracts float. #26 landed twelve more concrete `contract` declarations under `test/src/**.t.sol`, every one of them floating `^0.8.25`, so closing #22 on the single file it named would have closed it with the category unmet. Every `.t.sol` under `test/src/` declares a plain `contract` — concrete, nothing downstream compiles it — so all thirteen now pin `=0.8.25`. Left floating, and correctly so: `src/lib/*` libraries, `src/abstract/*` and `test/abstract/*` abstracts, `src/interface/*`, and `src/generated/candidate/AddressRegistry.sol`, which declares no contract at all and is emitted by rain-sol-codegen. The two `"pragma solidity ^0.8.25;\n\n"` string literals in LibRainDeploySnapshot.t.sol are untouched on purpose: they are the expected TEXT of a generated file, and the generator emits a caret. Bytecode-neutral. `foundry.toml` pins `solc = "0.8.25"` since #26, so every file here already compiled at 0.8.25 and `forge build` reports the same 64 files at the same compiler before and after. The pin makes the constraint explicit at the file that states it instead of leaving it to a build setting that a future bump would silently move. Co-Authored-By: Claude Opus 5 (1M context) --- test/src/abstract/RainDeployBroadcast.t.sol | 2 +- test/src/abstract/RainDeploySuitesBase.t.sol | 2 +- test/src/abstract/RainDeployVerifyChain.t.sol | 2 +- test/src/abstract/RainDeployVerifyChainCandidate.t.sol | 2 +- test/src/abstract/RainDeployVerifySnapshot.t.sol | 2 +- test/src/concrete/AddressRegistryDeployChain.t.sol | 2 +- test/src/concrete/AddressRegistryDeploySnapshot.t.sol | 2 +- test/src/concrete/AddressRegistryGet.t.sol | 2 +- test/src/concrete/AddressRegistryRegister.t.sol | 2 +- test/src/lib/GeneratedSnapshotShape.t.sol | 2 +- test/src/lib/LibAddressRegistry.t.sol | 2 +- test/src/lib/LibRainDeploySnapshot.t.sol | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/src/abstract/RainDeployBroadcast.t.sol b/test/src/abstract/RainDeployBroadcast.t.sol index 528b456..67656dc 100644 --- a/test/src/abstract/RainDeployBroadcast.t.sol +++ b/test/src/abstract/RainDeployBroadcast.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; diff --git a/test/src/abstract/RainDeploySuitesBase.t.sol b/test/src/abstract/RainDeploySuitesBase.t.sol index 21cae8a..c3da531 100644 --- a/test/src/abstract/RainDeploySuitesBase.t.sol +++ b/test/src/abstract/RainDeploySuitesBase.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; diff --git a/test/src/abstract/RainDeployVerifyChain.t.sol b/test/src/abstract/RainDeployVerifyChain.t.sol index b6204f3..7ce3ffc 100644 --- a/test/src/abstract/RainDeployVerifyChain.t.sol +++ b/test/src/abstract/RainDeployVerifyChain.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {DerivedDeploy} from "../../../src/abstract/RainDeployVerifyBase.sol"; import { diff --git a/test/src/abstract/RainDeployVerifyChainCandidate.t.sol b/test/src/abstract/RainDeployVerifyChainCandidate.t.sol index 8fa85ac..f3e1894 100644 --- a/test/src/abstract/RainDeployVerifyChainCandidate.t.sol +++ b/test/src/abstract/RainDeployVerifyChainCandidate.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {DeployCandidate, DeploySuite, RainDeploySuitesBase} from "../../../src/abstract/RainDeploySuitesBase.sol"; import {RainDeployVerifyChain} from "../../../src/abstract/RainDeployVerifyChain.sol"; diff --git a/test/src/abstract/RainDeployVerifySnapshot.t.sol b/test/src/abstract/RainDeployVerifySnapshot.t.sol index 8a077b2..ea528a2 100644 --- a/test/src/abstract/RainDeployVerifySnapshot.t.sol +++ b/test/src/abstract/RainDeployVerifySnapshot.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {ZoltuDerivationMismatch} from "../../../src/abstract/RainDeployVerifyBase.sol"; import {DeployCandidate, DeploySuite} from "../../../src/abstract/RainDeploySuitesBase.sol"; diff --git a/test/src/concrete/AddressRegistryDeployChain.t.sol b/test/src/concrete/AddressRegistryDeployChain.t.sol index 035f1ba..ea62f08 100644 --- a/test/src/concrete/AddressRegistryDeployChain.t.sol +++ b/test/src/concrete/AddressRegistryDeployChain.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {RainDeployVerifyChain} from "../../../src/abstract/RainDeployVerifyChain.sol"; import {AddressRegistryDeploySuites} from "../../../src/abstract/AddressRegistryDeploySuites.sol"; diff --git a/test/src/concrete/AddressRegistryDeploySnapshot.t.sol b/test/src/concrete/AddressRegistryDeploySnapshot.t.sol index 40cee2f..6c97997 100644 --- a/test/src/concrete/AddressRegistryDeploySnapshot.t.sol +++ b/test/src/concrete/AddressRegistryDeploySnapshot.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {RainDeployVerifySnapshot} from "../../../src/abstract/RainDeployVerifySnapshot.sol"; import {AddressRegistryDeploySuites} from "../../../src/abstract/AddressRegistryDeploySuites.sol"; diff --git a/test/src/concrete/AddressRegistryGet.t.sol b/test/src/concrete/AddressRegistryGet.t.sol index 7b6faed..8198e56 100644 --- a/test/src/concrete/AddressRegistryGet.t.sol +++ b/test/src/concrete/AddressRegistryGet.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; diff --git a/test/src/concrete/AddressRegistryRegister.t.sol b/test/src/concrete/AddressRegistryRegister.t.sol index f4bdf58..d5d52d9 100644 --- a/test/src/concrete/AddressRegistryRegister.t.sol +++ b/test/src/concrete/AddressRegistryRegister.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test, Vm} from "forge-std-1.16.1/src/Test.sol"; diff --git a/test/src/lib/GeneratedSnapshotShape.t.sol b/test/src/lib/GeneratedSnapshotShape.t.sol index ca445ab..b7aecec 100644 --- a/test/src/lib/GeneratedSnapshotShape.t.sol +++ b/test/src/lib/GeneratedSnapshotShape.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; diff --git a/test/src/lib/LibAddressRegistry.t.sol b/test/src/lib/LibAddressRegistry.t.sol index 6044495..c11a3b8 100644 --- a/test/src/lib/LibAddressRegistry.t.sol +++ b/test/src/lib/LibAddressRegistry.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol"; import {LibAddressRegistry} from "../../../src/lib/LibAddressRegistry.sol"; diff --git a/test/src/lib/LibRainDeploySnapshot.t.sol b/test/src/lib/LibRainDeploySnapshot.t.sol index ddf4d65..b917ea4 100644 --- a/test/src/lib/LibRainDeploySnapshot.t.sol +++ b/test/src/lib/LibRainDeploySnapshot.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LicenseRef-DCL-1.0 // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd -pragma solidity ^0.8.25; +pragma solidity =0.8.25; import {Test} from "forge-std-1.16.1/src/Test.sol";