Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
63 changes: 41 additions & 22 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,37 +1,56 @@
LibICloneableFactoryV4CheckImplementationCodeTest:testCheckImplementationCodeContract() (gas: 248218)
LibICloneableFactoryV4CheckImplementationCodeTest:testCheckImplementationCodeEtched(address,bytes) (runs: 2048, μ: 7528, ~: 7527)
LibICloneableFactoryV4CheckImplementationCodeTest:testCheckImplementationCodeZero(address) (runs: 2048, μ: 7214, ~: 7267)
ICloneableV2Test:testCloneableV2SuccessDistinctFromDomainTags() (gas: 279)
ICloneableV2Test:testCloneableV2SuccessLiteralIsAcceptedNamespaced(bytes32,bytes) (runs: 2048, μ: 431751, ~: 422707)
ICloneableV2Test:testCloneableV2SuccessLiteralIsAcceptedOpenSalt(bytes32,bytes) (runs: 2048, μ: 432314, ~: 423256)
ICloneableV2Test:testCloneableV2SuccessNearMissIsRejected(bytes32) (runs: 2048, μ: 166262, ~: 166262)
ICloneableV2Test:testCloneableV2SuccessNearMissIsWellFormed() (gas: 273)
ICloneableV2Test:testCloneableV2SuccessPinned() (gas: 267)
LibICloneableFactoryV4CheckImplementationCodeTest:testCheckImplementationCodeContract() (gas: 297955)
LibICloneableFactoryV4CheckImplementationCodeTest:testCheckImplementationCodeEip7702Designator(address,address) (runs: 2048, μ: 7422, ~: 7422)
LibICloneableFactoryV4CheckImplementationCodeTest:testCheckImplementationCodeEtched(address,bytes) (runs: 2048, μ: 7962, ~: 7960)
LibICloneableFactoryV4CheckImplementationCodeTest:testCheckImplementationCodeZero(address) (runs: 2048, μ: 7169, ~: 7223)
LibICloneableFactoryV4CloneCreationCodeTest:testCloneCreationCodeDeploysEIP1167Runtime(address,bytes32) (runs: 2048, μ: 45636, ~: 45636)
LibICloneableFactoryV4CloneCreationCodeTest:testCloneCreationCodeIsEIP1167(address) (runs: 2048, μ: 4245, ~: 4245)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltCallerIndependent(bytes32,bytes,address,address) (runs: 2048, μ: 459061, ~: 443058)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltDataInDerivation(bytes32,bytes,bytes) (runs: 2048, μ: 466856, ~: 450600)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltCallerIndependent(bytes32,bytes,address,address) (runs: 2048, μ: 552856, ~: 537248)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltDataInDerivation(bytes32,bytes,bytes) (runs: 2048, μ: 560902, ~: 544857)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltDiffersFromSenderNamespaced(address,bytes,bytes32,bytes32,address) (runs: 2048, μ: 8139, ~: 8126)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltDisjointTagsCloseTheSquat(address,bytes,bytes) (runs: 2048, μ: 467536, ~: 451203)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltDoesNotConsumeNamespacedSalt(bytes32,bytes) (runs: 2048, μ: 456513, ~: 438428)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltEvent(bytes32,bytes) (runs: 2048, μ: 359037, ~: 349969)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltInitializeFailureFails(bytes32,bytes32) (runs: 2048, μ: 167203, ~: 167203)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltDisjointTagsCloseTheSquat(address,bytes,bytes) (runs: 2048, μ: 561665, ~: 545415)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltDoesNotConsumeNamespacedSalt(bytes32,bytes) (runs: 2048, μ: 550479, ~: 532662)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltEmptyData(bytes32,bytes) (runs: 2048, μ: 385199, ~: 385184)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltEvent(bytes32,bytes) (runs: 2048, μ: 430819, ~: 421885)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltExtremeSalts(bytes) (runs: 2048, μ: 552758, ~: 535431)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltFactoryScoped(bytes32,bytes) (runs: 2048, μ: 995361, ~: 977453)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltImplementationIsByAddress(bytes32,bytes) (runs: 2048, μ: 855549, ~: 837641)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltInitializeFailureFails(bytes32,bytes32) (runs: 2048, μ: 167225, ~: 167225)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltIsDomainTaggedHash(address,bytes,bytes32) (runs: 2048, μ: 6499, ~: 6482)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltManyClonesPerImpl(bytes32,bytes32,bytes) (runs: 2048, μ: 455295, ~: 438862)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltMatchesPredict(bytes32,bytes) (runs: 2048, μ: 361663, ~: 352503)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltPredictCallerIndependent(address,bytes,bytes32,address,address) (runs: 2048, μ: 12247, ~: 12224)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltSecondDeployReverts(bytes32,bytes,address,address) (runs: 2048, μ: 1040442913, ~: 1040443151)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltZeroImplementationCodeSize(address,bytes,bytes32) (runs: 2048, μ: 11124, ~: 11129)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicDataNotInDerivation(bytes32,bytes,bytes) (runs: 2048, μ: 464734, ~: 448450)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicEvent(bytes32,bytes) (runs: 2048, μ: 359015, ~: 349951)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltLargeData(bytes32,bytes1) (runs: 2048, μ: 6360129, ~: 8726306)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltManyClonesPerImpl(bytes32,bytes32,bytes) (runs: 2048, μ: 549352, ~: 533117)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltMatchesPredict(bytes32,bytes) (runs: 2048, μ: 433513, ~: 424488)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltOrderIndependent(bytes32,bytes32,bytes) (runs: 2048, μ: 798425, ~: 765827)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltPredictCallerIndependent(address,bytes,bytes32,address,address) (runs: 2048, μ: 12291, ~: 12269)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltPredictIsStaticCallable(address,bytes,bytes32) (runs: 2048, μ: 8872, ~: 8844)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltSecondDeployReverts(bytes32,bytes,address,address) (runs: 2048, μ: 1040445132, ~: 1040445368)
LibICloneableFactoryV4CloneDeterministicOpenSaltTest:testCloneDeterministicOpenSaltZeroImplementationCodeSize(address,bytes,bytes32) (runs: 2048, μ: 11142, ~: 11151)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicDataNotInDerivation(bytes32,bytes,bytes) (runs: 2048, μ: 558768, ~: 542729)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicEvent(bytes32,bytes) (runs: 2048, μ: 430819, ~: 421889)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicExtremeSalts(bytes) (runs: 2048, μ: 560054, ~: 542536)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicFactoryScoped(bytes32,bytes) (runs: 2048, μ: 994234, ~: 976355)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicInitializeFailureFails(bytes32,bytes32) (runs: 2048, μ: 166695, ~: 166695)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicManyClonesPerImpl(bytes32,bytes32,bytes) (runs: 2048, μ: 455229, ~: 438823)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicMatchesPredict(bytes32,bytes) (runs: 2048, μ: 361175, ~: 352030)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicSaltIsDomainTaggedHash(address,bytes32,address) (runs: 2048, μ: 5563, ~: 5563)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicSecondDeployReverts(bytes32,bytes) (runs: 2048, μ: 1040443447, ~: 1040443612)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicSenderScoped(bytes32,bytes,address,address) (runs: 2048, μ: 459986, ~: 444001)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicManyClonesPerImpl(bytes32,bytes32,bytes) (runs: 2048, μ: 549258, ~: 533035)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicMatchesPredict(bytes32,bytes) (runs: 2048, μ: 433026, ~: 424015)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicPredictCallerIndependent(address,bytes32,address,address,address) (runs: 2048, μ: 13695, ~: 13695)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicPredictIsStaticCallable(address,bytes32,address) (runs: 2048, μ: 7502, ~: 7502)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicPredictZeroDeployer(address,bytes32) (runs: 2048, μ: 9672, ~: 9672)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicSaltIsDomainTaggedHash(address,bytes32,address) (runs: 2048, μ: 5564, ~: 5564)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicSecondDeployReverts(bytes32,bytes) (runs: 2048, μ: 1040445673, ~: 1040445840)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicSenderScoped(bytes32,bytes,address,address) (runs: 2048, μ: 553760, ~: 538213)
LibICloneableFactoryV4CloneDeterministicTest:testCloneDeterministicZeroImplementationCodeSize(address,bytes,bytes32) (runs: 2048, μ: 11086, ~: 11111)
LibICloneableFactoryV4PredictCloneAddressTest:testPredictCloneAddressIsCreate2Formula(address,address,bytes32) (runs: 2048, μ: 1724, ~: 1724)
LibICloneableFactoryV4PredictCloneAddressTest:testPredictCloneAddressMatchesOZ(address,address,bytes32) (runs: 2048, μ: 1570, ~: 1570)
LibICloneableFactoryV4PredictCloneAddressTest:testPredictCloneAddressMatchesRealDeploy(address,bytes32) (runs: 2048, μ: 42869, ~: 42869)
LibICloneableFactoryV4Test:testDerivationsDisjoint(address,bytes32,bytes32,bytes) (runs: 2048, μ: 1405, ~: 1398)
LibICloneableFactoryV4Test:testDomainTagsDistinct() (gas: 233)
LibICloneableFactoryV4Test:testDomainTagsPinned() (gas: 325)
LibICloneableFactoryV4Test:testEffectiveOpenSaltDataSensitive(bytes32,bytes,bytes) (runs: 2048, μ: 4687, ~: 4682)
LibICloneableFactoryV4Test:testEffectiveOpenSaltDataSensitive(bytes32,bytes,bytes) (runs: 2048, μ: 4686, ~: 4682)
LibICloneableFactoryV4Test:testEffectiveOpenSaltEmptyData(bytes32) (runs: 2048, μ: 826, ~: 826)
LibICloneableFactoryV4Test:testEffectiveOpenSaltMatchesFormula(bytes32,bytes) (runs: 2048, μ: 1269, ~: 1257)
LibICloneableFactoryV4Test:testEffectiveOpenSaltPreimageShape(bytes32,bytes) (runs: 2048, μ: 1360, ~: 1348)
Expand Down
69 changes: 69 additions & 0 deletions test/concrete/TestCloneable.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// SPDX-License-Identifier: LicenseRef-DCL-1.0
// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd
pragma solidity =0.8.25;

import {ICloneableV2} from "src/interface/ICloneableV2.sol";

/// Thrown by a second call to `TestCloneable.initialize`. `ICloneableV2` says
/// the implementation MUST ensure `initialize` can NOT be called more than
/// once; this is how this fixture ensures it.
error TestCloneableAlreadyInitialized();

/// @title TestCloneable
/// @notice THE conforming `ICloneableV2` fixture. Every test that needs a
/// clone that initializes successfully uses this one, so there is a single
/// place where "what a correct `ICloneableV2` does" is written down, and every
/// flow test in the suite is run against something that actually honours the
/// interface rather than against the minimum the factory happens to check.
///
/// Three properties, each load bearing:
///
/// - It stores whatever `data` it was initialized with in the public `sData`,
/// so a test can prove the bytes reached the clone verbatim.
/// - `initialize` can NOT be called more than once — the interface's first
/// normative MUST. The flag is written before the data so a re-entrant call
/// cannot slip past the guard.
/// - It returns the success sentinel written out from the LITERAL STRING
/// `ICloneableV2` names, NOT the imported `ICLONEABLE_V2_SUCCESS`. Importing
/// the constant would put both sides of the library's comparison in
/// lockstep: change the constant and every clone still initializes, because
/// the fixture changed with it. A third party implementing `ICloneableV2`
/// has no such luxury — the interface tells them to return
/// `keccak256("ICloneableV2.initialize")` and they hard-code that value — so
/// the fixture hard-codes it too, and a drift in the constant surfaces as a
/// real `InitializationFailed` through a real factory.
///
/// It also carries the RECOMMENDED typed overload, which the interface
/// requires to revert `InitializeSignatureFn` always.
contract TestCloneable is ICloneableV2 {
/// The data this clone was initialized with. Set once.
bytes public sData;

/// Whether `initialize` has already run on this clone. Storage lives on
/// the clone, not the implementation, because the factory reaches this
/// code through an EIP-1167 `DELEGATECALL` proxy.
bool public sInitialized;

/// @inheritdoc ICloneableV2
function initialize(bytes memory data) external returns (bytes32) {
if (sInitialized) {
revert TestCloneableAlreadyInitialized();
}
sInitialized = true;
sData = data;
// Deliberately the literal, not `ICLONEABLE_V2_SUCCESS`. See the
// contract notice.
return keccak256("ICloneableV2.initialize");
}

/// The RECOMMENDED typed overload of `initialize`, which exists only so an
/// initialization config type appears in the ABI. `ICloneableV2` requires
/// it to revert `InitializeSignatureFn` ALWAYS, so that it is never
/// accidentally called in place of the generic `initialize(bytes)` the
/// factory calls. The parameter is unnamed because it is never read.
/// @return Never returns; the declared return type only exists so the
/// overload has the shape a real typed `initialize` would.
function initialize(uint256) external pure returns (bytes32) {
revert InitializeSignatureFn();
}
}
19 changes: 0 additions & 19 deletions test/src/concrete/TestCloneable.sol

This file was deleted.

Loading
Loading