From 8a882533f2d080c42b1a8fca41b8cfbc00e5d297 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Sat, 22 Aug 2026 17:25:34 +0000 Subject: [PATCH 1/2] Bump rain-solmem to 0.1.26 via rain-extrospection 0.1.13 Puts the repo on the latest published solmem. This repo's own sources never import solmem directly; it is reached only through rain-extrospection, so the solmem bump lands by moving rain-extrospection 0.1.6 -> 0.1.13 (which pins rain-solmem-0.1.26) and rain-solmem 0.1.3 -> 0.1.26 together in foundry.toml and soldeer.lock. The new library bytecode changes the compiled Extrospect, so the rolling candidate snapshot moves: script/Build.sol regenerated src/generated/candidate/Extrospect.sol with the new deterministic Zoltu address 0x01A8116e07D63348c02818Af858769EaCdaF134A. The next release deploys this new bytecode. The frozen src/generated/0_1_0/ record is untouched; V1 remains live at 0x1BE878af679C1a0A6AC15108b0F4398de1f94506. ExtrospectConstantsTest now pins the candidate as the V2 deployment; the V1 pins stay canonical in the frozen record. The checkNoSolidityCBORMetadata equivalence test tracks 0.1.13's documented behaviour change: a codeless account now reverts CodelessAccount instead of passing, on both the concrete and the library side. Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 6 +-- README.md | 12 +++-- foundry.toml | 4 +- soldeer.lock | 16 +++--- src/concrete/Extrospect.sol | 10 ++-- src/generated/candidate/Extrospect.sol | 8 +-- test/concrete/MockBeacon.sol | 4 +- ...rospect.checkCBORTrimmedBytecodeHash.t.sol | 2 +- ...trospect.checkNoSolidityCBORMetadata.t.sol | 21 ++++++-- .../Extrospect.checkNotEOFBytecode.t.sol | 2 +- .../Extrospect.checkNotMetamorphic.t.sol | 2 +- test/src/concrete/Extrospect.constants.t.sol | 51 ++++++++++--------- ...spect.isBeaconImplementationBytecode.t.sol | 2 +- .../concrete/Extrospect.isBeaconOwner.t.sol | 2 +- .../concrete/Extrospect.isEOFBytecode.t.sol | 2 +- .../concrete/Extrospect.isERC1167Proxy.t.sol | 2 +- ...pect.scanEVMOpcodesPresentInBytecode.t.sol | 2 +- ...ct.scanEVMOpcodesReachableInBytecode.t.sol | 2 +- .../Extrospect.scanMetamorphicRisk.t.sol | 2 +- ...trospect.tryTrimSolidityCBORMetadata.t.sol | 2 +- 20 files changed, 86 insertions(+), 68 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 476e6c4..0d4c9a1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -68,9 +68,9 @@ Mutation and coverage campaigns: see `.claude/rules/mutation-profile.md`. - One contract per `.sol` file. No `@custom:` NatSpec. No skipped tests. - Comments describe current behaviour only. - Soldeer deps carry the version in the import path, e.g. - `rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol`. `recursive_deps` - is off, so every package an import resolves through is declared in - `foundry.toml`. + `rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol`. + `recursive_deps` is off, so every package an import resolves through is + declared in `foundry.toml`. ## Deployment and releases diff --git a/README.md b/README.md index 6bde88c..73d6c21 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,13 @@ candidate is a snapshot of this repo's source, and every frozen `src/generated//` record is declared. `ExtrospectDeployChainTest` inherits `RainDeployVerifyChain`, which holds every RELEASED suite live on every supported network — with no release cut it has no subject and forks nothing. -`ExtrospectConstantsTest` ties the generated candidate to the live V1 deployment -(`0x1BE878af679C1a0A6AC15108b0F4398de1f94506`) byte for byte, and executes the -recorded creation bytecode through the Zoltu factory's own bytecode, etched -offline. The whole record is a pure function of the creation code, so none of -that needs a network. +`ExtrospectConstantsTest` ties the generated candidate to the pinned V2 +deployment (`0x01A8116e07D63348c02818Af858769EaCdaF134A`, deployed by the next +release; V1 remains live at `0x1BE878af679C1a0A6AC15108b0F4398de1f94506` and +recorded in `src/generated/0_1_0/`) byte for byte, and executes the recorded +creation bytecode through the Zoltu factory's own bytecode, etched offline. The +whole record is a pure function of the creation code, so none of that needs a +network. ## Releases diff --git a/foundry.toml b/foundry.toml index 4c2066a..d567043 100644 --- a/foundry.toml +++ b/foundry.toml @@ -61,8 +61,8 @@ no_match_contract = "ExtrospectConstantsTest|ExtrospectDeploySnapshotTest" # `LibExtrospectBytecode`. [dependencies] forge-std = "1.16.2" -"rain-extrospection" = "0.1.6" -"rain-solmem" = "0.1.3" +"rain-extrospection" = "0.1.13" +"rain-solmem" = "0.1.26" "rain-deploy" = "0.1.7" # `LibRainDeploySnapshot` — reached from `script/Build.sol` and the shipped # verify abstracts — emits the generated record via `LibCodeGen`/`LibFs`. diff --git a/soldeer.lock b/soldeer.lock index 5f7cfcb..f5e8d54 100644 --- a/soldeer.lock +++ b/soldeer.lock @@ -14,10 +14,10 @@ integrity = "e51da6f2b3a0f427a0aac5d7714bed2027f5cf0f39b31f0692e9623ceeaa47f2" [[dependencies]] name = "rain-extrospection" -version = "0.1.6" -url = "https://soldeer-revisions.s3.amazonaws.com/rain-extrospection/0_1_6_18-08-2026_12:57:47_rain.zip" -checksum = "4e580128b89eebe9ddb7f3ae36e2dffa8351a062168092962a99de234add7cf8" -integrity = "d8cb335c2f69ad31230b7ba0612ab05100aa6ff9e300b2c60fd5b81f8704c133" +version = "0.1.13" +url = "https://soldeer-revisions.s3.amazonaws.com/rain-extrospection/0_1_13_20-08-2026_09:08:24_rain.zip" +checksum = "8cf77283049994469090ceecee5944c9a580a624463fbae1861d637ba35515e5" +integrity = "5727c7553eb165eb66ac529aa2d9d0d2032bb20824c45acf7b09c82c8c546141" [[dependencies]] name = "rain-sol-codegen" @@ -28,7 +28,7 @@ integrity = "164e2655ac8b66bcf52c799421706d3dfaab987addaaeadd74574e70fd2eb6ed" [[dependencies]] name = "rain-solmem" -version = "0.1.3" -url = "https://soldeer-revisions.s3.amazonaws.com/rain-solmem/0_1_3_09-05-2026_19:49:33_rain.zip" -checksum = "1d405bb81f7c9e56d1717de0d60da918d2fc2fa4db083efd2abe9906378d019f" -integrity = "e879d2743f9d884f647b9dd489889a83f2cea5f76eb69409a113e1baa69d3643" +version = "0.1.26" +url = "https://soldeer-revisions.s3.amazonaws.com/rain-solmem/0_1_26_18-08-2026_16:20:17_rain.zip" +checksum = "291a0acf805b8acd65dfb9e848e6670bde158120bb5b0bcdeeaf17c4084a134c" +integrity = "54e56c1b10d05df72c1c3dcc8df92b99b9f01cd946363158b077c779ce4d20fa" diff --git a/src/concrete/Extrospect.sol b/src/concrete/Extrospect.sol index d4ceb55..02abbee 100644 --- a/src/concrete/Extrospect.sol +++ b/src/concrete/Extrospect.sol @@ -2,11 +2,11 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {IExtrospectV1} from "rain-extrospection-0.1.6/src/interface/IExtrospectV1.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; -import {LibExtrospectMetamorphic} from "rain-extrospection-0.1.6/src/lib/LibExtrospectMetamorphic.sol"; -import {LibExtrospectERC1167Proxy} from "rain-extrospection-0.1.6/src/lib/LibExtrospectERC1167Proxy.sol"; -import {LibExtrospectERC1967BeaconProxy} from "rain-extrospection-0.1.6/src/lib/LibExtrospectERC1967BeaconProxy.sol"; +import {IExtrospectV1} from "rain-extrospection-0.1.13/src/interface/IExtrospectV1.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectMetamorphic} from "rain-extrospection-0.1.13/src/lib/LibExtrospectMetamorphic.sol"; +import {LibExtrospectERC1167Proxy} from "rain-extrospection-0.1.13/src/lib/LibExtrospectERC1167Proxy.sol"; +import {LibExtrospectERC1967BeaconProxy} from "rain-extrospection-0.1.13/src/lib/LibExtrospectERC1967BeaconProxy.sol"; /// @title Extrospect /// @notice Concrete implementation of `IExtrospectV1`. Parameterless diff --git a/src/generated/candidate/Extrospect.sol b/src/generated/candidate/Extrospect.sol index 15d031a..1ab2a4a 100644 --- a/src/generated/candidate/Extrospect.sol +++ b/src/generated/candidate/Extrospect.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x6f34c52c30411783d48eb81ac33c9cf7c108e61f86b2c5403ad49c8680cc71cf); +bytes32 constant BYTECODE_HASH = bytes32(0xd036244004bdb66e7d31e3aa2a7a3306e46fd04ceb85b713bfe8b7547232032d); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x1BE878af679C1a0A6AC15108b0F4398de1f94506); +address constant DEPLOYED_ADDRESS = address(0x01A8116e07D63348c02818Af858769EaCdaF134A); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b50610bc78061001c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c8063b0f6344e1161007d578063e84ac49c11610058578063e84ac49c146101cf578063e8584930146101f0578063ec42dbb114610203575f80fd5b8063b0f6344e1461016a578063b5bf101e146101a9578063b8470cda146101bc575f80fd5b80637c2ac141116100ad5780637c2ac141146101315780639f4a3a2c14610144578063a759327c14610157575f80fd5b80632b597859146100d35780635875b34d146100e8578063708d44971461010e575b5f80fd5b6100e66100e13660046109f7565b610216565b005b6100fb6100f63660046109f7565b610222565b6040519081526020015b60405180910390f35b61012161011c3660046109f7565b610232565b6040519015158152602001610105565b6100fb61013f3660046109f7565b61023c565b610121610152366004610ae3565b610246565b6100fb6101653660046109f7565b610258565b61017d6101783660046109f7565b610262565b60408051921515835273ffffffffffffffffffffffffffffffffffffffff909116602083015201610105565b6100e66101b7366004610b0b565b610276565b6101216101ca366004610b24565b61027f565b6101e26101dd3660046109f7565b61028a565b604051610105929190610b55565b6100e66101fe3660046109f7565b61029c565b6100e6610211366004610ae3565b6102a5565b61021f816102b3565b50565b5f61022c826102f3565b92915050565b5f61022c82610361565b5f61022c82610382565b5f61025183836103b4565b9392505050565b5f61022c82610432565b5f8061026d836104e2565b91509150915091565b61021f816105ed565b5f610251838361066b565b5f6060610296836106dd565b93915050565b61021f81610790565b6102af82826107dc565b5050565b6102bc81610361565b1561021f576040517f6facd91b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102fd826102b3565b815182908082015b80831015610359576001928301805160ff1693841b9490941793927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa001602081101561035357928301600101925b50610305565b505050919050565b5f600282511061037d5761ffff60028301511661ef0081149150505b919050565b5f7f80350000000000000000000000000000000000000000000000000000000000006103ad83610432565b1692915050565b5f80806103e1857f5c60da1b000000000000000000000000000000000000000000000000000000006108a5565b915091508180156104295750838173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c80519060200120145b95945050505050565b5f61043c826102b3565b81518290605b7fe0080000000000000000000000000000000000000040000000000000000000018284015f5b818610156104d75760018601955060ff86511660608103602081101561049057968701600101965b508180156104a457600181146104bf575f80fd5b6001821b988917988516156104b857600192505b5050610468565b8582036104b857506001901b9690961795505f610468565b505050505050919050565b80515f908190602d146104f957505f928392509050565b604080518082018252600a8082527f363d3d373d3d3d363d73000000000000000000000000000000000000000000006020928301528582018190208351808501909452600f8085527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000094840194909452603e8701939093207f63d391efc3119310b9796819854d0555ea77fb380e9ef5190c2359a8094c1f3c9384147f11a195f66c9175f46895bae2006d40848a680c7068b9fc4af248ff9a54a47e45909114166001169450909184156105e557601e86015173ffffffffffffffffffffffffffffffffffffffff1693505b505050915091565b5f8173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c90505f61062c826106dd565b90508015610666576040517f5b529f0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8080610698857f8da5cb5b000000000000000000000000000000000000000000000000000000006108a5565b9150915081801561042957508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149250505092915050565b5f6106e7826102b3565b81516035811061078a578083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015174ffffffffffffffff000000000000000000000000009081165f90815291516affffffffffff000000ffff90811660205260409092207f0e55864b80a56accebaca64500e23598f6acfb743a5475323f0b7f2d0d268c628082149550919291908515610785576035850387525b505050505b50919050565b5f61079a82610382565b905080156102af576040517f7a92f35a000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c90505f61081b826106dd565b905080610854576040517f2e2af59600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151602083012083811461089e576040517fdfb87a5300000000000000000000000000000000000000000000000000000000815260048101859052602481018290526044016107d3565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290515f9182918291829173ffffffffffffffffffffffffffffffffffffffff88169161092891610bb1565b5f60405180830381855afa9150503d805f8114610960576040519150601f19603f3d011682016040523d82523d5f602084013e610965565b606091505b509150915081158061097957508051602014155b1561098b575f809350935050506109c3565b602081015173ffffffffffffffffffffffffffffffffffffffff8111156109ba575f80945094505050506109c3565b60019450925050505b9250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215610a07575f80fd5b813567ffffffffffffffff80821115610a1e575f80fd5b818401915084601f830112610a31575f80fd5b813581811115610a4357610a436109ca565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610a8957610a896109ca565b81604052828152876020848701011115610aa1575f80fd5b826020860160208301375f928101602001929092525095945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461037d575f80fd5b5f8060408385031215610af4575f80fd5b610afd83610ac0565b946020939093013593505050565b5f60208284031215610b1b575f80fd5b61025182610ac0565b5f8060408385031215610b35575f80fd5b610b3e83610ac0565b9150610b4c60208401610ac0565b90509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f6060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509392505050565b5f82518060208501845e5f92019182525091905056"; + hex"6080604052348015600e575f80fd5b50610b618061001c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c8063b0f6344e1161007d578063e84ac49c11610058578063e84ac49c146101cf578063e8584930146101f0578063ec42dbb114610203575f80fd5b8063b0f6344e1461016a578063b5bf101e146101a9578063b8470cda146101bc575f80fd5b80637c2ac141116100ad5780637c2ac141146101315780639f4a3a2c14610144578063a759327c14610157575f80fd5b80632b597859146100d35780635875b34d146100e8578063708d44971461010e575b5f80fd5b6100e66100e136600461097a565b610216565b005b6100fb6100f636600461097a565b610222565b6040519081526020015b60405180910390f35b61012161011c36600461097a565b610232565b6040519015158152602001610105565b6100fb61013f36600461097a565b61023c565b610121610152366004610a66565b610246565b6100fb61016536600461097a565b610258565b61017d61017836600461097a565b610262565b60408051921515835273ffffffffffffffffffffffffffffffffffffffff909116602083015201610105565b6100e66101b7366004610a8e565b610276565b6101216101ca366004610aa7565b61027f565b6101e26101dd36600461097a565b61028a565b604051610105929190610ad8565b6100e66101fe36600461097a565b61029c565b6100e6610211366004610a66565b6102a5565b61021f816102b3565b50565b5f61022c826102f3565b92915050565b5f61022c82610361565b5f61022c82610382565b5f610251838361040a565b9392505050565b5f61022c82610488565b5f8061026d83610538565b91509150915091565b61021f816105dd565b5f61025183836106b2565b5f606061029683610724565b93915050565b61021f816107d7565b6102af828261081e565b5050565b6102bc81610361565b1561021f576040517f6facd91b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102fd826102b3565b815182908082015b80831015610359576001928301805160ff1693841b9490941793927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa001602081101561035357928301600101925b50610305565b505050919050565b5f600282511061037d5761ffff60028301511661ef0081149150505b919050565b5f8082511180156103af575060ef60ff16825f815181106103a5576103a5610b34565b016020015160f81c145b156103d957507d800000000000000000000000000000000000000000000000000000000000919050565b7f803500000000000000000000000000000000000000000000000000000000000061040383610488565b1692915050565b5f8080610437857f5c60da1b000000000000000000000000000000000000000000000000000000006108e7565b9150915081801561047f5750838173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c80519060200120145b95945050505050565b5f610492826102b3565b81518290605b7fe0080000000000000000000000000000000000000040000000000000000000018284015f5b8186101561052d5760018601955060ff8651166060810360208110156104e657968701600101965b508180156104fa5760018114610515575f80fd5b6001821b9889179885161561050e57600192505b50506104be565b85820361050e57506001901b9690961795505f6104be565b505050505050919050565b80515f908190602d1461054f57505f928392509050565b600a6020848101829020600f603e8701207f63d391efc3119310b9796819854d0555ea77fb380e9ef5190c2359a8094c1f3c9182147f11a195f66c9175f46895bae2006d40848a680c7068b9fc4af248ff9a54a47e4590911416600116945090919084156105d557601e86015173ffffffffffffffffffffffffffffffffffffffff1693505b505050915091565b5f8173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c905080515f03610669576040517f45be09c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b5f61067382610724565b905080156106ad576040517f5b529f0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f80806106df857f8da5cb5b000000000000000000000000000000000000000000000000000000006108e7565b9150915081801561047f57508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149250505092915050565b5f61072e826102b3565b8151603581106107d1578083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015174ffffffffffffffff000000000000000000000000009081165f90815291516affffffffffff000000ffff90811660205260409092207f0e55864b80a56accebaca64500e23598f6acfb743a5475323f0b7f2d0d268c6280821495509192919085156107cc576035850387525b505050505b50919050565b5f6107e182610382565b905080156102af576040517f7a92f35a00000000000000000000000000000000000000000000000000000000815260048101829052602401610660565b5f8273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c90505f61085d82610724565b905080610896576040517f2e2af59600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160208301208381146108e0576040517fdfb87a530000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610660565b5050505050565b5f805f80845f525f8060045f895afa3d602014169150811561090c5760205f803e505f515b81158061092c575073ffffffffffffffffffffffffffffffffffffffff81115b1561093e575f80935093505050610946565b600193509150505b9250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6020828403121561098a575f80fd5b813567ffffffffffffffff808211156109a1575f80fd5b818401915084601f8301126109b4575f80fd5b8135818111156109c6576109c661094d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610a0c57610a0c61094d565b81604052828152876020848701011115610a24575f80fd5b826020860160208301375f928101602001929092525095945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461037d575f80fd5b5f8060408385031215610a77575f80fd5b610a8083610a43565b946020939093013593505050565b5f60208284031215610a9e575f80fd5b61025182610a43565b5f8060408385031215610ab8575f80fd5b610ac183610a43565b9150610acf60208401610a43565b90509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f6060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405234801561000f575f80fd5b50600436106100cf575f3560e01c8063b0f6344e1161007d578063e84ac49c11610058578063e84ac49c146101cf578063e8584930146101f0578063ec42dbb114610203575f80fd5b8063b0f6344e1461016a578063b5bf101e146101a9578063b8470cda146101bc575f80fd5b80637c2ac141116100ad5780637c2ac141146101315780639f4a3a2c14610144578063a759327c14610157575f80fd5b80632b597859146100d35780635875b34d146100e8578063708d44971461010e575b5f80fd5b6100e66100e13660046109f7565b610216565b005b6100fb6100f63660046109f7565b610222565b6040519081526020015b60405180910390f35b61012161011c3660046109f7565b610232565b6040519015158152602001610105565b6100fb61013f3660046109f7565b61023c565b610121610152366004610ae3565b610246565b6100fb6101653660046109f7565b610258565b61017d6101783660046109f7565b610262565b60408051921515835273ffffffffffffffffffffffffffffffffffffffff909116602083015201610105565b6100e66101b7366004610b0b565b610276565b6101216101ca366004610b24565b61027f565b6101e26101dd3660046109f7565b61028a565b604051610105929190610b55565b6100e66101fe3660046109f7565b61029c565b6100e6610211366004610ae3565b6102a5565b61021f816102b3565b50565b5f61022c826102f3565b92915050565b5f61022c82610361565b5f61022c82610382565b5f61025183836103b4565b9392505050565b5f61022c82610432565b5f8061026d836104e2565b91509150915091565b61021f816105ed565b5f610251838361066b565b5f6060610296836106dd565b93915050565b61021f81610790565b6102af82826107dc565b5050565b6102bc81610361565b1561021f576040517f6facd91b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102fd826102b3565b815182908082015b80831015610359576001928301805160ff1693841b9490941793927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa001602081101561035357928301600101925b50610305565b505050919050565b5f600282511061037d5761ffff60028301511661ef0081149150505b919050565b5f7f80350000000000000000000000000000000000000000000000000000000000006103ad83610432565b1692915050565b5f80806103e1857f5c60da1b000000000000000000000000000000000000000000000000000000006108a5565b915091508180156104295750838173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c80519060200120145b95945050505050565b5f61043c826102b3565b81518290605b7fe0080000000000000000000000000000000000000040000000000000000000018284015f5b818610156104d75760018601955060ff86511660608103602081101561049057968701600101965b508180156104a457600181146104bf575f80fd5b6001821b988917988516156104b857600192505b5050610468565b8582036104b857506001901b9690961795505f610468565b505050505050919050565b80515f908190602d146104f957505f928392509050565b604080518082018252600a8082527f363d3d373d3d3d363d73000000000000000000000000000000000000000000006020928301528582018190208351808501909452600f8085527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000094840194909452603e8701939093207f63d391efc3119310b9796819854d0555ea77fb380e9ef5190c2359a8094c1f3c9384147f11a195f66c9175f46895bae2006d40848a680c7068b9fc4af248ff9a54a47e45909114166001169450909184156105e557601e86015173ffffffffffffffffffffffffffffffffffffffff1693505b505050915091565b5f8173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c90505f61062c826106dd565b90508015610666576040517f5b529f0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f8080610698857f8da5cb5b000000000000000000000000000000000000000000000000000000006108a5565b9150915081801561042957508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149250505092915050565b5f6106e7826102b3565b81516035811061078a578083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015174ffffffffffffffff000000000000000000000000009081165f90815291516affffffffffff000000ffff90811660205260409092207f0e55864b80a56accebaca64500e23598f6acfb743a5475323f0b7f2d0d268c628082149550919291908515610785576035850387525b505050505b50919050565b5f61079a82610382565b905080156102af576040517f7a92f35a000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c90505f61081b826106dd565b905080610854576040517f2e2af59600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151602083012083811461089e576040517fdfb87a5300000000000000000000000000000000000000000000000000000000815260048101859052602481018290526044016107d3565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290515f9182918291829173ffffffffffffffffffffffffffffffffffffffff88169161092891610bb1565b5f60405180830381855afa9150503d805f8114610960576040519150601f19603f3d011682016040523d82523d5f602084013e610965565b606091505b509150915081158061097957508051602014155b1561098b575f809350935050506109c3565b602081015173ffffffffffffffffffffffffffffffffffffffff8111156109ba575f80945094505050506109c3565b60019450925050505b9250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215610a07575f80fd5b813567ffffffffffffffff80821115610a1e575f80fd5b818401915084601f830112610a31575f80fd5b813581811115610a4357610a436109ca565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610a8957610a896109ca565b81604052828152876020848701011115610aa1575f80fd5b826020860160208301375f928101602001929092525095945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461037d575f80fd5b5f8060408385031215610af4575f80fd5b610afd83610ac0565b946020939093013593505050565b5f60208284031215610b1b575f80fd5b61025182610ac0565b5f8060408385031215610b35575f80fd5b610b3e83610ac0565b9150610b4c60208401610ac0565b90509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f6060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509392505050565b5f82518060208501845e5f92019182525091905056"; + hex"608060405234801561000f575f80fd5b50600436106100cf575f3560e01c8063b0f6344e1161007d578063e84ac49c11610058578063e84ac49c146101cf578063e8584930146101f0578063ec42dbb114610203575f80fd5b8063b0f6344e1461016a578063b5bf101e146101a9578063b8470cda146101bc575f80fd5b80637c2ac141116100ad5780637c2ac141146101315780639f4a3a2c14610144578063a759327c14610157575f80fd5b80632b597859146100d35780635875b34d146100e8578063708d44971461010e575b5f80fd5b6100e66100e136600461097a565b610216565b005b6100fb6100f636600461097a565b610222565b6040519081526020015b60405180910390f35b61012161011c36600461097a565b610232565b6040519015158152602001610105565b6100fb61013f36600461097a565b61023c565b610121610152366004610a66565b610246565b6100fb61016536600461097a565b610258565b61017d61017836600461097a565b610262565b60408051921515835273ffffffffffffffffffffffffffffffffffffffff909116602083015201610105565b6100e66101b7366004610a8e565b610276565b6101216101ca366004610aa7565b61027f565b6101e26101dd36600461097a565b61028a565b604051610105929190610ad8565b6100e66101fe36600461097a565b61029c565b6100e6610211366004610a66565b6102a5565b61021f816102b3565b50565b5f61022c826102f3565b92915050565b5f61022c82610361565b5f61022c82610382565b5f610251838361040a565b9392505050565b5f61022c82610488565b5f8061026d83610538565b91509150915091565b61021f816105dd565b5f61025183836106b2565b5f606061029683610724565b93915050565b61021f816107d7565b6102af828261081e565b5050565b6102bc81610361565b1561021f576040517f6facd91b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102fd826102b3565b815182908082015b80831015610359576001928301805160ff1693841b9490941793927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa001602081101561035357928301600101925b50610305565b505050919050565b5f600282511061037d5761ffff60028301511661ef0081149150505b919050565b5f8082511180156103af575060ef60ff16825f815181106103a5576103a5610b34565b016020015160f81c145b156103d957507d800000000000000000000000000000000000000000000000000000000000919050565b7f803500000000000000000000000000000000000000000000000000000000000061040383610488565b1692915050565b5f8080610437857f5c60da1b000000000000000000000000000000000000000000000000000000006108e7565b9150915081801561047f5750838173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c80519060200120145b95945050505050565b5f610492826102b3565b81518290605b7fe0080000000000000000000000000000000000000040000000000000000000018284015f5b8186101561052d5760018601955060ff8651166060810360208110156104e657968701600101965b508180156104fa5760018114610515575f80fd5b6001821b9889179885161561050e57600192505b50506104be565b85820361050e57506001901b9690961795505f6104be565b505050505050919050565b80515f908190602d1461054f57505f928392509050565b600a6020848101829020600f603e8701207f63d391efc3119310b9796819854d0555ea77fb380e9ef5190c2359a8094c1f3c9182147f11a195f66c9175f46895bae2006d40848a680c7068b9fc4af248ff9a54a47e4590911416600116945090919084156105d557601e86015173ffffffffffffffffffffffffffffffffffffffff1693505b505050915091565b5f8173ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c905080515f03610669576040517f45be09c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024015b60405180910390fd5b5f61067382610724565b905080156106ad576040517f5b529f0900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f80806106df857f8da5cb5b000000000000000000000000000000000000000000000000000000006108e7565b9150915081801561047f57508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149250505092915050565b5f61072e826102b3565b8151603581106107d1578083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015174ffffffffffffffff000000000000000000000000009081165f90815291516affffffffffff000000ffff90811660205260409092207f0e55864b80a56accebaca64500e23598f6acfb743a5475323f0b7f2d0d268c6280821495509192919085156107cc576035850387525b505050505b50919050565b5f6107e182610382565b905080156102af576040517f7a92f35a00000000000000000000000000000000000000000000000000000000815260048101829052602401610660565b5f8273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181525f908060200190933c90505f61085d82610724565b905080610896576040517f2e2af59600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815160208301208381146108e0576040517fdfb87a530000000000000000000000000000000000000000000000000000000081526004810185905260248101829052604401610660565b5050505050565b5f805f80845f525f8060045f895afa3d602014169150811561090c5760205f803e505f515b81158061092c575073ffffffffffffffffffffffffffffffffffffffff81115b1561093e575f80935093505050610946565b600193509150505b9250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6020828403121561098a575f80fd5b813567ffffffffffffffff808211156109a1575f80fd5b818401915084601f8301126109b4575f80fd5b8135818111156109c6576109c661094d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715610a0c57610a0c61094d565b81604052828152876020848701011115610a24575f80fd5b826020860160208301375f928101602001929092525095945050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461037d575f80fd5b5f8060408385031215610a77575f80fd5b610a8083610a43565b946020939093013593505050565b5f60208284031215610a9e575f80fd5b61025182610a43565b5f8060408385031215610ab8575f80fd5b610ac183610a43565b9150610acf60208401610a43565b90509250929050565b8215158152604060208201525f82518060408401528060208501606085015e5f6060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd"; /// @dev The addresses that MUST already have code on a network before /// this release can be broadcast there, `abi.encode`d as an `address[]` diff --git a/test/concrete/MockBeacon.sol b/test/concrete/MockBeacon.sol index a256198..abfe978 100644 --- a/test/concrete/MockBeacon.sol +++ b/test/concrete/MockBeacon.sol @@ -2,8 +2,8 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {IBeacon} from "rain-extrospection-0.1.6/src/interface/IBeacon.sol"; -import {IOwnable} from "rain-extrospection-0.1.6/src/interface/IOwnable.sol"; +import {IBeacon} from "rain-extrospection-0.1.13/src/interface/IBeacon.sol"; +import {IOwnable} from "rain-extrospection-0.1.13/src/interface/IOwnable.sol"; /// @dev Minimal beacon test fixture implementing both `IBeacon` and /// `IOwnable` so selector and return-type match the lib's expectations diff --git a/test/src/concrete/Extrospect.checkCBORTrimmedBytecodeHash.t.sol b/test/src/concrete/Extrospect.checkCBORTrimmedBytecodeHash.t.sol index 46158b2..1bb4ee3 100644 --- a/test/src/concrete/Extrospect.checkCBORTrimmedBytecodeHash.t.sol +++ b/test/src/concrete/Extrospect.checkCBORTrimmedBytecodeHash.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; import {SOLIDITY_CBOR_RUNTIME_FIXTURE} from "test/concrete/SolidityCBORFixture.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; contract ExtrospectCheckCBORTrimmedBytecodeHashTest is ExtrospectEquivalence { //forge-lint: disable-next-line(mixed-case-function) diff --git a/test/src/concrete/Extrospect.checkNoSolidityCBORMetadata.t.sol b/test/src/concrete/Extrospect.checkNoSolidityCBORMetadata.t.sol index 7d95c56..2f38fc7 100644 --- a/test/src/concrete/Extrospect.checkNoSolidityCBORMetadata.t.sol +++ b/test/src/concrete/Extrospect.checkNoSolidityCBORMetadata.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; import {SOLIDITY_CBOR_RUNTIME_FIXTURE} from "test/concrete/SolidityCBORFixture.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; contract ExtrospectCheckNoSolidityCBORMetadataTest is ExtrospectEquivalence { //forge-lint: disable-next-line(mixed-case-function) @@ -13,9 +13,22 @@ contract ExtrospectCheckNoSolidityCBORMetadataTest is ExtrospectEquivalence { } function testCheckNoSolidityCBORMetadataEquivalencePass() external view { - // Account with no code passes both. - extrospect.checkNoSolidityCBORMetadata(address(0xdead)); - LibExtrospectBytecode.checkNoSolidityCBORMetadata(address(0xdead)); + // Account with code and no metadata passes both. `Extrospect` + // itself compiles with `cbor_metadata = false`, so its own + // runtime bytecode is the fixture. + extrospect.checkNoSolidityCBORMetadata(address(extrospect)); + LibExtrospectBytecode.checkNoSolidityCBORMetadata(address(extrospect)); + } + + function testCheckNoSolidityCBORMetadataEquivalenceCodeless() external { + // Account with no code reverts both with `CodelessAccount`: + // absence of code is not absence of metadata risk, so the + // check refuses to vouch for it. + address codeless = address(0xdead); + vm.expectRevert(abi.encodeWithSelector(LibExtrospectBytecode.CodelessAccount.selector, codeless)); + extrospect.checkNoSolidityCBORMetadata(codeless); + vm.expectRevert(abi.encodeWithSelector(LibExtrospectBytecode.CodelessAccount.selector, codeless)); + this.libCheckNoSolidityCBORMetadataExternal(codeless); } function testCheckNoSolidityCBORMetadataEquivalenceRevert() external { diff --git a/test/src/concrete/Extrospect.checkNotEOFBytecode.t.sol b/test/src/concrete/Extrospect.checkNotEOFBytecode.t.sol index 1f8fae7..5e9d5c3 100644 --- a/test/src/concrete/Extrospect.checkNotEOFBytecode.t.sol +++ b/test/src/concrete/Extrospect.checkNotEOFBytecode.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; contract ExtrospectCheckNotEOFBytecodeTest is ExtrospectEquivalence { function libCheckNotEOFBytecodeExternal(bytes memory bytecode) external pure { diff --git a/test/src/concrete/Extrospect.checkNotMetamorphic.t.sol b/test/src/concrete/Extrospect.checkNotMetamorphic.t.sol index ebaf27a..1ab6de4 100644 --- a/test/src/concrete/Extrospect.checkNotMetamorphic.t.sol +++ b/test/src/concrete/Extrospect.checkNotMetamorphic.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectMetamorphic} from "rain-extrospection-0.1.6/src/lib/LibExtrospectMetamorphic.sol"; +import {LibExtrospectMetamorphic} from "rain-extrospection-0.1.13/src/lib/LibExtrospectMetamorphic.sol"; contract ExtrospectCheckNotMetamorphicTest is ExtrospectEquivalence { /// External re-exposure of the library function so it can be reached via a diff --git a/test/src/concrete/Extrospect.constants.t.sol b/test/src/concrete/Extrospect.constants.t.sol index e836220..d9ae340 100644 --- a/test/src/concrete/Extrospect.constants.t.sol +++ b/test/src/concrete/Extrospect.constants.t.sol @@ -13,44 +13,47 @@ import { } from "src/generated/candidate/Extrospect.sol"; import {LibRainDeploy} from "rain-deploy-0.1.7/src/lib/LibRainDeploy.sol"; -/// @dev The address the V1 `Extrospect` deployment is live at. The generated -/// candidate MUST derive this address for as long as the source still -/// compiles to the deployed V1 bytecode — a drift here is a new deployment, -/// not a constant to update. -address constant EXTROSPECT_ZOLTU_ADDRESS_V1 = address(0x1BE878af679C1a0A6AC15108b0F4398de1f94506); +/// @dev The address the V2 `Extrospect` deployment will be live at: the Zoltu +/// address of the current candidate bytecode. Not yet deployed — the next +/// release deploys it. The V1 deployment remains live at +/// 0x1BE878af679C1a0A6AC15108b0F4398de1f94506, recorded in +/// `src/generated/0_1_0/`. The generated candidate MUST derive this address +/// for as long as the source compiles to the V2 bytecode — a drift here is a +/// new deployment, not a constant to update. +address constant EXTROSPECT_ZOLTU_ADDRESS_V2 = address(0x01A8116e07D63348c02818Af858769EaCdaF134A); -/// @dev The runtime codehash of the V1 deployment. -bytes32 constant EXTROSPECT_RUNTIME_CODEHASH_V1 = 0x6f34c52c30411783d48eb81ac33c9cf7c108e61f86b2c5403ad49c8680cc71cf; +/// @dev The runtime codehash of the V2 candidate bytecode. +bytes32 constant EXTROSPECT_RUNTIME_CODEHASH_V2 = 0xd036244004bdb66e7d31e3aa2a7a3306e46fd04ceb85b713bfe8b7547232032d; -/// @dev `keccak256` of the V1 creation bytecode. Pinned as a hash because the +/// @dev `keccak256` of the V2 creation bytecode. Pinned as a hash because the /// bytes themselves live in the generated snapshot, and a second copy here /// would be a second source of truth. -bytes32 constant EXTROSPECT_CREATION_KECCAK_V1 = 0x5a56765a85cfcb3d9ca721de9dce9f1eb770ee9c7b873b50bd7727c20a344efd; +bytes32 constant EXTROSPECT_CREATION_KECCAK_V2 = 0x24ac88b85bc285f8be255968b680ae632f12f0b78f8d15330e988d0eea498e18; /// @title ExtrospectConstantsTest -/// @notice Ties the generated candidate snapshot to the existing V1 -/// deployment and to the compiler's current output, so the snapshot cannot -/// drift from either without failing loud. +/// @notice Ties the generated candidate snapshot to the pinned V2 deployment +/// and to the compiler's current output, so the snapshot cannot drift from +/// either without failing loud. /// @dev These pin compiler output, not behaviour: they fail for any edit to /// any source file reachable from `Extrospect`. The `mutation` foundry /// profile excludes this contract by name. contract ExtrospectConstantsTest is Test { - /// The generated candidate IS the V1 deployment, byte for byte: the - /// recorded creation code hashes to the V1 creation bytecode's hash, the - /// recorded address is the V1 address and the recorded codehash is the V1 + /// The generated candidate IS the V2 deployment, byte for byte: the + /// recorded creation code hashes to the V2 creation bytecode's hash, the + /// recorded address is the V2 address and the recorded codehash is the V2 /// runtime codehash. - function testGeneratedCandidateIsTheV1Deployment() external pure { + function testGeneratedCandidateIsTheV2Deployment() external pure { assertEq( keccak256(CREATION_CODE), - EXTROSPECT_CREATION_KECCAK_V1, - "generated creation code is not the V1 creation bytecode" + EXTROSPECT_CREATION_KECCAK_V2, + "generated creation code is not the V2 creation bytecode" ); - assertEq(DEPLOYED_ADDRESS, EXTROSPECT_ZOLTU_ADDRESS_V1, "generated address is not the V1 Zoltu address"); - assertEq(BYTECODE_HASH, EXTROSPECT_RUNTIME_CODEHASH_V1, "generated codehash is not the V1 runtime codehash"); + assertEq(DEPLOYED_ADDRESS, EXTROSPECT_ZOLTU_ADDRESS_V2, "generated address is not the V2 Zoltu address"); + assertEq(BYTECODE_HASH, EXTROSPECT_RUNTIME_CODEHASH_V2, "generated codehash is not the V2 runtime codehash"); } /// The recorded creation code matches the current compiler output, so the - /// V1 tie above is a statement about the contract this repo compiles and + /// V2 tie above is a statement about the contract this repo compiles and /// not about a stale snapshot. function testExtrospectCreationBytecode() external pure { assertEq( @@ -90,7 +93,7 @@ contract ExtrospectConstantsTest is Test { /// The recorded constants describe one deployment, so they must agree /// with each other when the recorded creation bytecode is actually /// executed. Running it through the real Zoltu factory bytecode lands at - /// the V1 address and leaves code hashing to the V1 codehash, and that + /// the V2 address and leaves code hashing to the V2 codehash, and that /// runtime code is byte for byte both `RUNTIME_CODE` and /// `type(Extrospect).runtimeCode`. Deterministic and offline: the factory /// is etched from its own pinned bytecode, so no network is involved. @@ -99,9 +102,9 @@ contract ExtrospectConstantsTest is Test { address deployed = LibRainDeploy.deployZoltu(CREATION_CODE); - assertEq(deployed, EXTROSPECT_ZOLTU_ADDRESS_V1, "recorded creation bytecode does not deploy to the V1 address"); + assertEq(deployed, EXTROSPECT_ZOLTU_ADDRESS_V2, "recorded creation bytecode does not deploy to the V2 address"); assertEq( - deployed.codehash, EXTROSPECT_RUNTIME_CODEHASH_V1, "deployed runtime code does not hash to the V1 codehash" + deployed.codehash, EXTROSPECT_RUNTIME_CODEHASH_V2, "deployed runtime code does not hash to the V2 codehash" ); assertEq(deployed.code, RUNTIME_CODE, "deployed runtime code differs from the recorded runtime code"); assertEq(deployed.code, type(Extrospect).runtimeCode, "deployed runtime code differs from compiler output"); diff --git a/test/src/concrete/Extrospect.isBeaconImplementationBytecode.t.sol b/test/src/concrete/Extrospect.isBeaconImplementationBytecode.t.sol index 617644b..b34688d 100644 --- a/test/src/concrete/Extrospect.isBeaconImplementationBytecode.t.sol +++ b/test/src/concrete/Extrospect.isBeaconImplementationBytecode.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectERC1967BeaconProxy} from "rain-extrospection-0.1.6/src/lib/LibExtrospectERC1967BeaconProxy.sol"; +import {LibExtrospectERC1967BeaconProxy} from "rain-extrospection-0.1.13/src/lib/LibExtrospectERC1967BeaconProxy.sol"; import {MockBeacon} from "test/concrete/MockBeacon.sol"; import {EmptyContract} from "test/concrete/EmptyContract.sol"; diff --git a/test/src/concrete/Extrospect.isBeaconOwner.t.sol b/test/src/concrete/Extrospect.isBeaconOwner.t.sol index fe7e6d9..7cf8402 100644 --- a/test/src/concrete/Extrospect.isBeaconOwner.t.sol +++ b/test/src/concrete/Extrospect.isBeaconOwner.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectERC1967BeaconProxy} from "rain-extrospection-0.1.6/src/lib/LibExtrospectERC1967BeaconProxy.sol"; +import {LibExtrospectERC1967BeaconProxy} from "rain-extrospection-0.1.13/src/lib/LibExtrospectERC1967BeaconProxy.sol"; import {MockBeacon} from "test/concrete/MockBeacon.sol"; import {EmptyContract} from "test/concrete/EmptyContract.sol"; diff --git a/test/src/concrete/Extrospect.isEOFBytecode.t.sol b/test/src/concrete/Extrospect.isEOFBytecode.t.sol index 54cb5b0..629a600 100644 --- a/test/src/concrete/Extrospect.isEOFBytecode.t.sol +++ b/test/src/concrete/Extrospect.isEOFBytecode.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; contract ExtrospectIsEOFBytecodeTest is ExtrospectEquivalence { function testIsEOFBytecodeEquivalenceFuzz(bytes memory bytecode) external view { diff --git a/test/src/concrete/Extrospect.isERC1167Proxy.t.sol b/test/src/concrete/Extrospect.isERC1167Proxy.t.sol index 97a342e..414bf78 100644 --- a/test/src/concrete/Extrospect.isERC1167Proxy.t.sol +++ b/test/src/concrete/Extrospect.isERC1167Proxy.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectERC1167Proxy} from "rain-extrospection-0.1.6/src/lib/LibExtrospectERC1167Proxy.sol"; +import {LibExtrospectERC1167Proxy} from "rain-extrospection-0.1.13/src/lib/LibExtrospectERC1167Proxy.sol"; contract ExtrospectIsERC1167ProxyTest is ExtrospectEquivalence { function testIsERC1167ProxyEquivalenceFuzz(bytes memory bytecode) external view { diff --git a/test/src/concrete/Extrospect.scanEVMOpcodesPresentInBytecode.t.sol b/test/src/concrete/Extrospect.scanEVMOpcodesPresentInBytecode.t.sol index 5cb3c58..a05c7ff 100644 --- a/test/src/concrete/Extrospect.scanEVMOpcodesPresentInBytecode.t.sol +++ b/test/src/concrete/Extrospect.scanEVMOpcodesPresentInBytecode.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; contract ExtrospectScanEVMOpcodesPresentInBytecodeTest is ExtrospectEquivalence { /// External re-exposure of the library function so it can be reached via a diff --git a/test/src/concrete/Extrospect.scanEVMOpcodesReachableInBytecode.t.sol b/test/src/concrete/Extrospect.scanEVMOpcodesReachableInBytecode.t.sol index c4aceda..58b16a3 100644 --- a/test/src/concrete/Extrospect.scanEVMOpcodesReachableInBytecode.t.sol +++ b/test/src/concrete/Extrospect.scanEVMOpcodesReachableInBytecode.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; contract ExtrospectScanEVMOpcodesReachableInBytecodeTest is ExtrospectEquivalence { /// External re-exposure of the library function so it can be reached via a diff --git a/test/src/concrete/Extrospect.scanMetamorphicRisk.t.sol b/test/src/concrete/Extrospect.scanMetamorphicRisk.t.sol index 01a021e..bbd5e58 100644 --- a/test/src/concrete/Extrospect.scanMetamorphicRisk.t.sol +++ b/test/src/concrete/Extrospect.scanMetamorphicRisk.t.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; -import {LibExtrospectMetamorphic} from "rain-extrospection-0.1.6/src/lib/LibExtrospectMetamorphic.sol"; +import {LibExtrospectMetamorphic} from "rain-extrospection-0.1.13/src/lib/LibExtrospectMetamorphic.sol"; contract ExtrospectScanMetamorphicRiskTest is ExtrospectEquivalence { /// External re-exposure of the library function so it can be reached via a diff --git a/test/src/concrete/Extrospect.tryTrimSolidityCBORMetadata.t.sol b/test/src/concrete/Extrospect.tryTrimSolidityCBORMetadata.t.sol index 03bea49..d0cfd3d 100644 --- a/test/src/concrete/Extrospect.tryTrimSolidityCBORMetadata.t.sol +++ b/test/src/concrete/Extrospect.tryTrimSolidityCBORMetadata.t.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.25; import {ExtrospectEquivalence} from "test/concrete/ExtrospectEquivalence.sol"; import {SOLIDITY_CBOR_RUNTIME_FIXTURE} from "test/concrete/SolidityCBORFixture.sol"; -import {LibExtrospectBytecode} from "rain-extrospection-0.1.6/src/lib/LibExtrospectBytecode.sol"; +import {LibExtrospectBytecode} from "rain-extrospection-0.1.13/src/lib/LibExtrospectBytecode.sol"; contract ExtrospectTryTrimSolidityCBORMetadataTest is ExtrospectEquivalence { function testTryTrimSolidityCBORMetadataEquivalenceTrim() external view { From 5622e0a93cb3814cd757f8accd79def8d6058ff0 Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Sat, 22 Aug 2026 17:36:57 +0000 Subject: [PATCH 2/2] Present-tense NatSpec for the V2 candidate address pin Co-Authored-By: Claude Fable 5 --- test/src/concrete/Extrospect.constants.t.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/src/concrete/Extrospect.constants.t.sol b/test/src/concrete/Extrospect.constants.t.sol index d9ae340..859c19f 100644 --- a/test/src/concrete/Extrospect.constants.t.sol +++ b/test/src/concrete/Extrospect.constants.t.sol @@ -13,9 +13,8 @@ import { } from "src/generated/candidate/Extrospect.sol"; import {LibRainDeploy} from "rain-deploy-0.1.7/src/lib/LibRainDeploy.sol"; -/// @dev The address the V2 `Extrospect` deployment will be live at: the Zoltu -/// address of the current candidate bytecode. Not yet deployed — the next -/// release deploys it. The V1 deployment remains live at +/// @dev Deterministic Zoltu address recorded for the current V2 candidate +/// bytecode. The V1 deployment remains live at /// 0x1BE878af679C1a0A6AC15108b0F4398de1f94506, recorded in /// `src/generated/0_1_0/`. The generated candidate MUST derive this address /// for as long as the source compiles to the V2 bytecode — a drift here is a