From 6261d5e754608fb3b28a7636b199c8ff41c81489 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Fri, 22 May 2026 14:28:59 +1000 Subject: [PATCH 1/9] First pass of resolving compiler warnings --- contracts/access/IMintingAccessControl.sol | 2 +- contracts/access/MintingAccessControl.sol | 3 +- contracts/allowlist/IOperatorAllowlist.sol | 2 +- contracts/allowlist/IWalletProxy.sol | 2 +- .../allowlist/OperatorAllowlistEnforced.sol | 31 +- .../OperatorAllowlistUpgradeable.sol | 4 +- contracts/bridge/x/v3/CoreV3.sol | 198 ---------- contracts/bridge/x/v3/README.md | 8 - contracts/bridge/x/v3/RegistrationV3.sol | 85 ---- contracts/bridge/x/v4/CoreV4.sol | 314 --------------- contracts/bridge/x/v4/README.md | 31 -- contracts/bridge/x/v4/RegistrationV4.sol | 84 ---- .../deployer/AccessControlledDeployer.sol | 2 +- .../deployer/create/OwnableCreateDeploy.sol | 8 +- .../create2/OwnableCreate2Deployer.sol | 2 +- contracts/deployer/create3/OwnableCreate3.sol | 2 +- .../create3/OwnableCreate3Address.sol | 8 +- .../create3/OwnableCreate3Deployer.sol | 2 +- contracts/errors/PaymentSplitterErrors.sol | 2 +- contracts/games/gems/GemGame.sol | 2 +- contracts/mocks/MockDisguisedEOA.sol | 6 +- contracts/mocks/MockEIP1271Wallet.sol | 6 +- contracts/mocks/MockMarketplace.sol | 18 +- contracts/mocks/MockOnReceive.sol | 10 +- contracts/multicall/GuardedMulticaller.sol | 305 --------------- contracts/multicall/GuardedMulticaller2.sol | 3 +- .../payment-splitter/PaymentSplitter.sol | 4 +- contracts/staking/IStakeHolder.sol | 2 +- contracts/staking/IStakeHolderV2.sol | 2 +- contracts/staking/IWIMX.sol | 2 +- contracts/staking/StakeHolderBase.sol | 4 +- contracts/staking/StakeHolderBaseV2.sol | 2 +- contracts/staking/StakeHolderERC20.sol | 2 +- contracts/staking/StakeHolderERC20V2.sol | 2 +- contracts/staking/StakeHolderNative.sol | 2 +- contracts/staking/StakeHolderNativeV2.sol | 2 +- contracts/staking/StakeHolderWIMX.sol | 2 +- contracts/staking/StakeHolderWIMXV2.sol | 4 +- contracts/staking/WIMX.sol | 2 +- .../token/erc1155/abstract/ERC1155Permit.sol | 2 +- .../erc1155/abstract/ImmutableERC1155Base.sol | 2 +- .../token/erc1155/preset/ImmutableERC1155.sol | 2 +- .../ImmutableERC20FixedSupplyNoBurn.sol | 2 +- .../ImmutableERC20MinterBurnerPermit.sol | 3 +- .../token/erc721/abstract/ERC721Hybrid.sol | 4 +- .../erc721/abstract/ERC721HybridPermit.sol | 2 +- .../erc721/abstract/ERC721HybridPermitV2.sol | 2 +- .../token/erc721/abstract/ERC721HybridV2.sol | 2 +- .../token/erc721/abstract/ERC721Permit.sol | 2 +- contracts/token/erc721/abstract/IERC4494.sol | 2 +- .../erc721/abstract/ImmutableERC721Base.sol | 4 +- .../abstract/ImmutableERC721HybridBase.sol | 2 +- .../abstract/ImmutableERC721HybridBaseV2.sol | 3 +- .../token/erc721/erc721psi/ERC721Psi.sol | 5 +- .../erc721/erc721psi/ERC721PsiBurnableV2.sol | 2 +- .../token/erc721/erc721psi/ERC721PsiV2.sol | 10 +- .../erc721/interfaces/IImmutableERC721.sol | 2 +- .../interfaces/IImmutableERC721ByQuantity.sol | 2 +- .../IImmutableERC721ByQuantityV2.sol | 2 +- .../interfaces/IImmutableERC721Errors.sol | 2 +- .../interfaces/IImmutableERC721Structs.sol | 4 +- .../token/erc721/preset/ImmutableERC721.sol | 2 +- .../erc721/preset/ImmutableERC721MintByID.sol | 2 +- .../token/erc721/preset/ImmutableERC721V2.sol | 2 +- .../trading/seaport/ImmutableSeaport.sol | 2 +- .../seaport/conduit/ConduitController.sol | 1 + .../interfaces/ImmutableSeaportEvents.sol | 2 +- .../validators/ReadOnlyOrderValidator.sol | 2 +- .../seaport/validators/SeaportValidator.sol | 2 +- .../validators/SeaportValidatorHelper.sol | 2 +- .../v1/ImmutableSignedZone.sol | 4 +- .../v1/interfaces/SIP5Interface.sol | 2 +- .../v1/interfaces/SIP6EventsAndErrors.sol | 2 +- .../v1/interfaces/SIP7EventsAndErrors.sol | 2 +- .../v1/interfaces/SIP7Interface.sol | 2 +- .../v2/ImmutableSignedZoneV2.sol | 4 +- .../v2/ZoneAccessControl.sol | 4 +- .../v2/interfaces/SIP5EventsAndErrors.sol | 2 +- .../v2/interfaces/SIP5Interface.sol | 2 +- .../v2/interfaces/SIP6EventsAndErrors.sol | 2 +- .../v2/interfaces/SIP6Interface.sol | 2 +- .../v2/interfaces/SIP7EventsAndErrors.sol | 2 +- .../v2/interfaces/SIP7Interface.sol | 2 +- .../ZoneAccessControlEventsAndErrors.sol | 2 +- .../trading/seaport16/ImmutableSeaport.sol | 2 +- .../seaport16/conduit/ConduitController.sol | 2 +- .../interfaces/ImmutableSeaportEvents.sol | 3 +- .../validators/ReadOnlyOrderValidator.sol | 2 +- .../seaport16/validators/SeaportValidator.sol | 2 +- .../validators/SeaportValidatorHelper.sol | 2 +- .../v3/ImmutableSignedZoneV3.sol | 4 +- .../v3/ZoneAccessControl.sol | 3 +- .../v3/interfaces/SIP5EventsAndErrors.sol | 2 +- .../v3/interfaces/SIP5Interface.sol | 2 +- .../v3/interfaces/SIP6EventsAndErrors.sol | 2 +- .../v3/interfaces/SIP6Interface.sol | 2 +- .../v3/interfaces/SIP7EventsAndErrors.sol | 2 +- .../v3/interfaces/SIP7Interface.sol | 2 +- .../ZoneAccessControlEventsAndErrors.sol | 2 +- foundry.toml | 3 + .../token/erc721/ERC721ByQuantityPerf.t.sol | 4 +- perfTest/token/erc721/ERC721Perf.t.sol | 4 +- .../erc721/ImmutableERC721ByIdPerf.t.sol | 4 +- .../ImmutableERC721ByIdPerfPrefill.t.sol | 2 +- .../ImmutableERC721ByQuantityPerf.t.sol | 4 +- ...ImmutableERC721ByQuantityPerfPrefill.t.sol | 2 +- .../ImmutableERC721V2ByQuantityPerf.t.sol | 4 +- ...mutableERC721V2ByQuantityPerfPrefill.t.sol | 2 +- script/bridge/x/v4/DeployRegistrationV4.s.sol | 2 +- .../bridge/x/v4/DeployRegistrationV4Dev.s.sol | 2 +- .../x/v4/DeployRegistrationV4Sandbox.s.sol | 2 +- script/games/gems/DeployGemGame.sol | 5 +- script/staking/ChangeDistributor.t.sol | 11 +- script/staking/StakeHolderScriptERC20.t.sol | 8 +- script/staking/StakeHolderScriptWIMX.t.sol | 8 +- script/staking/UpgradeToWIMXV2.t.sol | 9 +- .../seaport/DeployImmutableSignedZoneV2.s.sol | 4 +- .../DeployImmutableSignedZoneV2Dev.s.sol | 3 +- .../seaport16/DeployConduitController.s.sol | 34 +- .../seaport16/DeployImmutableSeaport.s.sol | 30 +- .../DeployImmutableSignedZoneV3.s.sol | 46 +-- ...tableERC721MintByIDTransferApprovals.t.sol | 6 +- ...listImmutableERC721TransferApprovals.t.sol | 8 +- test/allowlist/MockOAL.sol | 2 +- .../OperatorAllowlistUpgradeable.t.sol | 5 +- test/bridge/x/v4/MockCoreV4.sol | 2 +- test/bridge/x/v4/RegistrationV4.t.sol | 2 +- test/deployer/AccessControlledDeployer.t.sol | 4 +- test/deployer/create2/Create2Utils.sol | 4 +- .../create2/OwnableCreate2Deployer.t.sol | 4 +- test/deployer/create3/Create3Utils.sol | 4 +- .../create3/OwnableCreate3Deployer.t.sol | 5 +- test/games/gems/GemGame.t.sol | 4 +- test/multicall/GuardedMulticaller.t.sol | 370 ------------------ test/multicall/GuardedMulticaller2.t.sol | 5 +- test/multicall/MockFunctions.sol | 2 +- test/multicall/SigUtils.t.sol | 8 +- test/payment-splitter/PaymentSplitter.t.sol | 4 +- test/royalty-enforcement/MockMarketplace.sol | 20 +- .../RoyaltyMarketplace.t.sol | 26 +- test/staking/StakeHolderAttackWallet.sol | 2 +- test/staking/StakeHolderAttackWallet2.sol | 2 +- test/staking/StakeHolderBase.t.sol | 4 +- test/staking/StakeHolderConfigBase.t.sol | 5 +- test/staking/StakeHolderConfigBaseV2.t.sol | 4 +- test/staking/StakeHolderConfigERC20.t.sol | 4 +- test/staking/StakeHolderConfigERC20V2.t.sol | 5 +- test/staking/StakeHolderConfigNative.t.sol | 5 +- test/staking/StakeHolderConfigNativeV2.t.sol | 4 +- test/staking/StakeHolderConfigWIMX.t.sol | 4 +- test/staking/StakeHolderConfigWIMXV2.t.sol | 5 +- test/staking/StakeHolderInitBase.t.sol | 4 +- test/staking/StakeHolderInitBaseV2.t.sol | 4 +- test/staking/StakeHolderInitERC20.t.sol | 4 +- test/staking/StakeHolderInitERC20V2.t.sol | 4 +- test/staking/StakeHolderInitNative.t.sol | 4 +- test/staking/StakeHolderInitNativeV2.t.sol | 4 +- test/staking/StakeHolderInitWIMX.t.sol | 4 +- test/staking/StakeHolderInitWIMXV2.t.sol | 4 +- test/staking/StakeHolderOperationalBase.t.sol | 5 +- .../StakeHolderOperationalBaseV2.t.sol | 4 +- .../staking/StakeHolderOperationalERC20.t.sol | 8 +- .../StakeHolderOperationalERC20V2.t.sol | 4 +- .../StakeHolderOperationalNative.t.sol | 5 +- .../StakeHolderOperationalNativeV2.t.sol | 5 +- test/staking/StakeHolderOperationalWIMX.t.sol | 7 +- .../StakeHolderOperationalWIMXV2.t.sol | 5 +- test/staking/StakeHolderTimeDelayBase.t.sol | 6 +- test/staking/StakeHolderTimeDelayERC20.t.sol | 5 +- test/staking/StakeHolderTimeDelayWIMX.t.sol | 4 +- test/staking/StakeHolderUpgradeForkTest.t.sol | 7 +- test/token/erc1155/ImmutableERC1155.t.sol | 21 +- .../token/erc1155/ImmutableERC1155Costs.t.sol | 5 +- .../ImmutableERC20FixedSupplyNoBurn.t.sol | 4 +- .../ImmutableERC20MinterBurnerPermit.t.sol | 4 +- test/token/erc721/ERC721Base.t.sol | 5 +- test/token/erc721/ERC721ByQuantityBase.t.sol | 2 +- test/token/erc721/ERC721ConfigBase.t.sol | 6 +- test/token/erc721/ERC721ConfigByIdV1.t.sol | 2 +- .../erc721/ERC721ConfigByQuantityBase.t.sol | 4 +- .../erc721/ERC721ConfigByQuantityV1.t.sol | 4 +- .../erc721/ERC721ConfigByQuantityV2.t.sol | 4 +- test/token/erc721/ERC721OperationalBase.t.sol | 2 +- .../erc721/ERC721OperationalByIdV1.t.sol | 2 +- .../ERC721OperationalByQuantityBase.t.sol | 4 +- .../ERC721OperationalByQuantityV1.t.sol | 4 +- .../ERC721OperationalByQuantityV2.t.sol | 2 +- .../token/erc721/fuzz/ERC721PsiV2.Echidna.sol | 2 + test/token/x/Asset.t.sol | 2 +- .../seaport/ImmutableSeaportBase.t.sol | 13 +- .../seaport/ImmutableSeaportHarness.t.sol | 2 +- .../seaport/ImmutableSeaportOperational.t.sol | 13 +- ...utableSeaportSignedZoneV2Integration.t.sol | 4 +- .../seaport/ImmutableSeaportTestHelper.t.sol | 2 +- .../seaport/utils/IImmutableERC1155.t.sol | 2 +- .../seaport/utils/IImmutableERC721.t.sol | 2 +- .../utils/IOperatorAllowlistUpgradeable.t.sol | 2 +- .../seaport/utils/SigningTestHelper.t.sol | 4 +- .../ImmutableSignedZoneOrderValidation.t.sol | 5 +- .../v1/ImmutableSignedZoneOwnership.t.sol | 5 +- .../ImmutableSignedZoneSignerManagement.t.sol | 2 +- .../v2/IImmutableSignedZoneV2Harness.t.sol | 2 +- .../v2/ImmutableSignedZoneV2.t.sol | 4 +- .../v2/ImmutableSignedZoneV2Harness.t.sol | 2 +- .../seaport16/ImmutableSeaportBase.t.sol | 15 +- .../seaport16/ImmutableSeaportHarness.t.sol | 2 +- .../ImmutableSeaportOperational.t.sol | 17 +- ...utableSeaportSignedZoneV3Integration.t.sol | 49 ++- .../ImmutableSeaportTestHelper.t.sol | 2 +- .../utils/MockTransferValidator.t.sol | 2 +- .../seaport16/utils/SigningTestHelper.t.sol | 4 +- .../v3/IImmutableSignedZoneV3Harness.t.sol | 2 +- .../v3/ImmutableSignedZoneV3.t.sol | 4 +- .../v3/ImmutableSignedZoneV3Harness.t.sol | 2 +- test/utils/DeployAllowlistProxy.sol | 2 +- test/utils/DeploySCW.sol | 1 - test/utils/Sign.sol | 2 +- 217 files changed, 439 insertions(+), 1947 deletions(-) delete mode 100644 contracts/bridge/x/v3/CoreV3.sol delete mode 100644 contracts/bridge/x/v3/README.md delete mode 100644 contracts/bridge/x/v3/RegistrationV3.sol delete mode 100644 contracts/bridge/x/v4/CoreV4.sol delete mode 100644 contracts/bridge/x/v4/README.md delete mode 100644 contracts/bridge/x/v4/RegistrationV4.sol delete mode 100644 contracts/multicall/GuardedMulticaller.sol delete mode 100644 test/multicall/GuardedMulticaller.t.sol diff --git a/contracts/access/IMintingAccessControl.sol b/contracts/access/IMintingAccessControl.sol index 963d8781..0acecd67 100644 --- a/contracts/access/IMintingAccessControl.sol +++ b/contracts/access/IMintingAccessControl.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/access/MintingAccessControl.sol b/contracts/access/MintingAccessControl.sol index dffbd45a..750f493d 100644 --- a/contracts/access/MintingAccessControl.sol +++ b/contracts/access/MintingAccessControl.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -6,6 +6,7 @@ import {AccessControlEnumerable} from "@openzeppelin/contracts/access/AccessCont abstract contract MintingAccessControl is AccessControlEnumerable { /// @notice Role to mint tokens + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant MINTER_ROLE = bytes32("MINTER_ROLE"); /** diff --git a/contracts/allowlist/IOperatorAllowlist.sol b/contracts/allowlist/IOperatorAllowlist.sol index a12b182b..d92c92c7 100644 --- a/contracts/allowlist/IOperatorAllowlist.sol +++ b/contracts/allowlist/IOperatorAllowlist.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/allowlist/IWalletProxy.sol b/contracts/allowlist/IWalletProxy.sol index 094fb179..7b571792 100644 --- a/contracts/allowlist/IWalletProxy.sol +++ b/contracts/allowlist/IWalletProxy.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/allowlist/OperatorAllowlistEnforced.sol b/contracts/allowlist/OperatorAllowlistEnforced.sol index f5b9875e..5d055625 100644 --- a/contracts/allowlist/OperatorAllowlistEnforced.sol +++ b/contracts/allowlist/OperatorAllowlistEnforced.sol @@ -1,37 +1,23 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 // slither-disable-start calls-loop pragma solidity >=0.8.19 <0.8.29; -// Allowlist Registry import {IOperatorAllowlist} from "./IOperatorAllowlist.sol"; - -// Interface import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; - -// Errors import {OperatorAllowlistEnforcementErrors} from "../errors/Errors.sol"; -/* - OperatorAllowlistEnforced is an abstract contract that token contracts can inherit in order to set the - address of the OperatorAllowlist registry that it will interface with, so that the token contract may - enable the restriction of approvals and transfers to allowlisted users. - OperatorAllowlistEnforced is not designed to be upgradeable or extended. -*/ +/** + * @notice OperatorAllowlistEnforced is an abstract contract that token contracts can inherit in order to set the + * address of the OperatorAllowlist registry that it will interface with, so that the token contract may + * enable the restriction of approvals and transfers to allowlisted users. + * OperatorAllowlistEnforced is not designed to be upgradeable or extended. + */ abstract contract OperatorAllowlistEnforced is OperatorAllowlistEnforcementErrors { - /// ===== State Variables ===== - - /// @notice Interface that implements the `IOperatorAllowlist` interface - IOperatorAllowlist public operatorAllowlist; - - /// ===== Events ===== - /// @notice Emitted whenever the transfer Allowlist registry is updated event OperatorAllowlistRegistryUpdated(address oldRegistry, address newRegistry); - /// ===== Modifiers ===== - /** * @notice Internal function to validate an approval, according to whether the target is an EOA or Allowlisted * @param targetApproval the address of the approval target to be validated @@ -86,7 +72,8 @@ abstract contract OperatorAllowlistEnforced is OperatorAllowlistEnforcementError _; } - /// ===== External functions ===== + /// @notice Interface that implements the `IOperatorAllowlist` interface + IOperatorAllowlist public operatorAllowlist; /** * @notice Internal function to set the operator allowlist the calling contract will interface with diff --git a/contracts/allowlist/OperatorAllowlistUpgradeable.sol b/contracts/allowlist/OperatorAllowlistUpgradeable.sol index 5ad863e4..84b5c38a 100644 --- a/contracts/allowlist/OperatorAllowlistUpgradeable.sol +++ b/contracts/allowlist/OperatorAllowlistUpgradeable.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -34,9 +34,11 @@ contract OperatorAllowlistUpgradeable is /// ===== State Variables ===== /// @notice Only REGISTRAR_ROLE can invoke white listing registration and removal + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant REGISTRAR_ROLE = bytes32("REGISTRAR_ROLE"); /// @notice Only UPGRADE_ROLE can upgrade the contract + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant UPGRADE_ROLE = bytes32("UPGRADE_ROLE"); /// @notice Mapping of Allowlisted addresses diff --git a/contracts/bridge/x/v3/CoreV3.sol b/contracts/bridge/x/v3/CoreV3.sol deleted file mode 100644 index fe8a7208..00000000 --- a/contracts/bridge/x/v3/CoreV3.sol +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 -// SPDX-License-Identifier: MIT -// solhint-disable compiler-version -pragma solidity ^0.8.11; - -interface CoreV3 { - function announceAvailabilityVerifierRemovalIntent(address) external; - function announceVerifierRemovalIntent(address) external; - function getRegisteredAvailabilityVerifiers() external; - function getRegisteredVerifiers() external; - function isAvailabilityVerifier(address) external; - function isFrozen() external; - function isVerifier(address) external; - function mainAcceptGovernance() external; - function mainCancelNomination() external; - function mainIsGovernor(address) external; - function mainNominateNewGovernor(address) external; - function mainRemoveGovernor(address) external; - function registerAvailabilityVerifier(address, string calldata) external; - function registerVerifier(address, string calldata) external; - function removeAvailabilityVerifier(address) external; - function removeVerifier(address) external; - function unFreeze() external; - function getEthKey(uint256 starkKey) external view returns (address ethKey); - function isOperator(address) external; - function isTokenAdmin(address) external; - function isUserAdmin(address) external; - function onERC721Received(address, address, uint256, bytes calldata) external; - function registerOperator(address) external; - function registerToken(uint256, bytes calldata) external; - function registerTokenAdmin(address) external; - function registerUser(address, uint256, bytes calldata) external; - function registerUserAdmin(address) external; - function unregisterOperator(address) external; - function unregisterTokenAdmin(address) external; - function unregisterUserAdmin(address) external; - function withdrawNftTo(uint256, uint256, uint256, address) external; - function withdrawTo(uint256, uint256, address) external; - - event LogDeposit( - address depositorEthKey, - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - - event LogNftDeposit( - address depositorEthKey, - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 tokenId, - uint256 assetId - ); - - event LogDepositCancel(uint256 starkKey, uint256 vaultId, uint256 assetId); - - event LogDepositCancelReclaimed( - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - - event LogDepositNftCancelReclaimed( - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 tokenId, - uint256 assetId - ); - - function getDepositBalance( - uint256 starkKey, - uint256 assetId, - uint256 vaultId - ) external view returns (uint256 balance); - - function getQuantizedDepositBalance( - uint256 starkKey, - uint256 assetId, - uint256 vaultId - ) external view returns (uint256 balance); - - function depositNft(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 tokenId) external; - - function getCancellationRequest( - uint256 starkKey, - uint256 assetId, - uint256 vaultId - ) external view returns (uint256 request); - - function depositERC20(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 quantizedAmount) external; - - function depositEth(uint256 starkKey, uint256 assetType, uint256 vaultId) external payable; - - function deposit(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 quantizedAmount) external; - - function deposit(uint256 starkKey, uint256 assetType, uint256 vaultId) external payable; - - function depositCancel(uint256 starkKey, uint256 assetId, uint256 vaultId) external; - - function depositReclaim(uint256 starkKey, uint256 assetId, uint256 vaultId) external; - - function depositNftReclaim(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 tokenId) external; - - event LogWithdrawalPerformed( - uint256 ownerKey, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount, - address recipient - ); - - event LogNftWithdrawalPerformed( - uint256 ownerKey, - uint256 assetType, - uint256 tokenId, - uint256 assetId, - address recipient - ); - - event LogMintWithdrawalPerformed( - uint256 ownerKey, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount, - uint256 assetId - ); - - event LogWithdrawalAllowed( - uint256 ownerKey, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - - event LogNftWithdrawalAllowed(uint256 ownerKey, uint256 assetId); - - event LogMintableWithdrawalAllowed(uint256 ownerKey, uint256 assetId, uint256 quantizedAmount); - - function getWithdrawalBalance(uint256 ownerKey, uint256 assetId) external view returns (uint256 balance); - - function withdraw(uint256 ownerKey, uint256 assetType) external; - - function withdrawNft(uint256 ownerKey, uint256 assetType, uint256 tokenId) external; - - function withdrawAndMint(uint256 ownerKey, uint256 assetType, bytes calldata mintingBlob) external; - - function getVaultRoot() external view returns (uint256 root); - function getVaultTreeHeight() external view returns (uint256 height); - function getOrderRoot() external view returns (uint256 root); - function getOrderTreeHeight() external view returns (uint256 height); - function getSequenceNumber() external view returns (uint256 seq); - function getLastBatchId() external view returns (uint256 batchId); - - function registerAndDepositERC20( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - uint256 vaultId, - uint256 quantizedAmount - ) external; - - function registerAndDepositEth( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - uint256 vaultId - ) external payable; - - function getAssetInfo(uint256 assetType) external view returns (bytes memory assetInfo); - - function getQuantum(uint256 presumedAssetType) external view returns (uint256 quantum); - - function escape(uint256 starkKey, uint256 vaultId, uint256 assetId, uint256 quantizedAmount) external; - - event LogFullWithdrawalRequest(uint256 starkKey, uint256 vaultId); - - function fullWithdrawalRequest(uint256 starkKey, uint256 vaultId) external; - - function freezeRequest(uint256 starkKey, uint256 vaultId) external; - - event LogRootUpdate(uint256 sequenceNumber, uint256 batchId, uint256 vaultRoot, uint256 orderRoot); - - event LogStateTransitionFact(bytes32 stateTransitionFact); - - event LogVaultBalanceChangeApplied(address ethKey, uint256 assetId, uint256 vaultId, int256 quantizedAmountChange); - - function updateState(uint256[] calldata publicInput, uint256[] calldata applicationData) external; - - function getFullWithdrawalRequest(uint256 starkKey, uint256 vaultId) external view returns (uint256 res); -} diff --git a/contracts/bridge/x/v3/README.md b/contracts/bridge/x/v3/README.md deleted file mode 100644 index aa291e74..00000000 --- a/contracts/bridge/x/v3/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Immutable X Contracts - -## Immutable Contract Addresses - -| Environment/Network | Core (StarkEx Bridge) Contract | User Registration Contract | -|--------------------------|-------------------------------------------------------------------------------------------------------------------------------| ----------------------------------------------------------------------------------------------------------------------------- | -| **Sandbox (Sepolia)** | [0x2d5C349fD8464DA06a3f90b4B0E9195F3d1b7F98](https://sepolia.etherscan.io/address/0x2d5C349fD8464DA06a3f90b4B0E9195F3d1b7F98) | [0x1c97ada273c9a52253f463042f29117090cd7d83](https://goerli.etherscan.io/address/0x1C97Ada273C9A52253f463042f29117090Cd7D83) | -| **Production (Mainnet)** | [0x5fdcca53617f4d2b9134b29090c87d01058e27e9](https://etherscan.io/address/0x5FDCCA53617f4d2b9134B29090C87D01058e27e9) | [0x72a06bf2a1CE5e39cBA06c0CAb824960B587d64c](https://etherscan.io/address/0x72a06bf2a1CE5e39cBA06c0CAb824960B587d64c) | diff --git a/contracts/bridge/x/v3/RegistrationV3.sol b/contracts/bridge/x/v3/RegistrationV3.sol deleted file mode 100644 index d50c8497..00000000 --- a/contracts/bridge/x/v3/RegistrationV3.sol +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 -// SPDX-License-Identifier: MIT -// solhint-disable compiler-version -pragma solidity ^0.8.11; - -import {CoreV3} from "./CoreV3.sol"; - -contract RegistrationV3 { - CoreV3 public immutable imx; - - constructor(CoreV3 _imx) { - imx = _imx; - } - - function registerAndDepositNft( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - uint256 vaultId, - uint256 tokenId - ) external { - imx.registerUser(ethKey, starkKey, signature); - imx.depositNft(starkKey, assetType, vaultId, tokenId); - } - - function registerAndWithdraw( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType - ) external { - imx.registerUser(ethKey, starkKey, signature); - imx.withdraw(starkKey, assetType); - } - - function registerAndWithdrawTo( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - address recipient - ) external { - imx.registerUser(ethKey, starkKey, signature); - imx.withdrawTo(starkKey, assetType, recipient); - } - - function registerAndWithdrawNft( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - uint256 tokenId - ) external { - imx.registerUser(ethKey, starkKey, signature); - imx.withdrawNft(starkKey, assetType, tokenId); - } - - function registerAndWithdrawNftTo( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - uint256 tokenId, - address recipient - ) external { - imx.registerUser(ethKey, starkKey, signature); - imx.withdrawNftTo(starkKey, assetType, tokenId, recipient); - } - - function regsiterAndWithdrawAndMint( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - bytes calldata mintingBlob - ) external { - imx.registerUser(ethKey, starkKey, signature); - imx.withdrawAndMint(starkKey, assetType, mintingBlob); - } - - function isRegistered(uint256 starkKey) public view returns (bool) { - return imx.getEthKey(starkKey) != address(0); - } -} diff --git a/contracts/bridge/x/v4/CoreV4.sol b/contracts/bridge/x/v4/CoreV4.sol deleted file mode 100644 index 638de5c1..00000000 --- a/contracts/bridge/x/v4/CoreV4.sol +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 -// SPDX-License-Identifier: MIT -// -// This contract is an interface for the StarkEx Core contract v4 version. -// It is used to interact with the StarkEx Core contract from the Registration contract. -// The Core contract is used to register and withdraw users and assets from the StarkEx system. -// -// This file was generated using the abi-to-sol tool. -// the StarkEx contract ABI that was provided by StarkWare via slack. -pragma solidity >=0.8.19 <0.8.29; - -// solhint-disable func-name-mixedcase -interface CoreV4 { - fallback() external payable; - - function VERSION() external view returns (string memory); - - function initialize(bytes memory data) external; - - receive() external payable; - - event LogFrozen(); - event LogNewGovernorAccepted(address acceptedGovernor); - event LogNominatedGovernor(address nominatedGovernor); - event LogNominationCancelled(); - event LogRegistered(address entry, string entryId); - event LogRemovalIntent(address entry, string entryId); - event LogRemoved(address entry, string entryId); - event LogRemovedGovernor(address removedGovernor); - event LogUnFrozen(); - - function DEPOSIT_CANCEL_DELAY() external view returns (uint256); - - function FREEZE_GRACE_PERIOD() external view returns (uint256); - - function MAIN_GOVERNANCE_INFO_TAG() external view returns (string memory); - - function MAX_FORCED_ACTIONS_REQS_PER_BLOCK() external view returns (uint256); - - function MAX_VERIFIER_COUNT() external view returns (uint256); - - function UNFREEZE_DELAY() external view returns (uint256); - - function VERIFIER_REMOVAL_DELAY() external view returns (uint256); - - function announceAvailabilityVerifierRemovalIntent(address verifier) external; - - function announceVerifierRemovalIntent(address verifier) external; - - function getRegisteredAvailabilityVerifiers() external view returns (address[] memory _verifers); - - function getRegisteredVerifiers() external view returns (address[] memory _verifers); - - function isAvailabilityVerifier(address verifierAddress) external view returns (bool); - - function isFrozen() external view returns (bool); - - function isVerifier(address verifierAddress) external view returns (bool); - - function mainAcceptGovernance() external; - - function mainCancelNomination() external; - - function mainIsGovernor(address testGovernor) external view returns (bool); - - function mainNominateNewGovernor(address newGovernor) external; - - function mainRemoveGovernor(address governorForRemoval) external; - - function registerAvailabilityVerifier(address verifier, string memory identifier) external; - - function registerVerifier(address verifier, string memory identifier) external; - - function removeAvailabilityVerifier(address verifier) external; - - function removeVerifier(address verifier) external; - - function unFreeze() external; - - event LogDeposit( - address depositorEthKey, - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - event LogDepositCancel(uint256 starkKey, uint256 vaultId, uint256 assetId); - event LogDepositCancelReclaimed( - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - event LogDepositNftCancelReclaimed( - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 tokenId, - uint256 assetId - ); - event LogMintWithdrawalPerformed( - uint256 ownerKey, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount, - uint256 assetId - ); - event LogMintableWithdrawalAllowed(uint256 ownerKey, uint256 assetId, uint256 quantizedAmount); - event LogNftDeposit( - address depositorEthKey, - uint256 starkKey, - uint256 vaultId, - uint256 assetType, - uint256 tokenId, - uint256 assetId - ); - event LogNftWithdrawalAllowed(uint256 ownerKey, uint256 assetId); - event LogNftWithdrawalPerformed( - uint256 ownerKey, - uint256 assetType, - uint256 tokenId, - uint256 assetId, - address recipient - ); - event LogTokenAdminAdded(address tokenAdmin); - event LogTokenAdminRemoved(address tokenAdmin); - event LogTokenRegistered(uint256 assetType, bytes assetInfo, uint256 quantum); - event LogUserRegistered(address ethKey, uint256 starkKey, address sender); - event LogWithdrawalAllowed( - uint256 ownerKey, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - event LogWithdrawalPerformed( - uint256 ownerKey, - uint256 assetType, - uint256 nonQuantizedAmount, - uint256 quantizedAmount, - address recipient - ); - - function defaultVaultWithdrawalLock() external view returns (uint256); - - function deposit(uint256 starkKey, uint256 assetType, uint256 vaultId) external payable; - - function deposit(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 quantizedAmount) external; - - function depositCancel(uint256 starkKey, uint256 assetId, uint256 vaultId) external; - - function depositERC20(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 quantizedAmount) external; - - function depositEth(uint256 starkKey, uint256 assetType, uint256 vaultId) external payable; - - function depositNft(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 tokenId) external; - - function depositNftReclaim(uint256 starkKey, uint256 assetType, uint256 vaultId, uint256 tokenId) external; - - function depositReclaim(uint256 starkKey, uint256 assetId, uint256 vaultId) external; - - function getActionCount() external view returns (uint256); - - function getActionHashByIndex(uint256 actionIndex) external view returns (bytes32); - - function getAssetInfo(uint256 assetType) external view returns (bytes memory assetInfo); - - function getCancellationRequest( - uint256 starkKey, - uint256 assetId, - uint256 vaultId - ) external view returns (uint256 request); - - function getDepositBalance( - uint256 starkKey, - uint256 assetId, - uint256 vaultId - ) external view returns (uint256 balance); - - function getEthKey(uint256 ownerKey) external view returns (address); - - function getFullWithdrawalRequest(uint256 starkKey, uint256 vaultId) external view returns (uint256 res); - - function getQuantizedDepositBalance( - uint256 starkKey, - uint256 assetId, - uint256 vaultId - ) external view returns (uint256 balance); - - function getQuantum(uint256 presumedAssetType) external view returns (uint256 quantum); - - function getWithdrawalBalance(uint256 ownerKey, uint256 assetId) external view returns (uint256 balance); - - function isAssetRegistered(uint256 assetType) external view returns (bool); - - function isTokenAdmin(address testedAdmin) external view returns (bool); - - function onERC721Received(address, address, uint256, bytes memory) external returns (bytes4); - - function orderRegistryAddress() external view returns (address); - - function registerAndDepositERC20( - address ethKey, - uint256 starkKey, - bytes memory signature, - uint256 assetType, - uint256 vaultId, - uint256 quantizedAmount - ) external; - - function registerAndDepositEth( - address ethKey, - uint256 starkKey, - bytes memory signature, - uint256 assetType, - uint256 vaultId - ) external payable; - - function registerEthAddress(address ethKey, uint256 starkKey, bytes memory starkSignature) external; - - function registerSender(uint256 starkKey, bytes memory starkSignature) external; - - function registerToken(uint256 assetType, bytes memory assetInfo) external; - - function registerToken(uint256 assetType, bytes memory assetInfo, uint256 quantum) external; - - function registerTokenAdmin(address newAdmin) external; - - function unregisterTokenAdmin(address oldAdmin) external; - - function withdraw(uint256 ownerKey, uint256 assetType) external; - - function withdrawAndMint(uint256 ownerKey, uint256 assetType, bytes memory mintingBlob) external; - - function withdrawNft(uint256 ownerKey, uint256 assetType, uint256 tokenId) external; - - event LogOperatorAdded(address operator); - event LogOperatorRemoved(address operator); - event LogRootUpdate(uint256 sequenceNumber, uint256 batchId, uint256 vaultRoot, uint256 orderRoot); - event LogStateTransitionFact(bytes32 stateTransitionFact); - event LogVaultBalanceChangeApplied(address ethKey, uint256 assetId, uint256 vaultId, int256 quantizedAmountChange); - - function STARKEX_MAX_DEFAULT_VAULT_LOCK() external view returns (uint256); - - function escape(uint256 starkKey, uint256 vaultId, uint256 assetId, uint256 quantizedAmount) external; - - function getLastBatchId() external view returns (uint256 batchId); - - function getOrderRoot() external view returns (uint256 root); - - function getOrderTreeHeight() external view returns (uint256 height); - - function getSequenceNumber() external view returns (uint256 seq); - - function getVaultRoot() external view returns (uint256 root); - - function getVaultTreeHeight() external view returns (uint256 height); - - function isOperator(address testedOperator) external view returns (bool); - - function registerOperator(address newOperator) external; - - function unregisterOperator(address removedOperator) external; - - function updateState(uint256[] memory publicInput, uint256[] memory applicationData) external; - - event LogFullWithdrawalRequest(uint256 starkKey, uint256 vaultId); - - function freezeRequest(uint256 starkKey, uint256 vaultId) external; - - function fullWithdrawalRequest(uint256 starkKey, uint256 vaultId) external; - - event LogDefaultVaultWithdrawalLockSet(uint256 newDefaultLockTime); - event LogDepositToVault( - address ethKey, - uint256 assetId, - uint256 vaultId, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - event LogVaultWithdrawalLockSet(address ethKey, uint256 assetId, uint256 vaultId, uint256 timeRelease); - event LogWithdrawalFromVault( - address ethKey, - uint256 assetId, - uint256 vaultId, - uint256 nonQuantizedAmount, - uint256 quantizedAmount - ); - - function depositERC20ToVault(uint256 assetId, uint256 vaultId, uint256 quantizedAmount) external; - - function depositEthToVault(uint256 assetId, uint256 vaultId) external payable; - - function getQuantizedVaultBalance(address ethKey, uint256 assetId, uint256 vaultId) external view returns (uint256); - - function getVaultBalance(address ethKey, uint256 assetId, uint256 vaultId) external view returns (uint256); - - function getVaultWithdrawalLock(address ethKey, uint256 assetId, uint256 vaultId) external view returns (uint256); - - function isStrictVaultBalancePolicy() external view returns (bool); - - function isVaultLocked(address ethKey, uint256 assetId, uint256 vaultId) external view returns (bool); - - function lockVault(uint256 assetId, uint256 vaultId, uint256 lockTime) external; - - function setDefaultVaultWithdrawalLock(uint256 newDefaultTime) external; - - function withdrawFromVault(uint256 assetId, uint256 vaultId, uint256 quantizedAmount) external; - - event ImplementationActivationRescheduled(address indexed implementation, uint256 updatedActivationTime); - - function updateImplementationActivationTime(address implementation, bytes memory data, bool finalize) external; -} diff --git a/contracts/bridge/x/v4/README.md b/contracts/bridge/x/v4/README.md deleted file mode 100644 index 0b277f44..00000000 --- a/contracts/bridge/x/v4/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Immutable X Contracts - -The immutable x v4 contracts provide functionality for enabling immutable-x users to off-ramp assets from the StarkEx network to Ethereum network. -From v4 onwards, Starkex changed the deposit, withdrawal and registration flows to be more efficient and more trustless, and this contract acts as a wrapper around the StarkEx contract to provide a more user-friendly interface. - -# Status - -Contract audits and threat models: - -| Description | Date |Version Audited | Link to Report | -|----------------|------------------|-----------------|----------------| -| Internal audit | Feb 16, 2024 | [4f0fd701e357e2bc9c94d13a6a46babdb6a5fbf2](https://github.com/immutable/contracts/tree/4f0fd701e357e2bc9c94d13a6a46babdb6a5fbf2/contracts/bridge/x/v4) | [202402-internal-audit-immutablex-bridge-v4](../../../../audits/bridge/x/202402-internal-audit-immutablex-bridge-v4.pdf) | - - -## Immutable Contract Addresses - -| Environment/Network | Core (StarkEx Bridge) Contract | User Registration Contract | -|--------------------------|--------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------| -| **Dev (Sepolia)** | [0x590c809bd5ff50dcb39e4320b60139b29b880174](https://sepolia.etherscan.io/address/0x590c809bd5ff50dcb39e4320b60139b29b880174) | [0x31D79A2b1E0150b73D243826b93ba7BCaE7fCB60](https://sepolia.etherscan.io/address/0x31D79A2b1E0150b73D243826b93ba7BCaE7fCB60) | -| **Sandbox (Sepolia)** | [0x2d5C349fD8464DA06a3f90b4B0E9195F3d1b7F98](https://sepolia.etherscan.io/address/0x2d5C349fD8464DA06a3f90b4B0E9195F3d1b7F98) | [0xd1527c65c6287ec5ab816d328eb83bb4cb690e92](https://sepolia.etherscan.io/address/0xd1527c65c6287ec5ab816d328eb83bb4cb690e92) | -| **Production (Mainnet)** | [0x5fdcca53617f4d2b9134b29090c87d01058e27e9](https://etherscan.io/address/0x5FDCCA53617f4d2b9134B29090C87D01058e27e9) | [0xac88a57943b5BBa1ecd931F8494cAd0B7F717590](https://etherscan.io/address/0xac88a57943b5BBa1ecd931F8494cAd0B7F717590) | - -## RegistrationV4 - -This contract is a wrapper around the StarkEx contract to provide a more user-friendly interface for executing multiple transactions on the StarkEx contract at once. - -## CoreV4 - -This contract is an interface for the StarkEx Core contract v4 version. -It is used to interact with the StarkEx Core contract from the Registration contract. -The Core contract is used to register and withdraw users and assets from the StarkEx system. diff --git a/contracts/bridge/x/v4/RegistrationV4.sol b/contracts/bridge/x/v4/RegistrationV4.sol deleted file mode 100644 index 8cb40f0f..00000000 --- a/contracts/bridge/x/v4/RegistrationV4.sol +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.19 <0.8.29; - -import {CoreV4} from "./CoreV4.sol"; - -/** - * Emitted when there are no funds to withdraw when calling `withdrawAll`. - */ -error NoFundsToWithdraw(uint256 ethKey, uint256 starkKey); - -/** - * RegistrationV4 is a wrapper around the StarkEx contract to provide a more user-friendly interface for executing multiple transactions on the StarkEx contract at once. - * This contract is not upgradeable. If an issue is found with this contract, a new version will be deployed. - */ -contract RegistrationV4 { - CoreV4 public immutable imx; - - constructor(address payable _imx) { - imx = CoreV4(_imx); - } - - function registerAndWithdrawAll( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType - ) external { - if (!isRegistered(starkKey)) { - imx.registerEthAddress(ethKey, starkKey, signature); - } - withdrawAll(uint160(ethKey), starkKey, assetType); - } - - function withdrawAll(uint256 ethKey, uint256 starkKey, uint256 assetType) public { - uint256 ethKeyBalance = imx.getWithdrawalBalance(ethKey, assetType); - uint256 starkKeyBalance = imx.getWithdrawalBalance(starkKey, assetType); - if (ethKeyBalance == 0 && starkKeyBalance == 0) { - revert NoFundsToWithdraw(ethKey, starkKey); - } - - if (ethKeyBalance > 0) { - imx.withdraw(ethKey, assetType); - } - - if (starkKeyBalance > 0) { - imx.withdraw(starkKey, assetType); - } - } - - function registerAndWithdrawNft( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - uint256 tokenId - ) external { - if (!isRegistered(starkKey)) { - imx.registerEthAddress(ethKey, starkKey, signature); - } - imx.withdrawNft(starkKey, assetType, tokenId); - } - - function registerWithdrawAndMint( - address ethKey, - uint256 starkKey, - bytes calldata signature, - uint256 assetType, - bytes calldata mintingBlob - ) external { - if (!isRegistered(starkKey)) { - imx.registerEthAddress(ethKey, starkKey, signature); - } - imx.withdrawAndMint(starkKey, assetType, mintingBlob); - } - - function getVersion() external view returns (string memory) { - return imx.VERSION(); - } - - function isRegistered(uint256 starkKey) public view returns (bool) { - return imx.getEthKey(starkKey) != address(0); - } -} diff --git a/contracts/deployer/AccessControlledDeployer.sol b/contracts/deployer/AccessControlledDeployer.sol index eede9e55..0485e2ed 100644 --- a/contracts/deployer/AccessControlledDeployer.sol +++ b/contracts/deployer/AccessControlledDeployer.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/deployer/create/OwnableCreateDeploy.sol b/contracts/deployer/create/OwnableCreateDeploy.sol index 25ef28a8..1b86ffb2 100644 --- a/contracts/deployer/create/OwnableCreateDeploy.sol +++ b/contracts/deployer/create/OwnableCreateDeploy.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; @@ -12,10 +12,10 @@ pragma solidity >=0.8.19 <0.8.29; */ contract OwnableCreateDeploy { // Address that is authorised to call the deploy function. - address private immutable owner; + address private immutable OWNER; constructor() { - owner = msg.sender; + OWNER = msg.sender; } /** * @dev Deploys a new contract with the specified bytecode using the `CREATE` opcode. @@ -24,7 +24,7 @@ contract OwnableCreateDeploy { // slither-disable-next-line locked-ether function deploy(bytes memory bytecode) external payable { // solhint-disable-next-line custom-errors, reason-string - require(msg.sender == owner, "CreateDeploy: caller is not the owner"); + require(msg.sender == OWNER, "CreateDeploy: caller is not the owner"); // solhint-disable no-inline-assembly assembly { if iszero(create(callvalue(), add(bytecode, 32), mload(bytecode))) { diff --git a/contracts/deployer/create2/OwnableCreate2Deployer.sol b/contracts/deployer/create2/OwnableCreate2Deployer.sol index 0f63cbe7..4a75c015 100644 --- a/contracts/deployer/create2/OwnableCreate2Deployer.sol +++ b/contracts/deployer/create2/OwnableCreate2Deployer.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/deployer/create3/OwnableCreate3.sol b/contracts/deployer/create3/OwnableCreate3.sol index ad88b747..9937482f 100644 --- a/contracts/deployer/create3/OwnableCreate3.sol +++ b/contracts/deployer/create3/OwnableCreate3.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/deployer/create3/OwnableCreate3Address.sol b/contracts/deployer/create3/OwnableCreate3Address.sol index 2b88bcbb..755138bb 100644 --- a/contracts/deployer/create3/OwnableCreate3Address.sol +++ b/contracts/deployer/create3/OwnableCreate3Address.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; @@ -12,13 +12,13 @@ import {OwnableCreateDeploy} from "../create/OwnableCreateDeploy.sol"; */ abstract contract OwnableCreate3Address { /// @dev bytecode hash of the CreateDeploy helper contract - bytes32 internal immutable createDeployBytecodeHash; + bytes32 internal immutable CREATE_DEPLOY_BYTECODE_HASH; constructor() { // Slither is mistakenly seeing the expansion of type(OwnableCreateDeploy).creationCode // as a very large number. // slither-disable-next-line too-many-digits - createDeployBytecodeHash = keccak256(type(OwnableCreateDeploy).creationCode); + CREATE_DEPLOY_BYTECODE_HASH = keccak256(type(OwnableCreateDeploy).creationCode); } /** @@ -28,7 +28,7 @@ abstract contract OwnableCreate3Address { */ function _create3Address(bytes32 deploySalt) internal view returns (address deployed) { address deployer = address( - uint160(uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, createDeployBytecodeHash)))) + uint160(uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, CREATE_DEPLOY_BYTECODE_HASH)))) ); deployed = address(uint160(uint256(keccak256(abi.encodePacked(hex"d694", deployer, hex"01"))))); diff --git a/contracts/deployer/create3/OwnableCreate3Deployer.sol b/contracts/deployer/create3/OwnableCreate3Deployer.sol index 9775a444..6886e236 100644 --- a/contracts/deployer/create3/OwnableCreate3Deployer.sol +++ b/contracts/deployer/create3/OwnableCreate3Deployer.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/errors/PaymentSplitterErrors.sol b/contracts/errors/PaymentSplitterErrors.sol index 164d7b02..2038d8e3 100644 --- a/contracts/errors/PaymentSplitterErrors.sol +++ b/contracts/errors/PaymentSplitterErrors.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 //SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/games/gems/GemGame.sol b/contracts/games/gems/GemGame.sol index b2cc9d72..60c5ac5f 100644 --- a/contracts/games/gems/GemGame.sol +++ b/contracts/games/gems/GemGame.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 // solhint-disable not-rely-on-time diff --git a/contracts/mocks/MockDisguisedEOA.sol b/contracts/mocks/MockDisguisedEOA.sol index 8c2820cd..5636e73c 100644 --- a/contracts/mocks/MockDisguisedEOA.sol +++ b/contracts/mocks/MockDisguisedEOA.sol @@ -5,10 +5,10 @@ import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; // Used in CREATE2 vector contract MockDisguisedEOA { - IERC721 public immutable tokenAddress; + IERC721 public immutable TOKEN_ADDRESS; constructor(IERC721 _tokenAddress) { - tokenAddress = _tokenAddress; + TOKEN_ADDRESS = _tokenAddress; } /// @notice This code is only for testing purposes. Do not use similar @@ -16,6 +16,6 @@ contract MockDisguisedEOA { /// @dev For details see: https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom function executeTransfer(address from, address recipient, uint256 _tokenId) external { // slither-disable-next-line arbitrary-send-erc20 - tokenAddress.transferFrom(from, recipient, _tokenId); + TOKEN_ADDRESS.transferFrom(from, recipient, _tokenId); } } diff --git a/contracts/mocks/MockEIP1271Wallet.sol b/contracts/mocks/MockEIP1271Wallet.sol index 189da50a..085168c0 100644 --- a/contracts/mocks/MockEIP1271Wallet.sol +++ b/contracts/mocks/MockEIP1271Wallet.sol @@ -6,16 +6,16 @@ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol"; import {IERC721Receiver} from "@openzeppelin/contracts/interfaces/IERC721Receiver.sol"; contract MockEIP1271Wallet is IERC1271 { - address public immutable owner; + address public immutable OWNER; constructor(address _owner) { // slither-disable-next-line missing-zero-check - owner = _owner; + OWNER = _owner; } function isValidSignature(bytes32 hash, bytes memory signature) public view override returns (bytes4) { address recoveredAddress = ECDSA.recover(hash, signature); - if (recoveredAddress == owner) { + if (recoveredAddress == OWNER) { return this.isValidSignature.selector; } else { return 0; diff --git a/contracts/mocks/MockMarketplace.sol b/contracts/mocks/MockMarketplace.sol index 0f4d2617..281b0c98 100644 --- a/contracts/mocks/MockMarketplace.sol +++ b/contracts/mocks/MockMarketplace.sol @@ -7,16 +7,16 @@ import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol"; contract MockMarketplace { error ZeroAddress(); - IERC721 public immutable tokenAddress; - IERC2981 public immutable royaltyAddress; + IERC721 public immutable TOKEN_ADDRESS; + IERC2981 public immutable ROYALTY_ADDRESS; constructor(address _tokenAddress) { - tokenAddress = IERC721(_tokenAddress); - royaltyAddress = IERC2981(_tokenAddress); + TOKEN_ADDRESS = IERC721(_tokenAddress); + ROYALTY_ADDRESS = IERC2981(_tokenAddress); } function executeTransfer(address recipient, uint256 _tokenId) public { - tokenAddress.transferFrom(msg.sender, recipient, _tokenId); + TOKEN_ADDRESS.transferFrom(msg.sender, recipient, _tokenId); } /// @notice This code is only for testing purposes. Do not use similar @@ -24,11 +24,11 @@ contract MockMarketplace { /// @dev For details see: https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom function executeTransferFrom(address from, address to, uint256 _tokenId) public { // slither-disable-next-line arbitrary-send-erc20 - tokenAddress.transferFrom(from, to, _tokenId); + TOKEN_ADDRESS.transferFrom(from, to, _tokenId); } function executeApproveForAll(address operator, bool approved) public { - tokenAddress.setApprovalForAll(operator, approved); + TOKEN_ADDRESS.setApprovalForAll(operator, approved); } /// @notice This code is only for testing purposes. Do not use similar @@ -40,7 +40,7 @@ contract MockMarketplace { } // solhint-disable-next-line custom-errors require(msg.value == price, "insufficient msg.value"); - (address receiver, uint256 royaltyAmount) = royaltyAddress.royaltyInfo(_tokenId, price); + (address receiver, uint256 royaltyAmount) = ROYALTY_ADDRESS.royaltyInfo(_tokenId, price); if (receiver == address(0)) { revert ZeroAddress(); } @@ -48,6 +48,6 @@ contract MockMarketplace { payable(receiver).transfer(royaltyAmount); payable(from).transfer(sellerAmt); // slither-disable-next-line arbitrary-send-erc20 - tokenAddress.transferFrom(from, recipient, _tokenId); + TOKEN_ADDRESS.transferFrom(from, recipient, _tokenId); } } diff --git a/contracts/mocks/MockOnReceive.sol b/contracts/mocks/MockOnReceive.sol index d563d8ca..02731b35 100644 --- a/contracts/mocks/MockOnReceive.sol +++ b/contracts/mocks/MockOnReceive.sol @@ -4,13 +4,13 @@ pragma solidity >=0.8.19 <0.8.29; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; contract MockOnReceive { - IERC721 public immutable tokenAddress; - address private immutable recipient; + IERC721 public immutable TOKEN_ADDRESS; + address private immutable RECIPIENT; // slither-disable-next-line missing-zero-check constructor(IERC721 _tokenAddress, address _recipient) { - tokenAddress = _tokenAddress; - recipient = _recipient; + TOKEN_ADDRESS = _tokenAddress; + RECIPIENT = _recipient; } // Attempt to transfer token to another address on receive @@ -20,7 +20,7 @@ contract MockOnReceive { /* from */ uint256 tokenId, bytes calldata /* data */ ) public returns (bytes4) { - tokenAddress.transferFrom(address(this), recipient, tokenId); + TOKEN_ADDRESS.transferFrom(address(this), RECIPIENT, tokenId); return this.onERC721Received.selector; } } diff --git a/contracts/multicall/GuardedMulticaller.sol b/contracts/multicall/GuardedMulticaller.sol deleted file mode 100644 index 95948894..00000000 --- a/contracts/multicall/GuardedMulticaller.sol +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.19 <0.8.29; - -// Signature Validation -import {SignatureChecker} from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol"; - -// Access Control -import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; - -// Reentrancy Guard -import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; - -// EIP-712 Typed Structs -import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; - -/** - * - * @title GuardedMulticaller contract - * @author Immutable Game Studio - * @notice This contract is used to batch calls to other contracts. - * @dev This contract is not designed to be upgradeable. If an issue is found with this contract, - * a new version will be deployed. All approvals granted to this contract will be revoked before - * a new version is deployed. Approvals will be granted to the new contract. - */ -contract GuardedMulticaller is AccessControl, ReentrancyGuard, EIP712 { - /// @dev Mapping of address to function selector to permitted status - // solhint-disable-next-line named-parameters-mapping - mapping(address => mapping(bytes4 => bool)) private permittedFunctionSelectors; - - /// @dev Mapping of reference to executed status - // solhint-disable-next-line named-parameters-mapping - mapping(bytes32 => bool) private replayProtection; - - /// @dev Only those with MULTICALL_SIGNER_ROLE can generate valid signatures for execute function. - bytes32 public constant MULTICALL_SIGNER_ROLE = bytes32("MULTICALL_SIGNER_ROLE"); - - /// @dev EIP712 typehash for execute function - bytes32 internal constant MULTICALL_TYPEHASH = - keccak256("Multicall(bytes32 ref,address[] targets,bytes[] data,uint256 deadline)"); - - /// @dev Struct for function permit - struct FunctionPermit { - address target; - bytes4 functionSelector; - bool permitted; - } - - /// @dev Event emitted when execute function is called - event Multicalled( - address indexed _multicallSigner, - bytes32 indexed _reference, - address[] _targets, - bytes[] _data, - uint256 _deadline - ); - - /// @dev Event emitted when a function permit is updated - event FunctionPermitted(address indexed _target, bytes4 _functionSelector, bool _permitted); - - /// @dev Error thrown when reference is invalid - error InvalidReference(bytes32 _reference); - - /// @dev Error thrown when reference has already been executed - error ReusedReference(bytes32 _reference); - - /// @dev Error thrown when address array is empty - error EmptyAddressArray(); - - /// @dev Error thrown when address array is empty - error EmptyFunctionPermitArray(); - - /// @dev Error thrown when address array and data array have different lengths - error AddressDataArrayLengthsMismatch(uint256 _addressLength, uint256 _dataLength); - - /// @dev Error thrown when deadline is expired - error Expired(uint256 _deadline); - - /// @dev Error thrown when target address is not a contract - error NonContractAddress(address _target); - - /// @dev Error thrown when signer is not authorized - error UnauthorizedSigner(address _multicallSigner); - - /// @dev Error thrown when signature is invalid - error UnauthorizedSignature(bytes _signature); - - /// @dev Error thrown when call reverts - error FailedCall(address _target, bytes _data); - - /// @dev Error thrown when call data is invalid - error InvalidCallData(address _target, bytes _data); - - /// @dev Error thrown when call data is unauthorized - error UnauthorizedFunction(address _target, bytes _data); - - /** - * - * @notice Grants DEFAULT_ADMIN_ROLE to the contract creator - * @param _owner Owner of the contract - * @param _name Name of the contract - * @param _version Version of the contract - */ - // solhint-disable-next-line no-unused-vars - constructor(address _owner, string memory _name, string memory _version) EIP712(_name, _version) { - _grantRole(DEFAULT_ADMIN_ROLE, _owner); - } - - /** - * @notice Check if a function selector is permitted. - * - * @param _target Contract address - * @param _functionSelector Function selector - */ - function isFunctionPermitted(address _target, bytes4 _functionSelector) public view returns (bool) { - return permittedFunctionSelectors[_target][_functionSelector]; - } - - /** - * - * @dev Returns hash of array of bytes - * - * @param _data Array of bytes - */ - function hashBytesArray(bytes[] memory _data) public pure returns (bytes32) { - bytes32[] memory hashedBytesArr = new bytes32[](_data.length); - for (uint256 i = 0; i < _data.length; i++) { - hashedBytesArr[i] = keccak256(_data[i]); - } - return keccak256(abi.encodePacked(hashedBytesArr)); - } - - /** - * - * @notice Execute a list of calls. Returned data from calls are ignored. - * The signature must be generated by an address with EXECUTION_MULTICALL_SIGNER_ROLE - * The signature must be valid - * The signature must not be expired - * The reference must be unique - * The reference must not be executed before - * The list of calls must not be empty - * The list of calls is executed in order - * - * @param _multicallSigner Address of an approved signer - * @param _reference Reference - * @param _targets List of addresses to call - * @param _data List of call data - * @param _deadline Expiration timestamp - * @param _signature Signature of the multicall signer - */ - // slither-disable-start low-level-calls,cyclomatic-complexity - // solhint-disable-next-line code-complexity - function execute( - address _multicallSigner, - bytes32 _reference, - address[] calldata _targets, - bytes[] calldata _data, - uint256 _deadline, - bytes calldata _signature - ) external nonReentrant { - // solhint-disable-next-line not-rely-on-time - if (_deadline < block.timestamp) { - revert Expired(_deadline); - } - if (_reference == 0) { - revert InvalidReference(_reference); - } - if (replayProtection[_reference]) { - revert ReusedReference(_reference); - } - if (_targets.length == 0) { - revert EmptyAddressArray(); - } - if (_targets.length != _data.length) { - revert AddressDataArrayLengthsMismatch(_targets.length, _data.length); - } - for (uint256 i = 0; i < _targets.length; i++) { - if (_data[i].length < 4) { - revert InvalidCallData(_targets[i], _data[i]); - } - bytes4 functionSelector = bytes4(_data[i][:4]); - if (!permittedFunctionSelectors[_targets[i]][functionSelector]) { - revert UnauthorizedFunction(_targets[i], _data[i]); - } - if (_targets[i].code.length == 0) { - revert NonContractAddress(_targets[i]); - } - } - if (!hasRole(MULTICALL_SIGNER_ROLE, _multicallSigner)) { - revert UnauthorizedSigner(_multicallSigner); - } - - // Signature validation - if ( - !SignatureChecker.isValidSignatureNow( - _multicallSigner, - _hashTypedData(_reference, _targets, _data, _deadline), - _signature - ) - ) { - revert UnauthorizedSignature(_signature); - } - - replayProtection[_reference] = true; - - // Multicall - for (uint256 i = 0; i < _targets.length; i++) { - // solhint-disable avoid-low-level-calls - // slither-disable-next-line calls-loop - (bool success, bytes memory returnData) = _targets[i].call(_data[i]); - if (!success) { - if (returnData.length == 0) { - revert FailedCall(_targets[i], _data[i]); - } - // solhint-disable-next-line no-inline-assembly - assembly { - revert(add(returnData, 32), mload(returnData)) - } - } - } - - emit Multicalled(_multicallSigner, _reference, _targets, _data, _deadline); - } - // slither-disable-end low-level-calls,cyclomatic-complexity - - /** - * @notice Update function permits for a list of function selectors on target contracts. Only DEFAULT_ADMIN_ROLE can call this function. - * - * @param _functionPermits List of function permits - */ - function setFunctionPermits(FunctionPermit[] calldata _functionPermits) external onlyRole(DEFAULT_ADMIN_ROLE) { - if (_functionPermits.length == 0) { - revert EmptyFunctionPermitArray(); - } - for (uint256 i = 0; i < _functionPermits.length; i++) { - if (_functionPermits[i].target.code.length == 0) { - revert NonContractAddress(_functionPermits[i].target); - } - permittedFunctionSelectors[_functionPermits[i].target][ - _functionPermits[i].functionSelector - ] = _functionPermits[i].permitted; - emit FunctionPermitted( - _functionPermits[i].target, - _functionPermits[i].functionSelector, - _functionPermits[i].permitted - ); - } - } - - /** - * @notice Grants MULTICALL_SIGNER_ROLE to a user. Only DEFAULT_ADMIN_ROLE can call this function. - * - * @param _user User to grant MULTICALL_SIGNER_ROLE to - */ - function grantMulticallSignerRole(address _user) external onlyRole(DEFAULT_ADMIN_ROLE) { - grantRole(MULTICALL_SIGNER_ROLE, _user); - } - - /** - * @notice Revokes MULTICALL_SIGNER_ROLE for a user. Only DEFAULT_ADMIN_ROLE can call this function. - * - * @param _user User to grant MULTICALL_SIGNER_ROLE to - */ - function revokeMulticallSignerRole(address _user) external onlyRole(DEFAULT_ADMIN_ROLE) { - revokeRole(MULTICALL_SIGNER_ROLE, _user); - } - - /** - * @notice Gets whether the reference has been executed before. - * - * @param _reference Reference to check - */ - function hasBeenExecuted(bytes32 _reference) external view returns (bool) { - return replayProtection[_reference]; - } - - /** - * - * @dev Returns EIP712 message hash for given parameters - * - * @param _reference Reference - * @param _targets List of addresses to call - * @param _data List of call data - * @param _deadline Expiration timestamp - */ - function _hashTypedData( - bytes32 _reference, - address[] calldata _targets, - bytes[] calldata _data, - uint256 _deadline - ) internal view returns (bytes32) { - return - _hashTypedDataV4( - keccak256( - abi.encode( - MULTICALL_TYPEHASH, - _reference, - keccak256(abi.encodePacked(_targets)), - hashBytesArray(_data), - _deadline - ) - ) - ); - } -} diff --git a/contracts/multicall/GuardedMulticaller2.sol b/contracts/multicall/GuardedMulticaller2.sol index 1637abc9..d55c6d5f 100644 --- a/contracts/multicall/GuardedMulticaller2.sol +++ b/contracts/multicall/GuardedMulticaller2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; @@ -35,6 +35,7 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { mapping(bytes32 ref => bool executed) private replayProtection; /// @dev Only those with MULTICALL_SIGNER_ROLE can generate valid signatures for execute function. + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant MULTICALL_SIGNER_ROLE = bytes32("MULTICALL_SIGNER_ROLE"); /// @dev EIP712 typehash for call diff --git a/contracts/payment-splitter/PaymentSplitter.sol b/contracts/payment-splitter/PaymentSplitter.sol index b322f03a..d2aaf1dc 100644 --- a/contracts/payment-splitter/PaymentSplitter.sol +++ b/contracts/payment-splitter/PaymentSplitter.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -29,9 +29,11 @@ contract PaymentSplitter is AccessControlEnumerable, IPaymentSplitterErrors, Ree event PaymentReceived(address from, uint256 amount); /// @notice Role responsible for releasing funds + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant RELEASE_FUNDS_ROLE = bytes32("RELEASE_FUNDS_ROLE"); /// @notice Role responsible for registering tokens + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant TOKEN_REGISTRAR_ROLE = bytes32("TOKEN_REGISTRAR_ROLE"); /// @notice the totalshares held by payees diff --git a/contracts/staking/IStakeHolder.sol b/contracts/staking/IStakeHolder.sol index 88aad636..01cf8446 100644 --- a/contracts/staking/IStakeHolder.sol +++ b/contracts/staking/IStakeHolder.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/IStakeHolderV2.sol b/contracts/staking/IStakeHolderV2.sol index 2254375e..f982ac98 100644 --- a/contracts/staking/IStakeHolderV2.sol +++ b/contracts/staking/IStakeHolderV2.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/IWIMX.sol b/contracts/staking/IWIMX.sol index f7302bcc..2759b7ab 100644 --- a/contracts/staking/IWIMX.sol +++ b/contracts/staking/IWIMX.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/StakeHolderBase.sol b/contracts/staking/StakeHolderBase.sol index 0a434ac0..b2af5f04 100644 --- a/contracts/staking/StakeHolderBase.sol +++ b/contracts/staking/StakeHolderBase.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; @@ -18,9 +18,11 @@ abstract contract StakeHolderBase is ReentrancyGuardUpgradeable { /// @notice Only UPGRADE_ROLE can upgrade the contract + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant UPGRADE_ROLE = bytes32("UPGRADE_ROLE"); /// @notice Only DISTRIBUTE_ROLE can call the distribute function + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant DISTRIBUTE_ROLE = bytes32("DISTRIBUTE_ROLE"); /// @notice Version 0 version number diff --git a/contracts/staking/StakeHolderBaseV2.sol b/contracts/staking/StakeHolderBaseV2.sol index cdd274a4..1c800d52 100644 --- a/contracts/staking/StakeHolderBaseV2.sol +++ b/contracts/staking/StakeHolderBaseV2.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/StakeHolderERC20.sol b/contracts/staking/StakeHolderERC20.sol index 7329df0e..3b1128c2 100644 --- a/contracts/staking/StakeHolderERC20.sol +++ b/contracts/staking/StakeHolderERC20.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/StakeHolderERC20V2.sol b/contracts/staking/StakeHolderERC20V2.sol index fd8e3b97..62f4b30a 100644 --- a/contracts/staking/StakeHolderERC20V2.sol +++ b/contracts/staking/StakeHolderERC20V2.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/StakeHolderNative.sol b/contracts/staking/StakeHolderNative.sol index 55fee4c1..a01cd3d8 100644 --- a/contracts/staking/StakeHolderNative.sol +++ b/contracts/staking/StakeHolderNative.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/StakeHolderNativeV2.sol b/contracts/staking/StakeHolderNativeV2.sol index 72f8b9bc..0fd72621 100644 --- a/contracts/staking/StakeHolderNativeV2.sol +++ b/contracts/staking/StakeHolderNativeV2.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/StakeHolderWIMX.sol b/contracts/staking/StakeHolderWIMX.sol index 25396ecc..b37188ff 100644 --- a/contracts/staking/StakeHolderWIMX.sol +++ b/contracts/staking/StakeHolderWIMX.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/staking/StakeHolderWIMXV2.sol b/contracts/staking/StakeHolderWIMXV2.sol index 4edf70df..679f1355 100644 --- a/contracts/staking/StakeHolderWIMXV2.sol +++ b/contracts/staking/StakeHolderWIMXV2.sol @@ -1,8 +1,8 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; -import {IStakeHolder, StakeHolderBase, StakeHolderBaseV2, StakeHolderNativeV2} from "./StakeHolderNativeV2.sol"; +import {IStakeHolder, StakeHolderBase, StakeHolderNativeV2} from "./StakeHolderNativeV2.sol"; import {IWIMX} from "./IWIMX.sol"; /** diff --git a/contracts/staking/WIMX.sol b/contracts/staking/WIMX.sol index c41e22f9..da2b0382 100644 --- a/contracts/staking/WIMX.sol +++ b/contracts/staking/WIMX.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc1155/abstract/ERC1155Permit.sol b/contracts/token/erc1155/abstract/ERC1155Permit.sol index 6c55e733..4e51edb9 100644 --- a/contracts/token/erc1155/abstract/ERC1155Permit.sol +++ b/contracts/token/erc1155/abstract/ERC1155Permit.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol b/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol index 971a4c4a..b0d8183e 100644 --- a/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol +++ b/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc1155/preset/ImmutableERC1155.sol b/contracts/token/erc1155/preset/ImmutableERC1155.sol index 5ab8a257..3c2b7587 100644 --- a/contracts/token/erc1155/preset/ImmutableERC1155.sol +++ b/contracts/token/erc1155/preset/ImmutableERC1155.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol b/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol index 3ba3ddb8..85085eb0 100644 --- a/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol +++ b/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol b/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol index 692908b5..cfa908a1 100644 --- a/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol +++ b/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; @@ -19,6 +19,7 @@ import {IImmutableERC20Errors} from "./Errors.sol"; */ contract ImmutableERC20MinterBurnerPermit is ERC20Capped, ERC20Burnable, ERC20Permit, MintingAccessControl { /// @notice Role to mint tokens + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant HUB_OWNER_ROLE = bytes32("HUB_OWNER_ROLE"); /** diff --git a/contracts/token/erc721/abstract/ERC721Hybrid.sol b/contracts/token/erc721/abstract/ERC721Hybrid.sol index dd184b57..d1d899af 100644 --- a/contracts/token/erc721/abstract/ERC721Hybrid.sol +++ b/contracts/token/erc721/abstract/ERC721Hybrid.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -8,6 +8,8 @@ import {ERC721Psi, ERC721PsiBurnable} from "../erc721psi/ERC721PsiBurnable.sol"; // Errors import {IImmutableERC721Errors} from "../../../errors/Errors.sol"; +// forge-lint: disable-start(pascal-case-struct) + /* This contract allows for minting with one of two strategies: - ERC721: minting with specified tokenIDs (inefficient) diff --git a/contracts/token/erc721/abstract/ERC721HybridPermit.sol b/contracts/token/erc721/abstract/ERC721HybridPermit.sol index 0dfecadd..6b4f79d2 100644 --- a/contracts/token/erc721/abstract/ERC721HybridPermit.sol +++ b/contracts/token/erc721/abstract/ERC721HybridPermit.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol b/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol index d4ec2461..5b233728 100644 --- a/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol +++ b/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/abstract/ERC721HybridV2.sol b/contracts/token/erc721/abstract/ERC721HybridV2.sol index e7ad3b41..63680d3b 100644 --- a/contracts/token/erc721/abstract/ERC721HybridV2.sol +++ b/contracts/token/erc721/abstract/ERC721HybridV2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/abstract/ERC721Permit.sol b/contracts/token/erc721/abstract/ERC721Permit.sol index a70dc823..a31ac760 100644 --- a/contracts/token/erc721/abstract/ERC721Permit.sol +++ b/contracts/token/erc721/abstract/ERC721Permit.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/abstract/IERC4494.sol b/contracts/token/erc721/abstract/IERC4494.sol index cbe8751f..fdc6378c 100644 --- a/contracts/token/erc721/abstract/IERC4494.sol +++ b/contracts/token/erc721/abstract/IERC4494.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/abstract/ImmutableERC721Base.sol b/contracts/token/erc721/abstract/ImmutableERC721Base.sol index 7885156d..84c06e4c 100644 --- a/contracts/token/erc721/abstract/ImmutableERC721Base.sol +++ b/contracts/token/erc721/abstract/ImmutableERC721Base.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -13,6 +13,8 @@ import {OperatorAllowlistEnforced} from "../../../allowlist/OperatorAllowlistEnf import {BitMaps} from "@openzeppelin/contracts/utils/structs/BitMaps.sol"; import {AccessControlEnumerable, MintingAccessControl} from "../../../access/MintingAccessControl.sol"; +// forge-lint: disable-start(pascal-case-struct) + /* ImmutableERC721Base is an abstract contract that offers minimum preset functionality without an opinionated form of minting. This contract is intended to be inherited and implement its diff --git a/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol b/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol index 3d2ddc23..1643a623 100644 --- a/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol +++ b/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol b/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol index 82e8fe7e..fb08e294 100644 --- a/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol +++ b/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -74,6 +74,7 @@ abstract contract ImmutableERC721HybridBaseV2 is * @notice sets the contract uri for the collection. Permissioned to only the admin role * @param _contractURI the new baseURI to set */ + // solhint-disable-next-line mixed-case-function function setContractURI(string memory _contractURI) public onlyRole(DEFAULT_ADMIN_ROLE) { contractURI = _contractURI; } diff --git a/contracts/token/erc721/erc721psi/ERC721Psi.sol b/contracts/token/erc721/erc721psi/ERC721Psi.sol index a3bff80e..7bc50201 100644 --- a/contracts/token/erc721/erc721psi/ERC721Psi.sol +++ b/contracts/token/erc721/erc721psi/ERC721Psi.sol @@ -10,7 +10,7 @@ * - github: https://github.com/estarriolvetch/ERC721Psi * - npm: https://www.npmjs.com/package/erc721psi */ -// solhint-disable +// forge-lint: disable-start(all) pragma solidity >=0.8.19 <0.8.29; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; @@ -199,7 +199,6 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { - //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Psi: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); @@ -452,7 +451,6 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ - // solhint-disable-next-line no-empty-blocks function _beforeTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal virtual {} /** @@ -467,6 +465,5 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ - // solhint-disable-next-line no-empty-blocks function _afterTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal virtual {} } diff --git a/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol b/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol index 029dada6..1804ab33 100644 --- a/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol +++ b/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 /** * Inspired by ERC721Psi: https://github.com/estarriolvetch/ERC721Psi diff --git a/contracts/token/erc721/erc721psi/ERC721PsiV2.sol b/contracts/token/erc721/erc721psi/ERC721PsiV2.sol index 953f026d..e81a26aa 100644 --- a/contracts/token/erc721/erc721psi/ERC721PsiV2.sol +++ b/contracts/token/erc721/erc721psi/ERC721PsiV2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 /** * Inspired by ERC721Psi: https://github.com/estarriolvetch/ERC721Psi @@ -13,7 +13,6 @@ import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {IERC165, ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; -// solhint-disable custom-errors, reason-string abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; @@ -127,7 +126,6 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { * @dev See {IERC721-transferFrom}. */ function transferFrom(address _from, address _to, uint256 _tokenId) public virtual override { - //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), _tokenId), "ERC721Psi: transfer caller is not owner nor approved"); _transfer(_from, _to, _tokenId); } @@ -281,7 +279,6 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. - // solhint-disable-next-line no-inline-assembly assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(_to, _BITMASK_ADDRESS) @@ -459,11 +456,13 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { } function _bitIsSet(uint256 _bitMask, uint256 _offset) internal pure returns (bool) { + /// forge-lint: disable-next-line(incorrect-shift) uint256 bitSet = 1 << _offset; return (bitSet & _bitMask != 0); } function _setBit(uint256 _bitMask, uint256 _offset) internal pure returns (uint256) { + /// forge-lint: disable-next-line(incorrect-shift) uint256 bitSet = 1 << _offset; uint256 updatedBitMask = bitSet | _bitMask; return updatedBitMask; @@ -474,6 +473,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { // If offset = 1, mask should be 0xffff...ffe // If offset = 2, mask should be 0xffff...ffc // If offset = 3, mask should be 0xffff...ff8 + /// forge-lint: disable-next-line(incorrect-shift) uint256 inverseBitMask = (1 << _offset) - 1; return ~inverseBitMask; } @@ -490,7 +490,6 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ - // solhint-disable-next-line no-empty-blocks function _beforeTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal virtual {} /** @@ -505,6 +504,5 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ - // solhint-disable-next-line no-empty-blocks function _afterTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal virtual {} } diff --git a/contracts/token/erc721/interfaces/IImmutableERC721.sol b/contracts/token/erc721/interfaces/IImmutableERC721.sol index 289f3de0..c415db91 100644 --- a/contracts/token/erc721/interfaces/IImmutableERC721.sol +++ b/contracts/token/erc721/interfaces/IImmutableERC721.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol b/contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol index 3cc769d4..a2f9b7f3 100644 --- a/contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol +++ b/contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/interfaces/IImmutableERC721ByQuantityV2.sol b/contracts/token/erc721/interfaces/IImmutableERC721ByQuantityV2.sol index c2fb57b1..be13004e 100644 --- a/contracts/token/erc721/interfaces/IImmutableERC721ByQuantityV2.sol +++ b/contracts/token/erc721/interfaces/IImmutableERC721ByQuantityV2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/interfaces/IImmutableERC721Errors.sol b/contracts/token/erc721/interfaces/IImmutableERC721Errors.sol index 47f08aaa..9301b659 100644 --- a/contracts/token/erc721/interfaces/IImmutableERC721Errors.sol +++ b/contracts/token/erc721/interfaces/IImmutableERC721Errors.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol b/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol index e9867ac1..fe6c6e53 100644 --- a/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol +++ b/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol @@ -1,7 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; +// forge-lint: disable-start(pascal-case-struct) + interface IImmutableERC721Structs { /** * @notice A singular batch transfer request. The length of the tos and tokenIds must be matching diff --git a/contracts/token/erc721/preset/ImmutableERC721.sol b/contracts/token/erc721/preset/ImmutableERC721.sol index f8107c6a..4f170ab0 100644 --- a/contracts/token/erc721/preset/ImmutableERC721.sol +++ b/contracts/token/erc721/preset/ImmutableERC721.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/preset/ImmutableERC721MintByID.sol b/contracts/token/erc721/preset/ImmutableERC721MintByID.sol index 29040872..08a79408 100644 --- a/contracts/token/erc721/preset/ImmutableERC721MintByID.sol +++ b/contracts/token/erc721/preset/ImmutableERC721MintByID.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/token/erc721/preset/ImmutableERC721V2.sol b/contracts/token/erc721/preset/ImmutableERC721V2.sol index 17d00d2c..9d4dd9b3 100644 --- a/contracts/token/erc721/preset/ImmutableERC721V2.sol +++ b/contracts/token/erc721/preset/ImmutableERC721V2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/trading/seaport/ImmutableSeaport.sol b/contracts/trading/seaport/ImmutableSeaport.sol index 549bea35..acca5b85 100644 --- a/contracts/trading/seaport/ImmutableSeaport.sol +++ b/contracts/trading/seaport/ImmutableSeaport.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version pragma solidity ^0.8.17; diff --git a/contracts/trading/seaport/conduit/ConduitController.sol b/contracts/trading/seaport/conduit/ConduitController.sol index de3aedb9..46ea8426 100644 --- a/contracts/trading/seaport/conduit/ConduitController.sol +++ b/contracts/trading/seaport/conduit/ConduitController.sol @@ -2,4 +2,5 @@ // solhint-disable pragma solidity ^0.8.14; +// forge-lint: disable-next-line(unused-import) import {ConduitController} from "seaport-core/src/conduit/ConduitController.sol"; diff --git a/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol b/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol index c3896fea..26a353a3 100644 --- a/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol +++ b/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version pragma solidity ^0.8.17; diff --git a/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol b/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol index bfe332b3..fce83a79 100644 --- a/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol +++ b/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.17; +// forge-lint: disable-next-line(unused-import) import {ReadOnlyOrderValidator} from "seaport/contracts/helpers/order-validator/lib/ReadOnlyOrderValidator.sol"; diff --git a/contracts/trading/seaport/validators/SeaportValidator.sol b/contracts/trading/seaport/validators/SeaportValidator.sol index 772502fe..db4d3758 100644 --- a/contracts/trading/seaport/validators/SeaportValidator.sol +++ b/contracts/trading/seaport/validators/SeaportValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.17; +// forge-lint: disable-next-line(unused-import) import {SeaportValidator} from "seaport/contracts/helpers/order-validator/SeaportValidator.sol"; diff --git a/contracts/trading/seaport/validators/SeaportValidatorHelper.sol b/contracts/trading/seaport/validators/SeaportValidatorHelper.sol index e7a001f3..b0f7b7aa 100644 --- a/contracts/trading/seaport/validators/SeaportValidatorHelper.sol +++ b/contracts/trading/seaport/validators/SeaportValidatorHelper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.17; +// forge-lint: disable-next-line(unused-import) import {SeaportValidatorHelper} from "seaport/contracts/helpers/order-validator/lib/SeaportValidatorHelper.sol"; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol index 08d1ed17..04dd42e7 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // slither-disable-start missing-inheritance @@ -164,7 +164,7 @@ contract ImmutableSignedZone is } // Set the signer info. - _signers[signer] = SignerInfo(true, true); + _signers[signer] = SignerInfo(active: true, previouslyActive: true); // Emit an event that the signer was added. emit SignerAdded(signer); diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol index 67b60f55..3095ddbc 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version pragma solidity ^0.8.17; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol index ba2ea889..8678cc72 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version pragma solidity ^0.8.17; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol index 292e703f..b3cbf181 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version pragma solidity ^0.8.17; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol index 8c04becd..85065b8e 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version pragma solidity ^0.8.17; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol index 29631173..42cc8546 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version @@ -148,7 +148,7 @@ contract ImmutableSignedZoneV2 is } // Set the signer info. - _signers[signer] = SignerInfo(true, true); + _signers[signer] = SignerInfo(active: true, previouslyActive: true); // Emit an event that the signer was added. emit SignerAdded(signer); diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol index 4b045746..2a121335 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol @@ -1,7 +1,6 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable-next-line compiler-version pragma solidity 0.8.20; import {AccessControl} from "openzeppelin-contracts-5.0.2/access/AccessControl.sol"; @@ -14,6 +13,7 @@ import {ZoneAccessControlEventsAndErrors} from "../../../../../../contracts/trad */ abstract contract ZoneAccessControl is AccessControlEnumerable, ZoneAccessControlEventsAndErrors { /// @dev Zone manager manages the zone. + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant ZONE_MANAGER_ROLE = bytes32("ZONE_MANAGER"); /** diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol index 21bbf159..fc9943be 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol index 38c80558..47fe9fbb 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol index b9e517cf..10760f96 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol index 3739500c..b71302f3 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol index df579b25..48c8e065 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol index a8d4d1e7..fc362fa4 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol index cf86ab3b..b6ea6b01 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport16/ImmutableSeaport.sol b/contracts/trading/seaport16/ImmutableSeaport.sol index a206f547..86c1623f 100644 --- a/contracts/trading/seaport16/ImmutableSeaport.sol +++ b/contracts/trading/seaport16/ImmutableSeaport.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version pragma solidity ^0.8.24; diff --git a/contracts/trading/seaport16/conduit/ConduitController.sol b/contracts/trading/seaport16/conduit/ConduitController.sol index 5cd920aa..a3b0eaac 100644 --- a/contracts/trading/seaport16/conduit/ConduitController.sol +++ b/contracts/trading/seaport16/conduit/ConduitController.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.17; +// forge-lint: disable-next-line(unused-import) import {ConduitController} from "seaport-core-16/src/conduit/ConduitController.sol"; diff --git a/contracts/trading/seaport16/interfaces/ImmutableSeaportEvents.sol b/contracts/trading/seaport16/interfaces/ImmutableSeaportEvents.sol index c3896fea..9b67db9a 100644 --- a/contracts/trading/seaport16/interfaces/ImmutableSeaportEvents.sol +++ b/contracts/trading/seaport16/interfaces/ImmutableSeaportEvents.sol @@ -1,6 +1,5 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol b/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol index 74de5531..bb805019 100644 --- a/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol +++ b/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.17; +// forge-lint: disable-next-line(unused-import) import {ReadOnlyOrderValidator} from "seaport-16/contracts/helpers/order-validator/lib/ReadOnlyOrderValidator.sol"; diff --git a/contracts/trading/seaport16/validators/SeaportValidator.sol b/contracts/trading/seaport16/validators/SeaportValidator.sol index 196db81b..54336555 100644 --- a/contracts/trading/seaport16/validators/SeaportValidator.sol +++ b/contracts/trading/seaport16/validators/SeaportValidator.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.17; +// forge-lint: disable-next-line(unused-import) import {SeaportValidator} from "seaport-16/contracts/helpers/order-validator/SeaportValidator.sol"; diff --git a/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol b/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol index 8f565398..ef804595 100644 --- a/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol +++ b/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.17; +// forge-lint: disable-next-line(unused-import) import {SeaportValidatorHelper} from "seaport-16/contracts/helpers/order-validator/lib/SeaportValidatorHelper.sol"; diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol index 5b5107ed..c169164f 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version @@ -170,7 +170,7 @@ contract ImmutableSignedZoneV3 is } // Set the signer info. - _signers[signer] = SignerInfo(true, true); + _signers[signer] = SignerInfo(active: true, previouslyActive: true); // Emit an event that the signer was added. emit SignerAdded(signer); diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol index bf36af88..fbf13879 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version @@ -14,6 +14,7 @@ import {ZoneAccessControlEventsAndErrors} from "./interfaces/ZoneAccessControlEv */ abstract contract ZoneAccessControl is AccessControlEnumerable, ZoneAccessControlEventsAndErrors { /// @dev Zone manager manages the zone. + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant ZONE_MANAGER_ROLE = bytes32("ZONE_MANAGER"); /** diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol index 21bbf159..fc9943be 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol index 3f2af4a7..b2aa426e 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol index b9e517cf..10760f96 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol index 3739500c..b71302f3 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol index 4a6bade5..bdb4340b 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol index a8d4d1e7..fc362fa4 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol index cf86ab3b..b6ea6b01 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable compiler-version diff --git a/foundry.toml b/foundry.toml index 8e6b1d92..cbeb5e24 100644 --- a/foundry.toml +++ b/foundry.toml @@ -5,5 +5,8 @@ out = 'foundry-out' libs = ["lib"] fs_permissions = [{ access = "read", path = "./foundry-out" }] +[lint] +exclude_lints = ["mixed-case-function","mixed-case-variable","asm-keccak256"] + # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/perfTest/token/erc721/ERC721ByQuantityPerf.t.sol b/perfTest/token/erc721/ERC721ByQuantityPerf.t.sol index f5ab7dc6..c0e7a630 100644 --- a/perfTest/token/erc721/ERC721ByQuantityPerf.t.sol +++ b/perfTest/token/erc721/ERC721ByQuantityPerf.t.sol @@ -1,9 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ERC721PerfTest} from "./ERC721Perf.t.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; import {IImmutableERC721Structs} from "../../../contracts/token/erc721/interfaces/IImmutableERC721Structs.sol"; diff --git a/perfTest/token/erc721/ERC721Perf.t.sol b/perfTest/token/erc721/ERC721Perf.t.sol index 47fc059a..36c4e826 100644 --- a/perfTest/token/erc721/ERC721Perf.t.sol +++ b/perfTest/token/erc721/ERC721Perf.t.sol @@ -1,9 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ERC721BaseTest} from "../../../test/token/erc721/ERC721Base.t.sol"; import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {IImmutableERC721Structs} from "../../../contracts/token/erc721/interfaces/IImmutableERC721Structs.sol"; diff --git a/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol b/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol index 0ebdcce0..db88eb66 100644 --- a/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol +++ b/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol @@ -1,9 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ERC721PerfTest} from "./ERC721Perf.t.sol"; import {ImmutableERC721} from "../../../contracts/token/erc721/preset/ImmutableERC721.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; diff --git a/perfTest/token/erc721/ImmutableERC721ByIdPerfPrefill.t.sol b/perfTest/token/erc721/ImmutableERC721ByIdPerfPrefill.t.sol index 0ecf8760..a32ba41b 100644 --- a/perfTest/token/erc721/ImmutableERC721ByIdPerfPrefill.t.sol +++ b/perfTest/token/erc721/ImmutableERC721ByIdPerfPrefill.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol b/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol index f808aa57..6c55dc36 100644 --- a/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol +++ b/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol @@ -1,9 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ERC721ByQuantityPerfTest} from "./ERC721ByQuantityPerf.t.sol"; import {ImmutableERC721} from "../../../contracts/token/erc721/preset/ImmutableERC721.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; diff --git a/perfTest/token/erc721/ImmutableERC721ByQuantityPerfPrefill.t.sol b/perfTest/token/erc721/ImmutableERC721ByQuantityPerfPrefill.t.sol index c287e9b7..2596a006 100644 --- a/perfTest/token/erc721/ImmutableERC721ByQuantityPerfPrefill.t.sol +++ b/perfTest/token/erc721/ImmutableERC721ByQuantityPerfPrefill.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol b/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol index 38af3611..3bee17b5 100644 --- a/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol +++ b/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol @@ -1,9 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ERC721ByQuantityPerfTest} from "./ERC721ByQuantityPerf.t.sol"; import {ImmutableERC721V2} from "../../../contracts/token/erc721/preset/ImmutableERC721V2.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; diff --git a/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerfPrefill.t.sol b/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerfPrefill.t.sol index 06524654..92c7f59c 100644 --- a/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerfPrefill.t.sol +++ b/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerfPrefill.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/script/bridge/x/v4/DeployRegistrationV4.s.sol b/script/bridge/x/v4/DeployRegistrationV4.s.sol index a6ee606d..a610bd83 100644 --- a/script/bridge/x/v4/DeployRegistrationV4.s.sol +++ b/script/bridge/x/v4/DeployRegistrationV4.s.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; diff --git a/script/bridge/x/v4/DeployRegistrationV4Dev.s.sol b/script/bridge/x/v4/DeployRegistrationV4Dev.s.sol index 60d8c0db..99304201 100644 --- a/script/bridge/x/v4/DeployRegistrationV4Dev.s.sol +++ b/script/bridge/x/v4/DeployRegistrationV4Dev.s.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; diff --git a/script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol b/script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol index 1f62af31..679bb760 100644 --- a/script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol +++ b/script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; diff --git a/script/games/gems/DeployGemGame.sol b/script/games/gems/DeployGemGame.sol index bade8ce6..49cbba3a 100644 --- a/script/games/gems/DeployGemGame.sol +++ b/script/games/gems/DeployGemGame.sol @@ -1,9 +1,9 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.20; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {GemGame} from "../../../contracts/games/gems/GemGame.sol"; /** @@ -41,6 +41,7 @@ contract DeployGemGame is Test { function testDeploy() external { /// @dev Fork the Immutable zkEVM testnet for this test + // @solhint-disable-next-line variable-name-mixedcase string memory rpcURL = "https://rpc.testnet.immutable.com"; vm.createSelectFork(rpcURL); diff --git a/script/staking/ChangeDistributor.t.sol b/script/staking/ChangeDistributor.t.sol index 300ad830..fafa8d07 100644 --- a/script/staking/ChangeDistributor.t.sol +++ b/script/staking/ChangeDistributor.t.sol @@ -1,19 +1,12 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.20; -import "forge-std/Test.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; +import {Test} from "forge-std/Test.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; -import {IERC20} from "openzeppelin-contracts-4.9.3/token/ERC20/IERC20.sol"; -import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; import {IAccessControlUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/access/IAccessControlUpgradeable.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; -import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; -import {StakeHolderWIMXV2} from "../../contracts/staking/StakeHolderWIMXV2.sol"; -import {WIMX} from "../../contracts/staking/WIMX.sol"; -import {OwnableCreate3Deployer} from "../../contracts/deployer/create3/OwnableCreate3Deployer.sol"; /** diff --git a/script/staking/StakeHolderScriptERC20.t.sol b/script/staking/StakeHolderScriptERC20.t.sol index 0f1df6d2..9ba19dda 100644 --- a/script/staking/StakeHolderScriptERC20.t.sol +++ b/script/staking/StakeHolderScriptERC20.t.sol @@ -1,8 +1,9 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.20; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; import {ERC20PresetFixedSupply} from "openzeppelin-contracts-4.9.3/token/ERC20/presets/ERC20PresetFixedSupply.sol"; @@ -385,8 +386,9 @@ contract StakeHolderScriptERC20 is Test { address user1 = makeAddr("user1"); vm.startBroadcast(_bank); - erc20.transfer(user1, 100 ether); + bool success = erc20.transfer(user1, 100 ether); vm.stopBroadcast(); + require(success, "ERC20 transfer unexpectedly failed"); _stake(_stakeHolder, user1, 10 ether); diff --git a/script/staking/StakeHolderScriptWIMX.t.sol b/script/staking/StakeHolderScriptWIMX.t.sol index 56d2fdca..824c54f5 100644 --- a/script/staking/StakeHolderScriptWIMX.t.sol +++ b/script/staking/StakeHolderScriptWIMX.t.sol @@ -1,16 +1,14 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.20; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; import {IERC20} from "openzeppelin-contracts-4.9.3/token/ERC20/IERC20.sol"; -import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; -import {IAccessControlUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/access/IAccessControlUpgradeable.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; -import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderWIMXV2} from "../../contracts/staking/StakeHolderWIMXV2.sol"; import {WIMX} from "../../contracts/staking/WIMX.sol"; import {OwnableCreate3Deployer} from "../../contracts/deployer/create3/OwnableCreate3Deployer.sol"; diff --git a/script/staking/UpgradeToWIMXV2.t.sol b/script/staking/UpgradeToWIMXV2.t.sol index c4113a3e..1b271dea 100644 --- a/script/staking/UpgradeToWIMXV2.t.sol +++ b/script/staking/UpgradeToWIMXV2.t.sol @@ -1,19 +1,16 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2023 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.20; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; -import {IERC20} from "openzeppelin-contracts-4.9.3/token/ERC20/IERC20.sol"; import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; -import {IAccessControlUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/access/IAccessControlUpgradeable.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderWIMXV2} from "../../contracts/staking/StakeHolderWIMXV2.sol"; -import {WIMX} from "../../contracts/staking/WIMX.sol"; -import {OwnableCreate3Deployer} from "../../contracts/deployer/create3/OwnableCreate3Deployer.sol"; /** * @title IDeployer Interface diff --git a/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol b/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol index cdabc7af..86f5f072 100644 --- a/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol +++ b/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol @@ -1,9 +1,9 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version pragma solidity 0.8.20; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSignedZoneV2} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; diff --git a/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol b/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol index 8d122e3e..461387c7 100644 --- a/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol +++ b/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 import {Script} from "forge-std/Script.sol"; @@ -18,6 +18,7 @@ contract DeployImmutableSignedZoneV2Dev is Script { "ImmutableSignedZone", "", "", address(0xC606830D8341bc9F5F5Dd7615E9313d2655B505D) ); + // forge-lint: disable-next-line(unsafe-typecast) c.grantRole(bytes32("ZONE_MANAGER"), address(0xC606830D8341bc9F5F5Dd7615E9313d2655B505D)); // set server side signer address diff --git a/script/trading/seaport16/DeployConduitController.s.sol b/script/trading/seaport16/DeployConduitController.s.sol index b628b01f..a996ec89 100644 --- a/script/trading/seaport16/DeployConduitController.s.sol +++ b/script/trading/seaport16/DeployConduitController.s.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 pragma solidity 0.8.24; @@ -11,36 +11,36 @@ import {Script} from "forge-std/Script.sol"; * outlined here: https://github.com/ProjectOpenSea/seaport/blob/main/docs/Deployment.md. */ contract DeployConduitController is Script { - address private constant keylessCreate2DeployerAddress = 0x4c8D290a1B368ac4728d83a9e8321fC3af2b39b1; - address private constant keylessCreate2Address = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; - address private constant inefficientImmutableCreate2FactoryAddress = 0xcfA3A7637547094fF06246817a35B8333C315196; - address private constant immutableCreate2FactoryAddress = 0x0000000000FFe8B47B3e2130213B802212439497; - address private constant conduitControllerAddress = 0x00000000F9490004C11Cef243f5400493c00Ad63; + address private constant KEYLESS_CREATE2_DEPLOYER_ADDRESS = 0x4c8D290a1B368ac4728d83a9e8321fC3af2b39b1; + address private constant KEYLESS_CREATE2_ADDRESS = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; + address private constant INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS = 0xcfA3A7637547094fF06246817a35B8333C315196; + address private constant IMMUTABLE_CREATE2_FACTORY_ADDRESS = 0x0000000000FFe8B47B3e2130213B802212439497; + address private constant CONDUIT_CONTROLLER_ADDRESS = 0x00000000F9490004C11Cef243f5400493c00Ad63; - bytes private constant createKeylessCreate2RawSignedTx = hex"f87e8085174876e800830186a08080ad601f80600e600039806000f350fe60003681823780368234f58015156014578182fd5b80825250506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; + bytes private constant CREATE_KEYLESS_CREATE2_RAW_SIGNED_TX = hex"f87e8085174876e800830186a08080ad601f80600e600039806000f350fe60003681823780368234f58015156014578182fd5b80825250506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; - bytes private constant createInefficientImmutableCreate2FactoryRawTx = hex"608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a0032"; + bytes private constant CREATE_INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_RAW_TX = hex"608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a0032"; - bytes private constant createImmutableCreate2FactoryRawTx = hex"64e030870000000000000000000000000000000000000000f4b0218f13a6440a6f02000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000853608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a003200000000000000000000000000"; + bytes private constant CREATE_IMMUTABLE_CREATE2_FACTORY_RAW_TX = hex"64e030870000000000000000000000000000000000000000f4b0218f13a6440a6f02000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000853608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a003200000000000000000000000000"; - bytes private constant createConduitControllerRawTx = hex"64e030870000000000000000000000000000000000000000dc0ef3c792976604960400000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000302760c08060405234620000ea57600090610c9f906001600160401b03603f8301601f1916820181811183821017620000da575b604052828252620023889160208101908484833951902060805260405192839281840192831184841017620000ca575b8339039082f58015620000ba575b6001600160a01b03163f60a05260405161227490816200011482396080518181816102b101528181610bcc0152610d06015260a0518181816102d401528181610c620152610da90152f35b620000c462000106565b6200006f565b620000d4620000ef565b62000061565b620000e4620000ef565b62000031565b600080fd5b50634e487b7160e01b600052604160045260246000fd5b506040513d6000823e3d90fdfe60806040526004361015610013575b600080fd5b60003560e01c8063027cc7641461012b5780630a96ad391461012257806313ad9cab1461011957806314afd79e1461011057806333bc8572146101075780634e3f9580146100fe57806351710e45146100f55780636d435421146100ec5780636e9bfd9f146100e3578063794593bc146100da5780637b37e561146100d15780638b9e028b146100c8578063906c87cc146100bf576393790f44146100b757600080fd5b61000e61126e565b5061000e6111fa565b5061000e61113c565b5061000e610fc8565b5061000e610c8a565b5061000e610b3c565b5061000e6109bf565b5061000e610765565b5061000e6106f3565b5061000e61064f565b5061000e6105db565b5061000e6102fa565b5061000e61027b565b5061000e61017a565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576101b2610134565b602435906101bf81611574565b73ffffffffffffffffffffffffffffffffffffffff80911691600083815280602052600360408220015482101561023f5790600360408361023b9661020a9552806020522001611400565b90549060031b1c166040519182918291909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0390f35b602484604051907f6ceb340b0000000000000000000000000000000000000000000000000000000082526004820152fd5b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57604080517f000000000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006020820152f35b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610332610134565b61033a610157565b90604435918215918215840361000e5761035381611505565b73ffffffffffffffffffffffffffffffffffffffff811690813b1561000e576040517fc4e8fcb500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201528515156024820152610401926000908290604490829084905af180156105ce575b6105b5575b5073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b92600484019261043183859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5491821590806105ae575b1561048157505050600361047d92930161045682826114ce565b54929073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b555b005b91949391816105a5575b5061049257005b6104df61047d938560037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600098019201916104ce83546113a4565b90808203610504575b505050611447565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6105766105449161053b61051b61059c9588611400565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b92839187611400565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b553880806104d7565b9050153861048b565b508061043c565b806105c26105c892611335565b80610270565b386103da565b6105d6611397565b6103d5565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610615610134565b61061e81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260016040600020015416604051908152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e861068c610134565b73ffffffffffffffffffffffffffffffffffffffff6106a9610157565b916106b381611574565b166000526000835260046040600020019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541515604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff610740610134565b61074981611574565b1660005260006020526020600360406000200154604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761079d610134565b6107a681611574565b61080c6107f360026107d88473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036109765761047f9060007f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a2610896600261086d8373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b73ffffffffffffffffffffffffffffffffffffffff3390806108dd60016107d88673ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b169083167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec6000604051a46001610935339273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6040517f88c3a11500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576109f7610134565b6109ff610157565b90610a0981611505565b73ffffffffffffffffffffffffffffffffffffffff808316908115610b095750610a5b6107f360026107d88573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b8114610ab95761093561047f93926002927f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6000604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b506040517fcbc080ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291166024820152604490fd5b82602491604051917fa388d263000000000000000000000000000000000000000000000000000000008352166004820152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576040517fff00000000000000000000000000000000000000000000000000000000000000602082019081523060601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260043560358301527f0000000000000000000000000000000000000000000000000000000000000000605583015273ffffffffffffffffffffffffffffffffffffffff91610c3b81607581015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611356565b519020604080519290911673ffffffffffffffffffffffffffffffffffffffff811683523f7f000000000000000000000000000000000000000000000000000000000000000014602083015290f35b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435610cc6610157565b73ffffffffffffffffffffffffffffffffffffffff91828216908115610f9f57338160601c03610f7657610da46107f386516020810190610d8881610c0f7f0000000000000000000000000000000000000000000000000000000000000000883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b92833f7f000000000000000000000000000000000000000000000000000000000000000014610f3057947f4397af6128d529b8ae0442f99db1296d5136062597a15bbc61c1b2a6431a7d15610eca838060009961023b989796865180610c9f8082019082821067ffffffffffffffff831117610f23575b6115a0833903908df515610f16575b610e9c610e578973ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91600183019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b55835173ffffffffffffffffffffffffffffffffffffffff8716815260208101919091529081906040820190565b0390a15194859483167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8287a473ffffffffffffffffffffffffffffffffffffffff1682526020820190565b610f1e611397565b610e2a565b610f2b611305565b610e1b565b85517f6328ccb200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602490fd5b600485517fcb6e5344000000000000000000000000000000000000000000000000000000008152fd5b600485517f99faaa04000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611000610134565b61100981611505565b73ffffffffffffffffffffffffffffffffffffffff9081811660009281845283602052600260408520015416156110ba575061108e600291837f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055604051f35b602490604051907f6b0136160000000000000000000000000000000000000000000000000000000082526004820152fd5b6020908160408183019282815285518094520193019160005b828110611112575050505090565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101611104565b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611175610134565b9061117f82611574565b73ffffffffffffffffffffffffffffffffffffffff91826000911681528082526003604082200192604051908193808654938481520195845280842093915b8383106111e15761023b866111d5818a0382611356565b604051918291826110eb565b84548116875295810195600194850194909201916111be565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020611234610134565b61123d81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260026040600020015416604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff6112bb610134565b16600052600060205260406000205480156112db57602090604051908152f35b60046040517f4ca82090000000000000000000000000000000000000000000000000000000008152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161134957604052565b611351611305565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761134957604052565b506040513d6000823e3d90fd5b600181106113d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80548210156114185760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8054801561149f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061147c8282611400565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b906105446114f692805490680100000000000000008210156114f8575b600182018155611400565b565b611500611305565b6114eb565b61150e81611574565b73ffffffffffffffffffffffffffffffffffffffff809116908160005260006020526001604060002001541633036115435750565b602490604051907fd4ed9a170000000000000000000000000000000000000000000000000000000082526004820152fd5b73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002054156112db5756fe60a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e0033a264697066735822122031e2de61a9e35e9e87d5eef6a36b045a0bab54c4031fd01a0f8138afce3cec3164736f6c634300080e003360a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e003300000000000000000000000000000000000000000000000000"; + bytes private constant CREATE_CONDUIT_CONTROLLER_RAW_TX = hex"64e030870000000000000000000000000000000000000000dc0ef3c792976604960400000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000302760c08060405234620000ea57600090610c9f906001600160401b03603f8301601f1916820181811183821017620000da575b604052828252620023889160208101908484833951902060805260405192839281840192831184841017620000ca575b8339039082f58015620000ba575b6001600160a01b03163f60a05260405161227490816200011482396080518181816102b101528181610bcc0152610d06015260a0518181816102d401528181610c620152610da90152f35b620000c462000106565b6200006f565b620000d4620000ef565b62000061565b620000e4620000ef565b62000031565b600080fd5b50634e487b7160e01b600052604160045260246000fd5b506040513d6000823e3d90fdfe60806040526004361015610013575b600080fd5b60003560e01c8063027cc7641461012b5780630a96ad391461012257806313ad9cab1461011957806314afd79e1461011057806333bc8572146101075780634e3f9580146100fe57806351710e45146100f55780636d435421146100ec5780636e9bfd9f146100e3578063794593bc146100da5780637b37e561146100d15780638b9e028b146100c8578063906c87cc146100bf576393790f44146100b757600080fd5b61000e61126e565b5061000e6111fa565b5061000e61113c565b5061000e610fc8565b5061000e610c8a565b5061000e610b3c565b5061000e6109bf565b5061000e610765565b5061000e6106f3565b5061000e61064f565b5061000e6105db565b5061000e6102fa565b5061000e61027b565b5061000e61017a565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576101b2610134565b602435906101bf81611574565b73ffffffffffffffffffffffffffffffffffffffff80911691600083815280602052600360408220015482101561023f5790600360408361023b9661020a9552806020522001611400565b90549060031b1c166040519182918291909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0390f35b602484604051907f6ceb340b0000000000000000000000000000000000000000000000000000000082526004820152fd5b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57604080517f000000000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006020820152f35b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610332610134565b61033a610157565b90604435918215918215840361000e5761035381611505565b73ffffffffffffffffffffffffffffffffffffffff811690813b1561000e576040517fc4e8fcb500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201528515156024820152610401926000908290604490829084905af180156105ce575b6105b5575b5073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b92600484019261043183859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5491821590806105ae575b1561048157505050600361047d92930161045682826114ce565b54929073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b555b005b91949391816105a5575b5061049257005b6104df61047d938560037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600098019201916104ce83546113a4565b90808203610504575b505050611447565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6105766105449161053b61051b61059c9588611400565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b92839187611400565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b553880806104d7565b9050153861048b565b508061043c565b806105c26105c892611335565b80610270565b386103da565b6105d6611397565b6103d5565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610615610134565b61061e81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260016040600020015416604051908152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e861068c610134565b73ffffffffffffffffffffffffffffffffffffffff6106a9610157565b916106b381611574565b166000526000835260046040600020019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541515604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff610740610134565b61074981611574565b1660005260006020526020600360406000200154604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761079d610134565b6107a681611574565b61080c6107f360026107d88473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036109765761047f9060007f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a2610896600261086d8373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b73ffffffffffffffffffffffffffffffffffffffff3390806108dd60016107d88673ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b169083167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec6000604051a46001610935339273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6040517f88c3a11500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576109f7610134565b6109ff610157565b90610a0981611505565b73ffffffffffffffffffffffffffffffffffffffff808316908115610b095750610a5b6107f360026107d88573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b8114610ab95761093561047f93926002927f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6000604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b506040517fcbc080ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291166024820152604490fd5b82602491604051917fa388d263000000000000000000000000000000000000000000000000000000008352166004820152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576040517fff00000000000000000000000000000000000000000000000000000000000000602082019081523060601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260043560358301527f0000000000000000000000000000000000000000000000000000000000000000605583015273ffffffffffffffffffffffffffffffffffffffff91610c3b81607581015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611356565b519020604080519290911673ffffffffffffffffffffffffffffffffffffffff811683523f7f000000000000000000000000000000000000000000000000000000000000000014602083015290f35b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435610cc6610157565b73ffffffffffffffffffffffffffffffffffffffff91828216908115610f9f57338160601c03610f7657610da46107f386516020810190610d8881610c0f7f0000000000000000000000000000000000000000000000000000000000000000883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b92833f7f000000000000000000000000000000000000000000000000000000000000000014610f3057947f4397af6128d529b8ae0442f99db1296d5136062597a15bbc61c1b2a6431a7d15610eca838060009961023b989796865180610c9f8082019082821067ffffffffffffffff831117610f23575b6115a0833903908df515610f16575b610e9c610e578973ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91600183019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b55835173ffffffffffffffffffffffffffffffffffffffff8716815260208101919091529081906040820190565b0390a15194859483167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8287a473ffffffffffffffffffffffffffffffffffffffff1682526020820190565b610f1e611397565b610e2a565b610f2b611305565b610e1b565b85517f6328ccb200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602490fd5b600485517fcb6e5344000000000000000000000000000000000000000000000000000000008152fd5b600485517f99faaa04000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611000610134565b61100981611505565b73ffffffffffffffffffffffffffffffffffffffff9081811660009281845283602052600260408520015416156110ba575061108e600291837f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055604051f35b602490604051907f6b0136160000000000000000000000000000000000000000000000000000000082526004820152fd5b6020908160408183019282815285518094520193019160005b828110611112575050505090565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101611104565b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611175610134565b9061117f82611574565b73ffffffffffffffffffffffffffffffffffffffff91826000911681528082526003604082200192604051908193808654938481520195845280842093915b8383106111e15761023b866111d5818a0382611356565b604051918291826110eb565b84548116875295810195600194850194909201916111be565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020611234610134565b61123d81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260026040600020015416604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff6112bb610134565b16600052600060205260406000205480156112db57602090604051908152f35b60046040517f4ca82090000000000000000000000000000000000000000000000000000000008152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161134957604052565b611351611305565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761134957604052565b506040513d6000823e3d90fd5b600181106113d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80548210156114185760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8054801561149f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061147c8282611400565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b906105446114f692805490680100000000000000008210156114f8575b600182018155611400565b565b611500611305565b6114eb565b61150e81611574565b73ffffffffffffffffffffffffffffffffffffffff809116908160005260006020526001604060002001541633036115435750565b602490604051907fd4ed9a170000000000000000000000000000000000000000000000000000000082526004820152fd5b73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002054156112db5756fe60a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e0033a264697066735822122031e2de61a9e35e9e87d5eef6a36b045a0bab54c4031fd01a0f8138afce3cec3164736f6c634300080e003360a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e003300000000000000000000000000000000000000000000000000"; function run() external { vm.startBroadcast(); - if (keylessCreate2Address.code.length == 0) { + if (KEYLESS_CREATE2_ADDRESS.code.length == 0) { console.log("Deploying KEYLESS_CREATE2"); // Creates KEYLESS_CREATE2 contract using 0x4c8D290a1B368ac4728d83a9e8321fC3af2b39b1 as the deployer. This account must be funded with at least 0.01 ether. - require(keylessCreate2DeployerAddress.balance >= 0.01 ether, string.concat("keylessCreate2Deployer balance must be at least ", vm.toString(uint256(0.01 ether)), " but is only ", vm.toString(keylessCreate2DeployerAddress.balance))); - vm.broadcastRawTransaction(createKeylessCreate2RawSignedTx); + require(KEYLESS_CREATE2_DEPLOYER_ADDRESS.balance >= 0.01 ether, string.concat("keylessCreate2Deployer balance must be at least ", vm.toString(uint256(0.01 ether)), " but is only ", vm.toString(KEYLESS_CREATE2_DEPLOYER_ADDRESS.balance))); + vm.broadcastRawTransaction(CREATE_KEYLESS_CREATE2_RAW_SIGNED_TX); } else { console.log("Skipping KEYLESS_CREATE2, already exists"); } - _createIfNotExist("INEFFICIENT_IMMUTABLE_CREATE2_FACTORY", inefficientImmutableCreate2FactoryAddress, keylessCreate2Address, createInefficientImmutableCreate2FactoryRawTx); - _createIfNotExist("IMMUTABLE_CREATE2_FACTORY", immutableCreate2FactoryAddress, inefficientImmutableCreate2FactoryAddress, createImmutableCreate2FactoryRawTx); - _createIfNotExist("ConduitController", conduitControllerAddress, immutableCreate2FactoryAddress, createConduitControllerRawTx); - + _createIfNotExist("INEFFICIENT_IMMUTABLE_CREATE2_FACTORY", INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS, KEYLESS_CREATE2_ADDRESS, CREATE_INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_RAW_TX); + _createIfNotExist("IMMUTABLE_CREATE2_FACTORY", IMMUTABLE_CREATE2_FACTORY_ADDRESS, INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS, CREATE_IMMUTABLE_CREATE2_FACTORY_RAW_TX); + _createIfNotExist("ConduitController", CONDUIT_CONTROLLER_ADDRESS, IMMUTABLE_CREATE2_FACTORY_ADDRESS, CREATE_CONDUIT_CONTROLLER_RAW_TX); + vm.stopBroadcast(); } diff --git a/script/trading/seaport16/DeployImmutableSeaport.s.sol b/script/trading/seaport16/DeployImmutableSeaport.s.sol index 8bfe49c0..dccc44d2 100644 --- a/script/trading/seaport16/DeployImmutableSeaport.s.sol +++ b/script/trading/seaport16/DeployImmutableSeaport.s.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 pragma solidity 0.8.24; @@ -14,33 +14,33 @@ import {IDeployer} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/inter * @dev This script assumes that the ConduitController contract has already been deployed. */ contract DeployImmutableSeaport is Script { - address private constant accessControlledDeployerAddress = 0x0B5B1d92259b13D516cCd5a6E63d7D94Ea2A4836; - address private constant create2DeployerAddress = 0x9df760a54b3B00cC8B3d70A37d45fa97cCfdb4Db; - address private constant conduitControllerAddress = 0x00000000F9490004C11Cef243f5400493c00Ad63; - address private constant immutableSeaportAddress = 0xbE737Cf2C122F83d1610C1224f7B99ca9d0E09f6; - bytes32 private constant immutableSeaportDeploymentSalt = keccak256(abi.encodePacked("immutable-seaport16")); - address private constant seaportInitialOwner = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer + address private constant ACCESS_CONTROLLED_DEPLOYER_ADDRESS = 0x0B5B1d92259b13D516cCd5a6E63d7D94Ea2A4836; + address private constant CREATE2_DEPLOYER_ADDRESS = 0x9df760a54b3B00cC8B3d70A37d45fa97cCfdb4Db; + address private constant CONDUIT_CONTROLLER_ADDRESS = 0x00000000F9490004C11Cef243f5400493c00Ad63; + address private constant IMMUTABLE_SEAPORT_ADDRESS = 0xbE737Cf2C122F83d1610C1224f7B99ca9d0E09f6; + bytes32 private constant IMMUTABLE_SEAPORT_DEPLOYMENT_SALT = keccak256(abi.encodePacked("immutable-seaport16")); + address private constant SEAPORT_INITIAL_OWNER = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer function run() external { - AccessControlledDeployer deployer = AccessControlledDeployer(accessControlledDeployerAddress); - IDeployer create2Deployer = IDeployer(create2DeployerAddress); + AccessControlledDeployer deployer = AccessControlledDeployer(ACCESS_CONTROLLED_DEPLOYER_ADDRESS); + IDeployer create2Deployer = IDeployer(CREATE2_DEPLOYER_ADDRESS); // Check supplied immutableSeaportAddress matches the expected address based on current creationCode bytes memory immutableSeaportDeploymentBytecode = abi.encodePacked( type(ImmutableSeaport).creationCode, - abi.encode(conduitControllerAddress, seaportInitialOwner) + abi.encode(CONDUIT_CONTROLLER_ADDRESS, SEAPORT_INITIAL_OWNER) ); - address expectedImmutableSeaportAddress = create2Deployer.deployedAddress(immutableSeaportDeploymentBytecode, accessControlledDeployerAddress, immutableSeaportDeploymentSalt); + address expectedImmutableSeaportAddress = create2Deployer.deployedAddress(immutableSeaportDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT); console.log("Expected ImmutableSeaport address: %s", expectedImmutableSeaportAddress); - require(expectedImmutableSeaportAddress == immutableSeaportAddress, "Expected ImmutableSeaport address mismatch"); + require(expectedImmutableSeaportAddress == IMMUTABLE_SEAPORT_ADDRESS, "Expected ImmutableSeaport address mismatch"); vm.startBroadcast(); // Deploy ImmutableSeaport if it doesn't already exist - if (immutableSeaportAddress.code.length == 0) { + if (IMMUTABLE_SEAPORT_ADDRESS.code.length == 0) { console.log("Deploying ImmutableSeaport"); - address deployedImmutableSeaportAddress = deployer.deploy(create2Deployer, immutableSeaportDeploymentBytecode, immutableSeaportDeploymentSalt); - require(deployedImmutableSeaportAddress == immutableSeaportAddress, "Deployed ImmutableSeaport address mismatch"); + address deployedImmutableSeaportAddress = deployer.deploy(create2Deployer, immutableSeaportDeploymentBytecode, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT); + require(deployedImmutableSeaportAddress == IMMUTABLE_SEAPORT_ADDRESS, "Deployed ImmutableSeaport address mismatch"); } else { console.log("Skipping ImmutableSeaport, already exists"); } diff --git a/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol b/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol index db2ebb73..b18b63ee 100644 --- a/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol +++ b/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 pragma solidity 0.8.24; @@ -15,45 +15,45 @@ import {IDeployer} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/inter * @dev This script assumes that the ImmutableSeaport contract has already been deployed. */ contract DeployImmutableSignedZoneV3 is Script { - address private constant accessControlledDeployerAddress = 0x0B5B1d92259b13D516cCd5a6E63d7D94Ea2A4836; - address private constant create2DeployerAddress = 0x9df760a54b3B00cC8B3d70A37d45fa97cCfdb4Db; - address private constant conduitControllerAddress = 0x00000000F9490004C11Cef243f5400493c00Ad63; - address private constant immutableSeaportAddress = 0xbE737Cf2C122F83d1610C1224f7B99ca9d0E09f6; - bytes32 private constant immutableSeaportDeploymentSalt = keccak256(abi.encodePacked("immutable-seaport16")); - address private constant zoneAddress = 0x18C12fb9c4f6165196c895aDF84230828A85B247; - bytes32 private constant zoneDeploymentSalt = keccak256(abi.encodePacked("immutable-signed-zone-v3")); - address private constant seaportInitialOwner = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer - address private constant zoneInitialOwner = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer +address private constant ACCESS_CONTROLLED_DEPLOYER_ADDRESS = 0x0B5B1d92259b13D516cCd5a6E63d7D94Ea2A4836; + address private constant CREATE2_DEPLOYER_ADDRESS = 0x9df760a54b3B00cC8B3d70A37d45fa97cCfdb4Db; + address private constant CONDUIT_CONTROLLER_ADDRESS = 0x00000000F9490004C11Cef243f5400493c00Ad63; + address private constant IMMUTABLE_SEAPORT_ADDRESS = 0xbE737Cf2C122F83d1610C1224f7B99ca9d0E09f6; + bytes32 private constant IMMUTABLE_SEAPORT_DEPLOYMENT_SALT = keccak256(abi.encodePacked("immutable-seaport16")); + address private constant ZONE_ADDRESS = 0x18C12fb9c4f6165196c895aDF84230828A85B247; + bytes32 private constant ZONE_DEPLOYMENT_SALT = keccak256(abi.encodePacked("immutable-signed-zone-v3")); + address private constant SEAPORT_INITIAL_OWNER = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer + address private constant ZONE_INITIAL_OWNER = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer function run() external { - AccessControlledDeployer deployer = AccessControlledDeployer(accessControlledDeployerAddress); - IDeployer create2Deployer = IDeployer(create2DeployerAddress); + AccessControlledDeployer deployer = AccessControlledDeployer(ACCESS_CONTROLLED_DEPLOYER_ADDRESS); + IDeployer create2Deployer = IDeployer(CREATE2_DEPLOYER_ADDRESS); // Check supplied immutableSeaportAddress matches the expected address based on current creationCode bytes memory immutableSeaportDeploymentBytecode = abi.encodePacked( type(ImmutableSeaport).creationCode, - abi.encode(conduitControllerAddress, seaportInitialOwner) + abi.encode(CONDUIT_CONTROLLER_ADDRESS, SEAPORT_INITIAL_OWNER) ); - address expectedImmutableSeaportAddress = create2Deployer.deployedAddress(immutableSeaportDeploymentBytecode, accessControlledDeployerAddress, immutableSeaportDeploymentSalt); - console.log("Expected ImmutableSeaport address: %s", expectedImmutableSeaportAddress); - require(expectedImmutableSeaportAddress == immutableSeaportAddress, "Expected ImmutableSeaport address mismatch"); + address expectedIMMUTABLE_SEAPORT_ADDRESS = create2Deployer.deployedAddress(immutableSeaportDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT); + console.log("Expected ImmutableSeaport address: %s", expectedIMMUTABLE_SEAPORT_ADDRESS); + require(expectedIMMUTABLE_SEAPORT_ADDRESS == IMMUTABLE_SEAPORT_ADDRESS, "Expected ImmutableSeaport address mismatch"); - // Check supplied zoneAddress matches the expected address based on current creationCode + // Check supplied ZONE_ADDRESS matches the expected address based on current creationCode bytes memory zoneDeploymentBytecode = abi.encodePacked( type(ImmutableSignedZoneV3).creationCode, - abi.encode("ImmutableSignedZone", immutableSeaportAddress, "", "", zoneInitialOwner) + abi.encode("ImmutableSignedZone", IMMUTABLE_SEAPORT_ADDRESS, "", "", ZONE_INITIAL_OWNER) ); - address expectedZoneAddress = create2Deployer.deployedAddress(zoneDeploymentBytecode, accessControlledDeployerAddress, zoneDeploymentSalt); + address expectedZoneAddress = create2Deployer.deployedAddress(zoneDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, ZONE_DEPLOYMENT_SALT); console.log("Expected ImmutableSignedZoneV3 address: %s", expectedZoneAddress); - require(expectedZoneAddress == zoneAddress, "Expected ImmutableSignedZoneV3 address mismatch"); + require(expectedZoneAddress == ZONE_ADDRESS, "Expected ImmutableSignedZoneV3 address mismatch"); vm.startBroadcast(); // Deploy zone if it doesn't already exist - if (zoneAddress.code.length == 0) { + if (ZONE_ADDRESS.code.length == 0) { console.log("Deploying ImmutableSignedZoneV3"); - address deployedZoneAddress = deployer.deploy(create2Deployer, zoneDeploymentBytecode, zoneDeploymentSalt); - require(deployedZoneAddress == zoneAddress, "Deployed ImmutableSignedZoneV3 address mismatch"); + address deployedZoneAddress = deployer.deploy(create2Deployer, zoneDeploymentBytecode, ZONE_DEPLOYMENT_SALT); + require(deployedZoneAddress == ZONE_ADDRESS, "Deployed ImmutableSignedZoneV3 address mismatch"); } else { console.log("Skipping ImmutableSignedZoneV3, already exists"); } diff --git a/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol b/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol index 6598440f..b7c299d2 100644 --- a/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol +++ b/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol @@ -1,15 +1,11 @@ pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {MockWallet} from "../../contracts/mocks/MockWallet.sol"; -import {MockWalletFactory} from "../../contracts/mocks/MockWalletFactory.sol"; import {MockFactory} from "../../contracts/mocks/MockFactory.sol"; import {ImmutableERC721MintByID} from "../../contracts/token/erc721/preset/ImmutableERC721MintByID.sol"; -import {IImmutableERC721Errors} from "../../contracts/errors/Errors.sol"; -import {OperatorAllowlistEnforcementErrors} from "../../contracts/errors/Errors.sol"; import {OperatorAllowlistUpgradeable} from "../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; -import {Sign} from "../utils/Sign.sol"; import {DeployOperatorAllowlist} from "../utils/DeployAllowlistProxy.sol"; import {DeploySCWallet} from "../utils/DeploySCW.sol"; import {DeployMockMarketPlace} from "../utils/DeployMockMarketPlace.sol"; diff --git a/test/allowlist/AllowlistImmutableERC721TransferApprovals.t.sol b/test/allowlist/AllowlistImmutableERC721TransferApprovals.t.sol index f21d76a0..24d2f63f 100644 --- a/test/allowlist/AllowlistImmutableERC721TransferApprovals.t.sol +++ b/test/allowlist/AllowlistImmutableERC721TransferApprovals.t.sol @@ -1,15 +1,11 @@ pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {MockWallet} from "../../contracts/mocks/MockWallet.sol"; -import {MockWalletFactory} from "../../contracts/mocks/MockWalletFactory.sol"; import {MockFactory} from "../../contracts/mocks/MockFactory.sol"; import {ImmutableERC721} from "../../contracts/token/erc721/preset/ImmutableERC721.sol"; -import {IImmutableERC721Errors} from "../../contracts/errors/Errors.sol"; -import {OperatorAllowlistEnforcementErrors} from "../../contracts/errors/Errors.sol"; import {OperatorAllowlistUpgradeable} from "../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; -import {Sign} from "../utils/Sign.sol"; import {DeployOperatorAllowlist} from "../utils/DeployAllowlistProxy.sol"; import {DeploySCWallet} from "../utils/DeploySCW.sol"; import {DeployMockMarketPlace} from "../utils/DeployMockMarketPlace.sol"; @@ -61,7 +57,7 @@ contract AllowlistERC721TransferApprovals is Test { _giveMinterRole(); } - function testDeployment() public { + function testDeployment() public view { assertEq(address(immutableERC721.operatorAllowlist()), proxyAddr); } diff --git a/test/allowlist/MockOAL.sol b/test/allowlist/MockOAL.sol index d32feed8..ed16f82e 100644 --- a/test/allowlist/MockOAL.sol +++ b/test/allowlist/MockOAL.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/allowlist/OperatorAllowlistUpgradeable.t.sol b/test/allowlist/OperatorAllowlistUpgradeable.t.sol index e631fc07..6b78b652 100644 --- a/test/allowlist/OperatorAllowlistUpgradeable.t.sol +++ b/test/allowlist/OperatorAllowlistUpgradeable.t.sol @@ -1,9 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; -import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {Test} from "forge-std/Test.sol"; import {OperatorAllowlistUpgradeable} from "../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {MockOperatorAllowlistUpgradeable} from "./MockOAL.sol"; import {ImmutableERC721} from "../../contracts/token/erc721/preset/ImmutableERC721.sol"; diff --git a/test/bridge/x/v4/MockCoreV4.sol b/test/bridge/x/v4/MockCoreV4.sol index 70d430f7..8e358c0d 100644 --- a/test/bridge/x/v4/MockCoreV4.sol +++ b/test/bridge/x/v4/MockCoreV4.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; diff --git a/test/bridge/x/v4/RegistrationV4.t.sol b/test/bridge/x/v4/RegistrationV4.t.sol index 6f6bd2a9..e985cf95 100644 --- a/test/bridge/x/v4/RegistrationV4.t.sol +++ b/test/bridge/x/v4/RegistrationV4.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; diff --git a/test/deployer/AccessControlledDeployer.t.sol b/test/deployer/AccessControlledDeployer.t.sol index ba77913a..b4459e07 100644 --- a/test/deployer/AccessControlledDeployer.t.sol +++ b/test/deployer/AccessControlledDeployer.t.sol @@ -1,8 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IDeployer} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeployer.sol"; import {ERC20MintableBurnable} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnable.sol"; diff --git a/test/deployer/create2/Create2Utils.sol b/test/deployer/create2/Create2Utils.sol index 75e86d34..646c1c03 100644 --- a/test/deployer/create2/Create2Utils.sol +++ b/test/deployer/create2/Create2Utils.sol @@ -1,8 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; contract Create2Utils is Test { function predictCreate2Address(bytes memory _bytecode, address _deployer, address _sender, bytes32 _salt) diff --git a/test/deployer/create2/OwnableCreate2Deployer.t.sol b/test/deployer/create2/OwnableCreate2Deployer.t.sol index c54e8ac7..bf100bfd 100644 --- a/test/deployer/create2/OwnableCreate2Deployer.t.sol +++ b/test/deployer/create2/OwnableCreate2Deployer.t.sol @@ -1,8 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {IDeploy} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeploy.sol"; import {ERC20Mock} from "@openzeppelin/contracts/mocks/ERC20Mock.sol"; import {ERC20MintableBurnable} from diff --git a/test/deployer/create3/Create3Utils.sol b/test/deployer/create3/Create3Utils.sol index f8faaf17..694c304e 100644 --- a/test/deployer/create3/Create3Utils.sol +++ b/test/deployer/create3/Create3Utils.sol @@ -1,8 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {IDeployer} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeployer.sol"; contract Create3Utils is Test { diff --git a/test/deployer/create3/OwnableCreate3Deployer.t.sol b/test/deployer/create3/OwnableCreate3Deployer.t.sol index 85fdf768..7d9b779a 100644 --- a/test/deployer/create3/OwnableCreate3Deployer.t.sol +++ b/test/deployer/create3/OwnableCreate3Deployer.t.sol @@ -1,8 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; +import {console} from "forge-std/console.sol"; import {IDeploy} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeploy.sol"; import {ERC20Mock} from "@openzeppelin/contracts/mocks/ERC20Mock.sol"; import {ERC20MintableBurnable} from diff --git a/test/games/gems/GemGame.t.sol b/test/games/gems/GemGame.t.sol index ef67e737..912e39fd 100644 --- a/test/games/gems/GemGame.t.sol +++ b/test/games/gems/GemGame.t.sol @@ -1,10 +1,10 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 // solhint-disable not-rely-on-time pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {GemGame, Unauthorized, ContractPaused} from "../../../contracts/games/gems/GemGame.sol"; contract GemGameTest is Test { diff --git a/test/multicall/GuardedMulticaller.t.sol b/test/multicall/GuardedMulticaller.t.sol deleted file mode 100644 index fc4e1186..00000000 --- a/test/multicall/GuardedMulticaller.t.sol +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 -// SPDX-License-Identifier: Apache 2.0 -pragma solidity ^0.8.19; - -import "forge-std/Test.sol"; -import {GuardedMulticaller} from "../../contracts/multicall/GuardedMulticaller.sol"; -import {MockFunctions} from "./MockFunctions.sol"; -import {SigUtils} from "./SigUtils.t.sol"; - -contract GuardedMulticallerTest is Test { - GuardedMulticaller public gmc; - MockFunctions public mock; - SigUtils public sigUtils; - - event Multicalled( - address indexed _multicallSigner, - bytes32 indexed _reference, - address[] _targets, - bytes[] _data, - uint256 _deadline - ); - - event FunctionPermitted(address indexed _target, bytes4 _functionSelector, bool _permitted); - - address public deployer; - address public signer; - uint256 public signerPk; - address public user; - uint256 public userPk; - - string public constant MULTICALLER_NAME = "Multicaller"; - string public constant MULTICALLER_VERSION = "v1"; - - bytes32 public ref; - uint256 public deadline; - - function setUp() public { - deployer = makeAddr("deployer"); - (signer, signerPk) = makeAddrAndKey("signer"); - (user, userPk) = makeAddrAndKey("user"); - - vm.prank(deployer); - gmc = new GuardedMulticaller(deployer, MULTICALLER_NAME, MULTICALLER_VERSION); - vm.prank(deployer); - gmc.grantMulticallSignerRole(signer); - - sigUtils = new SigUtils(MULTICALLER_NAME, MULTICALLER_VERSION, address(gmc)); - - vm.prank(deployer); - mock = new MockFunctions(); - - GuardedMulticaller.FunctionPermit[] memory functionPermits = new GuardedMulticaller.FunctionPermit[](2); - functionPermits[0] = GuardedMulticaller.FunctionPermit({ - target: address(mock), - functionSelector: MockFunctions.succeed.selector, - permitted: true - }); - functionPermits[1] = GuardedMulticaller.FunctionPermit({ - target: address(mock), - functionSelector: MockFunctions.revertWithNoReason.selector, - permitted: true - }); - vm.prank(deployer); - gmc.setFunctionPermits(functionPermits); - - deadline = block.timestamp + 30 minutes; - ref = keccak256(abi.encodePacked("test_ref")); - } - - function test_SuccessfulExecution() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSelector(MockFunctions.succeed.selector); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectEmit(true, true, true, true); - emit Multicalled(signer, ref, targets, data, deadline); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertWithCustomError() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("revertWithNoReason()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.FailedCall.selector, targets[0], data[0])); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertIfDeadlinePassed() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - uint256 expiredDeadline = block.timestamp; - vm.warp(expiredDeadline + 30 minutes); - bytes memory signature = signTypedData(signerPk, ref, targets, data, expiredDeadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.Expired.selector, expiredDeadline)); - gmc.execute(signer, ref, targets, data, expiredDeadline, signature); - } - - function test_RevertIfReferenceReused() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - gmc.execute(signer, ref, targets, data, deadline, signature); - - vm.prank(user); - vm.expectRevert(abi.encodePacked(GuardedMulticaller.ReusedReference.selector, ref)); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertIfInvalidReference() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes32 invalidRef = bytes32(0); - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.InvalidReference.selector, invalidRef)); - gmc.execute(signer, invalidRef, targets, data, deadline, signature); - } - - function test_RevertIfUnauthorizedSigner() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.UnauthorizedSigner.selector, user)); - // Note: execute called with user as signer. - gmc.execute(user, ref, targets, data, deadline, signature); - } - - function test_RevertIfSignatureMismatch() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes memory signature = signTypedData(userPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.UnauthorizedSignature.selector, signature)); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertIfEmptyTargets() public { - address[] memory targets = new address[](0); - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.EmptyAddressArray.selector)); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertIfTargetsDataMismatch() public { - address[] memory targets = new address[](2); - targets[0] = address(mock); - targets[1] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert( - abi.encodeWithSelector( - GuardedMulticaller.AddressDataArrayLengthsMismatch.selector, - targets.length, - data.length - ) - ); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertIfFunctionNotPermitted() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("notPermitted()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.UnauthorizedFunction.selector, targets[0], data[0])); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertIfFunctionDisallowed() public { - GuardedMulticaller.FunctionPermit[] memory functionPermits = new GuardedMulticaller.FunctionPermit[](1); - functionPermits[0] = GuardedMulticaller.FunctionPermit({ - target: address(mock), - functionSelector: MockFunctions.succeed.selector, - permitted: false - }); - vm.prank(deployer); - gmc.setFunctionPermits(functionPermits); - - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.UnauthorizedFunction.selector, targets[0], data[0])); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_RevertIfInvalidSignature() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes32 maliciousRef = keccak256(abi.encodePacked("malicious_ref")); - bytes memory signature = signTypedData(signerPk, maliciousRef, targets, data, deadline); - - vm.prank(user); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.UnauthorizedSignature.selector, signature)); - gmc.execute(signer, ref, targets, data, deadline, signature); - } - - function test_EmitFunctionPermittedEvent() public { - vm.startPrank(deployer); - GuardedMulticaller.FunctionPermit[] memory functionPermits = new GuardedMulticaller.FunctionPermit[](1); - functionPermits[0] = GuardedMulticaller.FunctionPermit({ - target: address(mock), - functionSelector: MockFunctions.succeed.selector, - permitted: true - }); - vm.expectEmit(true, true, true, true); - emit FunctionPermitted(address(mock), MockFunctions.succeed.selector, true); - gmc.setFunctionPermits(functionPermits); - - functionPermits[0] = GuardedMulticaller.FunctionPermit({ - target: address(mock), - functionSelector: MockFunctions.succeed.selector, - permitted: false - }); - vm.expectEmit(true, true, true, true); - emit FunctionPermitted(address(mock), MockFunctions.succeed.selector, false); - gmc.setFunctionPermits(functionPermits); - - vm.stopPrank(); - } - - function test_RevertIfEmptyFunctionPermits() public { - vm.prank(deployer); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.EmptyFunctionPermitArray.selector)); - gmc.setFunctionPermits(new GuardedMulticaller.FunctionPermit[](0)); - } - - function test_RevertIfAccessControlIssueWhileSettingFunctionPermits() public { - GuardedMulticaller.FunctionPermit[] memory functionPermits = new GuardedMulticaller.FunctionPermit[](1); - functionPermits[0] = GuardedMulticaller.FunctionPermit({ - target: address(mock), - functionSelector: MockFunctions.succeed.selector, - permitted: false - }); - vm.prank(user); - // Will be an access control error. - vm.expectRevert(); - gmc.setFunctionPermits(functionPermits); - } - - function test_RevertIfSetFunctionPermitsNonContract() public { - GuardedMulticaller.FunctionPermit[] memory functionPermits = new GuardedMulticaller.FunctionPermit[](1); - functionPermits[0] = GuardedMulticaller.FunctionPermit({ - target: deployer, - functionSelector: MockFunctions.succeed.selector, - permitted: true - }); - vm.prank(deployer); - vm.expectRevert(abi.encodeWithSelector(GuardedMulticaller.NonContractAddress.selector, deployer)); - gmc.setFunctionPermits(functionPermits); - } - - function test_RevertIfGrantRevokeSignerRoleWithInvalidRole() public { - vm.startPrank(user); - - vm.expectRevert(); - gmc.grantMulticallSignerRole(user); - - vm.expectRevert(); - gmc.revokeMulticallSignerRole(user); - - vm.stopPrank(); - } - - function test_HasBeenExecuted() public { - address[] memory targets = new address[](1); - targets[0] = address(mock); - - bytes[] memory data = new bytes[](1); - data[0] = abi.encodeWithSignature("succeed()"); - - bytes memory signature = signTypedData(signerPk, ref, targets, data, deadline); - - vm.prank(user); - gmc.execute(signer, ref, targets, data, deadline, signature); - - assertTrue(gmc.hasBeenExecuted(ref)); - - bytes32 invalidRef = keccak256(abi.encodePacked("invalid_ref")); - assertFalse(gmc.hasBeenExecuted(invalidRef)); - } - - function testIsFunctionPermitted() public { - assertTrue(gmc.isFunctionPermitted(address(mock), MockFunctions.succeed.selector)); - assertTrue(gmc.isFunctionPermitted(address(mock), MockFunctions.revertWithNoReason.selector)); - assertFalse(gmc.isFunctionPermitted(address(mock), MockFunctions.notPermitted.selector)); - } - - function testHashBytesArray() public { - bytes[] memory data = new bytes[](2); - data[0] = abi.encodeWithSignature("succeed()"); - data[1] = abi.encodeWithSignature("notSucceed()"); - assertEq(sigUtils.hashBytesArray(data), gmc.hashBytesArray(data)); - } - - function signTypedData( - uint256 _signerPk, - bytes32 _reference, - address[] memory _targets, - bytes[] memory _data, - uint256 _deadline - ) public view returns (bytes memory) { - bytes32 digest = sigUtils.hashTypedData(_reference, _targets, _data, _deadline); - (uint8 v, bytes32 r, bytes32 s) = vm.sign(_signerPk, digest); - return abi.encodePacked(r, s, v); - } -} diff --git a/test/multicall/GuardedMulticaller2.t.sol b/test/multicall/GuardedMulticaller2.t.sol index 9f2770b5..50b85b2b 100644 --- a/test/multicall/GuardedMulticaller2.t.sol +++ b/test/multicall/GuardedMulticaller2.t.sol @@ -1,11 +1,10 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {GuardedMulticaller2} from "../../contracts/multicall/GuardedMulticaller2.sol"; import {MockFunctions} from "./MockFunctions.sol"; -import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol"; import {SigUtils} from "./SigUtils.t.sol"; contract GuardedMulticaller2Test is Test { diff --git a/test/multicall/MockFunctions.sol b/test/multicall/MockFunctions.sol index 17ceb089..41372e60 100644 --- a/test/multicall/MockFunctions.sol +++ b/test/multicall/MockFunctions.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/multicall/SigUtils.t.sol b/test/multicall/SigUtils.t.sol index 4bb18a70..428dbd78 100644 --- a/test/multicall/SigUtils.t.sol +++ b/test/multicall/SigUtils.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -21,10 +21,10 @@ contract SigUtils { ); - bytes32 private immutable cachedDomainSeparator; + bytes32 private immutable CACHED_DOMAIN_SEPARATOR; constructor(string memory _name, string memory _version, address _verifyingContract) { - cachedDomainSeparator = keccak256(abi.encode(_TYPE_HASH, keccak256(bytes(_name)), keccak256(bytes(_version)), block.chainid, _verifyingContract)); + CACHED_DOMAIN_SEPARATOR = keccak256(abi.encode(_TYPE_HASH, keccak256(bytes(_name)), keccak256(bytes(_version)), block.chainid, _verifyingContract)); } function _hashCallArray(GuardedMulticaller2.Call[] calldata _calls) internal pure returns (bytes32) { @@ -43,7 +43,7 @@ contract SigUtils { uint256 _deadline ) public view returns (bytes32) { bytes32 digest = keccak256(abi.encode(MULTICALL_TYPEHASHV2, _reference, _hashCallArray(_calls), _deadline)); - return keccak256(abi.encodePacked("\x19\x01", cachedDomainSeparator, digest)); + return keccak256(abi.encodePacked("\x19\x01", CACHED_DOMAIN_SEPARATOR, digest)); } diff --git a/test/payment-splitter/PaymentSplitter.t.sol b/test/payment-splitter/PaymentSplitter.t.sol index 63ffeb18..54e004ee 100644 --- a/test/payment-splitter/PaymentSplitter.t.sol +++ b/test/payment-splitter/PaymentSplitter.t.sol @@ -1,8 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {PaymentSplitter} from "../../contracts/payment-splitter/PaymentSplitter.sol"; import {MockERC20} from "./MockERC20.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; diff --git a/test/royalty-enforcement/MockMarketplace.sol b/test/royalty-enforcement/MockMarketplace.sol index 68985b61..81221549 100644 --- a/test/royalty-enforcement/MockMarketplace.sol +++ b/test/royalty-enforcement/MockMarketplace.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -8,16 +8,16 @@ import {IERC2981} from "@openzeppelin/contracts/interfaces/IERC2981.sol"; contract MockMarketplace { error ZeroAddress(); - IERC721 public immutable tokenAddress; - IERC2981 public immutable royaltyAddress; + IERC721 public immutable TOKEN_ADDRESS; + IERC2981 public immutable ROYALTY_ADDRESS; constructor(address _tokenAddress) { - tokenAddress = IERC721(_tokenAddress); - royaltyAddress = IERC2981(_tokenAddress); + TOKEN_ADDRESS = IERC721(_tokenAddress); + ROYALTY_ADDRESS = IERC2981(_tokenAddress); } function executeTransfer(address recipient, uint256 _tokenId) public { - tokenAddress.transferFrom(msg.sender, recipient, _tokenId); + TOKEN_ADDRESS.transferFrom(msg.sender, recipient, _tokenId); } /// @notice This code is only for testing purposes. Do not use similar @@ -25,11 +25,11 @@ contract MockMarketplace { /// @dev For details see: https://github.com/crytic/slither/wiki/Detector-Documentation#arbitrary-from-in-transferfrom function executeTransferFrom(address from, address to, uint256 _tokenId) public { // slither-disable-next-line arbitrary-send-erc20 - tokenAddress.transferFrom(from, to, _tokenId); + TOKEN_ADDRESS.transferFrom(from, to, _tokenId); } function executeApproveForAll(address operator, bool approved) public { - tokenAddress.setApprovalForAll(operator, approved); + TOKEN_ADDRESS.setApprovalForAll(operator, approved); } /// @notice This code is only for testing purposes. Do not use similar @@ -41,7 +41,7 @@ contract MockMarketplace { } // solhint-disable-next-line custom-errors require(msg.value == price, "insufficient msg.value"); - (address receiver, uint256 royaltyAmount) = royaltyAddress.royaltyInfo(_tokenId, price); + (address receiver, uint256 royaltyAmount) = ROYALTY_ADDRESS.royaltyInfo(_tokenId, price); if (receiver == address(0)) { revert ZeroAddress(); } @@ -49,7 +49,7 @@ contract MockMarketplace { payable(receiver).transfer(royaltyAmount); payable(from).transfer(sellerAmt); // slither-disable-next-line arbitrary-send-erc20 - tokenAddress.transferFrom(from, recipient, _tokenId); + TOKEN_ADDRESS.transferFrom(from, recipient, _tokenId); } } diff --git a/test/royalty-enforcement/RoyaltyMarketplace.t.sol b/test/royalty-enforcement/RoyaltyMarketplace.t.sol index ee25c059..5151f8d7 100644 --- a/test/royalty-enforcement/RoyaltyMarketplace.t.sol +++ b/test/royalty-enforcement/RoyaltyMarketplace.t.sol @@ -1,8 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableERC721MintByID} from "../../contracts/token/erc721/preset/ImmutableERC721MintByID.sol"; import {MockMarketplace} from "./MockMarketplace.sol"; import {OperatorAllowlistUpgradeable} from "../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; @@ -21,12 +21,12 @@ contract RoyaltyMarketplaceTest is Test { address public buyer; address public seller; - string public constant baseURI = "https://baseURI.com/"; - string public constant contractURI = "https://contractURI.com"; - string public constant name = "ERC721Preset"; - string public constant symbol = "EP"; - uint96 public constant royalty = 2000; // 20% - + string public constant BASE_URI = "https://baseURI.com/"; + string public constant CONTRACT_URI = "https://contractURI.com"; + string public constant NAME = "ERC721Preset"; + string public constant SYMBOL = "EP"; + uint96 public constant ROYALTY = 2000; // 20% + function setUp() public { // Set up accounts owner = makeAddr("owner"); @@ -45,13 +45,13 @@ contract RoyaltyMarketplaceTest is Test { vm.prank(owner); erc721 = new ImmutableERC721MintByID( owner, - name, - symbol, - baseURI, - contractURI, + NAME, + SYMBOL, + BASE_URI, + CONTRACT_URI, address(operatorAllowlist), royaltyRecipient, - royalty + ROYALTY ); // Deploy mock marketplace diff --git a/test/staking/StakeHolderAttackWallet.sol b/test/staking/StakeHolderAttackWallet.sol index 4b4e25f0..2398efe6 100644 --- a/test/staking/StakeHolderAttackWallet.sol +++ b/test/staking/StakeHolderAttackWallet.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/staking/StakeHolderAttackWallet2.sol b/test/staking/StakeHolderAttackWallet2.sol index d3009909..883c3640 100644 --- a/test/staking/StakeHolderAttackWallet2.sol +++ b/test/staking/StakeHolderAttackWallet2.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/staking/StakeHolderBase.t.sol b/test/staking/StakeHolderBase.t.sol index 8794a98e..79b3842b 100644 --- a/test/staking/StakeHolderBase.t.sol +++ b/test/staking/StakeHolderBase.t.sol @@ -1,11 +1,11 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 // solhint-disable not-rely-on-time pragma solidity >=0.8.19 <0.8.29; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; diff --git a/test/staking/StakeHolderConfigBase.t.sol b/test/staking/StakeHolderConfigBase.t.sol index 0e9eaae4..837d54f2 100644 --- a/test/staking/StakeHolderConfigBase.t.sol +++ b/test/staking/StakeHolderConfigBase.t.sol @@ -1,9 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; diff --git a/test/staking/StakeHolderConfigBaseV2.t.sol b/test/staking/StakeHolderConfigBaseV2.t.sol index bcb9843c..2540c21d 100644 --- a/test/staking/StakeHolderConfigBaseV2.t.sol +++ b/test/staking/StakeHolderConfigBaseV2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderConfigBaseTest} from "./StakeHolderConfigBase.t.sol"; diff --git a/test/staking/StakeHolderConfigERC20.t.sol b/test/staking/StakeHolderConfigERC20.t.sol index 06afa165..3fe65c4a 100644 --- a/test/staking/StakeHolderConfigERC20.t.sol +++ b/test/staking/StakeHolderConfigERC20.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; diff --git a/test/staking/StakeHolderConfigERC20V2.t.sol b/test/staking/StakeHolderConfigERC20V2.t.sol index 780bd82e..fa017602 100644 --- a/test/staking/StakeHolderConfigERC20V2.t.sol +++ b/test/staking/StakeHolderConfigERC20V2.t.sol @@ -1,13 +1,10 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; import {StakeHolderERC20V2} from "../../contracts/staking/StakeHolderERC20V2.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; -import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; import {StakeHolderConfigBaseTestV2} from "./StakeHolderConfigBaseV2.t.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; diff --git a/test/staking/StakeHolderConfigNative.t.sol b/test/staking/StakeHolderConfigNative.t.sol index 8feaa4f5..54f0e0da 100644 --- a/test/staking/StakeHolderConfigNative.t.sol +++ b/test/staking/StakeHolderConfigNative.t.sol @@ -1,14 +1,11 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderNative} from "../../contracts/staking/StakeHolderNative.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderConfigBaseTest} from "./StakeHolderConfigBase.t.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; contract StakeHolderNativeV2a is StakeHolderNative { function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBase) { diff --git a/test/staking/StakeHolderConfigNativeV2.t.sol b/test/staking/StakeHolderConfigNativeV2.t.sol index fea533bf..3a07ef55 100644 --- a/test/staking/StakeHolderConfigNativeV2.t.sol +++ b/test/staking/StakeHolderConfigNativeV2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderNative} from "../../contracts/staking/StakeHolderNative.sol"; import {StakeHolderNativeV2} from "../../contracts/staking/StakeHolderNativeV2.sol"; import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; diff --git a/test/staking/StakeHolderConfigWIMX.t.sol b/test/staking/StakeHolderConfigWIMX.t.sol index 63da18fe..3f2954e9 100644 --- a/test/staking/StakeHolderConfigWIMX.t.sol +++ b/test/staking/StakeHolderConfigWIMX.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderWIMX} from "../../contracts/staking/StakeHolderWIMX.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; diff --git a/test/staking/StakeHolderConfigWIMXV2.t.sol b/test/staking/StakeHolderConfigWIMXV2.t.sol index dbec1411..a02439a7 100644 --- a/test/staking/StakeHolderConfigWIMXV2.t.sol +++ b/test/staking/StakeHolderConfigWIMXV2.t.sol @@ -1,12 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderWIMX} from "../../contracts/staking/StakeHolderWIMX.sol"; import {StakeHolderWIMXV2} from "../../contracts/staking/StakeHolderWIMXV2.sol"; -import {WIMX} from "../../contracts/staking/WIMX.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; import {StakeHolderConfigBaseTestV2} from "./StakeHolderConfigBaseV2.t.sol"; diff --git a/test/staking/StakeHolderInitBase.t.sol b/test/staking/StakeHolderInitBase.t.sol index 4ca9bf44..6b2c185f 100644 --- a/test/staking/StakeHolderInitBase.t.sol +++ b/test/staking/StakeHolderInitBase.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; abstract contract StakeHolderInitBaseTest is StakeHolderBaseTest { diff --git a/test/staking/StakeHolderInitBaseV2.t.sol b/test/staking/StakeHolderInitBaseV2.t.sol index 32e06b55..396b5dee 100644 --- a/test/staking/StakeHolderInitBaseV2.t.sol +++ b/test/staking/StakeHolderInitBaseV2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; abstract contract StakeHolderInitBaseTestV2 is StakeHolderInitBaseTest { diff --git a/test/staking/StakeHolderInitERC20.t.sol b/test/staking/StakeHolderInitERC20.t.sol index 33cb7c8b..0708c26a 100644 --- a/test/staking/StakeHolderInitERC20.t.sol +++ b/test/staking/StakeHolderInitERC20.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; contract StakeHolderInitERC20Test is StakeHolderInitBaseTest { diff --git a/test/staking/StakeHolderInitERC20V2.t.sol b/test/staking/StakeHolderInitERC20V2.t.sol index a458c9fd..df4c1aa2 100644 --- a/test/staking/StakeHolderInitERC20V2.t.sol +++ b/test/staking/StakeHolderInitERC20V2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderInitBaseTestV2} from "./StakeHolderInitBaseV2.t.sol"; contract StakeHolderInitERC20TestV2 is StakeHolderInitBaseTestV2 { diff --git a/test/staking/StakeHolderInitNative.t.sol b/test/staking/StakeHolderInitNative.t.sol index 51cebb83..549b6990 100644 --- a/test/staking/StakeHolderInitNative.t.sol +++ b/test/staking/StakeHolderInitNative.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; contract StakeHolderInitNativeTest is StakeHolderInitBaseTest { diff --git a/test/staking/StakeHolderInitNativeV2.t.sol b/test/staking/StakeHolderInitNativeV2.t.sol index f0aa22ba..4d160963 100644 --- a/test/staking/StakeHolderInitNativeV2.t.sol +++ b/test/staking/StakeHolderInitNativeV2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderInitBaseTestV2} from "./StakeHolderInitBaseV2.t.sol"; contract StakeHolderInitNativeTestV2 is StakeHolderInitBaseTestV2 { diff --git a/test/staking/StakeHolderInitWIMX.t.sol b/test/staking/StakeHolderInitWIMX.t.sol index cbf7f4d1..610099c1 100644 --- a/test/staking/StakeHolderInitWIMX.t.sol +++ b/test/staking/StakeHolderInitWIMX.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; contract StakeHolderInitWIMXTest is StakeHolderInitBaseTest { diff --git a/test/staking/StakeHolderInitWIMXV2.t.sol b/test/staking/StakeHolderInitWIMXV2.t.sol index ba2e4874..ee2c98c9 100644 --- a/test/staking/StakeHolderInitWIMXV2.t.sol +++ b/test/staking/StakeHolderInitWIMXV2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderInitBaseTestV2} from "./StakeHolderInitBaseV2.t.sol"; contract StakeHolderInitWIMXTestV2 is StakeHolderInitBaseTestV2 { diff --git a/test/staking/StakeHolderOperationalBase.t.sol b/test/staking/StakeHolderOperationalBase.t.sol index b28c4792..caace7df 100644 --- a/test/staking/StakeHolderOperationalBase.t.sol +++ b/test/staking/StakeHolderOperationalBase.t.sol @@ -1,9 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {stdError} from "forge-std/StdError.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; diff --git a/test/staking/StakeHolderOperationalBaseV2.t.sol b/test/staking/StakeHolderOperationalBaseV2.t.sol index 9408ba70..11c24682 100644 --- a/test/staking/StakeHolderOperationalBaseV2.t.sol +++ b/test/staking/StakeHolderOperationalBaseV2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderOperationalBaseTest} from "./StakeHolderOperationalBase.t.sol"; diff --git a/test/staking/StakeHolderOperationalERC20.t.sol b/test/staking/StakeHolderOperationalERC20.t.sol index 94d5ead4..a97cde6c 100644 --- a/test/staking/StakeHolderOperationalERC20.t.sol +++ b/test/staking/StakeHolderOperationalERC20.t.sol @@ -1,13 +1,10 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderOperationalBaseTest} from "./StakeHolderOperationalBase.t.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; contract StakeHolderOperationalERC20Test is StakeHolderOperationalBaseTest { function setUp() public virtual override { @@ -31,7 +28,8 @@ contract StakeHolderOperationalERC20Test is StakeHolderOperationalBaseTest { function _deal(address _to, uint256 _amount) internal override { vm.prank(bank); - erc20.transfer(_to, _amount); + bool success = erc20.transfer(_to, _amount); + require(success, "Unexpected ERC 20 transfer failure"); } function _addStake(address _staker, uint256 _amount, bool _hasError, bytes memory _error) internal override { diff --git a/test/staking/StakeHolderOperationalERC20V2.t.sol b/test/staking/StakeHolderOperationalERC20V2.t.sol index 0d174299..82a164d2 100644 --- a/test/staking/StakeHolderOperationalERC20V2.t.sol +++ b/test/staking/StakeHolderOperationalERC20V2.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {IStakeHolderV2} from "../../contracts/staking/IStakeHolderV2.sol"; diff --git a/test/staking/StakeHolderOperationalNative.t.sol b/test/staking/StakeHolderOperationalNative.t.sol index f43f2430..de8abcd6 100644 --- a/test/staking/StakeHolderOperationalNative.t.sol +++ b/test/staking/StakeHolderOperationalNative.t.sol @@ -1,13 +1,10 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderNative} from "../../contracts/staking/StakeHolderNative.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderOperationalBaseTest} from "./StakeHolderOperationalBase.t.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; import {StakeHolderAttackWallet} from "./StakeHolderAttackWallet.sol"; import {StakeHolderAttackWallet2} from "./StakeHolderAttackWallet2.sol"; diff --git a/test/staking/StakeHolderOperationalNativeV2.t.sol b/test/staking/StakeHolderOperationalNativeV2.t.sol index a516587e..6a0b32a1 100644 --- a/test/staking/StakeHolderOperationalNativeV2.t.sol +++ b/test/staking/StakeHolderOperationalNativeV2.t.sol @@ -1,10 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; -import {StakeHolderNative} from "../../contracts/staking/StakeHolderNative.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {IStakeHolderV2} from "../../contracts/staking/IStakeHolderV2.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; diff --git a/test/staking/StakeHolderOperationalWIMX.t.sol b/test/staking/StakeHolderOperationalWIMX.t.sol index 6afd3843..923bf083 100644 --- a/test/staking/StakeHolderOperationalWIMX.t.sol +++ b/test/staking/StakeHolderOperationalWIMX.t.sol @@ -1,14 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; -import {StakeHolderWIMX} from "../../contracts/staking/StakeHolderWIMX.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; -import {WIMX} from "../../contracts/staking/WIMX.sol"; import {StakeHolderOperationalBaseTest} from "./StakeHolderOperationalBase.t.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; contract StakeHolderOperationalWIMXTest is StakeHolderOperationalBaseTest { function setUp() public virtual override { diff --git a/test/staking/StakeHolderOperationalWIMXV2.t.sol b/test/staking/StakeHolderOperationalWIMXV2.t.sol index 704ad4c7..78c30c0a 100644 --- a/test/staking/StakeHolderOperationalWIMXV2.t.sol +++ b/test/staking/StakeHolderOperationalWIMXV2.t.sol @@ -1,10 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; -import {StakeHolderWIMX} from "../../contracts/staking/StakeHolderWIMX.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {IStakeHolderV2} from "../../contracts/staking/IStakeHolderV2.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; diff --git a/test/staking/StakeHolderTimeDelayBase.t.sol b/test/staking/StakeHolderTimeDelayBase.t.sol index 3e89ac91..d86b7af2 100644 --- a/test/staking/StakeHolderTimeDelayBase.t.sol +++ b/test/staking/StakeHolderTimeDelayBase.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; @@ -34,7 +32,7 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { } - function testTimeLockControllerDeployment() public { + function testTimeLockControllerDeployment() public view { assertEq(stakeHolderTimeDelay.getMinDelay(), delay, "Incorrect time delay"); } diff --git a/test/staking/StakeHolderTimeDelayERC20.t.sol b/test/staking/StakeHolderTimeDelayERC20.t.sol index 3219b73f..4b186259 100644 --- a/test/staking/StakeHolderTimeDelayERC20.t.sol +++ b/test/staking/StakeHolderTimeDelayERC20.t.sol @@ -1,15 +1,12 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; import {StakeHolderERC20V2} from "../../contracts/staking/StakeHolderERC20V2.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderTimeDelayBaseTest} from "./StakeHolderTimeDelayBase.t.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; -import {ERC20PresetFixedSupply} from "openzeppelin-contracts-4.9.3/token/ERC20/presets/ERC20PresetFixedSupply.sol"; import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; contract StakeHolderERC20V3a is StakeHolderERC20V2 { diff --git a/test/staking/StakeHolderTimeDelayWIMX.t.sol b/test/staking/StakeHolderTimeDelayWIMX.t.sol index 618077ed..ea52215f 100644 --- a/test/staking/StakeHolderTimeDelayWIMX.t.sol +++ b/test/staking/StakeHolderTimeDelayWIMX.t.sol @@ -1,9 +1,7 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderWIMX} from "../../contracts/staking/StakeHolderWIMX.sol"; import {StakeHolderWIMXV2} from "../../contracts/staking/StakeHolderWIMXV2.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; diff --git a/test/staking/StakeHolderUpgradeForkTest.t.sol b/test/staking/StakeHolderUpgradeForkTest.t.sol index 811fc9bc..dffcc520 100644 --- a/test/staking/StakeHolderUpgradeForkTest.t.sol +++ b/test/staking/StakeHolderUpgradeForkTest.t.sol @@ -1,12 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; import {StakeHolderWIMX} from "../../contracts/staking/StakeHolderWIMX.sol"; import {StakeHolderWIMXV2} from "../../contracts/staking/StakeHolderWIMXV2.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; @@ -51,7 +48,7 @@ contract StakeHolderUpgradeForkTest is Test { // It would fail if we were to run the test. return; } - console.log("Executing Staking Contract Upgrade Fork Test"); + //console.log("Executing Staking Contract Upgrade Fork Test"); stakingTokenAddress = stakeHolder.getToken(); assertEq(WIMX, stakingTokenAddress, "WIMX address incorrect prior to upgrade"); diff --git a/test/token/erc1155/ImmutableERC1155.t.sol b/test/token/erc1155/ImmutableERC1155.t.sol index f40d6d39..5d14161c 100644 --- a/test/token/erc1155/ImmutableERC1155.t.sol +++ b/test/token/erc1155/ImmutableERC1155.t.sol @@ -1,11 +1,10 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableERC1155} from "../../../contracts/token/erc1155/preset/ImmutableERC1155.sol"; import {IImmutableERC1155Errors} from "../../../contracts/errors/Errors.sol"; -import {OperatorAllowlistEnforcementErrors} from "../../../contracts/errors/Errors.sol"; import {OperatorAllowlistUpgradeable} from "../../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {Sign} from "../../utils/Sign.sol"; import {DeployOperatorAllowlist} from "../../utils/DeployAllowlistProxy.sol"; @@ -144,29 +143,29 @@ contract ImmutableERC1155Test is Test { assertEq(500, royaltyAmount); } - function test_DeploymentShouldSetAdminRoleToOwner() public { + function test_DeploymentShouldSetAdminRoleToOwner() public view { bytes32 adminRole = immutableERC1155.DEFAULT_ADMIN_ROLE(); assertTrue(immutableERC1155.hasRole(adminRole, owner)); } - function test_DeploymentShouldSetContractURI() public { + function test_DeploymentShouldSetContractURI() public view { assertEq(immutableERC1155.contractURI(), "test-contract-uri"); } - function test_DeploymentShouldSetBaseURI() public { + function test_DeploymentShouldSetBaseURI() public view { assertEq(immutableERC1155.baseURI(), "test-base-uri"); } - function test_DeploymentShouldSetUri() public { + function test_DeploymentShouldSetUri() public view { assertEq(immutableERC1155.uri(0), immutableERC1155.baseURI()); } - function test_DeploymentAllowlistShouldGiveAdminToOwner() public { + function test_DeploymentAllowlistShouldGiveAdminToOwner() public view { bytes32 adminRole = operatorAllowlist.DEFAULT_ADMIN_ROLE(); assertTrue(operatorAllowlist.hasRole(adminRole, owner)); } - function test_DeploymentShouldSetAllowlistToProxy() public { + function test_DeploymentShouldSetAllowlistToProxy() public view { assertEq(address(immutableERC1155.operatorAllowlist()), proxyAddr); } @@ -429,11 +428,11 @@ contract ImmutableERC1155Test is Test { /* * SupportsInterface */ - function test_SupportsInterface() public { + function test_SupportsInterface() public view { assertTrue(immutableERC1155.supportsInterface(0x9e3ae8e4)); } - function test_SupportsInterface_delegatesToSuper() public { + function test_SupportsInterface_delegatesToSuper() public view { assertTrue(immutableERC1155.supportsInterface(0x01ffc9a7)); //IERC165 } diff --git a/test/token/erc1155/ImmutableERC1155Costs.t.sol b/test/token/erc1155/ImmutableERC1155Costs.t.sol index 9d057d92..a4c7836a 100644 --- a/test/token/erc1155/ImmutableERC1155Costs.t.sol +++ b/test/token/erc1155/ImmutableERC1155Costs.t.sol @@ -1,11 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; import {ImmutableERC1155} from "../../../contracts/token/erc1155/preset/ImmutableERC1155.sol"; -import {IImmutableERC1155Errors} from "../../../contracts/errors/Errors.sol"; -import {OperatorAllowlistEnforcementErrors} from "../../../contracts/errors/Errors.sol"; import {OperatorAllowlistUpgradeable} from "../../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {Sign} from "../../utils/Sign.sol"; import {DeployOperatorAllowlist} from "../../utils/DeployAllowlistProxy.sol"; diff --git a/test/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.t.sol b/test/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.t.sol index 87e8c718..5d8326d0 100644 --- a/test/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.t.sol +++ b/test/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableERC20FixedSupplyNoBurn} from "contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol"; import {IImmutableERC20Errors} from "contracts/token/erc20/preset/Errors.sol"; @@ -25,7 +25,7 @@ contract ImmutableERC20FixedSupplyNoBurnTest is Test { erc20 = new ImmutableERC20FixedSupplyNoBurn(name, symbol, supply, treasurer, hubOwner); } - function testInit() public { + function testInit() public view { assertEq(erc20.name(), name, "name"); assertEq(erc20.symbol(), symbol, "symbol"); assertEq(erc20.totalSupply(), supply, "supply"); diff --git a/test/token/erc20/preset/ImmutableERC20MinterBurnerPermit.t.sol b/test/token/erc20/preset/ImmutableERC20MinterBurnerPermit.t.sol index 39bdcd0c..f1e45cbe 100644 --- a/test/token/erc20/preset/ImmutableERC20MinterBurnerPermit.t.sol +++ b/test/token/erc20/preset/ImmutableERC20MinterBurnerPermit.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableERC20MinterBurnerPermit} from "contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol"; import {IImmutableERC20Errors} from "contracts/token/erc20/preset/Errors.sol"; @@ -29,7 +29,7 @@ contract ImmutableERC20MinterBurnerPermitTest is Test { erc20 = new ImmutableERC20MinterBurnerPermit(admin, minter, hubOwner, name, symbol, maxSupply); } - function testInit() public { + function testInit() public view { assertEq(erc20.name(), name, "name"); assertEq(erc20.symbol(), symbol, "symbol"); bytes32 minterRole = erc20.MINTER_ROLE(); diff --git a/test/token/erc721/ERC721Base.t.sol b/test/token/erc721/ERC721Base.t.sol index 63516309..bc4db872 100644 --- a/test/token/erc721/ERC721Base.t.sol +++ b/test/token/erc721/ERC721Base.t.sol @@ -1,9 +1,9 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {OperatorAllowlistUpgradeable} from "../../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {DeployOperatorAllowlist} from "../../utils/DeployAllowlistProxy.sol"; @@ -78,6 +78,7 @@ abstract contract ERC721BaseTest is Test { function notOwnedRevertError(uint256 _tokenIdToBeBurned) public pure virtual returns (bytes memory); function calcFee(uint256 _salePrice) public view returns(uint96) { + // forge-lint: disable-next-line(unsafe-typecast) return uint96(feeNumerator * _salePrice / 10000); } diff --git a/test/token/erc721/ERC721ByQuantityBase.t.sol b/test/token/erc721/ERC721ByQuantityBase.t.sol index 5cf6ded3..134ddd20 100644 --- a/test/token/erc721/ERC721ByQuantityBase.t.sol +++ b/test/token/erc721/ERC721ByQuantityBase.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/token/erc721/ERC721ConfigBase.t.sol b/test/token/erc721/ERC721ConfigBase.t.sol index f179aa74..d63f36a9 100644 --- a/test/token/erc721/ERC721ConfigBase.t.sol +++ b/test/token/erc721/ERC721ConfigBase.t.sol @@ -1,8 +1,8 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {ERC721BaseTest} from "./ERC721Base.t.sol"; @@ -157,7 +157,7 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { erc721.setContractURI("New Contract URI"); } - function testSupportedInterfaces() public { + function testSupportedInterfaces() public view { // ERC165 assertTrue(erc721.supportsInterface(0x01ffc9a7)); // ERC721 diff --git a/test/token/erc721/ERC721ConfigByIdV1.t.sol b/test/token/erc721/ERC721ConfigByIdV1.t.sol index 9684f117..58172015 100644 --- a/test/token/erc721/ERC721ConfigByIdV1.t.sol +++ b/test/token/erc721/ERC721ConfigByIdV1.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/token/erc721/ERC721ConfigByQuantityBase.t.sol b/test/token/erc721/ERC721ConfigByQuantityBase.t.sol index deecb095..217e1f80 100644 --- a/test/token/erc721/ERC721ConfigByQuantityBase.t.sol +++ b/test/token/erc721/ERC721ConfigByQuantityBase.t.sol @@ -1,10 +1,10 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; import {ERC721ConfigBaseTest} from "./ERC721ConfigBase.t.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import {IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; abstract contract ERC721ConfigByQuantityBaseTest is ERC721ConfigBaseTest { IImmutableERC721ByQuantity public erc721BQ; diff --git a/test/token/erc721/ERC721ConfigByQuantityV1.t.sol b/test/token/erc721/ERC721ConfigByQuantityV1.t.sol index 6b2d6ea1..79598e67 100644 --- a/test/token/erc721/ERC721ConfigByQuantityV1.t.sol +++ b/test/token/erc721/ERC721ConfigByQuantityV1.t.sol @@ -1,11 +1,11 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; import {ERC721ConfigByQuantityBaseTest} from "./ERC721ConfigByQuantityBase.t.sol"; import {ImmutableERC721} from "../../../contracts/token/erc721/preset/ImmutableERC721.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; contract ERC721ConfigByQuantityV1Test is ERC721ConfigByQuantityBaseTest { diff --git a/test/token/erc721/ERC721ConfigByQuantityV2.t.sol b/test/token/erc721/ERC721ConfigByQuantityV2.t.sol index b9a3debc..c2d23b9b 100644 --- a/test/token/erc721/ERC721ConfigByQuantityV2.t.sol +++ b/test/token/erc721/ERC721ConfigByQuantityV2.t.sol @@ -1,11 +1,11 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; import {ERC721ConfigByQuantityBaseTest} from "./ERC721ConfigByQuantityBase.t.sol"; import {ImmutableERC721V2} from "../../../contracts/token/erc721/preset/ImmutableERC721V2.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; contract ERC721ConfigByQuantityV2Test is ERC721ConfigByQuantityBaseTest { diff --git a/test/token/erc721/ERC721OperationalBase.t.sol b/test/token/erc721/ERC721OperationalBase.t.sol index 3e742a9c..6f075e2c 100644 --- a/test/token/erc721/ERC721OperationalBase.t.sol +++ b/test/token/erc721/ERC721OperationalBase.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/token/erc721/ERC721OperationalByIdV1.t.sol b/test/token/erc721/ERC721OperationalByIdV1.t.sol index 92b4ef0e..da9ad7b5 100644 --- a/test/token/erc721/ERC721OperationalByIdV1.t.sol +++ b/test/token/erc721/ERC721OperationalByIdV1.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/token/erc721/ERC721OperationalByQuantityBase.t.sol b/test/token/erc721/ERC721OperationalByQuantityBase.t.sol index ee6ce7c8..8362a574 100644 --- a/test/token/erc721/ERC721OperationalByQuantityBase.t.sol +++ b/test/token/erc721/ERC721OperationalByQuantityBase.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; @@ -12,7 +12,7 @@ import {MockEIP1271Wallet} from "../../../contracts/mocks/MockEIP1271Wallet.sol" abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTest { IImmutableERC721ByQuantity public erc721BQ; - function testThreshold() public { + function testThreshold() public view { uint256 first = erc721BQ.mintBatchByQuantityThreshold(); assertTrue(first >= 2**128); } diff --git a/test/token/erc721/ERC721OperationalByQuantityV1.t.sol b/test/token/erc721/ERC721OperationalByQuantityV1.t.sol index ebf8f468..3671604d 100644 --- a/test/token/erc721/ERC721OperationalByQuantityV1.t.sol +++ b/test/token/erc721/ERC721OperationalByQuantityV1.t.sol @@ -1,11 +1,11 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; import {ERC721OperationalByQuantityBaseTest} from "./ERC721OperationalByQuantityBase.t.sol"; import {ImmutableERC721} from "../../../contracts/token/erc721/preset/ImmutableERC721.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; // Test the original ImmutableERC721 contract: Operational tests diff --git a/test/token/erc721/ERC721OperationalByQuantityV2.t.sol b/test/token/erc721/ERC721OperationalByQuantityV2.t.sol index 4a7f6198..6dee1334 100644 --- a/test/token/erc721/ERC721OperationalByQuantityV2.t.sol +++ b/test/token/erc721/ERC721OperationalByQuantityV2.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2025 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol b/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol index 4a4ab684..b27d2f3c 100644 --- a/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol +++ b/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol @@ -240,6 +240,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_cross_group_operations() public returns (bool) { uint256 groupSize = GROUP_SIZE; + // forge-lint: disable-next-line(divide-before-multiply) uint256 tokenId = (currentTokenId / groupSize) * groupSize; // Align to group boundary try this.mint(address(this), groupSize + 1) { @@ -352,6 +353,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { if (totalMinted == 0) return true; uint256 tokenId = currentTokenId % totalMinted; address originalOwner = tokenOwnersMap[tokenId]; + // forge-lint: disable-next-line(unsafe-typecast) address newOwner = address(uint160(currentTokenId % 100)); try this.transferFrom(originalOwner, newOwner, tokenId) { diff --git a/test/token/x/Asset.t.sol b/test/token/x/Asset.t.sol index b671983a..f7d64e36 100644 --- a/test/token/x/Asset.t.sol +++ b/test/token/x/Asset.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {Asset} from "../../../contracts/token/erc721/x/Asset.sol"; contract AssetTest is Test { diff --git a/test/trading/seaport/ImmutableSeaportBase.t.sol b/test/trading/seaport/ImmutableSeaportBase.t.sol index d093c92e..d6a972e6 100644 --- a/test/trading/seaport/ImmutableSeaportBase.t.sol +++ b/test/trading/seaport/ImmutableSeaportBase.t.sol @@ -1,23 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport/ImmutableSeaport.sol"; import {ImmutableSignedZone} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; -import {SIP7EventsAndErrors} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; import {ConduitController} from "seaport-core/src/conduit/ConduitController.sol"; import {Conduit} from "seaport-core/src/conduit/Conduit.sol"; -import {Consideration} from "seaport-core/src/lib/Consideration.sol"; -import {OrderParameters, OrderComponents, Order, AdvancedOrder, FulfillmentComponent, FulfillmentComponent, CriteriaResolver} from "seaport-types/src/lib/ConsiderationStructs.sol"; -import {ItemType, OrderType} from "seaport-types/src/lib/ConsiderationEnums.sol"; -import {ReceivedItem, SpentItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; - -import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - - - - abstract contract ImmutableSeaportBaseTest is Test { diff --git a/test/trading/seaport/ImmutableSeaportHarness.t.sol b/test/trading/seaport/ImmutableSeaportHarness.t.sol index 9f1cda4c..1ec0e38f 100644 --- a/test/trading/seaport/ImmutableSeaportHarness.t.sol +++ b/test/trading/seaport/ImmutableSeaportHarness.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport/ImmutableSeaportOperational.t.sol b/test/trading/seaport/ImmutableSeaportOperational.t.sol index d04d1147..b325f01b 100644 --- a/test/trading/seaport/ImmutableSeaportOperational.t.sol +++ b/test/trading/seaport/ImmutableSeaportOperational.t.sol @@ -4,18 +4,13 @@ pragma solidity ^0.8.13; import {ImmutableSeaportBaseTest} from "./ImmutableSeaportBase.t.sol"; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSeaportTestHelper} from "./ImmutableSeaportTestHelper.t.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport/ImmutableSeaport.sol"; -import {ImmutableSignedZone} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; import {SIP7EventsAndErrors} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; -import {ConduitController} from "seaport-core/src/conduit/ConduitController.sol"; -import {Conduit} from "seaport-core/src/conduit/Conduit.sol"; -import {Consideration} from "seaport-core/src/lib/Consideration.sol"; -import {OrderParameters, OrderComponents, Order, AdvancedOrder, FulfillmentComponent, FulfillmentComponent, CriteriaResolver} from "seaport-types/src/lib/ConsiderationStructs.sol"; -import {ItemType, OrderType} from "seaport-types/src/lib/ConsiderationEnums.sol"; -import {ConsiderationItem, OfferItem, ReceivedItem, SpentItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; +import {OrderParameters, OrderComponents, AdvancedOrder, CriteriaResolver} from "seaport-types/src/lib/ConsiderationStructs.sol"; +import {OrderType} from "seaport-types/src/lib/ConsiderationEnums.sol"; import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; @@ -224,7 +219,7 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } bytes memory signature = _signOrder(sellerPkey, orderHash); - AdvancedOrder memory order = AdvancedOrder(orderParams, 1, 1, signature, extraData); + AdvancedOrder memory order = AdvancedOrder({ parameters: orderParams, numerator: 1, denominator: 1, signature: signature, extraData: extraData }); return order; } } \ No newline at end of file diff --git a/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol b/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol index 923560d9..84682348 100644 --- a/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol +++ b/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol @@ -1,11 +1,11 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version pragma solidity ^0.8.17; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {ItemType, OrderType} from "seaport-types/src/lib/ConsiderationEnums.sol"; diff --git a/test/trading/seaport/ImmutableSeaportTestHelper.t.sol b/test/trading/seaport/ImmutableSeaportTestHelper.t.sol index 80766992..e947eac1 100644 --- a/test/trading/seaport/ImmutableSeaportTestHelper.t.sol +++ b/test/trading/seaport/ImmutableSeaportTestHelper.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol"; import {ZoneParameters, ConsiderationItem, OfferItem, ReceivedItem, SpentItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; diff --git a/test/trading/seaport/utils/IImmutableERC1155.t.sol b/test/trading/seaport/utils/IImmutableERC1155.t.sol index c32b7946..27dc3988 100644 --- a/test/trading/seaport/utils/IImmutableERC1155.t.sol +++ b/test/trading/seaport/utils/IImmutableERC1155.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport/utils/IImmutableERC721.t.sol b/test/trading/seaport/utils/IImmutableERC721.t.sol index 1156c98e..6682d52e 100644 --- a/test/trading/seaport/utils/IImmutableERC721.t.sol +++ b/test/trading/seaport/utils/IImmutableERC721.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol b/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol index f521d61b..ae445d0d 100644 --- a/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol +++ b/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2023 +// Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport/utils/SigningTestHelper.t.sol b/test/trading/seaport/utils/SigningTestHelper.t.sol index 33f56497..bd6699c5 100644 --- a/test/trading/seaport/utils/SigningTestHelper.t.sol +++ b/test/trading/seaport/utils/SigningTestHelper.t.sol @@ -1,11 +1,11 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version pragma solidity ^0.8.17; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; abstract contract SigningTestHelper is Test { function _sign(uint256 signerPrivateKey, bytes32 signatureDigest) internal pure returns (bytes memory) { diff --git a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol index 63e34715..70ccb4b8 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol @@ -1,13 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSeaportTestHelper} from "../../../ImmutableSeaportTestHelper.t.sol"; import {ImmutableSignedZone} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; import {SIP7EventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; import {SIP6EventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol"; -import {ZoneParameters, ReceivedItem, SpentItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; -import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol"; +import {ZoneParameters, ReceivedItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHelper { diff --git a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol index 74533aef..16a85164 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol @@ -1,9 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSignedZone} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; -import {SIP7EventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; @@ -23,7 +22,7 @@ contract ImmutableSignedZoneOwnershipTest is Test { vm.stopPrank(); } - function testDeployerBecomesOwner() public { + function testDeployerBecomesOwner() public view { assertEq(zone.owner(), owner); } diff --git a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol index ca7861ab..915b9d60 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSignedZone} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; import {SIP7EventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; diff --git a/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol index 85b5e699..80e6ff77 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol index c601f465..2700527e 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol @@ -1,11 +1,11 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version pragma solidity ^0.8.17; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol"; import {ReceivedItem, Schema, SpentItem, ZoneParameters} from "seaport-types/src/lib/ConsiderationStructs.sol"; diff --git a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol index 264fb57e..b6cfe368 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport16/ImmutableSeaportBase.t.sol b/test/trading/seaport16/ImmutableSeaportBase.t.sol index d47e394f..b3ad1b88 100644 --- a/test/trading/seaport16/ImmutableSeaportBase.t.sol +++ b/test/trading/seaport16/ImmutableSeaportBase.t.sol @@ -1,24 +1,13 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport16/ImmutableSeaport.sol"; import {ImmutableSignedZoneV3} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; -import {SIP7EventsAndErrors} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol"; import {ConduitController} from "seaport-core-16/src/conduit/ConduitController.sol"; import {Conduit} from "seaport-core-16/src/conduit/Conduit.sol"; -import {Consideration} from "seaport-core-16/src/lib/Consideration.sol"; -import {OrderParameters, OrderComponents, Order, AdvancedOrder, FulfillmentComponent, FulfillmentComponent, CriteriaResolver} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; -import {ItemType, OrderType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; -import {ReceivedItem, SpentItem} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; - -import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - - - - abstract contract ImmutableSeaportBaseTest is Test { diff --git a/test/trading/seaport16/ImmutableSeaportHarness.t.sol b/test/trading/seaport16/ImmutableSeaportHarness.t.sol index e74ea8c0..18e9b6d8 100644 --- a/test/trading/seaport16/ImmutableSeaportHarness.t.sol +++ b/test/trading/seaport16/ImmutableSeaportHarness.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport16/ImmutableSeaportOperational.t.sol b/test/trading/seaport16/ImmutableSeaportOperational.t.sol index 6e12d93e..d9f1c181 100644 --- a/test/trading/seaport16/ImmutableSeaportOperational.t.sol +++ b/test/trading/seaport16/ImmutableSeaportOperational.t.sol @@ -4,22 +4,13 @@ pragma solidity ^0.8.13; import {ImmutableSeaportBaseTest} from "./ImmutableSeaportBase.t.sol"; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ImmutableSeaportTestHelper} from "./ImmutableSeaportTestHelper.t.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport16/ImmutableSeaport.sol"; import {SIP7EventsAndErrors} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol"; - -import {ConduitController} from "seaport-core-16/src/conduit/ConduitController.sol"; -import {Conduit} from "seaport-core-16/src/conduit/Conduit.sol"; -import {Consideration} from "seaport-core-16/src/lib/Consideration.sol"; -import {OrderParameters, OrderComponents, Order, AdvancedOrder, FulfillmentComponent, FulfillmentComponent, CriteriaResolver} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; -import {ItemType, OrderType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; -import {ConsiderationItem, OfferItem, ReceivedItem, SpentItem} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; - -import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - - +import {OrderParameters, OrderComponents, AdvancedOrder, CriteriaResolver} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; +import {OrderType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; contract TestERC721 is ERC721("Test721", "TST721") { @@ -223,7 +214,7 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } bytes memory signature = _signOrder(sellerPkey, orderHash); - AdvancedOrder memory order = AdvancedOrder(orderParams, 1, 1, signature, extraData); + AdvancedOrder memory order = AdvancedOrder( parameters: orderParams, numerator: 1, denominator: 1, signature: signature, extraData: extraData }); return order; } } \ No newline at end of file diff --git a/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol b/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol index d2ab6fc1..3061d2c4 100644 --- a/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol +++ b/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol @@ -1,11 +1,11 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version pragma solidity ^0.8.17; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {ItemType, OrderType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; @@ -270,13 +270,14 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper // mints vm.prank(OWNER); - erc20Token.transfer( + bool success = erc20Token.transfer( FULFILLER, ( considerationItems[0].startAmount + considerationItems[1].startAmount + considerationItems[2].startAmount + considerationItems[3].startAmount ) ); + require(success, "Unexpectedly, ERC20 transfer failed"); vm.prank(OWNER); erc721Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria); @@ -450,13 +451,14 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper // mints vm.prank(OWNER); - erc20Token.transfer( + bool success = erc20Token.transfer( FULFILLER, ( considerationItems[0].startAmount + considerationItems[1].startAmount + considerationItems[2].startAmount + considerationItems[3].startAmount ) / 100 ); + require(success, "Unexpectedly, ERC20 transfer failed"); vm.prank(OWNER); erc1155Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria, offerItems[0].startAmount, new bytes(0)); @@ -634,13 +636,14 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper // mints vm.prank(OWNER); - erc20Token.transfer( + bool success = erc20Token.transfer( FULFILLER, ( considerationItems[0].startAmount + considerationItems[1].startAmount + considerationItems[2].startAmount + considerationItems[3].startAmount ) * 2 / 100 ); + require(success, "Unexpectedly, ERC20 transfer failed"); vm.prank(OWNER); erc1155Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria, offerItems[0].startAmount, new bytes(0)); @@ -846,22 +849,26 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper }); // mints - vm.prank(OWNER); - erc20Token.transfer( - FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) / 2 - ); - vm.prank(OWNER); - erc20Token.transfer( - FULFILLER_TWO, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) - ); + { + vm.prank(OWNER); + erc20Token.transfer( + FULFILLER, + ( + considerationItems[0].startAmount + considerationItems[1].startAmount + + considerationItems[2].startAmount + considerationItems[3].startAmount + ) / 2 + ); + } + { + vm.prank(OWNER); + erc20Token.transfer( + FULFILLER_TWO, + ( + considerationItems[0].startAmount + considerationItems[1].startAmount + + considerationItems[2].startAmount + considerationItems[3].startAmount + ) + ); + } vm.prank(OWNER); erc1155Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria, offerItems[0].startAmount, new bytes(0)); diff --git a/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol b/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol index 0a451f6c..8f3298eb 100644 --- a/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol +++ b/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.13; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {SigningTestHelper} from "./utils/SigningTestHelper.t.sol"; import {ItemType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; diff --git a/test/trading/seaport16/utils/MockTransferValidator.t.sol b/test/trading/seaport16/utils/MockTransferValidator.t.sol index c2d129f0..d88416aa 100644 --- a/test/trading/seaport16/utils/MockTransferValidator.t.sol +++ b/test/trading/seaport16/utils/MockTransferValidator.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport16/utils/SigningTestHelper.t.sol b/test/trading/seaport16/utils/SigningTestHelper.t.sol index 33f56497..bd6699c5 100644 --- a/test/trading/seaport16/utils/SigningTestHelper.t.sol +++ b/test/trading/seaport16/utils/SigningTestHelper.t.sol @@ -1,11 +1,11 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2024 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version pragma solidity ^0.8.17; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; abstract contract SigningTestHelper is Test { function _sign(uint256 signerPrivateKey, bytes32 signatureDigest) internal pure returns (bytes memory) { diff --git a/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol b/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol index e051556e..ca2bf26a 100644 --- a/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol +++ b/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version diff --git a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol index 4783a389..50bdd8a3 100644 --- a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol +++ b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol @@ -1,11 +1,11 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version pragma solidity ^0.8.17; // solhint-disable-next-line no-global-import -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {ItemType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; import {ReceivedItem, Schema, SpentItem, ZoneParameters} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; diff --git a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol index 351791db..59caebdf 100644 --- a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol +++ b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol @@ -1,4 +1,4 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2025 +// Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 // solhint-disable-next-line compiler-version diff --git a/test/utils/DeployAllowlistProxy.sol b/test/utils/DeployAllowlistProxy.sol index c3f1d723..54292d4a 100644 --- a/test/utils/DeployAllowlistProxy.sol +++ b/test/utils/DeployAllowlistProxy.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {OperatorAllowlistUpgradeable} from "../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; /// Deploys the OperatorAllowlistUpgradeable contract behind an ERC1967 Proxy and returns the address of the proxy diff --git a/test/utils/DeploySCW.sol b/test/utils/DeploySCW.sol index e9ce75b5..f974d106 100644 --- a/test/utils/DeploySCW.sol +++ b/test/utils/DeploySCW.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; import {MockWallet} from "../../contracts/mocks/MockWallet.sol"; import {MockWalletFactory} from "../../contracts/mocks/MockWalletFactory.sol"; diff --git a/test/utils/Sign.sol b/test/utils/Sign.sol index 27eef81c..2d69ba42 100644 --- a/test/utils/Sign.sol +++ b/test/utils/Sign.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; -import "forge-std/Test.sol"; +import {Test} from "forge-std/Test.sol"; contract Sign { bytes32 private _DOMAIN_SEPARATOR; From 6ff673941042d35946365ca31096d12b907b002a Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Fri, 22 May 2026 16:03:16 +1000 Subject: [PATCH 2/9] More linter changes --- .../OperatorAllowlistUpgradeable.sol | 6 +- .../deployer/create/OwnableCreateDeploy.sol | 2 +- contracts/mocks/MockWalletFactory.sol | 2 +- contracts/multicall/GuardedMulticaller2.sol | 2 +- contracts/staking/StakeHolderNative.sol | 2 +- contracts/staking/StakeHolderNativeV2.sol | 2 +- .../token/erc721/erc721psi/ERC721Psi.sol | 4 +- .../token/erc721/erc721psi/ERC721PsiV2.sol | 4 +- .../v1/ImmutableSignedZone.sol | 2 +- .../v2/ImmutableSignedZoneV2.sol | 2 +- .../v3/ImmutableSignedZoneV3.sol | 2 +- foundry.toml | 12 + script/bridge/x/v4/DeployRegistrationV4.s.sol | 22 - .../bridge/x/v4/DeployRegistrationV4Dev.s.sol | 22 - .../x/v4/DeployRegistrationV4Sandbox.s.sol | 22 - test/bridge/x/v4/MockCoreV4.sol | 450 ------------------ test/bridge/x/v4/README.md | 28 -- test/bridge/x/v4/RegistrationV4.t.sol | 444 ----------------- test/multicall/SigUtils.t.sol | 2 +- test/payment-splitter/PaymentSplitter.t.sol | 8 +- test/staking/StakeHolderAttackWallet2.sol | 2 +- test/staking/StakeHolderInitBase.t.sol | 8 +- test/staking/StakeHolderInitBaseV2.t.sol | 2 +- test/staking/StakeHolderUpgradeForkTest.t.sol | 1 + .../token/erc1155/ImmutableERC1155Costs.t.sol | 1 + .../ERC721OperationalByQuantityV1.t.sol | 1 + .../seaport/ImmutableSeaportOperational.t.sol | 4 +- .../ImmutableSeaportOperational.t.sol | 3 +- 28 files changed, 44 insertions(+), 1018 deletions(-) delete mode 100644 script/bridge/x/v4/DeployRegistrationV4.s.sol delete mode 100644 script/bridge/x/v4/DeployRegistrationV4Dev.s.sol delete mode 100644 script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol delete mode 100644 test/bridge/x/v4/MockCoreV4.sol delete mode 100644 test/bridge/x/v4/README.md delete mode 100644 test/bridge/x/v4/RegistrationV4.t.sol diff --git a/contracts/allowlist/OperatorAllowlistUpgradeable.sol b/contracts/allowlist/OperatorAllowlistUpgradeable.sol index 84b5c38a..a6963fe7 100644 --- a/contracts/allowlist/OperatorAllowlistUpgradeable.sol +++ b/contracts/allowlist/OperatorAllowlistUpgradeable.sol @@ -102,7 +102,7 @@ contract OperatorAllowlistUpgradeable is // get bytecode of wallet bytes32 codeHash; // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { codeHash := extcodehash(walletAddr) } bytecodeAllowlist[codeHash] = true; @@ -122,7 +122,7 @@ contract OperatorAllowlistUpgradeable is // get bytecode of wallet bytes32 codeHash; // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { codeHash := extcodehash(walletAddr) } delete bytecodeAllowlist[codeHash]; @@ -147,7 +147,7 @@ contract OperatorAllowlistUpgradeable is // Check if caller is a Allowlisted smart contract wallet bytes32 codeHash; // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { codeHash := extcodehash(target) } if (bytecodeAllowlist[codeHash]) { diff --git a/contracts/deployer/create/OwnableCreateDeploy.sol b/contracts/deployer/create/OwnableCreateDeploy.sol index 1b86ffb2..a91c78ce 100644 --- a/contracts/deployer/create/OwnableCreateDeploy.sol +++ b/contracts/deployer/create/OwnableCreateDeploy.sol @@ -26,7 +26,7 @@ contract OwnableCreateDeploy { // solhint-disable-next-line custom-errors, reason-string require(msg.sender == OWNER, "CreateDeploy: caller is not the owner"); // solhint-disable no-inline-assembly - assembly { + assembly ("memory-safe") { if iszero(create(callvalue(), add(bytecode, 32), mload(bytecode))) { revert(0, 0) } diff --git a/contracts/mocks/MockWalletFactory.sol b/contracts/mocks/MockWalletFactory.sol index fd3be5bf..70130639 100644 --- a/contracts/mocks/MockWalletFactory.sol +++ b/contracts/mocks/MockWalletFactory.sol @@ -21,7 +21,7 @@ contract MockWalletFactory { function deploy(address _mainModule, bytes32 _salt) public payable returns (address _contract) { bytes memory code = abi.encodePacked(WALLET_CREATION_CODE, uint256(uint160(_mainModule))); // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { _contract := create2(callvalue(), add(code, 32), mload(code), _salt) } // check deployment success diff --git a/contracts/multicall/GuardedMulticaller2.sol b/contracts/multicall/GuardedMulticaller2.sol index d55c6d5f..c5294d2d 100644 --- a/contracts/multicall/GuardedMulticaller2.sol +++ b/contracts/multicall/GuardedMulticaller2.sol @@ -166,7 +166,7 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { revert FailedCall(_calls[i], returnData); } // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { // The easiest way to bubble the revert reason is using memory via assembly revert(add(returnData, 32), mload(returnData)) } diff --git a/contracts/staking/StakeHolderNative.sol b/contracts/staking/StakeHolderNative.sol index a01cd3d8..cd473794 100644 --- a/contracts/staking/StakeHolderNative.sol +++ b/contracts/staking/StakeHolderNative.sol @@ -37,7 +37,7 @@ contract StakeHolderNative is StakeHolderBase { // Revert reasons should contain an error selector, which is four bytes long. if (returndata.length >= 4) { // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } diff --git a/contracts/staking/StakeHolderNativeV2.sol b/contracts/staking/StakeHolderNativeV2.sol index 0fd72621..c8c5deec 100644 --- a/contracts/staking/StakeHolderNativeV2.sol +++ b/contracts/staking/StakeHolderNativeV2.sol @@ -38,7 +38,7 @@ contract StakeHolderNativeV2 is StakeHolderBaseV2 { // Revert reasons should contain an error selector, which is four bytes long. if (returndata.length >= 4) { // solhint-disable-next-line no-inline-assembly - assembly { + assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } diff --git a/contracts/token/erc721/erc721psi/ERC721Psi.sol b/contracts/token/erc721/erc721psi/ERC721Psi.sol index 7bc50201..569c93b1 100644 --- a/contracts/token/erc721/erc721psi/ERC721Psi.sol +++ b/contracts/token/erc721/erc721psi/ERC721Psi.sol @@ -312,7 +312,7 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. - assembly { + assembly ("memory-safe") { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. @@ -418,7 +418,7 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { if (reason.length == 0) { revert("ERC721Psi: transfer to non ERC721Receiver implementer"); } else { - assembly { + assembly ("memory-safe") { revert(add(32, reason), mload(reason)) } } diff --git a/contracts/token/erc721/erc721psi/ERC721PsiV2.sol b/contracts/token/erc721/erc721psi/ERC721PsiV2.sol index e81a26aa..8e08f895 100644 --- a/contracts/token/erc721/erc721psi/ERC721PsiV2.sol +++ b/contracts/token/erc721/erc721psi/ERC721PsiV2.sol @@ -279,7 +279,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. - assembly { + assembly ("memory-safe") { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(_to, _BITMASK_ADDRESS) // Emit the `Transfer` event. @@ -402,7 +402,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { if (reason.length == 0) { revert("ERC721Psi: transfer to non ERC721Receiver implementer"); } else { - assembly { + assembly ("memory-safe") { revert(add(32, reason), mload(reason)) } } diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol index 04dd42e7..5c04b75d 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol @@ -164,7 +164,7 @@ contract ImmutableSignedZone is } // Set the signer info. - _signers[signer] = SignerInfo(active: true, previouslyActive: true); + _signers[signer] = SignerInfo(true, true); // Emit an event that the signer was added. emit SignerAdded(signer); diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol index 42cc8546..e8239595 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol @@ -148,7 +148,7 @@ contract ImmutableSignedZoneV2 is } // Set the signer info. - _signers[signer] = SignerInfo(active: true, previouslyActive: true); + _signers[signer] = SignerInfo(true, true); // Emit an event that the signer was added. emit SignerAdded(signer); diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol index c169164f..bd0e9ebe 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol @@ -170,7 +170,7 @@ contract ImmutableSignedZoneV3 is } // Set the signer info. - _signers[signer] = SignerInfo(active: true, previouslyActive: true); + _signers[signer] = SignerInfo(true, true); // Emit an event that the signer was added. emit SignerAdded(signer); diff --git a/foundry.toml b/foundry.toml index cbeb5e24..2ee4f6ba 100644 --- a/foundry.toml +++ b/foundry.toml @@ -5,7 +5,19 @@ out = 'foundry-out' libs = ["lib"] fs_permissions = [{ access = "read", path = "./foundry-out" }] +# Error 2424: This suppresses the "Natspec memory-safe-assembly special comment for inline assembly" +# warning. At present, there appears to be not other to suppress this warning. +# The warning is being generated because libraries used by this repo are not compliant. +# Error 3860: The is related to the size of init code fragments, and was being applied to +# test code as well as production code. There is, unfortunatley, no was to disable this +# just for test code. +# Error 5574: Code size too large +# Error 2394: Transient storage used in Seaport. +ignored_error_codes = [2424, 3860, 5574, 2394] + + [lint] +# For list of linting rules see https://www.getfoundry.sh/forge/linting exclude_lints = ["mixed-case-function","mixed-case-variable","asm-keccak256"] # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/script/bridge/x/v4/DeployRegistrationV4.s.sol b/script/bridge/x/v4/DeployRegistrationV4.s.sol deleted file mode 100644 index a610bd83..00000000 --- a/script/bridge/x/v4/DeployRegistrationV4.s.sol +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2026 -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import {RegistrationV4} from "../../../../contracts/bridge/x/v4/RegistrationV4.sol"; -import {Script} from "forge-std/Script.sol"; - -contract DeployRegistrationV4 is Script { - address public MAINNET_CONTRACT = 0x5FDCCA53617f4d2b9134B29090C87D01058e27e9; - uint256 private MAINNET_CHAIN_ID = 1; - - RegistrationV4 public registration; - - function run() external returns (RegistrationV4) { - require(block.chainid == MAINNET_CHAIN_ID, "wrong chain id, please use mainnet chain"); - - vm.startBroadcast(); - registration = new RegistrationV4(payable(MAINNET_CONTRACT)); - vm.stopBroadcast(); - return registration; - } -} diff --git a/script/bridge/x/v4/DeployRegistrationV4Dev.s.sol b/script/bridge/x/v4/DeployRegistrationV4Dev.s.sol deleted file mode 100644 index 99304201..00000000 --- a/script/bridge/x/v4/DeployRegistrationV4Dev.s.sol +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2026 -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import {RegistrationV4} from "../../../../contracts/bridge/x/v4/RegistrationV4.sol"; -import {Script} from "forge-std/Script.sol"; - -contract DeployRegistrationV4Dev is Script { - address public DEV_CONTRACT = 0x590C809bd5FF50DCb39e4320b60139B29B880174; - uint256 private SEPOLIA_CHAIN_ID = 11155111; - - RegistrationV4 public registration; - - function run() external returns (RegistrationV4) { - require(block.chainid == SEPOLIA_CHAIN_ID, "wrong chain id, please use sepolia chain"); - - vm.startBroadcast(); - registration = new RegistrationV4(payable(DEV_CONTRACT)); - vm.stopBroadcast(); - return registration; - } -} diff --git a/script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol b/script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol deleted file mode 100644 index 679bb760..00000000 --- a/script/bridge/x/v4/DeployRegistrationV4Sandbox.s.sol +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2026 -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import {RegistrationV4} from "../../../../contracts/bridge/x/v4/RegistrationV4.sol"; -import {Script} from "forge-std/Script.sol"; - -contract DeployRegistrationV4Sandbox is Script { - address public SANDBOX_CONTRACT = 0x2d5C349fD8464DA06a3f90b4B0E9195F3d1b7F98; - uint256 private SEPOLIA_CHAIN_ID = 11155111; - - RegistrationV4 public registration; - - function run() external returns (RegistrationV4) { - require(block.chainid == SEPOLIA_CHAIN_ID, "wrong chain id, please use sepolia chain"); - - vm.startBroadcast(); - registration = new RegistrationV4(payable(SANDBOX_CONTRACT)); - vm.stopBroadcast(); - return registration; - } -} diff --git a/test/bridge/x/v4/MockCoreV4.sol b/test/bridge/x/v4/MockCoreV4.sol deleted file mode 100644 index 8e358c0d..00000000 --- a/test/bridge/x/v4/MockCoreV4.sol +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2026 -// SPDX-License-Identifier: MIT -pragma solidity >=0.8.19 <0.8.29; - -import {CoreV4} from "../../../../contracts/bridge/x/v4/CoreV4.sol"; -import {Asset} from "../../../../contracts/token/erc721/x/Asset.sol"; -import {Minting} from "../../../../contracts/token/erc721/x/utils/Minting.sol"; - -contract MockCoreV4 is CoreV4 { - address internal ZERO_ADDRESS = address(0); - - // Mapping from STARK public key to the Ethereum public key of its owner. - mapping(uint256 => address) internal ethKeys; // NOLINT: uninitialized-state. - - // Pending withdrawals. - // A map STARK key => asset id => quantized amount. - mapping(uint256 => mapping(uint256 => uint256)) internal pendingWithdrawals; - - uint256 internal constant MASK_ADDRESS = (1 << 160) - 1; - - // Pending withdrawals. - // A map asset type => contract address. - mapping(uint256 => address) internal tokenContracts; - - fallback() external payable { - revert(); - } - - function VERSION() external pure override returns (string memory) { - return "4.0.1"; - } - - function initialize(bytes memory) external pure override { - revert("Not implemented"); - } - - receive() external payable { - revert(); - } - - function DEPOSIT_CANCEL_DELAY() external pure override returns (uint256) { - return 0; - } - - function FREEZE_GRACE_PERIOD() external pure override returns (uint256) { - return 0; - } - - function MAIN_GOVERNANCE_INFO_TAG() external pure override returns (string memory) { - return "governance_info"; - } - - function MAX_FORCED_ACTIONS_REQS_PER_BLOCK() external pure override returns (uint256) { - return 0; - } - - function MAX_VERIFIER_COUNT() external pure override returns (uint256) { - return 0; - } - - function UNFREEZE_DELAY() external pure override returns (uint256) { - return 0; - } - - function VERIFIER_REMOVAL_DELAY() external pure override returns (uint256) { - return 0; - } - - function announceAvailabilityVerifierRemovalIntent(address) external pure override { - revert("Not implemented"); - } - - function announceVerifierRemovalIntent(address) external pure override { - revert("Not implemented"); - } - - function getRegisteredAvailabilityVerifiers() external pure override returns (address[] memory _verifers) { - // Placeholder implementation, returning an empty array - address[] memory verifiers; - return verifiers; - } - - function getRegisteredVerifiers() external pure override returns (address[] memory _verifers) { - // Placeholder implementation, returning an empty array - address[] memory verifiers; - return verifiers; - } - - function isAvailabilityVerifier(address) external pure override returns (bool) { - return false; - } - - function isFrozen() external pure override returns (bool) { - return false; - } - - function isVerifier(address) external pure override returns (bool) { - return false; - } - - function mainAcceptGovernance() external pure override { - revert("Not implemented"); - } - - function mainCancelNomination() external pure override { - revert("Not implemented"); - } - - function mainIsGovernor(address) external pure override returns (bool) { - return false; - } - - function mainNominateNewGovernor(address) external pure override { - revert("Not implemented"); - } - - function mainRemoveGovernor(address) external pure override { - revert("Not implemented"); - } - - function registerAvailabilityVerifier(address, string memory) external pure override { - revert("Not implemented"); - } - - function registerVerifier(address, string memory) external pure override { - revert("Not implemented"); - } - - function removeAvailabilityVerifier(address) external pure override { - revert("Not implemented"); - } - - function removeVerifier(address) external pure override { - revert("Not implemented"); - } - - function unFreeze() external pure override { - revert("Not implemented"); - } - - function defaultVaultWithdrawalLock() external pure override returns (uint256) { - return 0; - } - - function deposit(uint256, uint256, uint256) external payable override { - revert("Not implemented"); - } - - function deposit(uint256, uint256, uint256, uint256) external pure override { - revert("Not implemented"); - } - - function depositCancel(uint256, uint256, uint256) external pure override { - revert("Not implemented"); - } - - function depositERC20(uint256, uint256, uint256, uint256) external pure override { - revert("Not implemented"); - } - - function depositEth(uint256, uint256, uint256) external payable override { - revert("Not implemented"); - } - - function depositNft(uint256, uint256, uint256, uint256) external pure override { - revert("Not implemented"); - } - - function depositNftReclaim(uint256, uint256, uint256, uint256) external pure override { - revert("Not implemented"); - } - - function depositReclaim(uint256, uint256, uint256) external pure override { - revert("Not implemented"); - } - - function getActionCount() external pure override returns (uint256) { - return 0; - } - - function getActionHashByIndex(uint256) external pure override returns (bytes32) { - revert("Not implemented"); - } - - function getAssetInfo(uint256) external pure override returns (bytes memory) { - revert("Not implemented"); - } - - function getCancellationRequest(uint256, uint256, uint256) external pure override returns (uint256) { - revert("Not implemented"); - } - - function getDepositBalance(uint256, uint256, uint256) external pure override returns (uint256) { - revert("Not implemented"); - } - - function getEthKey(uint256 ownerKey) public view override returns (address) { - address registeredEth = ethKeys[ownerKey]; - - if (registeredEth != address(0x0)) { - return registeredEth; - } - - return ownerKey == (ownerKey & MASK_ADDRESS) ? address(uint160(ownerKey)) : address(0x0); - } - - function getFullWithdrawalRequest(uint256, uint256) external pure override returns (uint256) { - revert("Not implemented"); - } - - function getQuantizedDepositBalance(uint256, uint256, uint256) external pure override returns (uint256) { - revert("Not implemented"); - } - - function getQuantum(uint256) external pure override returns (uint256) { - revert("Not implemented"); - } - - function addWithdrawalBalance(uint256 ownerKey, uint256 assetId, uint256 balance) external { - pendingWithdrawals[ownerKey][assetId] += balance; - } - - function getWithdrawalBalance(uint256 ownerKey, uint256 assetId) external view override returns (uint256) { - return pendingWithdrawals[ownerKey][assetId]; - } - - function isAssetRegistered(uint256) external pure override returns (bool) { - revert("Not implemented"); - } - - function isTokenAdmin(address) external pure override returns (bool) { - revert("Not implemented"); - } - - function onERC721Received(address, address, uint256, bytes memory) external pure override returns (bytes4) { - return this.onERC721Received.selector; - } - - function orderRegistryAddress() external pure override returns (address) { - revert("Not implemented"); - } - - function registerAndDepositERC20(address, uint256, bytes memory, uint256, uint256, uint256) - external - pure - override - { - revert("Not implemented"); - } - - function registerAndDepositEth(address, uint256, bytes memory, uint256, uint256) external payable override { - revert("Not implemented"); - } - - function registerEthAddress(address ethKey, uint256 starkKey, bytes memory starkSignature) external override { - // Validate keys and availability. - require(starkKey != 0, "INVALID_STARK_KEY"); - require(ethKey != ZERO_ADDRESS, "INVALID_ETH_ADDRESS"); - require(ethKeys[starkKey] == ZERO_ADDRESS, "STARK_KEY_UNAVAILABLE"); - require(starkSignature.length == 32 * 3, "INVALID_STARK_SIGNATURE_LENGTH"); - - // Update state. - ethKeys[starkKey] = ethKey; - - // Log new user. - emit LogUserRegistered(ethKey, starkKey, msg.sender); - } - - function registerSender(uint256, bytes memory) external pure override { - revert("Not implemented"); - } - - function registerToken(uint256, bytes memory) external pure override { - revert("Not implemented"); - } - - function addTokenContract(uint256 assetType, address tokenContract) external { - tokenContracts[assetType] = tokenContract; - } - - function registerToken(uint256, bytes memory, uint256) external pure override { - revert("Not implemented"); - } - - function registerTokenAdmin(address) external pure override { - revert("Not implemented"); - } - - function unregisterTokenAdmin(address) external pure override { - revert("Not implemented"); - } - - function withdraw(uint256 ownerKey, uint256 assetType) external override { - address payable recipient = payable(getEthKey(ownerKey)); - require(recipient != ZERO_ADDRESS, "USER_UNREGISTERED"); - uint256 assetId = assetType; - // Fetch and clear quantized amount. - uint256 amount = pendingWithdrawals[ownerKey][assetId]; - pendingWithdrawals[ownerKey][assetId] = 0; - - // Transfer funds. - (bool success,) = recipient.call{value: amount}(""); // NOLINT: low-level-calls. - require(success, "TRANSFER_ERROR"); - emit LogWithdrawalPerformed(ownerKey, assetType, amount, amount, recipient); - } - - function withdrawAndMint(uint256 ownerKey, uint256 assetType, bytes calldata mintingBlob) external override { - address payable recipient = payable(getEthKey(ownerKey)); - require(recipient != ZERO_ADDRESS, "USER_UNREGISTERED"); - - (uint256 tokenId,) = Minting.split(mintingBlob); - uint256 assetId = assetType + tokenId; - uint256 amount = pendingWithdrawals[ownerKey][assetId]; - pendingWithdrawals[ownerKey][assetId] = 0; - require(amount == 1, "INVALID_AMOUNT"); - - // Make sure we don't accidentally burn funds. - require(recipient != address(0x0), "INVALID_RECIPIENT"); - address tokenAddress = tokenContracts[assetType]; - require(tokenAddress != address(0x0), "INVALID_CONTRACT"); - - Asset(tokenAddress).mintFor(address(recipient), amount, mintingBlob); - } - - function withdrawNft(uint256 ownerKey, uint256 assetType, uint256 tokenId) external override { - uint256 assetId = assetType + tokenId; - - address payable recipient = payable(getEthKey(ownerKey)); - require(recipient != ZERO_ADDRESS, "USER_UNREGISTERED"); - - uint256 amount = pendingWithdrawals[ownerKey][assetId]; - pendingWithdrawals[ownerKey][assetId] = 0; - - require(amount == 1, "INVALID_AMOUNT"); - - // Transfer funds. - transferOutNft(recipient, assetType, tokenId); - - emit LogNftWithdrawalPerformed(ownerKey, assetType, tokenId, assetId, recipient); - } - - function transferOutNft(address recipient, uint256 assetType, uint256 tokenId) internal { - // Make sure we don't accidentally burn funds. - require(recipient != address(0x0), "INVALID_RECIPIENT"); - address tokenAddress = tokenContracts[assetType]; - require(tokenAddress != address(0x0), "INVALID_CONTRACT"); - - Asset(tokenAddress).safeTransferFrom(address(this), recipient, tokenId); - } - - function STARKEX_MAX_DEFAULT_VAULT_LOCK() external pure override returns (uint256) { - return 0; - } - - function escape(uint256, uint256, uint256, uint256) external pure override { - revert("Not implemented"); - } - - function getLastBatchId() external pure override returns (uint256) { - return 0; - } - - function getOrderRoot() external pure override returns (uint256) { - return 0; - } - - function getOrderTreeHeight() external pure override returns (uint256) { - return 0; - } - - function getSequenceNumber() external pure override returns (uint256) { - return 0; - } - - function getVaultRoot() external pure override returns (uint256) { - return 0; - } - - function getVaultTreeHeight() external pure override returns (uint256) { - return 0; - } - - function isOperator(address) external pure override returns (bool) { - return false; - } - - function registerOperator(address) external pure override { - revert("Not implemented"); - } - - function unregisterOperator(address) external pure override { - revert("Not implemented"); - } - - function updateState(uint256[] memory, uint256[] memory) external pure override { - revert("Not implemented"); - } - - function freezeRequest(uint256, uint256) external pure override { - revert("Not implemented"); - } - - function fullWithdrawalRequest(uint256, uint256) external pure override { - revert("Not implemented"); - } - - function depositERC20ToVault(uint256, uint256, uint256) external pure { - revert("Not implemented"); - } - - function depositEthToVault(uint256, uint256) external payable { - revert("Not implemented"); - } - - function getQuantizedVaultBalance(address, uint256, uint256) external pure returns (uint256) { - revert("Not implemented"); - } - - function getVaultBalance(address, uint256, uint256) external pure returns (uint256) { - revert("Not implemented"); - } - - function getVaultWithdrawalLock(address, uint256, uint256) external pure returns (uint256) { - revert("Not implemented"); - } - - function isStrictVaultBalancePolicy() external pure returns (bool) { - revert("Not implemented"); - } - - function isVaultLocked(address, uint256, uint256) external pure returns (bool) { - revert("Not implemented"); - } - - function lockVault(uint256, uint256, uint256) external pure { - revert("Not implemented"); - } - - function setDefaultVaultWithdrawalLock(uint256) external pure { - revert("Not implemented"); - } - - function updateImplementationActivationTime(address, bytes memory, bool) external pure { - revert("Not implemented"); - } - - function withdrawFromVault(uint256, uint256, uint256) external pure { - revert("Not implemented"); - } -} diff --git a/test/bridge/x/v4/README.md b/test/bridge/x/v4/README.md deleted file mode 100644 index a45f84d3..00000000 --- a/test/bridge/x/v4/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Test Plan for Starkex Registration V4 contracts - -## [RegistrationV4.t.sol](./RegistrationV4.t.sol) - -Initialize testing: - -| Test name | Description | Happy Case | Implemented | -|---------------------------------|------------------------------------------------------------|------------|-------------| -| testGetVersion | Checks if the tests are using the correct starkex version. | Yes | Yes | - - -Operational tests: - -| Test name | Description | Happy Case | Implemented | -|-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|-------------| -| testCompleteWithdrawalAll_WhenUserIsRegistered | Test path where user can claim 2 withdrawals that were prepared using different ownerKeys (ethKey and starkKey) all at once for a registered user. | Yes | Yes | -| testCompleteWithdrawalAll_WhenUserIsRegisteredAndHasEthKeyBalanceOnly | Test path where user can claim a withdrawal that were prepared using their ethKey for a registered user. | Yes | Yes | -| testCompleteWithdrawalAll_WhenUserIsRegisteredAndHasStarkKeyBalanceOnly | Test path where user can claim a withdrawal that were prepared using their starkKey for a registered user. | Yes | Yes | -| testShouldFailWithdrawalAll_WhenUserIsNotRegistered | Test path that reverts if user tries to claim 2 withdrawals that were prepared using different ownerKeys (ethKey and starkKey) for an unregistered starkKey. | No | Yes | -| testShouldFailWithdrawalAll_WhenUserDoesNotHaveFundsToWithdraw | Test path that reverts if user tries to claim 2 withdrawals that were never prepared. | No | Yes | -| testCompleteWithdrawalV4_WhenUserIsNotRegistered | Test path where user tries to claim a withdrawal that were prepared using their ethKey as their ownerKey unregistered user starkKey. | Yes | Yes | -| testRegisterAndCompleteWithdrawalAll_WhenUserIsNotRegistered | Test path where user can perform on-chain registration and claim 2 withdrawals that were prepared using different ownerKeys (ethKey and starkKey) all at once for an unregistered user. | Yes | Yes | -| testRegister_WhenUserIsNotRegistered | Test path where user can perform on-chain registration for an unregistered user. | Yes | Yes | -| testRegisterAndCompleteWithdrawalAll_WhenUserIsRegistered | Test path where user can perform on-chain registration and claim 2 withdrawals that were prepared using different ownerKeys (ethKey and starkKey) all at once for a registered user. | Yes | Yes | -| testRegisterAndWithdrawalNFT_WhenUserIsNotRegistered | Test path where user can perform on-chain registration and claim an NFT withdrawal all at once for an unregistered user. | Yes | Yes | -| testRegisterAndWithdrawalNFT_WhenUserIsRegistered | Test path where user can perform on-chain registration and claim an NFT withdrawal all at once for a registered user. | Yes | Yes | -| testRegisterWithdrawalAndMintNFT_WhenUserIsNotRegistered | Test path where user can perform on-chain registration, claim an NFT Minting and withdrawal all at once for an unregistered user. | Yes | Yes | - diff --git a/test/bridge/x/v4/RegistrationV4.t.sol b/test/bridge/x/v4/RegistrationV4.t.sol deleted file mode 100644 index e985cf95..00000000 --- a/test/bridge/x/v4/RegistrationV4.t.sol +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright (c) Immutable Pty Ltd 2018 - 2026 -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import {RegistrationV4, NoFundsToWithdraw} from "../../../../contracts/bridge/x/v4/RegistrationV4.sol"; -import {Test} from "forge-std/Test.sol"; -import {MockCoreV4} from "./MockCoreV4.sol"; -import {Asset} from "../../../../contracts/token/erc721/x/Asset.sol"; -import {console} from "forge-std/console.sol"; - -contract RegistrationV4Test is Test { - MockCoreV4 public mockCore; - RegistrationV4 public registration; - - uint256 private MOCK_CORE_FUNDS = 5e18; - - function setUp() public { - vm.startBroadcast(); - mockCore = new MockCoreV4(); - registration = new RegistrationV4(payable(mockCore)); - vm.deal(payable(mockCore), MOCK_CORE_FUNDS); - vm.stopBroadcast(); - } - - function testGetVersion() public { - string memory version = registration.getVersion(); - assertTrue(keccak256(abi.encodePacked(version)) == keccak256(abi.encodePacked("4.0.1"))); - } - - function testCompleteWithdrawalAll_WhenUserIsRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // arrange - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - registration.imx().registerEthAddress(ethAdd, starkKey, regSig); - // pre-checks - assertTrue(registration.isRegistered(starkKey)); - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - uint256 ethExpectedBalance = 4e10; - mockCore.addWithdrawalBalance(ethKey, assetType, ethExpectedBalance); - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 3e10; - mockCore.addWithdrawalBalance(starkKey, assetType, starkExpectedBalance); - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - // - uint256 initialBalance = ethAdd.balance; - // // act - registration.withdrawAll(ethKey, starkKey, assetType); - // - uint256 finalBalance = ethAdd.balance; - uint256 expectedFinalBalance = initialBalance + ethExpectedBalance + starkExpectedBalance; - assertEq(expectedFinalBalance, finalBalance); - } - - function testCompleteWithdrawalAll_WhenUserIsRegisteredAndHasEthKeyBalanceOnly() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // arrange - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - registration.imx().registerEthAddress(ethAdd, starkKey, regSig); - // pre-checks - assertTrue(registration.isRegistered(starkKey)); - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - uint256 ethExpectedBalance = 4e10; - mockCore.addWithdrawalBalance(ethKey, assetType, ethExpectedBalance); - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 0; - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - // - uint256 initialBalance = ethAdd.balance; - // // act - registration.withdrawAll(ethKey, starkKey, assetType); - // - uint256 finalBalance = ethAdd.balance; - uint256 expectedFinalBalance = initialBalance + ethExpectedBalance + starkExpectedBalance; - assertEq(expectedFinalBalance, finalBalance); - } - - function testCompleteWithdrawalAll_WhenUserIsRegisteredAndHasStarkKeyBalanceOnly() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // arrange - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - registration.imx().registerEthAddress(ethAdd, starkKey, regSig); - // pre-checks - assertTrue(registration.isRegistered(starkKey)); - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - uint256 ethExpectedBalance = 0; - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 3e10; - mockCore.addWithdrawalBalance(starkKey, assetType, starkExpectedBalance); - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - // - uint256 initialBalance = ethAdd.balance; - // // act - registration.withdrawAll(ethKey, starkKey, assetType); - // - uint256 finalBalance = ethAdd.balance; - uint256 expectedFinalBalance = initialBalance + ethExpectedBalance + starkExpectedBalance; - assertEq(expectedFinalBalance, finalBalance); - } - - function testShouldFailWithdrawalAll_WhenUserIsNotRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - - uint256 ethExpectedBalance = 4e10; - mockCore.addWithdrawalBalance(ethKey, assetType, ethExpectedBalance); - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 3e10; - mockCore.addWithdrawalBalance(starkKey, assetType, starkExpectedBalance); - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - - address registeredEthAddress = registration.imx().getEthKey(starkKey); - assertEq(address(0), registeredEthAddress); - - uint256 initialBalance = ethAdd.balance; - vm.expectRevert("USER_UNREGISTERED"); - // act - registration.withdrawAll(ethKey, starkKey, assetType); - - uint256 finalBalance = ethAdd.balance; - assertEq(initialBalance, finalBalance); - } - - function testShouldFailWithdrawalAll_WhenUserDoesNotHaveFundsToWithdraw() public { - // arrange - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - - uint256 ethExpectedBalance = 0; - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 0; - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - // make sure user is registered - registration.imx().registerEthAddress(ethAdd, starkKey, regSig); - assertTrue(registration.isRegistered(starkKey)); - - vm.expectRevert(abi.encodeWithSelector(NoFundsToWithdraw.selector, ethAdd, starkKey)); - // act - registration.withdrawAll(ethKey, starkKey, assetType); - } - - function testCompleteWithdrawalV4_WhenUserIsNotRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - - uint256 ethExpectedBalance = 4e10; - mockCore.addWithdrawalBalance(ethKey, assetType, ethExpectedBalance); - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 3e10; - mockCore.addWithdrawalBalance(starkKey, assetType, starkExpectedBalance); - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - - address registeredEthAddress = registration.imx().getEthKey(starkKey); - assertEq(address(0), registeredEthAddress); - - uint256 initialBalance = ethAdd.balance; - // act - registration.imx().withdraw(ethKey, assetType); - - uint256 finalBalance = ethAdd.balance; - assertEq(initialBalance + ethExpectedBalance, finalBalance); - } - - function testRegisterAndCompleteWithdrawalAll_WhenUserIsNotRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - - uint256 ethExpectedBalance = 4e10; - mockCore.addWithdrawalBalance(ethKey, assetType, ethExpectedBalance); - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 3e10; - mockCore.addWithdrawalBalance(starkKey, assetType, starkExpectedBalance); - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - - // assure the user is not registered - assertFalse(registration.isRegistered(starkKey)); - - uint256 initialBalance = ethAdd.balance; - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - // act - registration.registerAndWithdrawAll(ethAdd, starkKey, regSig, assetType); - - // checks final balance - uint256 finalBalance = ethAdd.balance; - assertEq(initialBalance + ethExpectedBalance + starkExpectedBalance, finalBalance); - - // checks if the user was registered correctly - assertEq(ethAdd, registration.imx().getEthKey(starkKey)); - } - - function testRegisterAndCompleteWithdrawalAll_WhenUserIsRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // 0x2705737cd248ac819034b5de474c8f0368224f72a0fda9e031499d519992d9e (eth) - uint256 assetType = 1103114524755001640548555873671808205895038091681120606634696969331999845790; - - uint256 ethExpectedBalance = 4e10; - mockCore.addWithdrawalBalance(ethKey, assetType, ethExpectedBalance); - uint256 ethWithdrawableBalance = registration.imx().getWithdrawalBalance(ethKey, assetType); - assertEq(ethExpectedBalance, ethWithdrawableBalance); - - uint256 starkExpectedBalance = 3e10; - mockCore.addWithdrawalBalance(starkKey, assetType, starkExpectedBalance); - uint256 starkWithdrawableBalance = registration.imx().getWithdrawalBalance(starkKey, assetType); - assertEq(starkExpectedBalance, starkWithdrawableBalance); - - // assure the user is registered - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - registration.imx().registerEthAddress(ethAdd, starkKey, regSig); - assertTrue(registration.isRegistered(starkKey)); - - uint256 initialBalance = ethAdd.balance; - - // act - registration.registerAndWithdrawAll(ethAdd, starkKey, regSig, assetType); - - // checks final balance - uint256 finalBalance = ethAdd.balance; - assertEq(initialBalance + ethExpectedBalance + starkExpectedBalance, finalBalance); - - // checks if the user was registered correctly - assertEq(ethAdd, registration.imx().getEthKey(starkKey)); - } - - function testRegister_WhenUserIsNotRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // assure the user is not registered - assertFalse(registration.isRegistered(starkKey)); - assertEq(address(0x0), registration.imx().getEthKey(starkKey)); - - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - // act - registration.imx().registerEthAddress(ethAdd, starkKey, regSig); - - // checks if the user was registered correctly - assertTrue(registration.isRegistered(starkKey)); - assertEq(ethAdd, registration.imx().getEthKey(starkKey)); - } - - function testRegisterAndWithdrawalNFT_WhenUserIsNotRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - // uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // arrange - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - - // 0x31e2a7a568737baacd430d7750c9bf07dba85ba60d13b6b6fe8d47e8d13aa21 - uint256 assetType = 1410237129265691706741215969248966526395742991743406915223458527859231140385; - uint256 quantity = 1; - uint256 tokenId = 6; - - // arrange nft contract - Asset nftContract = new Asset(address(this), "name", "symbol", address(registration.imx())); - mockCore.addTokenContract(assetType, address(nftContract)); - mockCore.addWithdrawalBalance(starkKey, assetType + tokenId, 1); - nftContract.mintFor(address(mockCore), quantity, abi.encodePacked("{6}:{onchain-metadata}")); - - // pre-checks - assertFalse(registration.isRegistered(starkKey)); - assertEq(0, nftContract.balanceOf(ethAdd)); - - // act - registration.registerAndWithdrawNft(ethAdd, starkKey, regSig, assetType, tokenId); - - // assert - assertTrue(registration.isRegistered(starkKey)); - assertEq(quantity, nftContract.balanceOf(ethAdd)); - } - - function testRegisterAndWithdrawalNFT_WhenUserIsRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - // uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // arrange - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - // make sure user is registered - registration.imx().registerEthAddress(ethAdd, starkKey, regSig); - assertTrue(registration.isRegistered(starkKey)); - - // 0x31e2a7a568737baacd430d7750c9bf07dba85ba60d13b6b6fe8d47e8d13aa21 - uint256 assetType = 1410237129265691706741215969248966526395742991743406915223458527859231140385; - uint256 quantity = 1; - uint256 tokenId = 6; - - // arrange nft contract - Asset nftContract = new Asset(address(this), "name", "symbol", address(registration.imx())); - mockCore.addTokenContract(assetType, address(nftContract)); - mockCore.addWithdrawalBalance(starkKey, assetType + tokenId, 1); - nftContract.mintFor(address(mockCore), quantity, abi.encodePacked("{6}:{onchain-metadata}")); - - // pre-checks - assertEq(0, nftContract.balanceOf(ethAdd)); - - // act - registration.registerAndWithdrawNft(ethAdd, starkKey, regSig, assetType, tokenId); - - // assert - assertTrue(registration.isRegistered(starkKey)); - assertEq(quantity, nftContract.balanceOf(ethAdd)); - } - - function testRegisterWithdrawalAndMintNFT_WhenUserIsNotRegistered() public { - address ethAdd = 0xac3cc5a41D9e8c94Fe64138C1343A07B2fF5ff76; - // uint256 ethKey = 983301674259619813482344086789227297671214399350; - // 0x7a88d4e1a357d33d6168058ac6b08fa54c07b72313f78af594d4d44e8268a6c - uint256 starkKey = 3463995498836494504631329032145085468217956335318243415256427132985150966380; - - // arrange - bytes memory regSig = abi.encodePacked( - uint256(0x06f56e3e7392318ae672ff7d68d1b6c54a6f402019bd121dee9b8d8aa9658ab5), // r - uint256(0x06c1b98af915c6c1f88ea15f22f2d4f4a7a20c5416cafca0538bf227469dc14a), // s - uint256(0x02ec99c3c1d90d78dd77676a2505bbeba3cf9ecd1003d72c14949817d84625a4) // starkY - ); - - // 0x31e2a7a568737baacd430d7750c9bf07dba85ba60d13b6b6fe8d47e8d13aa21 - uint256 assetType = 1410237129265691706741215969248966526395742991743406915223458527859231140385; - uint256 quantity = 1; - uint256 tokenId = 7; - - // arrange nft contract - Asset nftContract = new Asset(address(this), "name", "symbol", address(registration.imx())); - mockCore.addTokenContract(assetType, address(nftContract)); - mockCore.addWithdrawalBalance(starkKey, assetType + tokenId, 1); - - // pre-checks - assertFalse(registration.isRegistered(starkKey)); - assertEq(0, nftContract.balanceOf(ethAdd)); - - // act - registration.registerWithdrawAndMint( - ethAdd, starkKey, regSig, assetType, abi.encodePacked("{7}:{onchain-metadata}") - ); - - // assert - assertTrue(registration.isRegistered(starkKey)); - assertEq(quantity, nftContract.balanceOf(ethAdd)); - } -} diff --git a/test/multicall/SigUtils.t.sol b/test/multicall/SigUtils.t.sol index 428dbd78..812c2c25 100644 --- a/test/multicall/SigUtils.t.sol +++ b/test/multicall/SigUtils.t.sol @@ -59,7 +59,7 @@ contract SigUtils { keccak256(abi.encodePacked(_targets)), hashBytesArray(_data), _deadline)); - return keccak256(abi.encodePacked("\x19\x01", cachedDomainSeparator, digest)); + return keccak256(abi.encodePacked("\x19\x01", CACHED_DOMAIN_SEPARATOR, digest)); } function hashBytesArray(bytes[] memory _data) public pure returns (bytes32) { diff --git a/test/payment-splitter/PaymentSplitter.t.sol b/test/payment-splitter/PaymentSplitter.t.sol index 54e004ee..0635e6b9 100644 --- a/test/payment-splitter/PaymentSplitter.t.sol +++ b/test/payment-splitter/PaymentSplitter.t.sol @@ -53,23 +53,23 @@ contract PaymentSplitterTest is Test { paymentSplitter.overridePayees(payees, shares); } - function testDeployRoles() public { + function testDeployRoles() public view { assertTrue(paymentSplitter.hasRole(paymentSplitter.DEFAULT_ADMIN_ROLE(), defaultAdmin)); assertTrue(paymentSplitter.hasRole(paymentSplitter.TOKEN_REGISTRAR_ROLE(), registrarAdmin)); assertTrue(paymentSplitter.hasRole(paymentSplitter.RELEASE_FUNDS_ROLE(), fundsAdmin)); } - function testTokensAdded() public { + function testTokensAdded() public view { assertEq(address(paymentSplitter.erc20Allowlist()[1]), address(erc20s[1])); assertEq(address(paymentSplitter.erc20Allowlist()[0]), address(erc20s[0])); } - function testPayeeAdded() public { + function testPayeeAdded() public view { assertEq(paymentSplitter.payee(0), payees[0]); assertEq(paymentSplitter.payee(1), payees[1]); } - function testSharesAdded() public { + function testSharesAdded() public view { assertEq(paymentSplitter.shares(payees[0]), shares[0]); assertEq(paymentSplitter.shares(payees[1]), shares[1]); } diff --git a/test/staking/StakeHolderAttackWallet2.sol b/test/staking/StakeHolderAttackWallet2.sol index 883c3640..9837491f 100644 --- a/test/staking/StakeHolderAttackWallet2.sol +++ b/test/staking/StakeHolderAttackWallet2.sol @@ -13,7 +13,7 @@ contract StakeHolderAttackWallet2 { } receive() external payable { // Cause a revert that has zero call data length. - assembly { + assembly ("memory-safe") { revert(0, 0) } diff --git a/test/staking/StakeHolderInitBase.t.sol b/test/staking/StakeHolderInitBase.t.sol index 6b2c185f..b137c82f 100644 --- a/test/staking/StakeHolderInitBase.t.sol +++ b/test/staking/StakeHolderInitBase.t.sol @@ -5,20 +5,20 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; abstract contract StakeHolderInitBaseTest is StakeHolderBaseTest { - function testGetVersion() public virtual { + function testGetVersion() public virtual view { uint256 ver = stakeHolder.version(); assertEq(ver, 0, "Expect initial version of storage layout to be V0"); } - function testStakersInit() public { + function testStakersInit() public view { assertEq(stakeHolder.getNumStakers(), 0, "Expect no stakers at deployment time"); } - function testGetToken() public { + function testGetToken() public view { assertEq(stakeHolder.getToken(), address(erc20), "Incorrect token address returned"); } - function testAdmins() public { + function testAdmins() public view { assertEq(stakeHolder.getRoleMemberCount(defaultAdminRole), 1, "Expect one role admin"); assertEq(stakeHolder.getRoleMemberCount(upgradeRole), 1, "Expect one upgrade admin"); assertEq(stakeHolder.getRoleMemberCount(distributeRole), 1, "Expect one distribute admin"); diff --git a/test/staking/StakeHolderInitBaseV2.t.sol b/test/staking/StakeHolderInitBaseV2.t.sol index 396b5dee..7ecdbced 100644 --- a/test/staking/StakeHolderInitBaseV2.t.sol +++ b/test/staking/StakeHolderInitBaseV2.t.sol @@ -5,7 +5,7 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; abstract contract StakeHolderInitBaseTestV2 is StakeHolderInitBaseTest { - function testGetVersion() public override { + function testGetVersion() public override view { uint256 ver = stakeHolder.version(); assertEq(ver, 2, "Incorrect version"); } diff --git a/test/staking/StakeHolderUpgradeForkTest.t.sol b/test/staking/StakeHolderUpgradeForkTest.t.sol index dffcc520..0534bb2a 100644 --- a/test/staking/StakeHolderUpgradeForkTest.t.sol +++ b/test/staking/StakeHolderUpgradeForkTest.t.sol @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; +import {Test} from "forge-std/Test.sol"; import {StakeHolderWIMX} from "../../contracts/staking/StakeHolderWIMX.sol"; import {StakeHolderWIMXV2} from "../../contracts/staking/StakeHolderWIMXV2.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; diff --git a/test/token/erc1155/ImmutableERC1155Costs.t.sol b/test/token/erc1155/ImmutableERC1155Costs.t.sol index a4c7836a..6446228a 100644 --- a/test/token/erc1155/ImmutableERC1155Costs.t.sol +++ b/test/token/erc1155/ImmutableERC1155Costs.t.sol @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; +import {Test} from "forge-std/Test.sol"; import {ImmutableERC1155} from "../../../contracts/token/erc1155/preset/ImmutableERC1155.sol"; import {OperatorAllowlistUpgradeable} from "../../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {Sign} from "../../utils/Sign.sol"; diff --git a/test/token/erc721/ERC721OperationalByQuantityV1.t.sol b/test/token/erc721/ERC721OperationalByQuantityV1.t.sol index 3671604d..d79cc45f 100644 --- a/test/token/erc721/ERC721OperationalByQuantityV1.t.sol +++ b/test/token/erc721/ERC721OperationalByQuantityV1.t.sol @@ -6,6 +6,7 @@ import {ERC721OperationalByQuantityBaseTest} from "./ERC721OperationalByQuantity import {ImmutableERC721} from "../../../contracts/token/erc721/preset/ImmutableERC721.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import {IImmutableERC721Errors} from "../../../contracts/errors/Errors.sol"; // Test the original ImmutableERC721 contract: Operational tests diff --git a/test/trading/seaport/ImmutableSeaportOperational.t.sol b/test/trading/seaport/ImmutableSeaportOperational.t.sol index b325f01b..4c64c4b3 100644 --- a/test/trading/seaport/ImmutableSeaportOperational.t.sol +++ b/test/trading/seaport/ImmutableSeaportOperational.t.sol @@ -15,8 +15,6 @@ import {OrderType} from "seaport-types/src/lib/ConsiderationEnums.sol"; import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - - contract TestERC721 is ERC721("Test721", "TST721") { function mint(address to, uint256 tokenId) public returns (bool) { _mint(to, tokenId); @@ -219,7 +217,7 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } bytes memory signature = _signOrder(sellerPkey, orderHash); - AdvancedOrder memory order = AdvancedOrder({ parameters: orderParams, numerator: 1, denominator: 1, signature: signature, extraData: extraData }); + AdvancedOrder memory order = AdvancedOrder(orderParams, 1, 1, signature, extraData); return order; } } \ No newline at end of file diff --git a/test/trading/seaport16/ImmutableSeaportOperational.t.sol b/test/trading/seaport16/ImmutableSeaportOperational.t.sol index d9f1c181..811907ae 100644 --- a/test/trading/seaport16/ImmutableSeaportOperational.t.sol +++ b/test/trading/seaport16/ImmutableSeaportOperational.t.sol @@ -12,6 +12,7 @@ import {SIP7EventsAndErrors} from "../../../contracts/trading/seaport16/zones/im import {OrderParameters, OrderComponents, AdvancedOrder, CriteriaResolver} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; import {OrderType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; +import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract TestERC721 is ERC721("Test721", "TST721") { function mint(address to, uint256 tokenId) public returns (bool) { @@ -214,7 +215,7 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } bytes memory signature = _signOrder(sellerPkey, orderHash); - AdvancedOrder memory order = AdvancedOrder( parameters: orderParams, numerator: 1, denominator: 1, signature: signature, extraData: extraData }); + AdvancedOrder memory order = AdvancedOrder(orderParams, 1, 1, signature, extraData ); return order; } } \ No newline at end of file From 8c9ec36c9cee5249f029216bb27ac0d073d88831 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Fri, 22 May 2026 17:22:36 +1000 Subject: [PATCH 3/9] Remove solhint --- .github/workflows/test.yml | 32 - .solhint.json | 53 -- .solhintignore | 1 - BUILD.md | 12 +- contracts/access/IERC173.sol | 1 - contracts/allowlist/IWalletProxy.sol | 1 - .../allowlist/OperatorAllowlistEnforced.sol | 9 +- .../OperatorAllowlistUpgradeable.sol | 20 +- .../deployer/AccessControlledDeployer.sol | 33 +- .../deployer/create/OwnableCreateDeploy.sol | 3 +- .../create3/OwnableCreate3Address.sol | 4 +- contracts/games/gems/GemGame.sol | 2 - contracts/mocks/MockEIP1271Wallet.sol | 15 +- contracts/mocks/MockMarketplace.sol | 1 - contracts/mocks/MockOnReceive.sol | 11 +- contracts/mocks/MockWallet.sol | 21 +- contracts/mocks/MockWalletFactory.sol | 2 - contracts/multicall/GuardedMulticaller2.sol | 39 +- .../payment-splitter/PaymentSplitter.sol | 12 +- contracts/staking/IStakeHolder.sol | 9 +- contracts/staking/StakeHolderBase.sol | 51 +- contracts/staking/StakeHolderBaseV2.sol | 45 +- contracts/staking/StakeHolderERC20.sol | 15 +- contracts/staking/StakeHolderERC20V2.sol | 15 +- contracts/staking/StakeHolderNative.sol | 2 - contracts/staking/StakeHolderNativeV2.sol | 2 - contracts/staking/StakeHolderWIMX.sol | 11 +- contracts/staking/StakeHolderWIMXV2.sol | 11 +- contracts/staking/WIMX.sol | 2 +- .../token/erc1155/abstract/ERC1155Permit.sol | 36 +- .../token/erc1155/abstract/IERC1155Permit.sol | 1 - .../erc1155/abstract/ImmutableERC1155Base.sol | 41 +- .../token/erc1155/preset/ImmutableERC1155.sol | 11 +- .../ImmutableERC20FixedSupplyNoBurn.sol | 10 +- .../ImmutableERC20MinterBurnerPermit.sol | 2 +- .../token/erc721/abstract/ERC721Hybrid.sol | 44 +- .../erc721/abstract/ERC721HybridPermit.sol | 33 +- .../erc721/abstract/ERC721HybridPermitV2.sol | 42 +- .../token/erc721/abstract/ERC721HybridV2.sol | 44 +- .../token/erc721/abstract/ERC721Permit.sol | 33 +- contracts/token/erc721/abstract/IERC4494.sol | 2 - .../erc721/abstract/ImmutableERC721Base.sol | 38 +- .../abstract/ImmutableERC721HybridBase.sol | 49 +- .../abstract/ImmutableERC721HybridBaseV2.sol | 50 +- .../token/erc721/erc721psi/ERC721Psi.sol | 11 +- .../erc721/erc721psi/ERC721PsiBurnableV2.sol | 2 +- .../token/erc721/erc721psi/ERC721PsiV2.sol | 21 +- .../erc721/interfaces/IImmutableERC721.sol | 4 - .../token/erc721/preset/ImmutableERC721.sol | 10 +- .../erc721/preset/ImmutableERC721MintByID.sol | 10 +- .../token/erc721/preset/ImmutableERC721V2.sol | 10 +- contracts/token/erc721/x/Asset.sol | 21 - contracts/token/erc721/x/IMintable.sol | 7 - contracts/token/erc721/x/Mintable.sol | 35 - contracts/token/erc721/x/utils/Bytes.sol | 89 --- contracts/token/erc721/x/utils/Minting.sol | 23 - .../trading/seaport/ImmutableSeaport.sol | 125 +-- .../seaport/conduit/ConduitController.sol | 1 - .../interfaces/ImmutableSeaportEvents.sol | 1 - .../validators/ReadOnlyOrderValidator.sol | 5 - .../seaport/validators/SeaportValidator.sol | 5 - .../validators/SeaportValidatorHelper.sol | 5 - .../v1/ImmutableSignedZone.sol | 94 +-- .../v1/interfaces/SIP5Interface.sol | 1 - .../v1/interfaces/SIP6EventsAndErrors.sol | 1 - .../v1/interfaces/SIP7EventsAndErrors.sol | 1 - .../v1/interfaces/SIP7Interface.sol | 1 - .../v2/ImmutableSignedZoneV2.sol | 147 ++-- .../v2/ZoneAccessControl.sol | 13 +- .../v2/interfaces/SIP5EventsAndErrors.sol | 1 - .../v2/interfaces/SIP5Interface.sol | 2 - .../v2/interfaces/SIP6EventsAndErrors.sol | 2 - .../v2/interfaces/SIP6Interface.sol | 3 - .../v2/interfaces/SIP7EventsAndErrors.sol | 2 - .../v2/interfaces/SIP7Interface.sol | 2 - .../ZoneAccessControlEventsAndErrors.sol | 2 - .../trading/seaport16/ImmutableSeaport.sol | 109 ++- .../validators/ReadOnlyOrderValidator.sol | 5 - .../seaport16/validators/SeaportValidator.sol | 5 - .../validators/SeaportValidatorHelper.sol | 5 - .../v3/ImmutableSignedZoneV3.sol | 211 +++-- .../v3/ZoneAccessControl.sol | 11 +- .../v3/interfaces/ITransferValidator.sol | 2 +- .../v3/interfaces/SIP5EventsAndErrors.sol | 1 - .../v3/interfaces/SIP5Interface.sol | 1 - .../v3/interfaces/SIP6EventsAndErrors.sol | 2 - .../v3/interfaces/SIP6Interface.sol | 3 - .../v3/interfaces/SIP7EventsAndErrors.sol | 1 - .../v3/interfaces/SIP7Interface.sol | 1 - .../ZoneAccessControlEventsAndErrors.sol | 2 - package.json | 1 - script/games/gems/DeployGemGame.sol | 5 +- script/staking/ChangeDistributor.t.sol | 37 +- script/staking/StakeHolderScriptERC20.t.sol | 165 ++-- script/staking/StakeHolderScriptWIMX.t.sol | 139 ++-- script/staking/UpgradeToWIMXV2.t.sol | 23 +- .../seaport/DeployImmutableSignedZoneV2.s.sol | 17 +- .../DeployImmutableSignedZoneV2Dev.s.sol | 6 +- .../seaport16/DeployConduitController.s.sol | 54 +- .../seaport16/DeployImmutableSeaport.s.sol | 19 +- .../DeployImmutableSignedZoneV3.s.sol | 23 +- ...tableERC721MintByIDTransferApprovals.t.sol | 2 +- .../OperatorAllowlistUpgradeable.t.sol | 16 +- test/deployer/AccessControlledDeployer.t.sol | 72 +- .../create2/OwnableCreate2Deployer.t.sol | 10 +- .../create3/OwnableCreate3Deployer.t.sol | 17 +- test/games/gems/GemGame.t.sol | 2 - test/multicall/GuardedMulticaller2.t.sol | 58 +- test/multicall/MockFunctions.sol | 6 +- test/multicall/SigUtils.t.sol | 60 +- test/royalty-enforcement/MockMarketplace.sol | 10 +- .../RoyaltyMarketplace.t.sol | 29 +- test/staking/StakeHolderAttackWallet.sol | 8 +- test/staking/StakeHolderAttackWallet2.sol | 7 +- test/staking/StakeHolderBase.t.sol | 9 +- test/staking/StakeHolderConfigBase.t.sol | 13 +- test/staking/StakeHolderConfigBaseV2.t.sol | 9 +- test/staking/StakeHolderConfigERC20.t.sol | 14 +- test/staking/StakeHolderConfigERC20V2.t.sol | 16 +- test/staking/StakeHolderConfigNative.t.sol | 14 +- test/staking/StakeHolderConfigNativeV2.t.sol | 20 +- test/staking/StakeHolderConfigWIMX.t.sol | 14 +- test/staking/StakeHolderConfigWIMXV2.t.sol | 16 +- test/staking/StakeHolderInitBase.t.sol | 2 +- test/staking/StakeHolderInitBaseV2.t.sol | 2 +- test/staking/StakeHolderInitERC20.t.sol | 1 - test/staking/StakeHolderInitERC20V2.t.sol | 1 - test/staking/StakeHolderInitNative.t.sol | 1 - test/staking/StakeHolderInitNativeV2.t.sol | 1 - test/staking/StakeHolderInitWIMX.t.sol | 1 - test/staking/StakeHolderInitWIMXV2.t.sol | 1 - test/staking/StakeHolderOperationalBase.t.sol | 61 +- .../StakeHolderOperationalBaseV2.t.sol | 39 +- .../staking/StakeHolderOperationalERC20.t.sol | 14 +- .../StakeHolderOperationalERC20V2.t.sol | 12 +- .../StakeHolderOperationalNative.t.sol | 26 +- .../StakeHolderOperationalNativeV2.t.sol | 11 +- test/staking/StakeHolderOperationalWIMX.t.sol | 26 +- .../StakeHolderOperationalWIMXV2.t.sol | 12 +- test/staking/StakeHolderTimeDelayBase.t.sol | 35 +- test/staking/StakeHolderTimeDelayERC20.t.sol | 20 +- test/staking/StakeHolderTimeDelayWIMX.t.sol | 20 +- test/staking/StakeHolderUpgradeForkTest.t.sol | 9 +- test/token/erc1155/ImmutableERC1155.t.sol | 10 +- .../token/erc1155/ImmutableERC1155Costs.t.sol | 14 +- test/token/erc721/ERC721Base.t.sol | 38 +- test/token/erc721/ERC721ByQuantityBase.t.sol | 1 - test/token/erc721/ERC721ConfigBase.t.sol | 62 +- test/token/erc721/ERC721ConfigByIdV1.t.sol | 16 +- .../erc721/ERC721ConfigByQuantityBase.t.sol | 17 +- .../erc721/ERC721ConfigByQuantityV1.t.sol | 8 +- .../erc721/ERC721ConfigByQuantityV2.t.sol | 9 +- test/token/erc721/ERC721OperationalBase.t.sol | 80 +- .../erc721/ERC721OperationalByIdV1.t.sol | 19 +- .../ERC721OperationalByQuantityBase.t.sol | 41 +- .../ERC721OperationalByQuantityV1.t.sol | 13 +- .../ERC721OperationalByQuantityV2.t.sol | 21 +- .../token/erc721/fuzz/ERC721PsiV2.Echidna.sol | 161 ++-- test/token/x/Asset.t.sol | 60 -- .../seaport/ImmutableSeaportBase.t.sol | 11 +- .../seaport/ImmutableSeaportConfig.t.sol | 3 +- .../seaport/ImmutableSeaportHarness.t.sol | 4 - .../seaport/ImmutableSeaportOperational.t.sol | 76 +- ...utableSeaportSignedZoneV2Integration.t.sol | 59 +- .../seaport/ImmutableSeaportTestHelper.t.sol | 99 ++- .../seaport/utils/IImmutableERC1155.t.sol | 2 - .../seaport/utils/IImmutableERC721.t.sol | 1 - .../utils/IOperatorAllowlistUpgradeable.t.sol | 2 - .../seaport/utils/SigningTestHelper.t.sol | 3 - .../ImmutableSignedZoneOrderValidation.t.sol | 151 +++- .../v1/ImmutableSignedZoneOwnership.t.sol | 12 +- .../ImmutableSignedZoneSignerManagement.t.sol | 16 +- .../v2/IImmutableSignedZoneV2Harness.t.sol | 15 +- .../v2/ImmutableSignedZoneV2.t.sol | 140 +--- .../v2/ImmutableSignedZoneV2Harness.t.sol | 10 +- .../seaport16/ImmutableSeaportBase.t.sol | 9 +- .../seaport16/ImmutableSeaportHarness.t.sol | 5 - .../ImmutableSeaportOperational.t.sol | 75 +- ...utableSeaportSignedZoneV3Integration.t.sol | 74 +- .../ImmutableSeaportTestHelper.t.sol | 95 ++- .../utils/MockTransferValidator.t.sol | 93 ++- .../seaport16/utils/SigningTestHelper.t.sol | 3 - .../v3/IImmutableSignedZoneV3Harness.t.sol | 10 +- .../v3/ImmutableSignedZoneV3.t.sol | 664 ++++------------ .../v3/ImmutableSignedZoneV3Harness.t.sol | 15 +- test/utils/Sign.sol | 2 - yarn.lock | 740 ------------------ 187 files changed, 2305 insertions(+), 3747 deletions(-) delete mode 100644 .solhint.json delete mode 100644 .solhintignore delete mode 100644 contracts/token/erc721/x/Asset.sol delete mode 100644 contracts/token/erc721/x/IMintable.sol delete mode 100644 contracts/token/erc721/x/Mintable.sol delete mode 100644 contracts/token/erc721/x/utils/Bytes.sol delete mode 100644 contracts/token/erc721/x/utils/Minting.sol delete mode 100644 contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol delete mode 100644 contracts/trading/seaport/validators/SeaportValidator.sol delete mode 100644 contracts/trading/seaport/validators/SeaportValidatorHelper.sol delete mode 100644 contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol delete mode 100644 contracts/trading/seaport16/validators/SeaportValidator.sol delete mode 100644 contracts/trading/seaport16/validators/SeaportValidatorHelper.sol delete mode 100644 test/token/x/Asset.t.sol diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b0916217..66e68944 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,22 +12,6 @@ permissions: contents: read jobs: - solhint: - name: Run solhint - runs-on: ubuntu-latest - steps: - - name: Checkout Code - uses: actions/checkout@v4 - - name: Setup Node - uses: actions/setup-node@v4 - with: - node-version-file: ".nvmrc" - cache: yarn - - name: Install dependencies - run: yarn install --frozen-lockfile --network-concurrency 1 - - name: Run solhint - run: yarn run lint - forge-test: name: Run Forge Tests runs-on: ubuntu-latest @@ -85,22 +69,6 @@ jobs: - uses: actions/checkout@v6 - run: sh readmecheck.sh - hardhat-legacy: - name: Run Hardhat Tests - runs-on: ubuntu-latest - steps: - - run: | - echo "Hardhat was removed in SDK v3. See README and MIGRATION.md." - echo "This job exists only to satisfy legacy branch protection on PRs targeting main." - - eslint-legacy: - name: Run eslint - runs-on: ubuntu-latest - steps: - - run: | - echo "ESLint is not part of the v3 toolchain (solhint covers Solidity)." - echo "This job exists only to satisfy legacy branch protection on PRs targeting main." - slither: name: Run slither runs-on: ubuntu-latest diff --git a/.solhint.json b/.solhint.json deleted file mode 100644 index f8efe5b0..00000000 --- a/.solhint.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "plugins": [], - - "rules": { - "code-complexity": ["warn", 7], - "custom-errors": "error", - "explicit-types": "error", - "function-max-lines": ["off", 50], - "max-line-length": ["off", 120], - "max-states-count": ["off", 15], - "no-console": "error", - "no-empty-blocks": "warn", - "no-global-import": "warn", - "no-unused-import": "warn", - "no-unused-vars": "warn", - "one-contract-per-file": "warn", - "payable-fallback": "warn", - "reason-string": ["warn", {"maxLength": 32}], - "constructor-syntax": "warn", - - "comprehensive-interface": "off", - "quotes": ["error", "double"], - - "const-name-snakecase": "warn", - "foundry-test-functions": ["off", ["setUp"]], - "func-name-mixedcase": "warn", - "modifier-name-mixedcase": "warn", - "named-parameters-mapping": "warn", - "named-return-values": "off", - "private-vars-leading-underscore": ["off", {"strict": false}], - "use-forbidden-name": "warn", - "var-name-mixedcase": "warn", - "imports-on-top": "warn", - "visibility-modifier-order": "warn", - - "avoid-call-value": "error", - "avoid-low-level-calls": "error", - "avoid-sha3": "error", - "avoid-suicide": "error", - "avoid-throw": "error", - "avoid-tx-origin": "error", - "check-send-result": "error", - "compiler-version": ["warn", ">=0.8.19 <0.8.29"], - "func-visibility": ["error", {"ignoreConstructors": true}], - "multiple-sends": "warn", - "no-complex-fallback": "warn", - "no-inline-assembly": "warn", - "not-rely-on-block-hash": "warn", - "not-rely-on-time": "warn", - "reentrancy": "warn", - "state-visibility": "warn" - } -} diff --git a/.solhintignore b/.solhintignore deleted file mode 100644 index 3c3629e6..00000000 --- a/.solhintignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/BUILD.md b/BUILD.md index 5860aef0..ac7a3663 100644 --- a/BUILD.md +++ b/BUILD.md @@ -10,21 +10,15 @@ forge install sudo pip3 install slither-analyzer ``` -## Build and Test +## Build, Test, and Lint -To build and test the contracts: +To build, test, and lint the contracts: ``` forge test -vvv ``` -## Solidity Linter - -To execute solhint: - -``` -yarn run solhint contracts/**/*.sol -``` +## Solidity Formatter To format Solidity (same as CI): diff --git a/contracts/access/IERC173.sol b/contracts/access/IERC173.sol index 373d9bec..08bfa4df 100644 --- a/contracts/access/IERC173.sol +++ b/contracts/access/IERC173.sol @@ -1,5 +1,4 @@ //SPDX-License-Identifier: Apache 2.0 -// solhint-disable compiler-version pragma solidity ^0.8.0; import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; diff --git a/contracts/allowlist/IWalletProxy.sol b/contracts/allowlist/IWalletProxy.sol index 7b571792..25f7a830 100644 --- a/contracts/allowlist/IWalletProxy.sol +++ b/contracts/allowlist/IWalletProxy.sol @@ -6,6 +6,5 @@ pragma solidity >=0.8.19 <0.8.29; /// Interface for Passport Wallet's proxy contract. interface IWalletProxy { // Returns the current implementation address used by the proxy contract - // solhint-disable-next-line func-name-mixedcase function PROXY_getImplementation() external view returns (address); } diff --git a/contracts/allowlist/OperatorAllowlistEnforced.sol b/contracts/allowlist/OperatorAllowlistEnforced.sol index 5d055625..e104372c 100644 --- a/contracts/allowlist/OperatorAllowlistEnforced.sol +++ b/contracts/allowlist/OperatorAllowlistEnforced.sol @@ -7,6 +7,9 @@ import {IOperatorAllowlist} from "./IOperatorAllowlist.sol"; import {IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import {OperatorAllowlistEnforcementErrors} from "../errors/Errors.sol"; +// Disable this code size warning as there is no plan to change this logic. +// forge-lint: disable-start(unwrapped-modifier-logic) + /** * @notice OperatorAllowlistEnforced is an abstract contract that token contracts can inherit in order to set the * address of the OperatorAllowlist registry that it will interface with, so that the token contract may @@ -50,8 +53,8 @@ abstract contract OperatorAllowlistEnforced is OperatorAllowlistEnforcementError // 1. caller is an EOA // 2. caller is Allowlisted or is the calling address bytecode is Allowlisted if ( - msg.sender != tx.origin && // solhint-disable-line avoid-tx-origin - !operatorAllowlist.isAllowlisted(msg.sender) + msg.sender != tx.origin + && !operatorAllowlist.isAllowlisted(msg.sender) ) { revert CallerNotInAllowlist(msg.sender); } @@ -88,4 +91,4 @@ abstract contract OperatorAllowlistEnforced is OperatorAllowlistEnforcementError operatorAllowlist = IOperatorAllowlist(_operatorAllowlist); } } -// slither-disable-end calls-loop +// forge-lint: disable-end(unwrapped-modifier-logic) diff --git a/contracts/allowlist/OperatorAllowlistUpgradeable.sol b/contracts/allowlist/OperatorAllowlistUpgradeable.sol index a6963fe7..2c283cc1 100644 --- a/contracts/allowlist/OperatorAllowlistUpgradeable.sol +++ b/contracts/allowlist/OperatorAllowlistUpgradeable.sol @@ -3,7 +3,9 @@ pragma solidity >=0.8.19 <0.8.29; import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; -import {AccessControlEnumerableUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/access/AccessControlEnumerableUpgradeable.sol"; +import { + AccessControlEnumerableUpgradeable +} from "openzeppelin-contracts-upgradeable-4.9.3/access/AccessControlEnumerableUpgradeable.sol"; // Introspection import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol"; @@ -25,7 +27,6 @@ contract OperatorAllowlistUpgradeable is IOperatorAllowlist { /// ===== Events ===== - /// @notice Emitted when a target address is added or removed from the Allowlist event AddressAllowlistChanged(address indexed target, bool added); @@ -101,7 +102,6 @@ contract OperatorAllowlistUpgradeable is function addWalletToAllowlist(address walletAddr) external onlyRole(REGISTRAR_ROLE) { // get bytecode of wallet bytes32 codeHash; - // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { codeHash := extcodehash(walletAddr) } @@ -121,7 +121,6 @@ contract OperatorAllowlistUpgradeable is function removeWalletFromAllowlist(address walletAddr) external onlyRole(REGISTRAR_ROLE) { // get bytecode of wallet bytes32 codeHash; - // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { codeHash := extcodehash(walletAddr) } @@ -146,7 +145,6 @@ contract OperatorAllowlistUpgradeable is // Check if caller is a Allowlisted smart contract wallet bytes32 codeHash; - // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { codeHash := extcodehash(target) } @@ -164,19 +162,21 @@ contract OperatorAllowlistUpgradeable is * @notice ERC-165 interface support * @param interfaceId The interface identifier, which is a 4-byte selector. */ - function supportsInterface( - bytes4 interfaceId - ) public view virtual override(ERC165, AccessControlEnumerableUpgradeable) returns (bool) { + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(ERC165, AccessControlEnumerableUpgradeable) + returns (bool) + { return interfaceId == type(IOperatorAllowlist).interfaceId || super.supportsInterface(interfaceId); } // Override the _authorizeUpgrade function - // solhint-disable-next-line no-empty-blocks function _authorizeUpgrade(address newImplementation) internal override onlyRole(UPGRADE_ROLE) {} /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[20] private __OperatorAllowlistUpgradeableGap; // slither-disable-end unused-state } diff --git a/contracts/deployer/AccessControlledDeployer.sol b/contracts/deployer/AccessControlledDeployer.sol index 0485e2ed..48c90dc3 100644 --- a/contracts/deployer/AccessControlledDeployer.sol +++ b/contracts/deployer/AccessControlledDeployer.sol @@ -75,11 +75,13 @@ contract AccessControlledDeployer is AccessControlEnumerable, Pausable { * @dev The function emits `Deployed` event after the contract is deployed * @return The address of the deployed contract */ - function deploy( - IDeployer deployer, - bytes memory bytecode, - bytes32 salt - ) external payable whenNotPaused onlyRole(DEPLOYER_ROLE) returns (address) { + function deploy(IDeployer deployer, bytes memory bytecode, bytes32 salt) + external + payable + whenNotPaused + onlyRole(DEPLOYER_ROLE) + returns (address) + { if (address(deployer) == address(0)) { revert ZeroAddress(); } @@ -98,12 +100,13 @@ contract AccessControlledDeployer is AccessControlEnumerable, Pausable { * @dev The function emits `Deployed` event after the contract is deployed * @return The address of the deployed contract */ - function deployAndInit( - IDeployer deployer, - bytes memory bytecode, - bytes32 salt, - bytes calldata init - ) external payable whenNotPaused onlyRole(DEPLOYER_ROLE) returns (address) { + function deployAndInit(IDeployer deployer, bytes memory bytecode, bytes32 salt, bytes calldata init) + external + payable + whenNotPaused + onlyRole(DEPLOYER_ROLE) + returns (address) + { if (address(deployer) == address(0)) { revert ZeroAddress(); } @@ -156,10 +159,10 @@ contract AccessControlledDeployer is AccessControlEnumerable, Pausable { * @dev This function requires that the current owner of `ownableDeployer` is this contract * @dev The function emits `OwnershipTransferred` event if the ownership is successfully transferred */ - function transferOwnershipOfDeployer( - Ownable ownableDeployer, - address newOwner - ) external onlyRole(OWNERSHIP_MANAGER_ROLE) { + function transferOwnershipOfDeployer(Ownable ownableDeployer, address newOwner) + external + onlyRole(OWNERSHIP_MANAGER_ROLE) + { if (address(ownableDeployer) == address(0) || newOwner == address(0)) { revert ZeroAddress(); } diff --git a/contracts/deployer/create/OwnableCreateDeploy.sol b/contracts/deployer/create/OwnableCreateDeploy.sol index a91c78ce..c5de8b12 100644 --- a/contracts/deployer/create/OwnableCreateDeploy.sol +++ b/contracts/deployer/create/OwnableCreateDeploy.sol @@ -17,15 +17,14 @@ contract OwnableCreateDeploy { constructor() { OWNER = msg.sender; } + /** * @dev Deploys a new contract with the specified bytecode using the `CREATE` opcode. * @param bytecode The bytecode of the contract to be deployed */ // slither-disable-next-line locked-ether function deploy(bytes memory bytecode) external payable { - // solhint-disable-next-line custom-errors, reason-string require(msg.sender == OWNER, "CreateDeploy: caller is not the owner"); - // solhint-disable no-inline-assembly assembly ("memory-safe") { if iszero(create(callvalue(), add(bytecode, 32), mload(bytecode))) { revert(0, 0) diff --git a/contracts/deployer/create3/OwnableCreate3Address.sol b/contracts/deployer/create3/OwnableCreate3Address.sol index 755138bb..0eda8c11 100644 --- a/contracts/deployer/create3/OwnableCreate3Address.sol +++ b/contracts/deployer/create3/OwnableCreate3Address.sol @@ -28,7 +28,9 @@ abstract contract OwnableCreate3Address { */ function _create3Address(bytes32 deploySalt) internal view returns (address deployed) { address deployer = address( - uint160(uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, CREATE_DEPLOY_BYTECODE_HASH)))) + uint160( + uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, CREATE_DEPLOY_BYTECODE_HASH))) + ) ); deployed = address(uint160(uint256(keccak256(abi.encodePacked(hex"d694", deployer, hex"01"))))); diff --git a/contracts/games/gems/GemGame.sol b/contracts/games/gems/GemGame.sol index 60c5ac5f..bc86775c 100644 --- a/contracts/games/gems/GemGame.sol +++ b/contracts/games/gems/GemGame.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2 -// solhint-disable not-rely-on-time - pragma solidity >=0.8.19 <0.8.29; import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol"; diff --git a/contracts/mocks/MockEIP1271Wallet.sol b/contracts/mocks/MockEIP1271Wallet.sol index 085168c0..b654947a 100644 --- a/contracts/mocks/MockEIP1271Wallet.sol +++ b/contracts/mocks/MockEIP1271Wallet.sol @@ -23,11 +23,18 @@ contract MockEIP1271Wallet is IERC1271 { } function onERC721Received( - address /* operator */, - address /* from */, - uint256 /* tokenId */, + address, + /* operator */ + address, + /* from */ + uint256, + /* tokenId */ bytes calldata /* data */ - ) external pure returns (bytes4) { + ) + external + pure + returns (bytes4) + { return IERC721Receiver.onERC721Received.selector; } } diff --git a/contracts/mocks/MockMarketplace.sol b/contracts/mocks/MockMarketplace.sol index 281b0c98..985809ac 100644 --- a/contracts/mocks/MockMarketplace.sol +++ b/contracts/mocks/MockMarketplace.sol @@ -38,7 +38,6 @@ contract MockMarketplace { if (from == address(0)) { revert ZeroAddress(); } - // solhint-disable-next-line custom-errors require(msg.value == price, "insufficient msg.value"); (address receiver, uint256 royaltyAmount) = ROYALTY_ADDRESS.royaltyInfo(_tokenId, price); if (receiver == address(0)) { diff --git a/contracts/mocks/MockOnReceive.sol b/contracts/mocks/MockOnReceive.sol index 02731b35..5f40435d 100644 --- a/contracts/mocks/MockOnReceive.sol +++ b/contracts/mocks/MockOnReceive.sol @@ -16,10 +16,15 @@ contract MockOnReceive { // Attempt to transfer token to another address on receive function onERC721Received( address, - /* operator */ address, - /* from */ uint256 tokenId, + /* operator */ + address, + /* from */ + uint256 tokenId, bytes calldata /* data */ - ) public returns (bytes4) { + ) + public + returns (bytes4) + { TOKEN_ADDRESS.transferFrom(address(this), RECIPIENT, tokenId); return this.onERC721Received.selector; } diff --git a/contracts/mocks/MockWallet.sol b/contracts/mocks/MockWallet.sol index c418f28d..36b55738 100644 --- a/contracts/mocks/MockWallet.sol +++ b/contracts/mocks/MockWallet.sol @@ -21,12 +21,10 @@ contract MockWallet { IERC1155(token).safeTransferFrom(from, to, tokenId, amount, ""); } - function onERC721Received( - address operator, - address from, - uint256 tokenId, - bytes calldata data - ) external returns (bytes4) { + function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) + external + returns (bytes4) + { emit Received(operator, from, tokenId, 1, data); return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } @@ -41,13 +39,10 @@ contract MockWallet { IERC1155(token).safeBatchTransferFrom(from, to, tokenIds, amounts, ""); } - function onERC1155Received( - address operator, - address from, - uint256 id, - uint256 value, - bytes calldata data - ) external returns (bytes4) { + function onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes calldata data) + external + returns (bytes4) + { emit Received(operator, from, id, value, data); return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")); } diff --git a/contracts/mocks/MockWalletFactory.sol b/contracts/mocks/MockWalletFactory.sol index 70130639..3af84355 100644 --- a/contracts/mocks/MockWalletFactory.sol +++ b/contracts/mocks/MockWalletFactory.sol @@ -20,12 +20,10 @@ contract MockWalletFactory { // slither-disable-next-line locked-ether function deploy(address _mainModule, bytes32 _salt) public payable returns (address _contract) { bytes memory code = abi.encodePacked(WALLET_CREATION_CODE, uint256(uint160(_mainModule))); - // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { _contract := create2(callvalue(), add(code, 32), mload(code), _salt) } // check deployment success - // solhint-disable-next-line custom-errors require(_contract != address(0), "WalletFactory: deployment failed"); } } diff --git a/contracts/multicall/GuardedMulticaller2.sol b/contracts/multicall/GuardedMulticaller2.sol index c5294d2d..1bfae010 100644 --- a/contracts/multicall/GuardedMulticaller2.sol +++ b/contracts/multicall/GuardedMulticaller2.sol @@ -35,17 +35,16 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { mapping(bytes32 ref => bool executed) private replayProtection; /// @dev Only those with MULTICALL_SIGNER_ROLE can generate valid signatures for execute function. - // forge-lint: disable-next-line(unsafe-typecast) + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant MULTICALL_SIGNER_ROLE = bytes32("MULTICALL_SIGNER_ROLE"); /// @dev EIP712 typehash for call bytes32 internal constant CALL_TYPEHASH = keccak256("Call(address target,string functionSignature,bytes data)"); /// @dev EIP712 typehash for execute function - bytes32 internal constant MULTICALL_TYPEHASH = - keccak256( - "Multicall(bytes32 ref,Call[] calls,uint256 deadline)Call(address target,string functionSignature,bytes data)" - ); + bytes32 internal constant MULTICALL_TYPEHASH = keccak256( + "Multicall(bytes32 ref,Call[] calls,uint256 deadline)Call(address target,string functionSignature,bytes data)" + ); /// @dev Event emitted when execute function is called event Multicalled(address indexed _multicallSigner, bytes32 indexed _reference, Call[] _calls, uint256 _deadline); @@ -84,7 +83,6 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { * @param _name Name of the contract * @param _version Version of the contract */ - // solhint-disable-next-line no-unused-vars constructor(address _owner, string memory _name, string memory _version) EIP712(_name, _version) { _grantRole(DEFAULT_ADMIN_ROLE, _owner); } @@ -107,7 +105,6 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { * @param _signature Signature of the multicall signer */ // slither-disable-start low-level-calls,cyclomatic-complexity - // solhint-disable-next-line code-complexity function execute( address _multicallSigner, bytes32 _reference, @@ -115,7 +112,6 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { uint256 _deadline, bytes calldata _signature ) external nonReentrant { - // solhint-disable-next-line not-rely-on-time if (_deadline < block.timestamp) { revert Expired(_deadline); } @@ -141,13 +137,9 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { } // Signature validation - if ( - !SignatureChecker.isValidSignatureNow( - _multicallSigner, - _hashTypedData(_reference, _calls, _deadline), - _signature - ) - ) { + if (!SignatureChecker.isValidSignatureNow( + _multicallSigner, _hashTypedData(_reference, _calls, _deadline), _signature + )) { revert UnauthorizedSignature(_signature); } @@ -157,7 +149,6 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { for (uint256 i = 0; i < _calls.length; i++) { bytes4 functionSelector = bytes4(keccak256(bytes(_calls[i].functionSignature))); bytes memory callData = abi.encodePacked(functionSelector, _calls[i].data); - // solhint-disable avoid-low-level-calls // slither-disable-next-line calls-loop (bool success, bytes memory returnData) = _calls[i].target.call(callData); if (!success) { @@ -165,7 +156,6 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { if (returnData.length < 4) { revert FailedCall(_calls[i], returnData); } - // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { // The easiest way to bubble the revert reason is using memory via assembly revert(add(returnData, 32), mload(returnData)) @@ -214,9 +204,8 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { function _hashCallArray(Call[] calldata _calls) internal pure returns (bytes32) { bytes32[] memory hashedCallArr = new bytes32[](_calls.length); for (uint256 i = 0; i < _calls.length; i++) { - hashedCallArr[i] = keccak256( - abi.encode(CALL_TYPEHASH, _calls[i].target, _calls[i].functionSignature, _calls[i].data) - ); + hashedCallArr[i] = + keccak256(abi.encode(CALL_TYPEHASH, _calls[i].target, _calls[i].functionSignature, _calls[i].data)); } return keccak256(abi.encode(hashedCallArr)); } @@ -229,11 +218,11 @@ contract GuardedMulticaller2 is AccessControl, ReentrancyGuard, EIP712 { * @param _calls List of calls * @param _deadline Expiration timestamp */ - function _hashTypedData( - bytes32 _reference, - Call[] calldata _calls, - uint256 _deadline - ) internal view returns (bytes32) { + function _hashTypedData(bytes32 _reference, Call[] calldata _calls, uint256 _deadline) + internal + view + returns (bytes32) + { return _hashTypedDataV4(keccak256(abi.encode(MULTICALL_TYPEHASH, _reference, _hashCallArray(_calls), _deadline))); } diff --git a/contracts/payment-splitter/PaymentSplitter.sol b/contracts/payment-splitter/PaymentSplitter.sol index d2aaf1dc..6447ca2e 100644 --- a/contracts/payment-splitter/PaymentSplitter.sol +++ b/contracts/payment-splitter/PaymentSplitter.sol @@ -29,11 +29,11 @@ contract PaymentSplitter is AccessControlEnumerable, IPaymentSplitterErrors, Ree event PaymentReceived(address from, uint256 amount); /// @notice Role responsible for releasing funds - // forge-lint: disable-next-line(unsafe-typecast) + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant RELEASE_FUNDS_ROLE = bytes32("RELEASE_FUNDS_ROLE"); /// @notice Role responsible for registering tokens - // forge-lint: disable-next-line(unsafe-typecast) + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant TOKEN_REGISTRAR_ROLE = bytes32("TOKEN_REGISTRAR_ROLE"); /// @notice the totalshares held by payees @@ -195,10 +195,10 @@ contract PaymentSplitter is AccessControlEnumerable, IPaymentSplitterErrors, Ree * @param payees the address of new payees * @param shares_ the shares of new payees */ - function overridePayees( - address payable[] memory payees, - uint256[] memory shares_ - ) public onlyRole(DEFAULT_ADMIN_ROLE) { + function overridePayees(address payable[] memory payees, uint256[] memory shares_) + public + onlyRole(DEFAULT_ADMIN_ROLE) + { if (payees.length != shares_.length) { revert PaymentSplitterLengthMismatchSharesPayees(); } diff --git a/contracts/staking/IStakeHolder.sol b/contracts/staking/IStakeHolder.sol index 01cf8446..3ba8990b 100644 --- a/contracts/staking/IStakeHolder.sol +++ b/contracts/staking/IStakeHolder.sol @@ -2,7 +2,9 @@ // SPDX-License-Identifier: Apache 2 pragma solidity >=0.8.19 <0.8.29; -import {IAccessControlEnumerableUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/access/IAccessControlEnumerableUpgradeable.sol"; +import { + IAccessControlEnumerableUpgradeable +} from "openzeppelin-contracts-upgradeable-4.9.3/access/IAccessControlEnumerableUpgradeable.sol"; /** * @title IStakeHolder: Interface for staking system. @@ -108,10 +110,7 @@ interface IStakeHolder is IAccessControlEnumerableUpgradeable { * @param _numberToReturn The number of accounts to return. * @return _stakers A subset of the stakers array. */ - function getStakers( - uint256 _startOffset, - uint256 _numberToReturn - ) external view returns (address[] memory _stakers); + function getStakers(uint256 _startOffset, uint256 _numberToReturn) external view returns (address[] memory _stakers); /** * @return The address of the staking token. diff --git a/contracts/staking/StakeHolderBase.sol b/contracts/staking/StakeHolderBase.sol index b2af5f04..59dbe097 100644 --- a/contracts/staking/StakeHolderBase.sol +++ b/contracts/staking/StakeHolderBase.sol @@ -3,8 +3,12 @@ pragma solidity >=0.8.19 <0.8.29; import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; -import {AccessControlEnumerableUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/access/AccessControlEnumerableUpgradeable.sol"; -import {ReentrancyGuardUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/security/ReentrancyGuardUpgradeable.sol"; +import { + AccessControlEnumerableUpgradeable +} from "openzeppelin-contracts-upgradeable-4.9.3/access/AccessControlEnumerableUpgradeable.sol"; +import { + ReentrancyGuardUpgradeable +} from "openzeppelin-contracts-upgradeable-4.9.3/security/ReentrancyGuardUpgradeable.sol"; import {IStakeHolder} from "./IStakeHolder.sol"; /** @@ -18,7 +22,7 @@ abstract contract StakeHolderBase is ReentrancyGuardUpgradeable { /// @notice Only UPGRADE_ROLE can upgrade the contract - // forge-lint: disable-next-line(unsafe-typecast) + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant UPGRADE_ROLE = bytes32("UPGRADE_ROLE"); /// @notice Only DISTRIBUTE_ROLE can call the distribute function @@ -37,14 +41,12 @@ abstract contract StakeHolderBase is } /// @notice The amount of value owned by each staker - // solhint-disable-next-line private-vars-leading-underscore mapping(address staker => StakeInfo stakeInfo) internal balances; /// @notice A list of all stakers who have ever staked. /// @dev The list make contain stakers who have completely unstaked (that is, have /// a balance of 0). This array is never re-ordered. As such, off-chain services /// could cache the results of getStakers(). - // solhint-disable-next-line private-vars-leading-underscore address[] internal stakers; /// @notice version number of the storage variable layout. @@ -56,11 +58,11 @@ abstract contract StakeHolderBase is * @param _upgradeAdmin the address to grant `UPGRADE_ROLE` to * @param _distributeAdmin the address to grant `DISTRIBUTE_ROLE` to */ - function __StakeHolderBase_init( - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin - ) internal virtual onlyInitializing { + function __StakeHolderBase_init(address _roleAdmin, address _upgradeAdmin, address _distributeAdmin) + internal + virtual + onlyInitializing + { __UUPSUpgradeable_init(); __AccessControl_init(); __ReentrancyGuard_init(); @@ -81,7 +83,12 @@ abstract contract StakeHolderBase is * this function attempting a malicious upgrade. * @ param _data ABI encoded data to be used as part of the contract storage upgrade. */ - function upgradeStorage(bytes memory /* _data */) external virtual { + function upgradeStorage( + bytes memory /* _data */ + ) + external + virtual + { revert CanNotUpgradeToLowerOrSameVersion(version); } @@ -117,9 +124,13 @@ abstract contract StakeHolderBase is /** * @inheritdoc IStakeHolder */ - function distributeRewards( - AccountAmount[] calldata _recipientsAndAmounts - ) external payable virtual nonReentrant onlyRole(DISTRIBUTE_ROLE) { + function distributeRewards(AccountAmount[] calldata _recipientsAndAmounts) + external + payable + virtual + nonReentrant + onlyRole(DISTRIBUTE_ROLE) + { // Distribute the value. uint256 total = 0; uint256 len = _recipientsAndAmounts.length; @@ -162,10 +173,12 @@ abstract contract StakeHolderBase is /** * @inheritdoc IStakeHolder */ - function getStakers( - uint256 _startOffset, - uint256 _numberToReturn - ) external view override(IStakeHolder) returns (address[] memory _stakers) { + function getStakers(uint256 _startOffset, uint256 _numberToReturn) + external + view + override(IStakeHolder) + returns (address[] memory _stakers) + { address[] memory stakerPartialArray = new address[](_numberToReturn); for (uint256 i = 0; i < _numberToReturn; i++) { stakerPartialArray[i] = stakers[_startOffset + i]; @@ -209,12 +222,10 @@ abstract contract StakeHolderBase is function _checksAndTransfer(uint256 _amount) internal virtual; // Override the _authorizeUpgrade function - // solhint-disable-next-line no-empty-blocks function _authorizeUpgrade(address newImplementation) internal override onlyRole(UPGRADE_ROLE) {} /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[50] private __StakeHolderBaseGap; // slither-disable-end unused-state } diff --git a/contracts/staking/StakeHolderBaseV2.sol b/contracts/staking/StakeHolderBaseV2.sol index 1c800d52..dcda8454 100644 --- a/contracts/staking/StakeHolderBaseV2.sol +++ b/contracts/staking/StakeHolderBaseV2.sol @@ -19,11 +19,11 @@ abstract contract StakeHolderBaseV2 is IStakeHolderV2, StakeHolderBase { * @param _upgradeAdmin the address to grant `UPGRADE_ROLE` to * @param _distributeAdmin the address to grant `DISTRIBUTE_ROLE` to */ - function __StakeHolderBase_init( - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin - ) internal virtual override { + function __StakeHolderBase_init(address _roleAdmin, address _upgradeAdmin, address _distributeAdmin) + internal + virtual + override + { // NOTE: onlyInitializing is called in super. super.__StakeHolderBase_init(_roleAdmin, _upgradeAdmin, _distributeAdmin); version = _VERSION2; @@ -40,7 +40,13 @@ abstract contract StakeHolderBaseV2 is IStakeHolderV2, StakeHolderBase { * this function attempting a malicious upgrade. * @ param _data ABI encoded data to be used as part of the contract storage upgrade. */ - function upgradeStorage(bytes memory /* _data */) external virtual override { + function upgradeStorage( + bytes memory /* _data */ + ) + external + virtual + override + { if (version == _VERSION0) { // Upgrading from version 0 to 2 involves only code changes and // changing the storage version number. @@ -54,9 +60,13 @@ abstract contract StakeHolderBaseV2 is IStakeHolderV2, StakeHolderBase { /** * @inheritdoc IStakeHolder */ - function distributeRewards( - AccountAmount[] calldata _recipientsAndAmounts - ) external payable override(IStakeHolder, StakeHolderBase) nonReentrant onlyRole(DISTRIBUTE_ROLE) { + function distributeRewards(AccountAmount[] calldata _recipientsAndAmounts) + external + payable + override(IStakeHolder, StakeHolderBase) + nonReentrant + onlyRole(DISTRIBUTE_ROLE) + { uint256 total = _distributeRewards(_recipientsAndAmounts, true); uint256 len = _recipientsAndAmounts.length; emit Distributed(msg.sender, total, len); @@ -65,9 +75,12 @@ abstract contract StakeHolderBaseV2 is IStakeHolderV2, StakeHolderBase { /** * @inheritdoc IStakeHolderV2 */ - function stakeFor( - AccountAmount[] calldata _recipientsAndAmounts - ) external payable nonReentrant onlyRole(DISTRIBUTE_ROLE) { + function stakeFor(AccountAmount[] calldata _recipientsAndAmounts) + external + payable + nonReentrant + onlyRole(DISTRIBUTE_ROLE) + { uint256 total = _distributeRewards(_recipientsAndAmounts, false); uint256 len = _recipientsAndAmounts.length; emit StakedFor(msg.sender, total, len); @@ -80,10 +93,10 @@ abstract contract StakeHolderBaseV2 is IStakeHolderV2, StakeHolderBase { * @param _existingAccountsOnly If true, revert if the account has never been used. * @return _total Value distributed. */ - function _distributeRewards( - AccountAmount[] calldata _recipientsAndAmounts, - bool _existingAccountsOnly - ) private returns (uint256 _total) { + function _distributeRewards(AccountAmount[] calldata _recipientsAndAmounts, bool _existingAccountsOnly) + private + returns (uint256 _total) + { // Distribute the value. _total = 0; uint256 len = _recipientsAndAmounts.length; diff --git a/contracts/staking/StakeHolderERC20.sol b/contracts/staking/StakeHolderERC20.sol index 3b1128c2..868da95a 100644 --- a/contracts/staking/StakeHolderERC20.sol +++ b/contracts/staking/StakeHolderERC20.sol @@ -3,7 +3,9 @@ pragma solidity >=0.8.19 <0.8.29; import {IERC20Upgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/token/ERC20/IERC20Upgradeable.sol"; -import {SafeERC20Upgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import { + SafeERC20Upgradeable +} from "openzeppelin-contracts-upgradeable-4.9.3/token/ERC20/utils/SafeERC20Upgradeable.sol"; import {IStakeHolder, StakeHolderBase} from "./StakeHolderBase.sol"; /** @@ -23,12 +25,10 @@ contract StakeHolderERC20 is StakeHolderBase { * @param _distributeAdmin the address to grant `DISTRIBUTE_ROLE` to. * @param _token the token to use for staking. */ - function initialize( - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin, - address _token - ) public initializer { + function initialize(address _roleAdmin, address _upgradeAdmin, address _distributeAdmin, address _token) + public + initializer + { __StakeHolderERC20_init(_roleAdmin, _upgradeAdmin, _distributeAdmin, _token); } @@ -68,7 +68,6 @@ contract StakeHolderERC20 is StakeHolderBase { /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[50] private __StakeHolderERC20Gap; // slither-disable-end unused-state } diff --git a/contracts/staking/StakeHolderERC20V2.sol b/contracts/staking/StakeHolderERC20V2.sol index 62f4b30a..ebb9d17f 100644 --- a/contracts/staking/StakeHolderERC20V2.sol +++ b/contracts/staking/StakeHolderERC20V2.sol @@ -3,7 +3,9 @@ pragma solidity >=0.8.19 <0.8.29; import {IERC20Upgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/token/ERC20/IERC20Upgradeable.sol"; -import {SafeERC20Upgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import { + SafeERC20Upgradeable +} from "openzeppelin-contracts-upgradeable-4.9.3/token/ERC20/utils/SafeERC20Upgradeable.sol"; import {IStakeHolder, StakeHolderBase, StakeHolderBaseV2} from "./StakeHolderBaseV2.sol"; /** @@ -24,12 +26,10 @@ contract StakeHolderERC20V2 is StakeHolderBaseV2 { * @param _distributeAdmin the address to grant `DISTRIBUTE_ROLE` to. * @param _token the token to use for staking. */ - function initialize( - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin, - address _token - ) public initializer { + function initialize(address _roleAdmin, address _upgradeAdmin, address _distributeAdmin, address _token) + public + initializer + { __StakeHolderERC20_init(_roleAdmin, _upgradeAdmin, _distributeAdmin, _token); } @@ -69,7 +69,6 @@ contract StakeHolderERC20V2 is StakeHolderBaseV2 { /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[50] private __StakeHolderERC20Gap; // slither-disable-end unused-state } diff --git a/contracts/staking/StakeHolderNative.sol b/contracts/staking/StakeHolderNative.sol index cd473794..b7c33078 100644 --- a/contracts/staking/StakeHolderNative.sol +++ b/contracts/staking/StakeHolderNative.sol @@ -36,7 +36,6 @@ contract StakeHolderNative is StakeHolderBase { // Look for revert reason and bubble it up if present. // Revert reasons should contain an error selector, which is four bytes long. if (returndata.length >= 4) { - // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) @@ -59,7 +58,6 @@ contract StakeHolderNative is StakeHolderBase { /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[50] private __StakeHolderNativeGap; // slither-disable-end unused-state } diff --git a/contracts/staking/StakeHolderNativeV2.sol b/contracts/staking/StakeHolderNativeV2.sol index c8c5deec..c60e3e81 100644 --- a/contracts/staking/StakeHolderNativeV2.sol +++ b/contracts/staking/StakeHolderNativeV2.sol @@ -37,7 +37,6 @@ contract StakeHolderNativeV2 is StakeHolderBaseV2 { // Look for revert reason and bubble it up if present. // Revert reasons should contain an error selector, which is four bytes long. if (returndata.length >= 4) { - // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) @@ -60,7 +59,6 @@ contract StakeHolderNativeV2 is StakeHolderBaseV2 { /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[50] private __StakeHolderNativeGap; // slither-disable-end unused-state } diff --git a/contracts/staking/StakeHolderWIMX.sol b/contracts/staking/StakeHolderWIMX.sol index b37188ff..1b92ac6f 100644 --- a/contracts/staking/StakeHolderWIMX.sol +++ b/contracts/staking/StakeHolderWIMX.sol @@ -21,12 +21,10 @@ contract StakeHolderWIMX is StakeHolderNative { * @param _distributeAdmin the address to grant `DISTRIBUTE_ROLE` to * @param _wIMXToken The address of the WIMX contract. */ - function initialize( - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin, - address _wIMXToken - ) public initializer { + function initialize(address _roleAdmin, address _upgradeAdmin, address _distributeAdmin, address _wIMXToken) + public + initializer + { __StakeHolderBase_init(_roleAdmin, _upgradeAdmin, _distributeAdmin); wIMX = IWIMX(_wIMXToken); } @@ -65,7 +63,6 @@ contract StakeHolderWIMX is StakeHolderNative { /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[50] private __StakeHolderWIMXGap; // slither-disable-end unused-state } diff --git a/contracts/staking/StakeHolderWIMXV2.sol b/contracts/staking/StakeHolderWIMXV2.sol index 679f1355..4c11e727 100644 --- a/contracts/staking/StakeHolderWIMXV2.sol +++ b/contracts/staking/StakeHolderWIMXV2.sol @@ -22,12 +22,10 @@ contract StakeHolderWIMXV2 is StakeHolderNativeV2 { * @param _distributeAdmin the address to grant `DISTRIBUTE_ROLE` to * @param _wIMXToken The address of the WIMX contract. */ - function initialize( - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin, - address _wIMXToken - ) public initializer { + function initialize(address _roleAdmin, address _upgradeAdmin, address _distributeAdmin, address _wIMXToken) + public + initializer + { __StakeHolderBase_init(_roleAdmin, _upgradeAdmin, _distributeAdmin); wIMX = IWIMX(_wIMXToken); } @@ -70,7 +68,6 @@ contract StakeHolderWIMXV2 is StakeHolderNativeV2 { /// @notice storage gap for additional variables for upgrades // slither-disable-start unused-state - // solhint-disable-next-line var-name-mixedcase uint256[50] private __StakeHolderWIMXGap; // slither-disable-end unused-state } diff --git a/contracts/staking/WIMX.sol b/contracts/staking/WIMX.sol index da2b0382..763b5ce4 100644 --- a/contracts/staking/WIMX.sol +++ b/contracts/staking/WIMX.sol @@ -10,7 +10,6 @@ import {Address} from "@openzeppelin/contracts/utils/Address.sol"; * @dev This contract is adapted from the official Wrapped ETH contract. * This contract is copied from https://github.com/immutable/zkevm-bridge-contracts/blob/main/src/child/WIMX.sol */ -// solhint-disable custom-errors, reason-string contract WIMX is IWIMX { // slither-disable-start constable-states string public name = "Wrapped IMX"; @@ -48,6 +47,7 @@ contract WIMX is IWIMX { Address.sendValue(payable(msg.sender), wad); emit Withdrawal(msg.sender, wad); } + // slither-disable-end reentrancy-events /** diff --git a/contracts/token/erc1155/abstract/ERC1155Permit.sol b/contracts/token/erc1155/abstract/ERC1155Permit.sol index 4e51edb9..6eeee94d 100644 --- a/contracts/token/erc1155/abstract/ERC1155Permit.sol +++ b/contracts/token/erc1155/abstract/ERC1155Permit.sol @@ -18,7 +18,6 @@ abstract contract ERC1155Permit is ERC1155Burnable, EIP712, IERC1155Permit, IImm constructor(string memory name, string memory uri) ERC1155(uri) EIP712(name, "1") {} function permit(address owner, address spender, bool approved, uint256 deadline, bytes memory sig) external { - // solhint-disable-next-line not-rely-on-time if (deadline < block.timestamp) { revert PermitExpired(); } @@ -36,11 +35,8 @@ abstract contract ERC1155Permit is ERC1155Burnable, EIP712, IERC1155Permit, IImm // EOA signature validation if (sig.length == 64) { // ERC2098 Sig - recoveredSigner = ECDSA.recover( - digest, - bytes32(BytesLib.slice(sig, 0, 32)), - bytes32(BytesLib.slice(sig, 32, 64)) - ); + recoveredSigner = + ECDSA.recover(digest, bytes32(BytesLib.slice(sig, 0, 32)), bytes32(BytesLib.slice(sig, 32, 64))); } else if (sig.length == 65) { // typical EDCSA Sig recoveredSigner = ECDSA.recover(digest, sig); @@ -68,7 +64,6 @@ abstract contract ERC1155Permit is ERC1155Burnable, EIP712, IERC1155Permit, IImm * @notice Returns the domain separator used in the encoding of the signature for permits, as defined by EIP-712 * @return the bytes32 domain separator */ - // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } @@ -79,9 +74,8 @@ abstract contract ERC1155Permit is ERC1155Burnable, EIP712, IERC1155Permit, IImm * @return True if the contract implements `interfaceId` and the call doesn't revert, otherwise false. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155) returns (bool) { - return - interfaceId == type(IERC1155Permit).interfaceId || // 0x9e3ae8e4 - super.supportsInterface(interfaceId); + return interfaceId == type(IERC1155Permit).interfaceId // 0x9e3ae8e4 + || super.supportsInterface(interfaceId); } /** @@ -91,16 +85,13 @@ abstract contract ERC1155Permit is ERC1155Burnable, EIP712, IERC1155Permit, IImm * @param deadline The deadline until which the permit is valid. * @return A bytes32 digest, EIP-712 compliant, that serves as a unique identifier for the permit. */ - function _buildPermitDigest( - address spender, - address owner, - bool approved, - uint256 deadline - ) internal returns (bytes32) { - return - _hashTypedDataV4( - keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, approved, _nonces[owner]++, deadline)) - ); + function _buildPermitDigest(address spender, address owner, bool approved, uint256 deadline) + internal + returns (bytes32) + { + return _hashTypedDataV4( + keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, approved, _nonces[owner]++, deadline)) + ); } /** @@ -112,9 +103,8 @@ abstract contract ERC1155Permit is ERC1155Burnable, EIP712, IERC1155Permit, IImm */ function _isValidERC1271Signature(address spender, bytes32 digest, bytes memory sig) private view returns (bool) { // slither-disable-next-line low-level-calls - (bool success, bytes memory res) = spender.staticcall( - abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig) - ); + (bool success, bytes memory res) = + spender.staticcall(abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig)); if (success && res.length == 32) { bytes4 decodedRes = abi.decode(res, (bytes4)); diff --git a/contracts/token/erc1155/abstract/IERC1155Permit.sol b/contracts/token/erc1155/abstract/IERC1155Permit.sol index f37ca5e1..5f63651e 100644 --- a/contracts/token/erc1155/abstract/IERC1155Permit.sol +++ b/contracts/token/erc1155/abstract/IERC1155Permit.sol @@ -7,6 +7,5 @@ interface IERC1155Permit { function permit(address owner, address spender, bool approved, uint256 deadline, bytes memory sig) external; function nonces(address owner) external view returns (uint256); - // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } diff --git a/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol b/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol index b0d8183e..479bcb0c 100644 --- a/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol +++ b/contracts/token/erc1155/abstract/ImmutableERC1155Base.sol @@ -67,11 +67,10 @@ abstract contract ImmutableERC1155Base is OperatorAllowlistEnforced, ERC1155Perm * @param receiver The address of the royalty receiver * @param feeNumerator The royalty fee numerator */ - function setNFTRoyaltyReceiver( - uint256 tokenId, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiver(uint256 tokenId, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { _setTokenRoyalty(tokenId, receiver, feeNumerator); } @@ -81,11 +80,10 @@ abstract contract ImmutableERC1155Base is OperatorAllowlistEnforced, ERC1155Perm * @param receiver The address of the royalty receiver * @param feeNumerator The royalty fee numerator */ - function setNFTRoyaltyReceiverBatch( - uint256[] calldata tokenIds, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiverBatch(uint256[] calldata tokenIds, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { for (uint256 i = 0; i < tokenIds.length; i++) { _setTokenRoyalty(tokenIds[i], receiver, feeNumerator); } @@ -135,9 +133,13 @@ abstract contract ImmutableERC1155Base is OperatorAllowlistEnforced, ERC1155Perm * @param interfaceId The interface identifier, which is a 4-byte selector. * @return True if the contract implements `interfaceId` and the call doesn't revert, otherwise false. */ - function supportsInterface( - bytes4 interfaceId - ) public view virtual override(ERC1155Permit, ERC2981, AccessControlEnumerable) returns (bool) { + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(ERC1155Permit, ERC2981, AccessControlEnumerable) + returns (bool) + { return super.supportsInterface(interfaceId); } @@ -203,7 +205,6 @@ abstract contract ImmutableERC1155Base is OperatorAllowlistEnforced, ERC1155Perm uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; - // solhint-disable-next-line custom-errors, reason-string require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; @@ -220,13 +221,11 @@ abstract contract ImmutableERC1155Base is OperatorAllowlistEnforced, ERC1155Perm * @param value The amount to transfer. * @param data Additional data with no specified format, sent in call to `to`. */ - function _safeTransferFrom( - address from, - address to, - uint256 id, - uint256 value, - bytes memory data - ) internal override validateTransfer(from, to) { + function _safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes memory data) + internal + override + validateTransfer(from, to) + { super._safeTransferFrom(from, to, id, value, data); } diff --git a/contracts/token/erc1155/preset/ImmutableERC1155.sol b/contracts/token/erc1155/preset/ImmutableERC1155.sol index 3c2b7587..037e0d26 100644 --- a/contracts/token/erc1155/preset/ImmutableERC1155.sol +++ b/contracts/token/erc1155/preset/ImmutableERC1155.sol @@ -10,7 +10,6 @@ import {ImmutableERC1155Base} from "../abstract/ImmutableERC1155Base.sol"; */ contract ImmutableERC1155 is ImmutableERC1155Base { /// ===== Constructor ===== - /** * @notice Grants `DEFAULT_ADMIN_ROLE` to the supplied `owner` address * @@ -56,12 +55,10 @@ contract ImmutableERC1155 is ImmutableERC1155Base { * @param values The amounts of tokens to mint * @param data Additional data */ - function safeMintBatch( - address to, - uint256[] calldata ids, - uint256[] calldata values, - bytes memory data - ) external onlyRole(MINTER_ROLE) { + function safeMintBatch(address to, uint256[] calldata ids, uint256[] calldata values, bytes memory data) + external + onlyRole(MINTER_ROLE) + { super._mintBatch(to, ids, values, data); } } diff --git a/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol b/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol index 85085eb0..af2f41d3 100644 --- a/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol +++ b/contracts/token/erc20/preset/ImmutableERC20FixedSupplyNoBurn.sol @@ -25,13 +25,9 @@ contract ImmutableERC20FixedSupplyNoBurn is Ownable, ERC20 { * @param _treasurer Initial owner of entire supply of all tokens. * @param _hubOwner The account associated with Immutable Hub. */ - constructor( - string memory _name, - string memory _symbol, - uint256 _totalSupply, - address _treasurer, - address _hubOwner - ) ERC20(_name, _symbol) { + constructor(string memory _name, string memory _symbol, uint256 _totalSupply, address _treasurer, address _hubOwner) + ERC20(_name, _symbol) + { _mint(_treasurer, _totalSupply); _transferOwnership(_hubOwner); } diff --git a/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol b/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol index cfa908a1..bb30b37b 100644 --- a/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol +++ b/contracts/token/erc20/preset/ImmutableERC20MinterBurnerPermit.sol @@ -19,7 +19,7 @@ import {IImmutableERC20Errors} from "./Errors.sol"; */ contract ImmutableERC20MinterBurnerPermit is ERC20Capped, ERC20Burnable, ERC20Permit, MintingAccessControl { /// @notice Role to mint tokens - // forge-lint: disable-next-line(unsafe-typecast) + // forge-lint: disable-next-line(unsafe-typecast) bytes32 public constant HUB_OWNER_ROLE = bytes32("HUB_OWNER_ROLE"); /** diff --git a/contracts/token/erc721/abstract/ERC721Hybrid.sol b/contracts/token/erc721/abstract/ERC721Hybrid.sol index d1d899af..9994bb6a 100644 --- a/contracts/token/erc721/abstract/ERC721Hybrid.sol +++ b/contracts/token/erc721/abstract/ERC721Hybrid.sol @@ -185,12 +185,11 @@ abstract contract ERC721Hybrid is ERC721PsiBurnable, ERC721, IImmutableERC721Err /** * @notice refer to erc721 or erc721psi */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory _data - ) public virtual override(ERC721, ERC721Psi) { + function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) + public + virtual + override(ERC721, ERC721Psi) + { if (tokenId < mintBatchByQuantityThreshold()) { return ERC721.safeTransferFrom(from, to, tokenId, _data); } @@ -200,10 +199,13 @@ abstract contract ERC721Hybrid is ERC721PsiBurnable, ERC721, IImmutableERC721Err /** * @notice refer to erc721 or erc721psi */ - function isApprovedForAll( - address owner, - address operator - ) public view virtual override(ERC721, ERC721Psi) returns (bool) { + function isApprovedForAll(address owner, address operator) + public + view + virtual + override(ERC721, ERC721Psi) + returns (bool) + { return ERC721.isApprovedForAll(owner, operator); } @@ -411,12 +413,11 @@ abstract contract ERC721Hybrid is ERC721PsiBurnable, ERC721, IImmutableERC721Err /** * @notice refer to erc721 or erc721psi */ - function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes memory _data - ) internal virtual override(ERC721, ERC721Psi) { + function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) + internal + virtual + override(ERC721, ERC721Psi) + { if (tokenId < mintBatchByQuantityThreshold()) { return ERC721._safeTransfer(from, to, tokenId, _data); } @@ -457,10 +458,13 @@ abstract contract ERC721Hybrid is ERC721PsiBurnable, ERC721, IImmutableERC721Err /** * @notice refer to erc721 or erc721psi */ - function _isApprovedOrOwner( - address spender, - uint256 tokenId - ) internal view virtual override(ERC721, ERC721Psi) returns (bool) { + function _isApprovedOrOwner(address spender, uint256 tokenId) + internal + view + virtual + override(ERC721, ERC721Psi) + returns (bool) + { if (tokenId < mintBatchByQuantityThreshold()) { return ERC721._isApprovedOrOwner(spender, tokenId); } diff --git a/contracts/token/erc721/abstract/ERC721HybridPermit.sol b/contracts/token/erc721/abstract/ERC721HybridPermit.sol index 6b4f79d2..bd3652b4 100644 --- a/contracts/token/erc721/abstract/ERC721HybridPermit.sol +++ b/contracts/token/erc721/abstract/ERC721HybridPermit.sol @@ -24,17 +24,9 @@ abstract contract ERC721HybridPermit is ERC721Hybrid, IERC4494, EIP712 { /** * @dev the unique identifier for the permit struct to be EIP 712 compliant */ - bytes32 private constant _PERMIT_TYPEHASH = - keccak256( - abi.encodePacked( - "Permit(", - "address spender," - "uint256 tokenId," - "uint256 nonce," - "uint256 deadline" - ")" - ) - ); + bytes32 private constant _PERMIT_TYPEHASH = keccak256( + abi.encodePacked("Permit(", "address spender," "uint256 tokenId," "uint256 nonce," "uint256 deadline" ")") + ); constructor(string memory name, string memory symbol) ERC721Hybrid(name, symbol) EIP712(name, "1") {} @@ -62,7 +54,6 @@ abstract contract ERC721HybridPermit is ERC721Hybrid, IERC4494, EIP712 { * @notice Returns the domain separator used in the encoding of the signature for permits, as defined by EIP-712 * @return the bytes32 domain separator */ - // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } @@ -73,9 +64,8 @@ abstract contract ERC721HybridPermit is ERC721Hybrid, IERC4494, EIP712 { * @return True if the contract implements `interfaceId` and the call doesn't revert, otherwise false. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721Hybrid) returns (bool) { - return - interfaceId == type(IERC4494).interfaceId || // 0x5604e225 - super.supportsInterface(interfaceId); + return interfaceId == type(IERC4494).interfaceId // 0x5604e225 + || super.supportsInterface(interfaceId); } /** @@ -90,7 +80,6 @@ abstract contract ERC721HybridPermit is ERC721Hybrid, IERC4494, EIP712 { } function _permit(address spender, uint256 tokenId, uint256 deadline, bytes memory sig) internal virtual { - // solhint-disable-next-line not-rely-on-time if (deadline < block.timestamp) { revert PermitExpired(); } @@ -108,11 +97,8 @@ abstract contract ERC721HybridPermit is ERC721Hybrid, IERC4494, EIP712 { // EOA signature validation if (sig.length == 64) { // ERC2098 Sig - recoveredSigner = ECDSA.recover( - digest, - bytes32(BytesLib.slice(sig, 0, 32)), - bytes32(BytesLib.slice(sig, 32, 64)) - ); + recoveredSigner = + ECDSA.recover(digest, bytes32(BytesLib.slice(sig, 0, 32)), bytes32(BytesLib.slice(sig, 32, 64))); } else if (sig.length == 65) { // typical EDCSA Sig recoveredSigner = ECDSA.recover(digest, sig); @@ -157,9 +143,8 @@ abstract contract ERC721HybridPermit is ERC721Hybrid, IERC4494, EIP712 { */ function _isValidERC1271Signature(address spender, bytes32 digest, bytes memory sig) private view returns (bool) { // slither-disable-next-line low-level-calls - (bool success, bytes memory res) = spender.staticcall( - abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig) - ); + (bool success, bytes memory res) = + spender.staticcall(abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig)); if (success && res.length == 32) { bytes4 decodedRes = abi.decode(res, (bytes4)); diff --git a/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol b/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol index 5b233728..0ddc1e60 100644 --- a/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol +++ b/contracts/token/erc721/abstract/ERC721HybridPermitV2.sol @@ -24,17 +24,9 @@ abstract contract ERC721HybridPermitV2 is ERC721HybridV2, IERC4494, EIP712 { /** * @dev the unique identifier for the permit struct to be EIP 712 compliant */ - bytes32 private constant _PERMIT_TYPEHASH = - keccak256( - abi.encodePacked( - "Permit(", - "address spender," - "uint256 tokenId," - "uint256 nonce," - "uint256 deadline" - ")" - ) - ); + bytes32 private constant _PERMIT_TYPEHASH = keccak256( + abi.encodePacked("Permit(", "address spender," "uint256 tokenId," "uint256 nonce," "uint256 deadline" ")") + ); constructor(string memory name, string memory symbol) ERC721HybridV2(name, symbol) EIP712(name, "1") {} @@ -62,7 +54,6 @@ abstract contract ERC721HybridPermitV2 is ERC721HybridV2, IERC4494, EIP712 { * @notice Returns the domain separator used in the encoding of the signature for permits, as defined by EIP-712 * @return the bytes32 domain separator */ - // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } @@ -72,12 +63,16 @@ abstract contract ERC721HybridPermitV2 is ERC721HybridV2, IERC4494, EIP712 { * @param interfaceId The interface identifier, which is a 4-byte selector. * @return True if the contract implements `interfaceId` and the call doesn't revert, otherwise false. */ - function supportsInterface( - bytes4 interfaceId - ) public view virtual override(IERC165, ERC721HybridV2) returns (bool) { + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(IERC165, ERC721HybridV2) + returns (bool) + { return - interfaceId == type(IERC4494).interfaceId || // 0x5604e225 - super.supportsInterface(interfaceId); + interfaceId == type(IERC4494).interfaceId // 0x5604e225 + || super.supportsInterface(interfaceId); } /** @@ -92,7 +87,6 @@ abstract contract ERC721HybridPermitV2 is ERC721HybridV2, IERC4494, EIP712 { } function _permit(address spender, uint256 tokenId, uint256 deadline, bytes memory sig) internal virtual { - // solhint-disable-next-line not-rely-on-time if (deadline < block.timestamp) { revert PermitExpired(); } @@ -110,11 +104,8 @@ abstract contract ERC721HybridPermitV2 is ERC721HybridV2, IERC4494, EIP712 { // EOA signature validation if (sig.length == 64) { // ERC2098 Sig - recoveredSigner = ECDSA.recover( - digest, - bytes32(BytesLib.slice(sig, 0, 32)), - bytes32(BytesLib.slice(sig, 32, 64)) - ); + recoveredSigner = + ECDSA.recover(digest, bytes32(BytesLib.slice(sig, 0, 32)), bytes32(BytesLib.slice(sig, 32, 64))); } else if (sig.length == 65) { // typical EDCSA Sig recoveredSigner = ECDSA.recover(digest, sig); @@ -159,9 +150,8 @@ abstract contract ERC721HybridPermitV2 is ERC721HybridV2, IERC4494, EIP712 { */ function _isValidERC1271Signature(address spender, bytes32 digest, bytes memory sig) private view returns (bool) { // slither-disable-next-line low-level-calls - (bool success, bytes memory res) = spender.staticcall( - abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig) - ); + (bool success, bytes memory res) = + spender.staticcall(abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig)); if (success && res.length == 32) { bytes4 decodedRes = abi.decode(res, (bytes4)); diff --git a/contracts/token/erc721/abstract/ERC721HybridV2.sol b/contracts/token/erc721/abstract/ERC721HybridV2.sol index 63680d3b..59cbd73e 100644 --- a/contracts/token/erc721/abstract/ERC721HybridV2.sol +++ b/contracts/token/erc721/abstract/ERC721HybridV2.sol @@ -117,12 +117,11 @@ abstract contract ERC721HybridV2 is ERC721PsiBurnableV2, ERC721, IImmutableERC72 /** * @notice refer to erc721 or erc721psi */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory _data - ) public virtual override(ERC721, ERC721PsiV2) { + function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) + public + virtual + override(ERC721, ERC721PsiV2) + { if (tokenId < mintBatchByQuantityThreshold()) { return ERC721.safeTransferFrom(from, to, tokenId, _data); } @@ -132,10 +131,13 @@ abstract contract ERC721HybridV2 is ERC721PsiBurnableV2, ERC721, IImmutableERC72 /** * @notice refer to erc721 or erc721psi */ - function isApprovedForAll( - address owner, - address operator - ) public view virtual override(ERC721, ERC721PsiV2) returns (bool) { + function isApprovedForAll(address owner, address operator) + public + view + virtual + override(ERC721, ERC721PsiV2) + returns (bool) + { return ERC721.isApprovedForAll(owner, operator); } @@ -343,12 +345,11 @@ abstract contract ERC721HybridV2 is ERC721PsiBurnableV2, ERC721, IImmutableERC72 /** * @notice refer to erc721 or erc721psi */ - function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes memory _data - ) internal virtual override(ERC721, ERC721PsiV2) { + function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) + internal + virtual + override(ERC721, ERC721PsiV2) + { if (tokenId < mintBatchByQuantityThreshold()) { return ERC721._safeTransfer(from, to, tokenId, _data); } @@ -389,10 +390,13 @@ abstract contract ERC721HybridV2 is ERC721PsiBurnableV2, ERC721, IImmutableERC72 /** * @notice refer to erc721 or erc721psi */ - function _isApprovedOrOwner( - address spender, - uint256 tokenId - ) internal view virtual override(ERC721, ERC721PsiV2) returns (bool) { + function _isApprovedOrOwner(address spender, uint256 tokenId) + internal + view + virtual + override(ERC721, ERC721PsiV2) + returns (bool) + { if (tokenId < mintBatchByQuantityThreshold()) { return ERC721._isApprovedOrOwner(spender, tokenId); } diff --git a/contracts/token/erc721/abstract/ERC721Permit.sol b/contracts/token/erc721/abstract/ERC721Permit.sol index a31ac760..e2001ad5 100644 --- a/contracts/token/erc721/abstract/ERC721Permit.sol +++ b/contracts/token/erc721/abstract/ERC721Permit.sol @@ -25,17 +25,9 @@ abstract contract ERC721Permit is ERC721Burnable, IERC4494, EIP712, IImmutableER /** * @dev the unique identifier for the permit struct to be EIP 712 compliant */ - bytes32 private constant _PERMIT_TYPEHASH = - keccak256( - abi.encodePacked( - "Permit(", - "address spender," - "uint256 tokenId," - "uint256 nonce," - "uint256 deadline" - ")" - ) - ); + bytes32 private constant _PERMIT_TYPEHASH = keccak256( + abi.encodePacked("Permit(", "address spender," "uint256 tokenId," "uint256 nonce," "uint256 deadline" ")") + ); constructor(string memory name, string memory symbol) ERC721(name, symbol) EIP712(name, "1") {} @@ -63,7 +55,6 @@ abstract contract ERC721Permit is ERC721Burnable, IERC4494, EIP712, IImmutableER * @notice Returns the domain separator used in the encoding of the signature for permits, as defined by EIP-712 * @return the bytes32 domain separator */ - // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } @@ -74,9 +65,8 @@ abstract contract ERC721Permit is ERC721Burnable, IERC4494, EIP712, IImmutableER * @return True if the contract implements `interfaceId` and the call doesn't revert, otherwise false. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { - return - interfaceId == type(IERC4494).interfaceId || // 0x5604e225 - super.supportsInterface(interfaceId); + return interfaceId == type(IERC4494).interfaceId // 0x5604e225 + || super.supportsInterface(interfaceId); } /** @@ -91,7 +81,6 @@ abstract contract ERC721Permit is ERC721Burnable, IERC4494, EIP712, IImmutableER } function _permit(address spender, uint256 tokenId, uint256 deadline, bytes memory sig) internal virtual { - // solhint-disable-next-line not-rely-on-time if (deadline < block.timestamp) { revert PermitExpired(); } @@ -109,11 +98,8 @@ abstract contract ERC721Permit is ERC721Burnable, IERC4494, EIP712, IImmutableER // EOA signature validation if (sig.length == 64) { // ERC2098 Sig - recoveredSigner = ECDSA.recover( - digest, - bytes32(BytesLib.slice(sig, 0, 32)), - bytes32(BytesLib.slice(sig, 32, 64)) - ); + recoveredSigner = + ECDSA.recover(digest, bytes32(BytesLib.slice(sig, 0, 32)), bytes32(BytesLib.slice(sig, 32, 64))); } else if (sig.length == 65) { // typical EDCSA Sig recoveredSigner = ECDSA.recover(digest, sig); @@ -158,9 +144,8 @@ abstract contract ERC721Permit is ERC721Burnable, IERC4494, EIP712, IImmutableER */ function _isValidERC1271Signature(address spender, bytes32 digest, bytes memory sig) private view returns (bool) { // slither-disable-next-line low-level-calls - (bool success, bytes memory res) = spender.staticcall( - abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig) - ); + (bool success, bytes memory res) = + spender.staticcall(abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, sig)); if (success && res.length == 32) { bytes4 decodedRes = abi.decode(res, (bytes4)); diff --git a/contracts/token/erc721/abstract/IERC4494.sol b/contracts/token/erc721/abstract/IERC4494.sol index fdc6378c..457b03bd 100644 --- a/contracts/token/erc721/abstract/IERC4494.sol +++ b/contracts/token/erc721/abstract/IERC4494.sol @@ -11,7 +11,6 @@ interface IERC4494 is IERC165 { /// ERC165 bytes to add to interface array - set in parent contract /// /// _INTERFACE_ID_ERC4494 = 0x5604e225 - /// @notice Function to approve by way of owner signature /// @param spender the address to approve /// @param tokenId the index of the NFT to approve the spender on @@ -26,6 +25,5 @@ interface IERC4494 is IERC165 { /// @notice Returns the domain separator used in the encoding of the signature for permits, as defined by EIP-712 /// @return the bytes32 domain separator - // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } diff --git a/contracts/token/erc721/abstract/ImmutableERC721Base.sol b/contracts/token/erc721/abstract/ImmutableERC721Base.sol index 84c06e4c..30084949 100644 --- a/contracts/token/erc721/abstract/ImmutableERC721Base.sol +++ b/contracts/token/erc721/abstract/ImmutableERC721Base.sol @@ -105,11 +105,10 @@ abstract contract ImmutableERC721Base is OperatorAllowlistEnforced, MintingAcces * @param feeNumerator the royalty fee numerator * @dev This can only be called by the a minter. See ERC2981 for more details on _setTokenRoyalty */ - function setNFTRoyaltyReceiver( - uint256 tokenId, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiver(uint256 tokenId, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { _setTokenRoyalty(tokenId, receiver, feeNumerator); } @@ -120,11 +119,10 @@ abstract contract ImmutableERC721Base is OperatorAllowlistEnforced, MintingAcces * @param feeNumerator the royalty fee numerator * @dev This can only be called by the a minter. See ERC2981 for more details on _setTokenRoyalty */ - function setNFTRoyaltyReceiverBatch( - uint256[] calldata tokenIds, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiverBatch(uint256[] calldata tokenIds, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { for (uint256 i = 0; i < tokenIds.length; i++) { _setTokenRoyalty(tokenIds[i], receiver, feeNumerator); } @@ -197,9 +195,13 @@ abstract contract ImmutableERC721Base is OperatorAllowlistEnforced, MintingAcces * @notice Returns the supported interfaces * @param interfaceId the interface to check for support */ - function supportsInterface( - bytes4 interfaceId - ) public view virtual override(ERC721Permit, ERC2981, AccessControlEnumerable) returns (bool) { + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(ERC721Permit, ERC2981, AccessControlEnumerable) + returns (bool) + { return super.supportsInterface(interfaceId); } @@ -222,11 +224,11 @@ abstract contract ImmutableERC721Base is OperatorAllowlistEnforced, MintingAcces * @inheritdoc ERC721Permit * @dev Note it will validate the to and from address in the allowlist */ - function _transfer( - address from, - address to, - uint256 tokenId - ) internal override(ERC721Permit) validateTransfer(from, to) { + function _transfer(address from, address to, uint256 tokenId) + internal + override(ERC721Permit) + validateTransfer(from, to) + { super._transfer(from, to, tokenId); } diff --git a/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol b/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol index 1643a623..62411b9d 100644 --- a/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol +++ b/contracts/token/erc721/abstract/ImmutableERC721HybridBase.sol @@ -50,9 +50,13 @@ abstract contract ImmutableERC721HybridBase is } /// @dev Returns the supported interfaces - function supportsInterface( - bytes4 interfaceId - ) public view virtual override(ERC721HybridPermit, ERC2981, AccessControlEnumerable) returns (bool) { + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(ERC721HybridPermit, ERC2981, AccessControlEnumerable) + returns (bool) + { return super.supportsInterface(interfaceId); } @@ -81,10 +85,12 @@ abstract contract ImmutableERC721HybridBase is * @inheritdoc ERC721Hybrid * @dev Note it will validate the operator in the allowlist */ - function setApprovalForAll( - address operator, - bool approved - ) public virtual override(ERC721Hybrid) validateApproval(operator) { + function setApprovalForAll(address operator, bool approved) + public + virtual + override(ERC721Hybrid) + validateApproval(operator) + { super.setApprovalForAll(operator, approved); } @@ -100,11 +106,12 @@ abstract contract ImmutableERC721HybridBase is * @inheritdoc ERC721HybridPermit * @dev Note it will validate the from and to address in the allowlist */ - function _transfer( - address from, - address to, - uint256 tokenId - ) internal virtual override(ERC721HybridPermit) validateTransfer(from, to) { + function _transfer(address from, address to, uint256 tokenId) + internal + virtual + override(ERC721HybridPermit) + validateTransfer(from, to) + { super._transfer(from, to, tokenId); } @@ -125,11 +132,10 @@ abstract contract ImmutableERC721HybridBase is * @param feeNumerator the royalty fee numerator * @dev This can only be called by the a minter. See ERC2981 for more details on _setTokenRoyalty */ - function setNFTRoyaltyReceiver( - uint256 tokenId, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiver(uint256 tokenId, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { _setTokenRoyalty(tokenId, receiver, feeNumerator); } @@ -140,11 +146,10 @@ abstract contract ImmutableERC721HybridBase is * @param feeNumerator the royalty fee numerator * @dev This can only be called by the a minter. See ERC2981 for more details on _setTokenRoyalty */ - function setNFTRoyaltyReceiverBatch( - uint256[] calldata tokenIds, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiverBatch(uint256[] calldata tokenIds, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { for (uint256 i = 0; i < tokenIds.length; i++) { _setTokenRoyalty(tokenIds[i], receiver, feeNumerator); } diff --git a/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol b/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol index fb08e294..c23e466c 100644 --- a/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol +++ b/contracts/token/erc721/abstract/ImmutableERC721HybridBaseV2.sol @@ -51,9 +51,13 @@ abstract contract ImmutableERC721HybridBaseV2 is } /// @dev Returns the supported interfaces - function supportsInterface( - bytes4 interfaceId - ) public view virtual override(ERC721HybridPermitV2, ERC2981, AccessControlEnumerable) returns (bool) { + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(ERC721HybridPermitV2, ERC2981, AccessControlEnumerable) + returns (bool) + { return super.supportsInterface(interfaceId); } @@ -74,7 +78,6 @@ abstract contract ImmutableERC721HybridBaseV2 is * @notice sets the contract uri for the collection. Permissioned to only the admin role * @param _contractURI the new baseURI to set */ - // solhint-disable-next-line mixed-case-function function setContractURI(string memory _contractURI) public onlyRole(DEFAULT_ADMIN_ROLE) { contractURI = _contractURI; } @@ -83,10 +86,12 @@ abstract contract ImmutableERC721HybridBaseV2 is * @inheritdoc ERC721 * @dev Note it will validate the operator in the allowlist */ - function setApprovalForAll( - address operator, - bool approved - ) public virtual override(ERC721, IERC721) validateApproval(operator) { + function setApprovalForAll(address operator, bool approved) + public + virtual + override(ERC721, IERC721) + validateApproval(operator) + { super.setApprovalForAll(operator, approved); } @@ -102,11 +107,12 @@ abstract contract ImmutableERC721HybridBaseV2 is * @inheritdoc ERC721HybridPermitV2 * @dev Note it will validate the from and to address in the allowlist */ - function _transfer( - address from, - address to, - uint256 tokenId - ) internal virtual override(ERC721HybridPermitV2) validateTransfer(from, to) { + function _transfer(address from, address to, uint256 tokenId) + internal + virtual + override(ERC721HybridPermitV2) + validateTransfer(from, to) + { super._transfer(from, to, tokenId); } @@ -127,11 +133,10 @@ abstract contract ImmutableERC721HybridBaseV2 is * @param feeNumerator the royalty fee numerator * @dev This can only be called by the a minter. See ERC2981 for more details on _setTokenRoyalty */ - function setNFTRoyaltyReceiver( - uint256 tokenId, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiver(uint256 tokenId, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { _setTokenRoyalty(tokenId, receiver, feeNumerator); } @@ -142,11 +147,10 @@ abstract contract ImmutableERC721HybridBaseV2 is * @param feeNumerator the royalty fee numerator * @dev This can only be called by the a minter. See ERC2981 for more details on _setTokenRoyalty */ - function setNFTRoyaltyReceiverBatch( - uint256[] calldata tokenIds, - address receiver, - uint96 feeNumerator - ) public onlyRole(MINTER_ROLE) { + function setNFTRoyaltyReceiverBatch(uint256[] calldata tokenIds, address receiver, uint96 feeNumerator) + public + onlyRole(MINTER_ROLE) + { for (uint256 i = 0; i < tokenIds.length; i++) { _setTokenRoyalty(tokenIds[i], receiver, feeNumerator); } diff --git a/contracts/token/erc721/erc721psi/ERC721Psi.sol b/contracts/token/erc721/erc721psi/ERC721Psi.sol index 569c93b1..fd3637d9 100644 --- a/contracts/token/erc721/erc721psi/ERC721Psi.sol +++ b/contracts/token/erc721/erc721psi/ERC721Psi.sol @@ -83,10 +83,8 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { - return - interfaceId == type(IERC721).interfaceId || - interfaceId == type(IERC721Metadata).interfaceId || - super.supportsInterface(interfaceId); + return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId + || super.supportsInterface(interfaceId); } /** @@ -110,7 +108,7 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { - (address owner, ) = _ownerAndBatchHeadOf(tokenId); + (address owner,) = _ownerAndBatchHeadOf(tokenId); return owner; } @@ -240,8 +238,7 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require( - _checkOnERC721Received(from, to, tokenId, 1, _data), - "ERC721Psi: transfer to non ERC721Receiver implementer" + _checkOnERC721Received(from, to, tokenId, 1, _data), "ERC721Psi: transfer to non ERC721Receiver implementer" ); } diff --git a/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol b/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol index 1804ab33..6ccaded5 100644 --- a/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol +++ b/contracts/token/erc721/erc721psi/ERC721PsiBurnableV2.sol @@ -23,7 +23,7 @@ abstract contract ERC721PsiBurnableV2 is ERC721PsiV2 { uint256 groupNumber; uint256 groupOffset; address owner; - (groupNumber, groupOffset, , owner) = _tokenInfo(_tokenId); + (groupNumber, groupOffset,, owner) = _tokenInfo(_tokenId); _beforeTokenTransfers(owner, address(0), _tokenId, 1); diff --git a/contracts/token/erc721/erc721psi/ERC721PsiV2.sol b/contracts/token/erc721/erc721psi/ERC721PsiV2.sol index 8e08f895..51c4153d 100644 --- a/contracts/token/erc721/erc721psi/ERC721PsiV2.sol +++ b/contracts/token/erc721/erc721psi/ERC721PsiV2.sol @@ -69,10 +69,8 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { - return - interfaceId == type(IERC721).interfaceId || - interfaceId == type(IERC721Metadata).interfaceId || - super.supportsInterface(interfaceId); + return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId + || super.supportsInterface(interfaceId); } /** @@ -88,7 +86,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { function ownerOf(uint256 _tokenId) public view virtual override returns (address) { bool exists; address owner; - (, , exists, owner) = _tokenInfo(_tokenId); + (,, exists, owner) = _tokenInfo(_tokenId); require(exists, "ERC721Psi: owner query for nonexistent token"); return owner; } @@ -174,8 +172,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require( - _checkOnERC721Received(from, to, tokenId, 1, _data), - "ERC721Psi: transfer to non ERC721Receiver implementer" + _checkOnERC721Received(from, to, tokenId, 1, _data), "ERC721Psi: transfer to non ERC721Receiver implementer" ); } @@ -188,7 +185,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { */ function _exists(uint256 _tokenId) internal view virtual returns (bool) { bool exists; - (, , exists, ) = _tokenInfo(_tokenId); + (,, exists,) = _tokenInfo(_tokenId); return exists; } @@ -202,7 +199,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { function _isApprovedOrOwner(address _spender, uint256 _tokenId) internal view virtual returns (bool) { bool exists; address owner; - (, , exists, owner) = _tokenInfo(_tokenId); + (,, exists, owner) = _tokenInfo(_tokenId); require(exists, "ERC721Psi: operator query for nonexistent token"); return ((_spender == owner) || (_spender == tokenApprovals[_tokenId]) || isApprovedForAll(owner, _spender)); @@ -359,7 +356,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { * Emits a {Approval} event. */ function _approve(address _to, uint256 _tokenId) internal virtual { - (, , , address owner) = _tokenInfo(_tokenId); + (,,, address owner) = _tokenInfo(_tokenId); // Clear approvals from the previous owner _approve(owner, _to, _tokenId); } @@ -456,7 +453,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { } function _bitIsSet(uint256 _bitMask, uint256 _offset) internal pure returns (bool) { - /// forge-lint: disable-next-line(incorrect-shift) + /// forge-lint: disable-next-line(incorrect-shift) uint256 bitSet = 1 << _offset; return (bitSet & _bitMask != 0); } @@ -473,7 +470,7 @@ abstract contract ERC721PsiV2 is Context, ERC165, IERC721, IERC721Metadata { // If offset = 1, mask should be 0xffff...ffe // If offset = 2, mask should be 0xffff...ffc // If offset = 3, mask should be 0xffff...ff8 - /// forge-lint: disable-next-line(incorrect-shift) + /// forge-lint: disable-next-line(incorrect-shift) uint256 inverseBitMask = (1 << _offset) - 1; return ~inverseBitMask; } diff --git a/contracts/token/erc721/interfaces/IImmutableERC721.sol b/contracts/token/erc721/interfaces/IImmutableERC721.sol index c415db91..3e9ce28a 100644 --- a/contracts/token/erc721/interfaces/IImmutableERC721.sol +++ b/contracts/token/erc721/interfaces/IImmutableERC721.sol @@ -125,25 +125,21 @@ interface IImmutableERC721 is * @notice Returns the domain separator used in the encoding of the signature for permits, as defined by EIP-712 * @return the bytes32 domain separator */ - // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); /** * @notice Return the value for the default admin role. */ - // solhint-disable-next-line func-name-mixedcase function DEFAULT_ADMIN_ROLE() external pure returns (bytes32); /** * @notice Common URIs for individual token URIs */ - // solhint-disable-next-line func-name-mixedcase function baseURI() external view returns (string memory); /** * @notice Contract level metadata */ - // solhint-disable-next-line func-name-mixedcase function contractURI() external view returns (string memory); /** diff --git a/contracts/token/erc721/preset/ImmutableERC721.sol b/contracts/token/erc721/preset/ImmutableERC721.sol index 4f170ab0..c248a546 100644 --- a/contracts/token/erc721/preset/ImmutableERC721.sol +++ b/contracts/token/erc721/preset/ImmutableERC721.sol @@ -6,7 +6,6 @@ import {ImmutableERC721HybridBase} from "../abstract/ImmutableERC721HybridBase.s contract ImmutableERC721 is ImmutableERC721HybridBase { /// ===== Constructor ===== - /** * @notice Grants `DEFAULT_ADMIN_ROLE` to the supplied `owner` address * @param owner_ The address to grant the `DEFAULT_ADMIN_ROLE` to @@ -30,14 +29,7 @@ contract ImmutableERC721 is ImmutableERC721HybridBase { uint96 feeNumerator_ ) ImmutableERC721HybridBase( - owner_, - name_, - symbol_, - baseURI_, - contractURI_, - operatorAllowlist_, - royaltyReceiver_, - feeNumerator_ + owner_, name_, symbol_, baseURI_, contractURI_, operatorAllowlist_, royaltyReceiver_, feeNumerator_ ) {} diff --git a/contracts/token/erc721/preset/ImmutableERC721MintByID.sol b/contracts/token/erc721/preset/ImmutableERC721MintByID.sol index 08a79408..e313659b 100644 --- a/contracts/token/erc721/preset/ImmutableERC721MintByID.sol +++ b/contracts/token/erc721/preset/ImmutableERC721MintByID.sol @@ -6,7 +6,6 @@ import {ImmutableERC721Base} from "../abstract/ImmutableERC721Base.sol"; contract ImmutableERC721MintByID is ImmutableERC721Base { /// ===== Constructor ===== - /** * @notice Grants `DEFAULT_ADMIN_ROLE` to the supplied `owner` address * @param owner_ The address to grant the `DEFAULT_ADMIN_ROLE` to @@ -30,14 +29,7 @@ contract ImmutableERC721MintByID is ImmutableERC721Base { uint96 feeNumerator_ ) ImmutableERC721Base( - owner_, - name_, - symbol_, - baseURI_, - contractURI_, - operatorAllowlist_, - royaltyReceiver_, - feeNumerator_ + owner_, name_, symbol_, baseURI_, contractURI_, operatorAllowlist_, royaltyReceiver_, feeNumerator_ ) {} diff --git a/contracts/token/erc721/preset/ImmutableERC721V2.sol b/contracts/token/erc721/preset/ImmutableERC721V2.sol index 9d4dd9b3..88966d20 100644 --- a/contracts/token/erc721/preset/ImmutableERC721V2.sol +++ b/contracts/token/erc721/preset/ImmutableERC721V2.sol @@ -6,7 +6,6 @@ import {ImmutableERC721HybridBaseV2} from "../abstract/ImmutableERC721HybridBase contract ImmutableERC721V2 is ImmutableERC721HybridBaseV2 { /// ===== Constructor ===== - /** * @notice Grants `DEFAULT_ADMIN_ROLE` to the supplied `owner` address * @param owner_ The address to grant the `DEFAULT_ADMIN_ROLE` to @@ -30,14 +29,7 @@ contract ImmutableERC721V2 is ImmutableERC721HybridBaseV2 { uint96 feeNumerator_ ) ImmutableERC721HybridBaseV2( - owner_, - name_, - symbol_, - baseURI_, - contractURI_, - operatorAllowlist_, - royaltyReceiver_, - feeNumerator_ + owner_, name_, symbol_, baseURI_, contractURI_, operatorAllowlist_, royaltyReceiver_, feeNumerator_ ) {} diff --git a/contracts/token/erc721/x/Asset.sol b/contracts/token/erc721/x/Asset.sol deleted file mode 100644 index 0f4edda4..00000000 --- a/contracts/token/erc721/x/Asset.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT -// solhint-disable compiler-version -pragma solidity ^0.8.4; - -import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import {Mintable} from "./Mintable.sol"; - -// slither-disable-start missing-inheritance -contract Asset is ERC721, Mintable { - constructor( - address _owner, - string memory _name, - string memory _symbol, - address _imx - ) ERC721(_name, _symbol) Mintable(_owner, _imx) {} - - function _mintFor(address user, uint256 id, bytes memory) internal override { - _safeMint(user, id); - } -} -// slither-disable-end missing-inheritance diff --git a/contracts/token/erc721/x/IMintable.sol b/contracts/token/erc721/x/IMintable.sol deleted file mode 100644 index d458f07d..00000000 --- a/contracts/token/erc721/x/IMintable.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT -// solhint-disable compiler-version -pragma solidity ^0.8.4; - -interface IMintable { - function mintFor(address to, uint256 quantity, bytes calldata mintingBlob) external; -} diff --git a/contracts/token/erc721/x/Mintable.sol b/contracts/token/erc721/x/Mintable.sol deleted file mode 100644 index 0f8987ab..00000000 --- a/contracts/token/erc721/x/Mintable.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// solhint-disable compiler-version, custom-errors, reason-string -pragma solidity ^0.8.4; - -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; -import {IMintable} from "./IMintable.sol"; -import {Minting} from "./utils/Minting.sol"; - -abstract contract Mintable is Ownable, IMintable { - address public immutable imx; - mapping(uint256 id => bytes blueprint) public blueprints; - - event AssetMinted(address to, uint256 id, bytes blueprint); - - constructor(address _owner, address _imx) { - imx = _imx; - require(_owner != address(0), "Owner must not be empty"); - transferOwnership(_owner); - } - - modifier onlyOwnerOrIMX() { - require(msg.sender == imx || msg.sender == owner(), "Function can only be called by owner or IMX"); - _; - } - - function mintFor(address user, uint256 quantity, bytes calldata mintingBlob) external override onlyOwnerOrIMX { - require(quantity == 1, "Mintable: invalid quantity"); - (uint256 id, bytes memory blueprint) = Minting.split(mintingBlob); - _mintFor(user, id, blueprint); - blueprints[id] = blueprint; - emit AssetMinted(user, id, blueprint); - } - - function _mintFor(address to, uint256 id, bytes memory blueprint) internal virtual; -} diff --git a/contracts/token/erc721/x/utils/Bytes.sol b/contracts/token/erc721/x/utils/Bytes.sol deleted file mode 100644 index fad2514d..00000000 --- a/contracts/token/erc721/x/utils/Bytes.sol +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: MIT -// solhint-disable compiler-version, custom-errors, reason-string -pragma solidity ^0.8.4; - -// slither-disable-start dead-code -library Bytes { - /** - * @dev Converts a `uint256` to a `string`. - * via OraclizeAPI - MIT licence - * https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol - */ - function fromUint(uint256 value) internal pure returns (string memory) { - if (value == 0) { - return "0"; - } - uint256 temp = value; - uint256 digits; - while (temp != 0) { - digits++; - temp /= 10; - } - bytes memory buffer = new bytes(digits); - uint256 index = digits - 1; - temp = value; - while (temp != 0) { - buffer[index--] = bytes1(uint8(48 + (temp % 10))); - temp /= 10; - } - return string(buffer); - } - - /** - * Index Of - * - * Locates and returns the position of a character within a string starting - * from a defined offset - * - * @param _base When being used for a data type this is the extended object - * otherwise this is the string acting as the haystack to be - * searched - * @param _value The needle to search for, at present this is currently - * limited to one character - * @param _offset The starting point to start searching from which can start - * from 0, but must not exceed the length of the string - * @return int The position of the needle starting from 0 and returning -1 - * in the case of no matches found - */ - function indexOf(bytes memory _base, string memory _value, uint256 _offset) internal pure returns (int256) { - bytes memory _valueBytes = bytes(_value); - - assert(_valueBytes.length == 1); - - for (uint256 i = _offset; i < _base.length; i++) { - if (_base[i] == _valueBytes[0]) { - return int256(i); - } - } - - return -1; - } - - function substring( - bytes memory strBytes, - uint256 startIndex, - uint256 endIndex - ) internal pure returns (string memory) { - bytes memory result = new bytes(endIndex - startIndex); - for (uint256 i = startIndex; i < endIndex; i++) { - result[i - startIndex] = strBytes[i]; - } - return string(result); - } - - function toUint(bytes memory b) internal pure returns (uint256) { - uint256 result = 0; - for (uint256 i = 0; i < b.length; i++) { - uint256 val = uint256(uint8(b[i])); - if (val >= 48 && val <= 57) { - // input is 0-9 - result = result * 10 + (val - 48); - } else { - // invalid character, expecting integer input - revert("invalid input, only numbers allowed"); - } - } - return result; - } -} -// slither-disable-end dead-code diff --git a/contracts/token/erc721/x/utils/Minting.sol b/contracts/token/erc721/x/utils/Minting.sol deleted file mode 100644 index c87776d6..00000000 --- a/contracts/token/erc721/x/utils/Minting.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -// solhint-disable compiler-version, custom-errors -pragma solidity ^0.8.4; - -import {Bytes} from "./Bytes.sol"; - -library Minting { - // Split the minting blob into token_id and blueprint portions - // {token_id}:{blueprint} - - function split(bytes calldata blob) internal pure returns (uint256, bytes memory) { - int256 index = Bytes.indexOf(blob, ":", 0); - require(index >= 0, "Separator must exist"); - // Trim the { and } from the parameters - uint256 tokenID = Bytes.toUint(blob[1:uint256(index) - 1]); - uint256 blueprintLength = blob.length - uint256(index) - 3; - if (blueprintLength == 0) { - return (tokenID, bytes("")); - } - bytes calldata blueprint = blob[uint256(index) + 2:blob.length - 1]; - return (tokenID, blueprint); - } -} diff --git a/contracts/trading/seaport/ImmutableSeaport.sol b/contracts/trading/seaport/ImmutableSeaport.sol index acca5b85..0dc3c144 100644 --- a/contracts/trading/seaport/ImmutableSeaport.sol +++ b/contracts/trading/seaport/ImmutableSeaport.sol @@ -1,10 +1,17 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; import {Consideration} from "seaport-core/src/lib/Consideration.sol"; -import {AdvancedOrder, BasicOrderParameters, CriteriaResolver, Execution, Fulfillment, FulfillmentComponent, Order} from "seaport-types/src/lib/ConsiderationStructs.sol"; +import { + AdvancedOrder, + BasicOrderParameters, + CriteriaResolver, + Execution, + Fulfillment, + FulfillmentComponent, + Order +} from "seaport-types/src/lib/ConsiderationStructs.sol"; import {OrderType} from "seaport-types/src/lib/ConsiderationEnums.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {ImmutableSeaportEvents} from "./interfaces/ImmutableSeaportEvents.sol"; @@ -22,7 +29,6 @@ import {ImmutableSeaportEvents} from "./interfaces/ImmutableSeaportEvents.sol"; contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { // Mapping to store valid ImmutableZones - this allows for multiple Zones // to be active at the same time, and can be expired or added on demand. - // solhint-disable-next-line named-parameters-mapping mapping(address => bool) public allowedZones; error OrderNotRestricted(); @@ -108,9 +114,13 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ - function fulfillBasicOrder( - BasicOrderParameters calldata parameters - ) public payable virtual override returns (bool fulfilled) { + function fulfillBasicOrder(BasicOrderParameters calldata parameters) + public + payable + virtual + override + returns (bool fulfilled) + { // All restricted orders are captured using this method if (uint256(parameters.basicOrderType) % 4 != 2 && uint256(parameters.basicOrderType) % 4 != 3) { revert OrderNotRestricted(); @@ -149,10 +159,13 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ - // solhint-disable-next-line func-name-mixedcase - function fulfillBasicOrder_efficient_6GL6yc( - BasicOrderParameters calldata parameters - ) public payable virtual override returns (bool fulfilled) { + function fulfillBasicOrder_efficient_6GL6yc(BasicOrderParameters calldata parameters) + public + payable + virtual + override + returns (bool fulfilled) + { // All restricted orders are captured using this method if (uint256(parameters.basicOrderType) % 4 != 2 && uint256(parameters.basicOrderType) % 4 != 3) { revert OrderNotRestricted(); @@ -191,10 +204,16 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { */ Order calldata order, bytes32 fulfillerConduitKey - ) public payable virtual override returns (bool fulfilled) { + ) + public + payable + virtual + override + returns (bool fulfilled) + { if ( - order.parameters.orderType != OrderType.FULL_RESTRICTED && - order.parameters.orderType != OrderType.PARTIAL_RESTRICTED + order.parameters.orderType != OrderType.FULL_RESTRICTED + && order.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(); } @@ -260,8 +279,8 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { address recipient ) public payable virtual override returns (bool fulfilled) { if ( - advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED && - advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED + advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED + && advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(); } @@ -344,27 +363,25 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { payable virtual override - returns (bool[] memory, /* availableOrders */ Execution[] memory /* executions */) + returns ( + bool[] memory, /* availableOrders */ + Execution[] memory /* executions */ + ) { for (uint256 i = 0; i < orders.length; i++) { Order memory order = orders[i]; if ( - order.parameters.orderType != OrderType.FULL_RESTRICTED && - order.parameters.orderType != OrderType.PARTIAL_RESTRICTED + order.parameters.orderType != OrderType.FULL_RESTRICTED + && order.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(); } _rejectIfZoneInvalid(order.parameters.zone); } - return - super.fulfillAvailableOrders( - orders, - offerFulfillments, - considerationFulfillments, - fulfillerConduitKey, - maximumFulfilled - ); + return super.fulfillAvailableOrders( + orders, offerFulfillments, considerationFulfillments, fulfillerConduitKey, maximumFulfilled + ); } /** @@ -470,13 +487,16 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { payable virtual override - returns (bool[] memory, /* availableOrders */ Execution[] memory /* executions */) + returns ( + bool[] memory, /* availableOrders */ + Execution[] memory /* executions */ + ) { for (uint256 i = 0; i < advancedOrders.length; i++) { AdvancedOrder memory advancedOrder = advancedOrders[i]; if ( - advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED && - advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED + advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED + && advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(); } @@ -484,16 +504,15 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { _rejectIfZoneInvalid(advancedOrder.parameters.zone); } - return - super.fulfillAvailableAdvancedOrders( - advancedOrders, - criteriaResolvers, - offerFulfillments, - considerationFulfillments, - fulfillerConduitKey, - recipient, - maximumFulfilled - ); + return super.fulfillAvailableAdvancedOrders( + advancedOrders, + criteriaResolvers, + offerFulfillments, + considerationFulfillments, + fulfillerConduitKey, + recipient, + maximumFulfilled + ); } /** @@ -534,12 +553,20 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { * @custom:name fulfillments */ Fulfillment[] calldata fulfillments - ) public payable virtual override returns (Execution[] memory /* executions */) { + ) + public + payable + virtual + override + returns ( + Execution[] memory /* executions */ + ) + { for (uint256 i = 0; i < orders.length; i++) { Order memory order = orders[i]; if ( - order.parameters.orderType != OrderType.FULL_RESTRICTED && - order.parameters.orderType != OrderType.PARTIAL_RESTRICTED + order.parameters.orderType != OrderType.FULL_RESTRICTED + && order.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(); } @@ -615,12 +642,20 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { */ Fulfillment[] calldata fulfillments, address recipient - ) public payable virtual override returns (Execution[] memory /* executions */) { + ) + public + payable + virtual + override + returns ( + Execution[] memory /* executions */ + ) + { for (uint256 i = 0; i < advancedOrders.length; i++) { AdvancedOrder memory advancedOrder = advancedOrders[i]; if ( - advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED && - advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED + advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED + && advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(); } diff --git a/contracts/trading/seaport/conduit/ConduitController.sol b/contracts/trading/seaport/conduit/ConduitController.sol index 46ea8426..3757b039 100644 --- a/contracts/trading/seaport/conduit/ConduitController.sol +++ b/contracts/trading/seaport/conduit/ConduitController.sol @@ -1,5 +1,4 @@ // SPDX-License-Identifier: MIT -// solhint-disable pragma solidity ^0.8.14; // forge-lint: disable-next-line(unused-import) diff --git a/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol b/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol index 26a353a3..9b67db9a 100644 --- a/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol +++ b/contracts/trading/seaport/interfaces/ImmutableSeaportEvents.sol @@ -1,6 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol b/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol deleted file mode 100644 index fce83a79..00000000 --- a/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// forge-lint: disable-next-line(unused-import) -import {ReadOnlyOrderValidator} from "seaport/contracts/helpers/order-validator/lib/ReadOnlyOrderValidator.sol"; diff --git a/contracts/trading/seaport/validators/SeaportValidator.sol b/contracts/trading/seaport/validators/SeaportValidator.sol deleted file mode 100644 index db4d3758..00000000 --- a/contracts/trading/seaport/validators/SeaportValidator.sol +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// forge-lint: disable-next-line(unused-import) -import {SeaportValidator} from "seaport/contracts/helpers/order-validator/SeaportValidator.sol"; diff --git a/contracts/trading/seaport/validators/SeaportValidatorHelper.sol b/contracts/trading/seaport/validators/SeaportValidatorHelper.sol deleted file mode 100644 index b0f7b7aa..00000000 --- a/contracts/trading/seaport/validators/SeaportValidatorHelper.sol +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// forge-lint: disable-next-line(unused-import) -import {SeaportValidatorHelper} from "seaport/contracts/helpers/order-validator/lib/SeaportValidatorHelper.sol"; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol index 5c04b75d..416ac131 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2 // slither-disable-start missing-inheritance -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ZoneParameters, Schema, ReceivedItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; @@ -42,43 +41,30 @@ contract ImmutableSignedZone is { /// @dev The EIP-712 digest parameters. bytes32 internal immutable _VERSION_HASH = keccak256(bytes("1.0")); - bytes32 internal immutable _EIP_712_DOMAIN_TYPEHASH = - keccak256( - abi.encodePacked( - "EIP712Domain(", - "string name,", - "string version,", - "uint256 chainId,", - "address verifyingContract", - ")" - ) - ); + bytes32 internal immutable _EIP_712_DOMAIN_TYPEHASH = keccak256( + abi.encodePacked( + "EIP712Domain(", "string name,", "string version,", "uint256 chainId,", "address verifyingContract", ")" + ) + ); - bytes32 internal immutable _SIGNED_ORDER_TYPEHASH = - keccak256( - abi.encodePacked( - "SignedOrder(", - "address fulfiller,", - "uint64 expiration,", - "bytes32 orderHash,", - "bytes context", - ")" - ) - ); + bytes32 internal immutable _SIGNED_ORDER_TYPEHASH = keccak256( + abi.encodePacked( + "SignedOrder(", "address fulfiller,", "uint64 expiration,", "bytes32 orderHash,", "bytes context", ")" + ) + ); bytes internal constant CONSIDERATION_BYTES = abi.encodePacked("Consideration(", "ReceivedItem[] consideration", ")"); - bytes internal constant RECEIVED_ITEM_BYTES = - abi.encodePacked( - "ReceivedItem(", - "uint8 itemType,", - "address token,", - "uint256 identifier,", - "uint256 amount,", - "address recipient", - ")" - ); + bytes internal constant RECEIVED_ITEM_BYTES = abi.encodePacked( + "ReceivedItem(", + "uint8 itemType,", + "address token,", + "uint256 identifier,", + "uint256 amount,", + "address recipient", + ")" + ); bytes32 internal constant RECEIVED_ITEM_TYPEHASH = keccak256(RECEIVED_ITEM_BYTES); @@ -90,16 +76,13 @@ contract ImmutableSignedZone is uint8 internal immutable _ACCEPTED_SIP6_VERSION = 0; /// @dev The name for this zone returned in getSeaportMetadata(). - // solhint-disable-next-line var-name-mixedcase string private _ZONE_NAME; // slither-disable-start immutable-states - // solhint-disable-next-line var-name-mixedcase bytes32 internal _NAME_HASH; // slither-disable-end immutable-states /// @dev The allowed signers. - // solhint-disable-next-line named-parameters-mapping mapping(address => SignerInfo) private _signers; /// @dev The API endpoint where orders for this zone can be signed. @@ -164,7 +147,7 @@ contract ImmutableSignedZone is } // Set the signer info. - _signers[signer] = SignerInfo(true, true); + _signers[signer] = SignerInfo({active: true, previouslyActive: true}); // Emit an event that the signer was added. emit SignerAdded(signer); @@ -197,9 +180,12 @@ contract ImmutableSignedZone is * @return validOrderMagicValue A magic value indicating if the order is * currently valid. */ - function validateOrder( - ZoneParameters calldata zoneParameters - ) external view override returns (bytes4 validOrderMagicValue) { + function validateOrder(ZoneParameters calldata zoneParameters) + external + view + override + returns (bytes4 validOrderMagicValue) + { // Put the extraData and orderHash on the stack for cheaper access. bytes calldata extraData = zoneParameters.extraData; bytes32 orderHash = zoneParameters.orderHash; @@ -238,9 +224,7 @@ contract ImmutableSignedZone is bytes calldata context = extraData[93:]; // Revert if expired. - // solhint-disable-next-line not-rely-on-time if (block.timestamp > expiration) { - // solhint-disable-next-line not-rely-on-time revert SignatureExpired(block.timestamp, expiration, orderHash); } @@ -372,8 +356,7 @@ contract ImmutableSignedZone is // first 32bytes of context must be exactly a keccak256 hash of consideration item array if (context.length < 32) { revert InvalidExtraData( - "invalid context, expecting consideration hash followed by order hashes", - zoneParameters.orderHash + "invalid context, expecting consideration hash followed by order hashes", zoneParameters.orderHash ); } @@ -390,8 +373,7 @@ contract ImmutableSignedZone is // context must be a multiple of 32 bytes if (orderHashesBytes.length % 32 != 0) { revert InvalidExtraData( - "invalid context, order hashes bytes not an array of bytes32 hashes", - zoneParameters.orderHash + "invalid context, order hashes bytes not an array of bytes32 hashes", zoneParameters.orderHash ); } @@ -432,16 +414,14 @@ contract ImmutableSignedZone is * @return signedOrderHash The signedOrder hash. * */ - function _deriveSignedOrderHash( - address fulfiller, - uint64 expiration, - bytes32 orderHash, - bytes calldata context - ) internal view returns (bytes32 signedOrderHash) { + function _deriveSignedOrderHash(address fulfiller, uint64 expiration, bytes32 orderHash, bytes calldata context) + internal + view + returns (bytes32 signedOrderHash) + { // Derive the signed order hash. - signedOrderHash = keccak256( - abi.encode(_SIGNED_ORDER_TYPEHASH, fulfiller, expiration, orderHash, keccak256(context)) - ); + signedOrderHash = + keccak256(abi.encode(_SIGNED_ORDER_TYPEHASH, fulfiller, expiration, orderHash, keccak256(context))); } /** @@ -485,10 +465,10 @@ contract ImmutableSignedZone is } // Iterate through each element and compare them - for (uint256 i = 0; i < array1Size; ) { + for (uint256 i = 0; i < array1Size;) { bool found = false; bytes32 item = array1[i]; - for (uint256 j = 0; j < array2Size; ) { + for (uint256 j = 0; j < array2Size;) { if (item == array2[j]) { // if item from array1 is in array2, break found = true; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol index 3095ddbc..2d7d6068 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP5Interface.sol @@ -1,6 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; import {Schema} from "seaport-types/src/lib/ConsiderationStructs.sol"; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol index 8678cc72..72e17a60 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol @@ -1,6 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol index b3cbf181..add225ae 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol @@ -1,6 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol index 85065b8e..1ed67cf9 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7Interface.sol @@ -1,6 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol index e8239595..9f82e55e 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol @@ -1,7 +1,6 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable-next-line compiler-version pragma solidity 0.8.20; import {AccessControlEnumerable} from "openzeppelin-contracts-5.0.2/access/extensions/AccessControlEnumerable.sol"; @@ -36,33 +35,21 @@ contract ImmutableSignedZoneV2 is SIP7Interface { /// @dev The EIP-712 domain type hash. - bytes32 private constant _EIP_712_DOMAIN_TYPEHASH = - keccak256( - abi.encodePacked( - "EIP712Domain(", - "string name,", - "string version,", - "uint256 chainId,", - "address verifyingContract", - ")" - ) - ); + bytes32 private constant _EIP_712_DOMAIN_TYPEHASH = keccak256( + abi.encodePacked( + "EIP712Domain(", "string name,", "string version,", "uint256 chainId,", "address verifyingContract", ")" + ) + ); /// @dev The EIP-712 domain version value. bytes32 private constant _VERSION_HASH = keccak256(bytes("2.0")); /// @dev The EIP-712 signed order type hash. - bytes32 private constant _SIGNED_ORDER_TYPEHASH = - keccak256( - abi.encodePacked( - "SignedOrder(", - "address fulfiller,", - "uint64 expiration,", - "bytes32 orderHash,", - "bytes context", - ")" - ) - ); + bytes32 private constant _SIGNED_ORDER_TYPEHASH = keccak256( + abi.encodePacked( + "SignedOrder(", "address fulfiller,", "uint64 expiration,", "bytes32 orderHash,", "bytes context", ")" + ) + ); /// @dev The chain ID on which the contract was deployed. uint256 private immutable _CHAIN_ID = block.chainid; @@ -74,13 +61,11 @@ contract ImmutableSignedZoneV2 is uint8 private constant _ACCEPTED_SIP6_VERSION = 0; /// @dev The name for this zone returned in getSeaportMetadata(). - // solhint-disable-next-line var-name-mixedcase string private _ZONE_NAME; bytes32 private immutable _NAME_HASH; /// @dev The allowed signers. - // solhint-disable-next-line named-parameters-mapping mapping(address => SignerInfo) private _signers; /// @dev The API endpoint where orders for this zone can be signed. @@ -99,12 +84,9 @@ contract ImmutableSignedZoneV2 is * @param owner The address of the owner of this contract. Specified in the * constructor to be CREATE2 / CREATE3 compatible. */ - constructor( - string memory zoneName, - string memory apiEndpoint, - string memory documentationURI, - address owner - ) ZoneAccessControl(owner) { + constructor(string memory zoneName, string memory apiEndpoint, string memory documentationURI, address owner) + ZoneAccessControl(owner) + { // Set the zone name. _ZONE_NAME = zoneName; @@ -148,7 +130,7 @@ contract ImmutableSignedZoneV2 is } // Set the signer info. - _signers[signer] = SignerInfo(true, true); + _signers[signer] = SignerInfo({active: true, previouslyActive: true}); // Emit an event that the signer was added. emit SignerAdded(signer); @@ -208,12 +190,8 @@ contract ImmutableSignedZoneV2 is // supported SIP (7) schemas = new Schema[](1); schemas[0].id = 7; - schemas[0].metadata = abi.encode( - _domainSeparator(), - _apiEndpoint, - _getSupportedSubstandards(), - _documentationURI - ); + schemas[0].metadata = + abi.encode(_domainSeparator(), _apiEndpoint, _getSupportedSubstandards(), _documentationURI); } /** @@ -254,9 +232,12 @@ contract ImmutableSignedZoneV2 is * @return validOrderMagicValue A magic value indicating if the order is * currently valid. */ - function validateOrder( - ZoneParameters calldata zoneParameters - ) external view override returns (bytes4 validOrderMagicValue) { + function validateOrder(ZoneParameters calldata zoneParameters) + external + view + override + returns (bytes4 validOrderMagicValue) + { // Put the extraData and orderHash on the stack for cheaper access. bytes calldata extraData = zoneParameters.extraData; bytes32 orderHash = zoneParameters.orderHash; @@ -295,9 +276,7 @@ contract ImmutableSignedZoneV2 is bytes calldata context = extraData[93:]; // Revert if expired. - // solhint-disable-next-line not-rely-on-time if (block.timestamp > expiration) { - // solhint-disable-next-line not-rely-on-time revert SignatureExpired(block.timestamp, expiration, orderHash); } @@ -340,14 +319,14 @@ contract ImmutableSignedZoneV2 is * * @param interfaceId The interface ID to check for support. */ - function supportsInterface( - bytes4 interfaceId - ) public view override(ERC165, ZoneInterface, AccessControlEnumerable) returns (bool) { - return - interfaceId == type(ZoneInterface).interfaceId || - interfaceId == type(SIP5Interface).interfaceId || - interfaceId == type(SIP7Interface).interfaceId || - super.supportsInterface(interfaceId); + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC165, ZoneInterface, AccessControlEnumerable) + returns (bool) + { + return interfaceId == type(ZoneInterface).interfaceId || interfaceId == type(SIP5Interface).interfaceId + || interfaceId == type(SIP7Interface).interfaceId || super.supportsInterface(interfaceId); } /** @@ -393,16 +372,14 @@ contract ImmutableSignedZoneV2 is * @param context The optional variable-length context. * @return signedOrderHash The signedOrder hash. */ - function _deriveSignedOrderHash( - address fulfiller, - uint64 expiration, - bytes32 orderHash, - bytes calldata context - ) internal pure returns (bytes32 signedOrderHash) { + function _deriveSignedOrderHash(address fulfiller, uint64 expiration, bytes32 orderHash, bytes calldata context) + internal + pure + returns (bytes32 signedOrderHash) + { // Derive the signed order hash. - signedOrderHash = keccak256( - abi.encode(_SIGNED_ORDER_TYPEHASH, fulfiller, expiration, orderHash, keccak256(context)) - ); + signedOrderHash = + keccak256(abi.encode(_SIGNED_ORDER_TYPEHASH, fulfiller, expiration, orderHash, keccak256(context))); } /** @@ -448,10 +425,11 @@ contract ImmutableSignedZoneV2 is * @param zoneParameters The zone parameters. * @return Length of substandard segment. */ - function _validateSubstandard3( - bytes calldata context, - ZoneParameters calldata zoneParameters - ) internal pure returns (uint256) { + function _validateSubstandard3(bytes calldata context, ZoneParameters calldata zoneParameters) + internal + pure + returns (uint256) + { if (uint8(context[0]) != 3) { return 0; } @@ -477,10 +455,11 @@ contract ImmutableSignedZoneV2 is * @param zoneParameters The zone parameters. * @return Length of substandard segment. */ - function _validateSubstandard4( - bytes calldata context, - ZoneParameters calldata zoneParameters - ) internal pure returns (uint256) { + function _validateSubstandard4(bytes calldata context, ZoneParameters calldata zoneParameters) + internal + pure + returns (uint256) + { if (uint8(context[0]) != 4) { return 0; } @@ -511,10 +490,11 @@ contract ImmutableSignedZoneV2 is * @param zoneParameters The zone parameters. * @return Length of substandard segment. */ - function _validateSubstandard6( - bytes calldata context, - ZoneParameters calldata zoneParameters - ) internal pure returns (uint256) { + function _validateSubstandard6(bytes calldata context, ZoneParameters calldata zoneParameters) + internal + pure + returns (uint256) + { if (uint8(context[0]) != 6) { return 0; } @@ -539,15 +519,11 @@ contract ImmutableSignedZoneV2 is // from context) amounts of the first offer item. if ( _deriveReceivedItemsHash( - zoneParameters.consideration, - originalFirstOfferItemAmount, - zoneParameters.offer[0].amount - ) != expectedReceivedItemsHash + zoneParameters.consideration, originalFirstOfferItemAmount, zoneParameters.offer[0].amount + ) != expectedReceivedItemsHash ) { revert Substandard6Violation( - zoneParameters.offer[0].amount, - originalFirstOfferItemAmount, - zoneParameters.orderHash + zoneParameters.offer[0].amount, originalFirstOfferItemAmount, zoneParameters.orderHash ); } @@ -592,10 +568,11 @@ contract ImmutableSignedZoneV2 is * @param values Values array. * @return True if all elements in values exist in sourceArray. */ - function _bytes32ArrayIncludes( - bytes32[] calldata sourceArray, - bytes32[] memory values - ) internal pure returns (bool) { + function _bytes32ArrayIncludes(bytes32[] calldata sourceArray, bytes32[] memory values) + internal + pure + returns (bool) + { // cache the length in memory for loop optimisation uint256 sourceArraySize = sourceArray.length; uint256 valuesSize = values.length; @@ -607,10 +584,10 @@ contract ImmutableSignedZoneV2 is } // Iterate through each element and compare them - for (uint256 i = 0; i < valuesSize; ) { + for (uint256 i = 0; i < valuesSize;) { bool found = false; bytes32 item = values[i]; - for (uint256 j = 0; j < sourceArraySize; ) { + for (uint256 j = 0; j < sourceArraySize;) { if (item == sourceArray[j]) { // if item from values is in sourceArray, break found = true; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol index 2a121335..638fc086 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/ZoneAccessControl.sol @@ -6,7 +6,9 @@ pragma solidity 0.8.20; import {AccessControl} from "openzeppelin-contracts-5.0.2/access/AccessControl.sol"; import {IAccessControl} from "openzeppelin-contracts-5.0.2/access/IAccessControl.sol"; import {AccessControlEnumerable} from "openzeppelin-contracts-5.0.2/access/extensions/AccessControlEnumerable.sol"; -import {ZoneAccessControlEventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol"; +import { + ZoneAccessControlEventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol"; /** * @notice ZoneAccessControl encapsulates access control functionality for the zone. @@ -29,10 +31,11 @@ abstract contract ZoneAccessControl is AccessControlEnumerable, ZoneAccessContro /** * @inheritdoc AccessControl */ - function revokeRole( - bytes32 role, - address account - ) public override(AccessControl, IAccessControl) onlyRole(getRoleAdmin(role)) { + function revokeRole(bytes32 role, address account) + public + override(AccessControl, IAccessControl) + onlyRole(getRoleAdmin(role)) + { if (role == DEFAULT_ADMIN_ROLE && super.getRoleMemberCount(DEFAULT_ADMIN_ROLE) == 1) { revert LastDefaultAdminRole(account); } diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol index fc9943be..97334d48 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol @@ -1,7 +1,6 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol index 47fe9fbb..3610fbbc 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5Interface.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; import {Schema} from "seaport-types/src/lib/ConsiderationStructs.sol"; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol index 10760f96..d313057e 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol index b71302f3..094e56ea 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6Interface.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; import {SIP6EventsAndErrors} from "./SIP6EventsAndErrors.sol"; @@ -10,5 +8,4 @@ import {SIP6EventsAndErrors} from "./SIP6EventsAndErrors.sol"; * @dev SIP-6: Multi-Zone ExtraData * https://github.com/ProjectOpenSea/SIPs/blob/main/SIPS/sip-6.md */ -// solhint-disable no-empty-blocks interface SIP6Interface is SIP6EventsAndErrors {} diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol index 48c8e065..19ad0c1b 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol index fc362fa4..a13c32c4 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; import {SIP7EventsAndErrors} from "./SIP7EventsAndErrors.sol"; diff --git a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol index b6ea6b01..9dfd38ca 100644 --- a/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol +++ b/contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport16/ImmutableSeaport.sol b/contracts/trading/seaport16/ImmutableSeaport.sol index 86c1623f..622c3b18 100644 --- a/contracts/trading/seaport16/ImmutableSeaport.sol +++ b/contracts/trading/seaport16/ImmutableSeaport.sol @@ -1,10 +1,17 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.24; import {Consideration} from "seaport-core-16/src/lib/Consideration.sol"; -import {AdvancedOrder, BasicOrderParameters, CriteriaResolver, Execution, Fulfillment, FulfillmentComponent, Order} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; +import { + AdvancedOrder, + BasicOrderParameters, + CriteriaResolver, + Execution, + Fulfillment, + FulfillmentComponent, + Order +} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; import {OrderType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {ImmutableSeaportEvents} from "./interfaces/ImmutableSeaportEvents.sol"; @@ -22,7 +29,6 @@ import {ImmutableSeaportEvents} from "./interfaces/ImmutableSeaportEvents.sol"; contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { // Mapping to store valid ImmutableZones - this allows for multiple Zones // to be active at the same time, and can be expired or added on demand. - // solhint-disable-next-line named-parameters-mapping mapping(address => bool) public allowedZones; error OrderNotRestricted(uint8 orderType); @@ -102,8 +108,8 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { */ function _rejectOrderIfZoneInvalid(Order memory order) internal view { if ( - order.parameters.orderType != OrderType.FULL_RESTRICTED && - order.parameters.orderType != OrderType.PARTIAL_RESTRICTED + order.parameters.orderType != OrderType.FULL_RESTRICTED + && order.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(uint8(order.parameters.orderType)); } @@ -117,8 +123,8 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { */ function _rejectAdvancedOrderIfZoneInvalid(AdvancedOrder memory advancedOrder) internal view { if ( - advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED && - advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED + advancedOrder.parameters.orderType != OrderType.FULL_RESTRICTED + && advancedOrder.parameters.orderType != OrderType.PARTIAL_RESTRICTED ) { revert OrderNotRestricted(uint8(advancedOrder.parameters.orderType)); } @@ -161,9 +167,13 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ - function fulfillBasicOrder( - BasicOrderParameters calldata parameters - ) public payable virtual override returns (bool fulfilled) { + function fulfillBasicOrder(BasicOrderParameters calldata parameters) + public + payable + virtual + override + returns (bool fulfilled) + { _rejectBasicOrderIfZoneInvalid(parameters); return super.fulfillBasicOrder(parameters); @@ -197,10 +207,13 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { * @return fulfilled A boolean indicating whether the order has been * successfully fulfilled. */ - // solhint-disable-next-line func-name-mixedcase - function fulfillBasicOrder_efficient_6GL6yc( - BasicOrderParameters calldata parameters - ) public payable virtual override returns (bool fulfilled) { + function fulfillBasicOrder_efficient_6GL6yc(BasicOrderParameters calldata parameters) + public + payable + virtual + override + returns (bool fulfilled) + { _rejectBasicOrderIfZoneInvalid(parameters); return super.fulfillBasicOrder_efficient_6GL6yc(parameters); @@ -234,7 +247,13 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { */ Order calldata order, bytes32 fulfillerConduitKey - ) public payable virtual override returns (bool fulfilled) { + ) + public + payable + virtual + override + returns (bool fulfilled) + { _rejectOrderIfZoneInvalid(order); return super.fulfillOrder(order, fulfillerConduitKey); @@ -373,7 +392,10 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { payable virtual override - returns (bool[] memory, /* availableOrders */ Execution[] memory /* executions */) + returns ( + bool[] memory, /* availableOrders */ + Execution[] memory /* executions */ + ) { uint256 numberOfOrders = orders.length; for (uint256 i = 0; i < numberOfOrders; i++) { @@ -381,14 +403,9 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { _rejectOrderIfZoneInvalid(order); } - return - super.fulfillAvailableOrders( - orders, - offerFulfillments, - considerationFulfillments, - fulfillerConduitKey, - maximumFulfilled - ); + return super.fulfillAvailableOrders( + orders, offerFulfillments, considerationFulfillments, fulfillerConduitKey, maximumFulfilled + ); } /** @@ -494,7 +511,10 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { payable virtual override - returns (bool[] memory, /* availableOrders */ Execution[] memory /* executions */) + returns ( + bool[] memory, /* availableOrders */ + Execution[] memory /* executions */ + ) { uint256 numberOfAdvancedOrders = advancedOrders.length; for (uint256 i = 0; i < numberOfAdvancedOrders; i++) { @@ -502,16 +522,15 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { _rejectAdvancedOrderIfZoneInvalid(advancedOrder); } - return - super.fulfillAvailableAdvancedOrders( - advancedOrders, - criteriaResolvers, - offerFulfillments, - considerationFulfillments, - fulfillerConduitKey, - recipient, - maximumFulfilled - ); + return super.fulfillAvailableAdvancedOrders( + advancedOrders, + criteriaResolvers, + offerFulfillments, + considerationFulfillments, + fulfillerConduitKey, + recipient, + maximumFulfilled + ); } /** @@ -552,7 +571,15 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { * @custom:name fulfillments */ Fulfillment[] calldata fulfillments - ) public payable virtual override returns (Execution[] memory /* executions */) { + ) + public + payable + virtual + override + returns ( + Execution[] memory /* executions */ + ) + { uint256 numberOfOrders = orders.length; for (uint256 i = 0; i < numberOfOrders; i++) { Order memory order = orders[i]; @@ -628,7 +655,15 @@ contract ImmutableSeaport is Consideration, Ownable, ImmutableSeaportEvents { */ Fulfillment[] calldata fulfillments, address recipient - ) public payable virtual override returns (Execution[] memory /* executions */) { + ) + public + payable + virtual + override + returns ( + Execution[] memory /* executions */ + ) + { uint256 numberOfAdvancedOrders = advancedOrders.length; for (uint256 i = 0; i < numberOfAdvancedOrders; i++) { AdvancedOrder memory advancedOrder = advancedOrders[i]; diff --git a/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol b/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol deleted file mode 100644 index bb805019..00000000 --- a/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// forge-lint: disable-next-line(unused-import) -import {ReadOnlyOrderValidator} from "seaport-16/contracts/helpers/order-validator/lib/ReadOnlyOrderValidator.sol"; diff --git a/contracts/trading/seaport16/validators/SeaportValidator.sol b/contracts/trading/seaport16/validators/SeaportValidator.sol deleted file mode 100644 index 54336555..00000000 --- a/contracts/trading/seaport16/validators/SeaportValidator.sol +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// forge-lint: disable-next-line(unused-import) -import {SeaportValidator} from "seaport-16/contracts/helpers/order-validator/SeaportValidator.sol"; diff --git a/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol b/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol deleted file mode 100644 index ef804595..00000000 --- a/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; - -// forge-lint: disable-next-line(unused-import) -import {SeaportValidatorHelper} from "seaport-16/contracts/helpers/order-validator/lib/SeaportValidatorHelper.sol"; diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol index bd0e9ebe..193f2b13 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.20; import {ITransferValidator} from "@limitbreak/creator-token-standards/src/interfaces/ITransferValidator.sol"; @@ -37,33 +35,21 @@ contract ImmutableSignedZoneV3 is SIP7Interface { /// @dev The EIP-712 domain type hash. - bytes32 private constant _EIP_712_DOMAIN_TYPEHASH = - keccak256( - abi.encodePacked( - "EIP712Domain(", - "string name,", - "string version,", - "uint256 chainId,", - "address verifyingContract", - ")" - ) - ); + bytes32 private constant _EIP_712_DOMAIN_TYPEHASH = keccak256( + abi.encodePacked( + "EIP712Domain(", "string name,", "string version,", "uint256 chainId,", "address verifyingContract", ")" + ) + ); /// @dev The EIP-712 domain version value. bytes32 private constant _VERSION_HASH = keccak256(bytes("3.0")); /// @dev The EIP-712 signed order type hash. - bytes32 private constant _SIGNED_ORDER_TYPEHASH = - keccak256( - abi.encodePacked( - "SignedOrder(", - "address fulfiller,", - "uint64 expiration,", - "bytes32 orderHash,", - "bytes context", - ")" - ) - ); + bytes32 private constant _SIGNED_ORDER_TYPEHASH = keccak256( + abi.encodePacked( + "SignedOrder(", "address fulfiller,", "uint64 expiration,", "bytes32 orderHash,", "bytes context", ")" + ) + ); /// @dev The chain ID on which the contract was deployed. uint256 private immutable _CHAIN_ID = block.chainid; @@ -75,7 +61,6 @@ contract ImmutableSignedZoneV3 is uint8 private constant _ACCEPTED_SIP6_VERSION = 0; /// @dev The name for this zone returned in getSeaportMetadata(). - // solhint-disable-next-line var-name-mixedcase string private _ZONE_NAME; bytes32 private immutable _NAME_HASH; @@ -84,7 +69,6 @@ contract ImmutableSignedZoneV3 is address private immutable _SEAPORT; /// @dev The allowed signers. - // solhint-disable-next-line named-parameters-mapping mapping(address => SignerInfo) private _signers; /// @dev The API endpoint where orders for this zone can be signed. @@ -170,7 +154,7 @@ contract ImmutableSignedZoneV3 is } // Set the signer info. - _signers[signer] = SignerInfo(true, true); + _signers[signer] = SignerInfo({active: true, previouslyActive: true}); // Emit an event that the signer was added. emit SignerAdded(signer); @@ -230,12 +214,8 @@ contract ImmutableSignedZoneV3 is // supported SIP (7) schemas = new Schema[](1); schemas[0].id = 7; - schemas[0].metadata = abi.encode( - _domainSeparator(), - _apiEndpoint, - _getSupportedSubstandards(), - _documentationURI - ); + schemas[0].metadata = + abi.encode(_domainSeparator(), _apiEndpoint, _getSupportedSubstandards(), _documentationURI); } /** @@ -276,9 +256,11 @@ contract ImmutableSignedZoneV3 is * @return authorizedOrderMagicValue A magic value indicating if the order * is currently valid. */ - function authorizeOrder( - ZoneParameters calldata zoneParameters - ) external override returns (bytes4 authorizedOrderMagicValue) { + function authorizeOrder(ZoneParameters calldata zoneParameters) + external + override + returns (bytes4 authorizedOrderMagicValue) + { // Revert if the caller is not the Seaport contract. if (msg.sender != _SEAPORT) { revert CallerNotSeaport(); @@ -322,9 +304,7 @@ contract ImmutableSignedZoneV3 is bytes calldata context = extraData[93:]; // Revert if expired. - // solhint-disable-next-line not-rely-on-time if (block.timestamp > expiration) { - // solhint-disable-next-line not-rely-on-time revert SignatureExpired(block.timestamp, expiration, orderHash); } @@ -386,9 +366,11 @@ contract ImmutableSignedZoneV3 is * @return validOrderMagicValue A magic value indicating if the order is * currently valid. */ - function validateOrder( - ZoneParameters calldata zoneParameters - ) external override returns (bytes4 validOrderMagicValue) { + function validateOrder(ZoneParameters calldata zoneParameters) + external + override + returns (bytes4 validOrderMagicValue) + { // Revert if the caller is not the Seaport contract. if (msg.sender != _SEAPORT) { revert CallerNotSeaport(); @@ -413,14 +395,14 @@ contract ImmutableSignedZoneV3 is * * @param interfaceId The interface ID to check for support. */ - function supportsInterface( - bytes4 interfaceId - ) public view override(ERC165, ZoneInterface, AccessControlEnumerable) returns (bool) { - return - interfaceId == type(ZoneInterface).interfaceId || - interfaceId == type(SIP5Interface).interfaceId || - interfaceId == type(SIP7Interface).interfaceId || - super.supportsInterface(interfaceId); + function supportsInterface(bytes4 interfaceId) + public + view + override(ERC165, ZoneInterface, AccessControlEnumerable) + returns (bool) + { + return interfaceId == type(ZoneInterface).interfaceId || interfaceId == type(SIP5Interface).interfaceId + || interfaceId == type(SIP7Interface).interfaceId || super.supportsInterface(interfaceId); } /** @@ -469,16 +451,14 @@ contract ImmutableSignedZoneV3 is * @param context The optional variable-length context. * @return signedOrderHash The signedOrder hash. */ - function _deriveSignedOrderHash( - address fulfiller, - uint64 expiration, - bytes32 orderHash, - bytes calldata context - ) internal pure returns (bytes32 signedOrderHash) { + function _deriveSignedOrderHash(address fulfiller, uint64 expiration, bytes32 orderHash, bytes calldata context) + internal + pure + returns (bytes32 signedOrderHash) + { // Derive the signed order hash. - signedOrderHash = keccak256( - abi.encode(_SIGNED_ORDER_TYPEHASH, fulfiller, expiration, orderHash, keccak256(context)) - ); + signedOrderHash = + keccak256(abi.encode(_SIGNED_ORDER_TYPEHASH, fulfiller, expiration, orderHash, keccak256(context))); } /** @@ -488,7 +468,9 @@ contract ImmutableSignedZoneV3 is * @param zoneParameters The zone parameters. * @param before Whether validation is occurring in before or after hook. */ - function _validateSubstandards(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) internal { + function _validateSubstandards(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) + internal + { uint256 startIndex = 0; uint256 contextLength = context.length; @@ -532,11 +514,11 @@ contract ImmutableSignedZoneV3 is * @param before Whether validation is occurring in before or after hook. * @return Length of substandard segment. */ - function _validateSubstandard1( - bytes calldata context, - ZoneParameters calldata zoneParameters, - bool before - ) internal pure returns (uint256) { + function _validateSubstandard1(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) + internal + pure + returns (uint256) + { if (uint8(context[0]) != 1) { return 0; } @@ -549,7 +531,11 @@ contract ImmutableSignedZoneV3 is if (before) { // zoneParameters.consideration.length >= 1 is guaranteed by the authorizeOrder function. if (uint256(bytes32(context[1:33])) != zoneParameters.consideration[0].identifier) { - revert Substandard1Violation(zoneParameters.orderHash, zoneParameters.consideration[0].identifier, uint256(bytes32(context[1:33]))); + revert Substandard1Violation( + zoneParameters.orderHash, + zoneParameters.consideration[0].identifier, + uint256(bytes32(context[1:33])) + ); } } @@ -569,11 +555,11 @@ contract ImmutableSignedZoneV3 is * @param before Whether validation is occurring in before or after hook. * @return Length of substandard segment. */ - function _validateSubstandard3( - bytes calldata context, - ZoneParameters calldata zoneParameters, - bool before - ) internal pure returns (uint256) { + function _validateSubstandard3(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) + internal + pure + returns (uint256) + { if (uint8(context[0]) != 3) { return 0; } @@ -603,11 +589,11 @@ contract ImmutableSignedZoneV3 is * @param before Whether validation is occurring in before or after hook. * @return Length of substandard segment. */ - function _validateSubstandard4( - bytes calldata context, - ZoneParameters calldata zoneParameters, - bool before - ) internal pure returns (uint256) { + function _validateSubstandard4(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) + internal + pure + returns (uint256) + { if (uint8(context[0]) != 4) { return 0; } @@ -649,11 +635,11 @@ contract ImmutableSignedZoneV3 is * @param before Whether validation is occurring in before or after hook. * @return Length of substandard segment. */ - function _validateSubstandard6( - bytes calldata context, - ZoneParameters calldata zoneParameters, - bool before - ) internal pure returns (uint256) { + function _validateSubstandard6(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) + internal + pure + returns (uint256) + { if (uint8(context[0]) != 6) { return 0; } @@ -680,15 +666,11 @@ contract ImmutableSignedZoneV3 is // from context) amounts of the first offer item. if ( _deriveReceivedItemsHash( - zoneParameters.consideration, - originalFirstOfferItemAmount, - zoneParameters.offer[0].amount - ) != expectedReceivedItemsHash + zoneParameters.consideration, originalFirstOfferItemAmount, zoneParameters.offer[0].amount + ) != expectedReceivedItemsHash ) { revert Substandard6Violation( - zoneParameters.offer[0].amount, - originalFirstOfferItemAmount, - zoneParameters.orderHash + zoneParameters.offer[0].amount, originalFirstOfferItemAmount, zoneParameters.orderHash ); } } @@ -706,11 +688,10 @@ contract ImmutableSignedZoneV3 is * @param before Whether validation is occurring in before or after hook. * @return Length of substandard segment. */ - function _validateSubstandard7( - bytes calldata context, - ZoneParameters calldata zoneParameters, - bool before - ) internal returns (uint256) { + function _validateSubstandard7(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) + internal + returns (uint256) + { if (uint8(context[0]) != 7) { return 0; } @@ -723,7 +704,11 @@ contract ImmutableSignedZoneV3 is if (before) { // zoneParameters.consideration.length >= 1 is guaranteed by the authorizeOrder function. if (uint256(bytes32(context[1:33])) != zoneParameters.consideration[0].identifier) { - revert Substandard7IdentifierViolation(zoneParameters.orderHash, zoneParameters.consideration[0].identifier, uint256(bytes32(context[1:33]))); + revert Substandard7IdentifierViolation( + zoneParameters.orderHash, + zoneParameters.consideration[0].identifier, + uint256(bytes32(context[1:33])) + ); } } @@ -731,10 +716,10 @@ contract ImmutableSignedZoneV3 is // slither-disable-next-line uninitialized-local address token; // zoneParameters.consideration.length >= 1 is guaranteed by the authorizeOrder function. - if (uint(zoneParameters.consideration[0].itemType) > 1) { + if (uint256(zoneParameters.consideration[0].itemType) > 1) { token = zoneParameters.consideration[0].token; - // zoneParameters.offer.length >= 1 is guaranteed by the authorizeOrder function. - } else if (uint(zoneParameters.offer[0].itemType) > 1) { + // zoneParameters.offer.length >= 1 is guaranteed by the authorizeOrder function. + } else if (uint256(zoneParameters.offer[0].itemType) > 1) { token = zoneParameters.offer[0].token; } else { revert Substandard7UnexpectedItemTypeViolation(zoneParameters.orderHash); @@ -761,11 +746,10 @@ contract ImmutableSignedZoneV3 is * @param before Whether validation is occurring in before or after hook. * @return Length of substandard segment. */ - function _validateSubstandard8( - bytes calldata context, - ZoneParameters calldata zoneParameters, - bool before - ) internal returns (uint256) { + function _validateSubstandard8(bytes calldata context, ZoneParameters calldata zoneParameters, bool before) + internal + returns (uint256) + { if (uint8(context[0]) != 8) { return 0; } @@ -777,7 +761,11 @@ contract ImmutableSignedZoneV3 is // Only perform identifier validation in before hook. if (before) { if (uint256(bytes32(context[1:33])) != zoneParameters.consideration[0].identifier) { - revert Substandard8IdentifierViolation(zoneParameters.orderHash, zoneParameters.consideration[0].identifier, uint256(bytes32(context[1:33]))); + revert Substandard8IdentifierViolation( + zoneParameters.orderHash, + zoneParameters.consideration[0].identifier, + uint256(bytes32(context[1:33])) + ); } } @@ -787,11 +775,11 @@ contract ImmutableSignedZoneV3 is // slither-disable-next-line uninitialized-local uint256 tokenId; // zoneParameters.consideration.length >= 1 is guaranteed by the authorizeOrder function. - if (uint(zoneParameters.consideration[0].itemType) > 1) { + if (uint256(zoneParameters.consideration[0].itemType) > 1) { token = zoneParameters.consideration[0].token; tokenId = zoneParameters.consideration[0].identifier; - // zoneParameters.offer.length >= 1 is guaranteed by the authorizeOrder function. - } else if (uint(zoneParameters.offer[0].itemType) > 1) { + // zoneParameters.offer.length >= 1 is guaranteed by the authorizeOrder function. + } else if (uint256(zoneParameters.offer[0].itemType) > 1) { token = zoneParameters.offer[0].token; tokenId = zoneParameters.offer[0].identifier; } else { @@ -847,10 +835,11 @@ contract ImmutableSignedZoneV3 is * @param values Values array. * @return True if all elements in values exist in sourceArray. */ - function _bytes32ArrayIncludes( - bytes32[] calldata sourceArray, - bytes32[] memory values - ) internal pure returns (bool) { + function _bytes32ArrayIncludes(bytes32[] calldata sourceArray, bytes32[] memory values) + internal + pure + returns (bool) + { // cache the length in memory for loop optimisation uint256 sourceArraySize = sourceArray.length; uint256 valuesSize = values.length; @@ -862,10 +851,10 @@ contract ImmutableSignedZoneV3 is } // Iterate through each element and compare them - for (uint256 i = 0; i < valuesSize; ) { + for (uint256 i = 0; i < valuesSize;) { bool found = false; bytes32 item = values[i]; - for (uint256 j = 0; j < sourceArraySize; ) { + for (uint256 j = 0; j < sourceArraySize;) { if (item == sourceArray[j]) { // if item from values is in sourceArray, break found = true; diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol index fbf13879..25cdeb11 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/ZoneAccessControl.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.20; import {AccessControl} from "openzeppelin-contracts-5.0.2/access/AccessControl.sol"; @@ -31,10 +29,11 @@ abstract contract ZoneAccessControl is AccessControlEnumerable, ZoneAccessContro /** * @inheritdoc AccessControl */ - function revokeRole( - bytes32 role, - address account - ) public override(AccessControl, IAccessControl) onlyRole(getRoleAdmin(role)) { + function revokeRole(bytes32 role, address account) + public + override(AccessControl, IAccessControl) + onlyRole(getRoleAdmin(role)) + { if (role == DEFAULT_ADMIN_ROLE && super.getRoleMemberCount(DEFAULT_ADMIN_ROLE) == 1) { revert LastDefaultAdminRole(account); } diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ITransferValidator.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ITransferValidator.sol index 5c1f45bc..a109426b 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ITransferValidator.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ITransferValidator.sol @@ -14,4 +14,4 @@ interface ITransferValidator { function beforeAuthorizedTransfer(address token, uint256 tokenId) external; function beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 amount) external; function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external; -} \ No newline at end of file +} diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol index fc9943be..97334d48 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol @@ -1,7 +1,6 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol index b2aa426e..a7f82219 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5Interface.sol @@ -1,7 +1,6 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; import {Schema} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol index 10760f96..d313057e 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol index b71302f3..094e56ea 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6Interface.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; import {SIP6EventsAndErrors} from "./SIP6EventsAndErrors.sol"; @@ -10,5 +8,4 @@ import {SIP6EventsAndErrors} from "./SIP6EventsAndErrors.sol"; * @dev SIP-6: Multi-Zone ExtraData * https://github.com/ProjectOpenSea/SIPs/blob/main/SIPS/sip-6.md */ -// solhint-disable no-empty-blocks interface SIP6Interface is SIP6EventsAndErrors {} diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol index bdb4340b..31138850 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol @@ -1,7 +1,6 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol index fc362fa4..a026e19a 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol @@ -1,7 +1,6 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable compiler-version pragma solidity ^0.8.17; import {SIP7EventsAndErrors} from "./SIP7EventsAndErrors.sol"; diff --git a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol index b6ea6b01..9dfd38ca 100644 --- a/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol +++ b/contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable compiler-version pragma solidity ^0.8.17; /** diff --git a/package.json b/package.json index 32b10d7f..f46d3c00 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,6 @@ }, "devDependencies": { "@types/node": "^22.15.0", - "solhint": "^6.2.1", "typescript": "^6.0.3" }, "keywords": [ diff --git a/script/games/gems/DeployGemGame.sol b/script/games/gems/DeployGemGame.sol index 49cbba3a..ab170b1a 100644 --- a/script/games/gems/DeployGemGame.sol +++ b/script/games/gems/DeployGemGame.sol @@ -41,7 +41,6 @@ contract DeployGemGame is Test { function testDeploy() external { /// @dev Fork the Immutable zkEVM testnet for this test - // @solhint-disable-next-line variable-name-mixedcase string memory rpcURL = "https://rpc.testnet.immutable.com"; vm.createSelectFork(rpcURL); @@ -53,9 +52,7 @@ contract DeployGemGame is Test { }); GemGameContractArgs memory gemGameContractArgs = GemGameContractArgs({ - pauser: makeAddr("pause"), - unpauser: makeAddr("unpause"), - defaultAdmin: makeAddr("admin") + pauser: makeAddr("pause"), unpauser: makeAddr("unpause"), defaultAdmin: makeAddr("admin") }); // Run deployment against forked testnet diff --git a/script/staking/ChangeDistributor.t.sol b/script/staking/ChangeDistributor.t.sol index fafa8d07..633ea443 100644 --- a/script/staking/ChangeDistributor.t.sol +++ b/script/staking/ChangeDistributor.t.sol @@ -8,7 +8,6 @@ import {IAccessControlUpgradeable} from "openzeppelin-contracts-upgradeable-4.9. import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; - /** * @notice Script for proposing and executing changes to which account has distributor role. * @dev testDeploy is the test. @@ -52,7 +51,6 @@ contract ChangeDistributor is Test { TimelockController stakeHolderTimeDelay = TimelockController(payable(TIMELOCK_CONTROLLER)); - function proposeChangeDistributor() external { uint256 isMainnet = vm.envUint("IMMUTABLE_NETWORK"); address newDistributor = (isMainnet == 1) ? MAINNET_NEW_DISTRIBUTOR : TESTNET_NEW_DISTRIBUTOR; @@ -70,8 +68,7 @@ contract ChangeDistributor is Test { function _proposeChangeDistributor(address _proposer, address _newDistributor) internal { assertTrue(stakeHolderTimeDelay.hasRole(PROPOSER_ROLE, _proposer), "Proposer does not have proposer role"); - (address[] memory targets, uint256[] memory values, bytes[] memory data, - bytes32 predecessor, bytes32 salt) = + (address[] memory targets, uint256[] memory values, bytes[] memory data, bytes32 predecessor, bytes32 salt) = _getChangeDistributorProposalParams(OLD_DISTRIBUTOR, _newDistributor); vm.startBroadcast(_proposer); @@ -83,8 +80,7 @@ contract ChangeDistributor is Test { stakeHolderTimeDelay = TimelockController(payable(TIMELOCK_CONTROLLER)); assertTrue(stakeHolderTimeDelay.hasRole(EXECUTOR_ROLE, _executor), "Executor does not have executor role"); - (address[] memory targets, uint256[] memory values, bytes[] memory data, - bytes32 predecessor, bytes32 salt) = + (address[] memory targets, uint256[] memory values, bytes[] memory data, bytes32 predecessor, bytes32 salt) = _getChangeDistributorProposalParams(OLD_DISTRIBUTOR, _newDistributor); bytes32 id = stakeHolderTimeDelay.hashOperationBatch(targets, values, data, predecessor, salt); @@ -95,19 +91,22 @@ contract ChangeDistributor is Test { vm.stopBroadcast(); } - function _getChangeDistributorProposalParams(address _oldAccount, address _newAccount) private returns ( - address[] memory targets, uint256[] memory values, bytes[] memory data, bytes32 predecessor, bytes32 salt) { - + function _getChangeDistributorProposalParams(address _oldAccount, address _newAccount) + private + returns ( + address[] memory targets, + uint256[] memory values, + bytes[] memory data, + bytes32 predecessor, + bytes32 salt + ) + { stakeHolderTimeDelay = TimelockController(payable(TIMELOCK_CONTROLLER)); - bytes memory callData0 = abi.encodeWithSelector( - IAccessControlUpgradeable.revokeRole.selector, - DISTRIBUTOR_ROLE, - _oldAccount); - bytes memory callData1 = abi.encodeWithSelector( - IAccessControlUpgradeable.grantRole.selector, - DISTRIBUTOR_ROLE, - _newAccount); + bytes memory callData0 = + abi.encodeWithSelector(IAccessControlUpgradeable.revokeRole.selector, DISTRIBUTOR_ROLE, _oldAccount); + bytes memory callData1 = + abi.encodeWithSelector(IAccessControlUpgradeable.grantRole.selector, DISTRIBUTOR_ROLE, _newAccount); targets = new address[](2); values = new uint256[](2); @@ -123,7 +122,6 @@ contract ChangeDistributor is Test { salt = bytes32(uint256(1)); } - // Test the remainder of the upgrade process. function testRemainderChangeDistributor() public { uint256 mainnetFork = vm.createFork(MAINNET_RPC_URL); @@ -135,8 +133,7 @@ contract ChangeDistributor is Test { return; } - (address[] memory targets, uint256[] memory values, bytes[] memory data, - bytes32 predecessor, bytes32 salt) = + (address[] memory targets, uint256[] memory values, bytes[] memory data, bytes32 predecessor, bytes32 salt) = _getChangeDistributorProposalParams(OLD_DISTRIBUTOR, MAINNET_NEW_DISTRIBUTOR); bytes32 id = stakeHolderTimeDelay.hashOperationBatch(targets, values, data, predecessor, salt); diff --git a/script/staking/StakeHolderScriptERC20.t.sol b/script/staking/StakeHolderScriptERC20.t.sol index 9ba19dda..31e0497c 100644 --- a/script/staking/StakeHolderScriptERC20.t.sol +++ b/script/staking/StakeHolderScriptERC20.t.sol @@ -37,21 +37,23 @@ struct ComplexDeploymentArgs { address factory; string salt; } + struct ComplexStakeHolderContractArgs { address distributeAdmin; address token; } + struct ComplexTimelockContractArgs { uint256 timeDelayInSeconds; address proposerAdmin; address executorAdmin; } - // Args needed for simple deployment struct SimpleDeploymentArgs { address deployer; } + struct SimpleStakeHolderContractArgs { address roleAdmin; address upgradeAdmin; @@ -59,8 +61,6 @@ struct SimpleStakeHolderContractArgs { address token; } - - /** * @notice Deployment script and test code for the deployment script. * @dev testDeploy is the test. @@ -68,7 +68,6 @@ struct SimpleStakeHolderContractArgs { * For more details on deployment see ../../contracts/staking/README.md */ contract StakeHolderScriptERC20 is Test { - /** * Deploy the OwnableCreate3Deployer needed for the complex deployment. */ @@ -90,13 +89,15 @@ contract StakeHolderScriptERC20 is Test { address executorAdmin = vm.envAddress("TIMELOCK_EXECUTOR_ADMIN"); string memory salt = vm.envString("SALT"); - ComplexDeploymentArgs memory deploymentArgs = ComplexDeploymentArgs({signer: signer, factory: factory, salt: salt}); + ComplexDeploymentArgs memory deploymentArgs = + ComplexDeploymentArgs({signer: signer, factory: factory, salt: salt}); ComplexStakeHolderContractArgs memory stakeHolderArgs = ComplexStakeHolderContractArgs({distributeAdmin: distributeAdmin, token: token}); - ComplexTimelockContractArgs memory timelockArgs = - ComplexTimelockContractArgs({timeDelayInSeconds: timeDelayInSeconds, proposerAdmin: proposerAdmin, executorAdmin: executorAdmin}); + ComplexTimelockContractArgs memory timelockArgs = ComplexTimelockContractArgs({ + timeDelayInSeconds: timeDelayInSeconds, proposerAdmin: proposerAdmin, executorAdmin: executorAdmin + }); _deployComplex(deploymentArgs, stakeHolderArgs, timelockArgs); } @@ -112,10 +113,9 @@ contract StakeHolderScriptERC20 is Test { SimpleDeploymentArgs memory deploymentArgs = SimpleDeploymentArgs({deployer: deployer}); - SimpleStakeHolderContractArgs memory stakeHolderArgs = - SimpleStakeHolderContractArgs({ - roleAdmin: roleAdmin, upgradeAdmin: upgradeAdmin, - distributeAdmin: distributeAdmin, token: token}); + SimpleStakeHolderContractArgs memory stakeHolderArgs = SimpleStakeHolderContractArgs({ + roleAdmin: roleAdmin, upgradeAdmin: upgradeAdmin, distributeAdmin: distributeAdmin, token: token + }); _deploySimple(deploymentArgs, stakeHolderArgs); } @@ -133,8 +133,6 @@ contract StakeHolderScriptERC20 is Test { _unstake(IStakeHolder(stakeHolder), staker, amount); } - - /** * Deploy the OwnableCreate3Deployer contract. Set the owner to the * contract deployer. @@ -149,12 +147,10 @@ contract StakeHolderScriptERC20 is Test { * Deploy StakeHolderERC20V2 using Create3, with the TimelockController. */ function _deployComplex( - ComplexDeploymentArgs memory deploymentArgs, + ComplexDeploymentArgs memory deploymentArgs, ComplexStakeHolderContractArgs memory stakeHolderArgs, - ComplexTimelockContractArgs memory timelockArgs) - private - returns (StakeHolderERC20V2 stakeHolderContract, TimelockController timelockController) - { + ComplexTimelockContractArgs memory timelockArgs + ) private returns (StakeHolderERC20V2 stakeHolderContract, TimelockController timelockController) { IDeployer ownableCreate3 = IDeployer(deploymentArgs.factory); bytes32 salt1 = keccak256(abi.encode(deploymentArgs.salt)); @@ -171,13 +167,8 @@ contract StakeHolderScriptERC20 is Test { executors[0] = timelockArgs.executorAdmin; // Create deployment bytecode and encode constructor args deploymentBytecode = abi.encodePacked( - type(TimelockController).creationCode, - abi.encode( - timelockArgs.timeDelayInSeconds, - proposers, - executors, - address(0) - ) + type(TimelockController).creationCode, + abi.encode(timelockArgs.timeDelayInSeconds, proposers, executors, address(0)) ); /// @dev Deploy the contract via the Ownable CREATE3 factory vm.startBroadcast(deploymentArgs.signer); @@ -185,12 +176,9 @@ contract StakeHolderScriptERC20 is Test { vm.stopBroadcast(); } - // Deploy StakeHolderERC20V2 via the Ownable Create3 factory. // Create deployment bytecode and encode constructor args - deploymentBytecode = abi.encodePacked( - type(StakeHolderERC20V2).creationCode - ); + deploymentBytecode = abi.encodePacked(type(StakeHolderERC20V2).creationCode); /// @dev Deploy the contract via the Ownable CREATE3 factory vm.startBroadcast(deploymentArgs.signer); address stakeHolderImplAddress = ownableCreate3.deploy(deploymentBytecode, salt2); @@ -199,17 +187,15 @@ contract StakeHolderScriptERC20 is Test { // Deploy ERC1967Proxy via the Ownable Create3 factory. // Create init data for the ERC1967 Proxy bytes memory initData = abi.encodeWithSelector( - StakeHolderERC20V2.initialize.selector, + StakeHolderERC20V2.initialize.selector, timelockAddress, // roleAdmin timelockAddress, // upgradeAdmin stakeHolderArgs.distributeAdmin, stakeHolderArgs.token ); // Create deployment bytecode and encode constructor args - deploymentBytecode = abi.encodePacked( - type(ERC1967Proxy).creationCode, - abi.encode(stakeHolderImplAddress, initData) - ); + deploymentBytecode = + abi.encodePacked(type(ERC1967Proxy).creationCode, abi.encode(stakeHolderImplAddress, initData)); /// @dev Deploy the contract via the Ownable CREATE3 factory vm.startBroadcast(deploymentArgs.signer); address stakeHolderContractAddress = ownableCreate3.deploy(deploymentBytecode, salt3); @@ -223,17 +209,16 @@ contract StakeHolderScriptERC20 is Test { * Deploy StakeHolderERC20V2 using an EOA and no time lock. */ function _deploySimple( - SimpleDeploymentArgs memory deploymentArgs, - SimpleStakeHolderContractArgs memory stakeHolderArgs) - private - returns (StakeHolderERC20V2 stakeHolderContract) { - + SimpleDeploymentArgs memory deploymentArgs, + SimpleStakeHolderContractArgs memory stakeHolderArgs + ) private returns (StakeHolderERC20V2 stakeHolderContract) { bytes memory initData = abi.encodeWithSelector( - StakeHolderERC20V2.initialize.selector, + StakeHolderERC20V2.initialize.selector, stakeHolderArgs.roleAdmin, stakeHolderArgs.upgradeAdmin, stakeHolderArgs.distributeAdmin, - stakeHolderArgs.token); + stakeHolderArgs.token + ); vm.startBroadcast(deploymentArgs.deployer); StakeHolderERC20V2 impl = new StakeHolderERC20V2(); @@ -268,7 +253,6 @@ contract StakeHolderScriptERC20 is Test { vm.stopBroadcast(); } - function testComplex() external { /// @dev Fork the Immutable zkEVM testnet for this test string memory rpcURL = "https://rpc.testnet.immutable.com"; @@ -276,47 +260,48 @@ contract StakeHolderScriptERC20 is Test { address bank = makeAddr("bank"); vm.startBroadcast(bank); - ERC20PresetFixedSupply erc20 = - new ERC20PresetFixedSupply("Name", "SYM", 1000 ether, bank); + ERC20PresetFixedSupply erc20 = new ERC20PresetFixedSupply("Name", "SYM", 1000 ether, bank); vm.stopBroadcast(); /// @dev These are Immutable zkEVM testnet values where necessary address immTestNetCreate3 = 0x37a59A845Bb6eD2034098af8738fbFFB9D589610; ComplexDeploymentArgs memory deploymentArgs = ComplexDeploymentArgs({ - signer: 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333, - factory: immTestNetCreate3, - salt: "salt" + signer: 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333, factory: immTestNetCreate3, salt: "salt" }); address distributeAdmin = makeAddr("distribute"); - ComplexStakeHolderContractArgs memory stakeHolderArgs = - ComplexStakeHolderContractArgs({ - distributeAdmin: distributeAdmin, - token: address(erc20) - }); + ComplexStakeHolderContractArgs memory stakeHolderArgs = + ComplexStakeHolderContractArgs({distributeAdmin: distributeAdmin, token: address(erc20)}); uint256 delay = 604800; // 604800 seconds = 1 week address proposer = makeAddr("proposer"); address executor = makeAddr("executor"); - ComplexTimelockContractArgs memory timelockArgs = - ComplexTimelockContractArgs({ - timeDelayInSeconds: delay, - proposerAdmin: proposer, - executorAdmin: executor - }); + ComplexTimelockContractArgs memory timelockArgs = + ComplexTimelockContractArgs({timeDelayInSeconds: delay, proposerAdmin: proposer, executorAdmin: executor}); // Run deployment against forked testnet StakeHolderERC20V2 stakeHolder; TimelockController timelockController; - (stakeHolder, timelockController) = - _deployComplex(deploymentArgs, stakeHolderArgs, timelockArgs); - - _commonTest(true, IStakeHolder(stakeHolder), address(timelockController), - bank, immTestNetCreate3, address(0), address(0), distributeAdmin); + (stakeHolder, timelockController) = _deployComplex(deploymentArgs, stakeHolderArgs, timelockArgs); + + _commonTest( + true, + IStakeHolder(stakeHolder), + address(timelockController), + bank, + immTestNetCreate3, + address(0), + address(0), + distributeAdmin + ); - assertTrue(timelockController.hasRole(timelockController.PROPOSER_ROLE(), proposer), "Proposer not set correcrly"); - assertTrue(timelockController.hasRole(timelockController.EXECUTOR_ROLE(), executor), "Executor not set correcrly"); + assertTrue( + timelockController.hasRole(timelockController.PROPOSER_ROLE(), proposer), "Proposer not set correcrly" + ); + assertTrue( + timelockController.hasRole(timelockController.EXECUTOR_ROLE(), executor), "Executor not set correcrly" + ); assertEq(timelockController.getMinDelay(), delay, "Delay not set correctly"); } @@ -329,44 +314,38 @@ contract StakeHolderScriptERC20 is Test { address bank = makeAddr("bank"); vm.startBroadcast(deployer); - ERC20PresetFixedSupply erc20 = - new ERC20PresetFixedSupply("Name", "SYM", 1000 ether, bank); + ERC20PresetFixedSupply erc20 = new ERC20PresetFixedSupply("Name", "SYM", 1000 ether, bank); vm.stopBroadcast(); /// @dev These are Immutable zkEVM testnet values where necessary - SimpleDeploymentArgs memory deploymentArgs = SimpleDeploymentArgs({ - deployer: deployer - }); + SimpleDeploymentArgs memory deploymentArgs = SimpleDeploymentArgs({deployer: deployer}); address roleAdmin = makeAddr("role"); address upgradeAdmin = makeAddr("upgrade"); address distributeAdmin = makeAddr("distribute"); - SimpleStakeHolderContractArgs memory stakeHolderContractArgs = - SimpleStakeHolderContractArgs({ - roleAdmin: roleAdmin, - upgradeAdmin: upgradeAdmin, - distributeAdmin: distributeAdmin, - token: address(erc20) - }); + SimpleStakeHolderContractArgs memory stakeHolderContractArgs = SimpleStakeHolderContractArgs({ + roleAdmin: roleAdmin, upgradeAdmin: upgradeAdmin, distributeAdmin: distributeAdmin, token: address(erc20) + }); // Run deployment against forked testnet StakeHolderERC20V2 stakeHolder = _deploySimple(deploymentArgs, stakeHolderContractArgs); - _commonTest(false, IStakeHolder(stakeHolder), address(0), - bank, deployer, roleAdmin, upgradeAdmin, distributeAdmin); + _commonTest( + false, IStakeHolder(stakeHolder), address(0), bank, deployer, roleAdmin, upgradeAdmin, distributeAdmin + ); } function _commonTest( - bool _isComplex, - IStakeHolder _stakeHolder, - address _timelockControl, - address _bank, - address _deployer, - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin - ) private { + bool _isComplex, + IStakeHolder _stakeHolder, + address _timelockControl, + address _bank, + address _deployer, + address _roleAdmin, + address _upgradeAdmin, + address _distributeAdmin + ) private { address roleAdmin = _isComplex ? _timelockControl : _roleAdmin; address upgradeAdmin = _isComplex ? _timelockControl : _upgradeAdmin; @@ -377,9 +356,15 @@ contract StakeHolderScriptERC20 is Test { { StakeHolderERC20V2 temp = new StakeHolderERC20V2(); bytes32 defaultAdminRole = temp.DEFAULT_ADMIN_ROLE(); - assertTrue(_stakeHolder.hasRole(_stakeHolder.UPGRADE_ROLE(), upgradeAdmin), "Upgrade admin should have upgrade role"); + assertTrue( + _stakeHolder.hasRole(_stakeHolder.UPGRADE_ROLE(), upgradeAdmin), + "Upgrade admin should have upgrade role" + ); assertTrue(_stakeHolder.hasRole(defaultAdminRole, roleAdmin), "Role admin should have default admin role"); - assertTrue(_stakeHolder.hasRole(_stakeHolder.DISTRIBUTE_ROLE(), _distributeAdmin), "Distribute admin should have distribute role"); + assertTrue( + _stakeHolder.hasRole(_stakeHolder.DISTRIBUTE_ROLE(), _distributeAdmin), + "Distribute admin should have distribute role" + ); // The DEFAULT_ADMIN_ROLE should be revoked from the deployer account assertFalse(_stakeHolder.hasRole(defaultAdminRole, _deployer), "msg.sender should not be an admin"); } diff --git a/script/staking/StakeHolderScriptWIMX.t.sol b/script/staking/StakeHolderScriptWIMX.t.sol index 824c54f5..44b1c7aa 100644 --- a/script/staking/StakeHolderScriptWIMX.t.sol +++ b/script/staking/StakeHolderScriptWIMX.t.sol @@ -37,21 +37,23 @@ struct ComplexDeploymentArgs { address factory; string salt; } + struct ComplexStakeHolderContractArgs { address distributeAdmin; address token; } + struct ComplexTimelockContractArgs { uint256 timeDelayInSeconds; address proposerAdmin; address executorAdmin; } - // Args needed for simple deployment struct SimpleDeploymentArgs { address deployer; } + struct SimpleStakeHolderContractArgs { address roleAdmin; address upgradeAdmin; @@ -59,8 +61,6 @@ struct SimpleStakeHolderContractArgs { address token; } - - /** * @notice Deployment script and test code for the deployment script. * @dev testDeploy is the test. @@ -68,7 +68,6 @@ struct SimpleStakeHolderContractArgs { * For more details on deployment see ../../contracts/staking/README.md */ contract StakeHolderScriptWIMX is Test { - /** * Deploy the OwnableCreate3Deployer needed for the complex deployment. */ @@ -90,13 +89,15 @@ contract StakeHolderScriptWIMX is Test { address executorAdmin = vm.envAddress("TIMELOCK_EXECUTOR_ADMIN"); string memory salt = vm.envString("SALT"); - ComplexDeploymentArgs memory deploymentArgs = ComplexDeploymentArgs({signer: signer, factory: factory, salt: salt}); + ComplexDeploymentArgs memory deploymentArgs = + ComplexDeploymentArgs({signer: signer, factory: factory, salt: salt}); ComplexStakeHolderContractArgs memory stakeHolderArgs = ComplexStakeHolderContractArgs({distributeAdmin: distributeAdmin, token: token}); - ComplexTimelockContractArgs memory timelockArgs = - ComplexTimelockContractArgs({timeDelayInSeconds: timeDelayInSeconds, proposerAdmin: proposerAdmin, executorAdmin: executorAdmin}); + ComplexTimelockContractArgs memory timelockArgs = ComplexTimelockContractArgs({ + timeDelayInSeconds: timeDelayInSeconds, proposerAdmin: proposerAdmin, executorAdmin: executorAdmin + }); _deployComplex(deploymentArgs, stakeHolderArgs, timelockArgs); } @@ -112,10 +113,9 @@ contract StakeHolderScriptWIMX is Test { SimpleDeploymentArgs memory deploymentArgs = SimpleDeploymentArgs({deployer: deployer}); - SimpleStakeHolderContractArgs memory stakeHolderArgs = - SimpleStakeHolderContractArgs({ - roleAdmin: roleAdmin, upgradeAdmin: upgradeAdmin, - distributeAdmin: distributeAdmin, token: token}); + SimpleStakeHolderContractArgs memory stakeHolderArgs = SimpleStakeHolderContractArgs({ + roleAdmin: roleAdmin, upgradeAdmin: upgradeAdmin, distributeAdmin: distributeAdmin, token: token + }); _deploySimple(deploymentArgs, stakeHolderArgs); } @@ -149,10 +149,8 @@ contract StakeHolderScriptWIMX is Test { function _deployComplex( ComplexDeploymentArgs memory deploymentArgs, ComplexStakeHolderContractArgs memory stakeHolderArgs, - ComplexTimelockContractArgs memory timelockArgs) - private - returns (StakeHolderWIMXV2 stakeHolderContract, TimelockController timelockController) - { + ComplexTimelockContractArgs memory timelockArgs + ) private returns (StakeHolderWIMXV2 stakeHolderContract, TimelockController timelockController) { IDeployer ownableCreate3 = IDeployer(deploymentArgs.factory); bytes32 salt1 = keccak256(abi.encode(deploymentArgs.salt)); @@ -170,12 +168,7 @@ contract StakeHolderScriptWIMX is Test { // Create deployment bytecode and encode constructor args deploymentBytecode = abi.encodePacked( type(TimelockController).creationCode, - abi.encode( - timelockArgs.timeDelayInSeconds, - proposers, - executors, - address(0) - ) + abi.encode(timelockArgs.timeDelayInSeconds, proposers, executors, address(0)) ); /// @dev Deploy the contract via the Ownable CREATE3 factory vm.startBroadcast(deploymentArgs.signer); @@ -183,12 +176,9 @@ contract StakeHolderScriptWIMX is Test { vm.stopBroadcast(); } - // Deploy StakeHolderWIMXV2 via the Ownable Create3 factory. // Create deployment bytecode and encode constructor args - deploymentBytecode = abi.encodePacked( - type(StakeHolderWIMXV2).creationCode - ); + deploymentBytecode = abi.encodePacked(type(StakeHolderWIMXV2).creationCode); /// @dev Deploy the contract via the Ownable CREATE3 factory vm.startBroadcast(deploymentArgs.signer); address stakeHolderImplAddress = ownableCreate3.deploy(deploymentBytecode, salt2); @@ -204,10 +194,8 @@ contract StakeHolderScriptWIMX is Test { stakeHolderArgs.token ); // Create deployment bytecode and encode constructor args - deploymentBytecode = abi.encodePacked( - type(ERC1967Proxy).creationCode, - abi.encode(stakeHolderImplAddress, initData) - ); + deploymentBytecode = + abi.encodePacked(type(ERC1967Proxy).creationCode, abi.encode(stakeHolderImplAddress, initData)); /// @dev Deploy the contract via the Ownable CREATE3 factory vm.startBroadcast(deploymentArgs.signer); address stakeHolderContractAddress = ownableCreate3.deploy(deploymentBytecode, salt3); @@ -222,16 +210,15 @@ contract StakeHolderScriptWIMX is Test { */ function _deploySimple( SimpleDeploymentArgs memory deploymentArgs, - SimpleStakeHolderContractArgs memory stakeHolderArgs) - private - returns (StakeHolderWIMXV2 stakeHolderContract) { - + SimpleStakeHolderContractArgs memory stakeHolderArgs + ) private returns (StakeHolderWIMXV2 stakeHolderContract) { bytes memory initData = abi.encodeWithSelector( StakeHolderWIMXV2.initialize.selector, stakeHolderArgs.roleAdmin, stakeHolderArgs.upgradeAdmin, stakeHolderArgs.distributeAdmin, - stakeHolderArgs.token); + stakeHolderArgs.token + ); vm.startBroadcast(deploymentArgs.deployer); StakeHolderWIMXV2 impl = new StakeHolderWIMXV2(); @@ -252,7 +239,7 @@ contract StakeHolderScriptWIMX is Test { } vm.startBroadcast(_staker); - _stakeHolder.stake{value: _amount} (_amount); + _stakeHolder.stake{value: _amount}(_amount); vm.stopBroadcast(); } @@ -273,40 +260,41 @@ contract StakeHolderScriptWIMX is Test { /// @dev These are Immutable zkEVM testnet values where necessary address immTestNetCreate3 = 0x37a59A845Bb6eD2034098af8738fbFFB9D589610; ComplexDeploymentArgs memory deploymentArgs = ComplexDeploymentArgs({ - signer: 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333, - factory: immTestNetCreate3, - salt: "salt" + signer: 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333, factory: immTestNetCreate3, salt: "salt" }); address distributeAdmin = makeAddr("distribute"); ComplexStakeHolderContractArgs memory stakeHolderArgs = - ComplexStakeHolderContractArgs({ - distributeAdmin: distributeAdmin, - token: address(erc20) - }); + ComplexStakeHolderContractArgs({distributeAdmin: distributeAdmin, token: address(erc20)}); uint256 delay = 604800; // 604800 seconds = 1 week address proposer = makeAddr("proposer"); address executor = makeAddr("executor"); ComplexTimelockContractArgs memory timelockArgs = - ComplexTimelockContractArgs({ - timeDelayInSeconds: delay, - proposerAdmin: proposer, - executorAdmin: executor - }); + ComplexTimelockContractArgs({timeDelayInSeconds: delay, proposerAdmin: proposer, executorAdmin: executor}); // Run deployment against forked testnet StakeHolderWIMXV2 stakeHolder; TimelockController timelockController; - (stakeHolder, timelockController) = - _deployComplex(deploymentArgs, stakeHolderArgs, timelockArgs); - - _commonTest(true, IStakeHolder(stakeHolder), address(timelockController), - immTestNetCreate3, address(0), address(0), distributeAdmin); + (stakeHolder, timelockController) = _deployComplex(deploymentArgs, stakeHolderArgs, timelockArgs); + + _commonTest( + true, + IStakeHolder(stakeHolder), + address(timelockController), + immTestNetCreate3, + address(0), + address(0), + distributeAdmin + ); - assertTrue(timelockController.hasRole(timelockController.PROPOSER_ROLE(), proposer), "Proposer not set correcrly"); - assertTrue(timelockController.hasRole(timelockController.EXECUTOR_ROLE(), executor), "Executor not set correcrly"); + assertTrue( + timelockController.hasRole(timelockController.PROPOSER_ROLE(), proposer), "Proposer not set correcrly" + ); + assertTrue( + timelockController.hasRole(timelockController.EXECUTOR_ROLE(), executor), "Executor not set correcrly" + ); assertEq(timelockController.getMinDelay(), delay, "Delay not set correctly"); } @@ -321,38 +309,31 @@ contract StakeHolderScriptWIMX is Test { WIMX erc20 = WIMX(wimxOnTestnet); /// @dev These are Immutable zkEVM testnet values where necessary - SimpleDeploymentArgs memory deploymentArgs = SimpleDeploymentArgs({ - deployer: deployer - }); + SimpleDeploymentArgs memory deploymentArgs = SimpleDeploymentArgs({deployer: deployer}); address roleAdmin = makeAddr("role"); address upgradeAdmin = makeAddr("upgrade"); address distributeAdmin = makeAddr("distribute"); - SimpleStakeHolderContractArgs memory stakeHolderContractArgs = - SimpleStakeHolderContractArgs({ - roleAdmin: roleAdmin, - upgradeAdmin: upgradeAdmin, - distributeAdmin: distributeAdmin, - token: address(erc20) - }); + SimpleStakeHolderContractArgs memory stakeHolderContractArgs = SimpleStakeHolderContractArgs({ + roleAdmin: roleAdmin, upgradeAdmin: upgradeAdmin, distributeAdmin: distributeAdmin, token: address(erc20) + }); // Run deployment against forked testnet StakeHolderWIMXV2 stakeHolder = _deploySimple(deploymentArgs, stakeHolderContractArgs); - _commonTest(false, IStakeHolder(stakeHolder), address(0), - deployer, roleAdmin, upgradeAdmin, distributeAdmin); + _commonTest(false, IStakeHolder(stakeHolder), address(0), deployer, roleAdmin, upgradeAdmin, distributeAdmin); } function _commonTest( - bool _isComplex, - IStakeHolder _stakeHolder, - address _timelockControl, - address _deployer, - address _roleAdmin, - address _upgradeAdmin, - address _distributeAdmin - ) private { + bool _isComplex, + IStakeHolder _stakeHolder, + address _timelockControl, + address _deployer, + address _roleAdmin, + address _upgradeAdmin, + address _distributeAdmin + ) private { address roleAdmin = _isComplex ? _timelockControl : _roleAdmin; address upgradeAdmin = _isComplex ? _timelockControl : _upgradeAdmin; @@ -363,9 +344,15 @@ contract StakeHolderScriptWIMX is Test { { StakeHolderWIMXV2 temp = new StakeHolderWIMXV2(); bytes32 defaultAdminRole = temp.DEFAULT_ADMIN_ROLE(); - assertTrue(_stakeHolder.hasRole(_stakeHolder.UPGRADE_ROLE(), upgradeAdmin), "Upgrade admin should have upgrade role"); + assertTrue( + _stakeHolder.hasRole(_stakeHolder.UPGRADE_ROLE(), upgradeAdmin), + "Upgrade admin should have upgrade role" + ); assertTrue(_stakeHolder.hasRole(defaultAdminRole, roleAdmin), "Role admin should have default admin role"); - assertTrue(_stakeHolder.hasRole(_stakeHolder.DISTRIBUTE_ROLE(), _distributeAdmin), "Distribute admin should have distribute role"); + assertTrue( + _stakeHolder.hasRole(_stakeHolder.DISTRIBUTE_ROLE(), _distributeAdmin), + "Distribute admin should have distribute role" + ); // The DEFAULT_ADMIN_ROLE should be revoked from the deployer account assertFalse(_stakeHolder.hasRole(defaultAdminRole, _deployer), "msg.sender should not be an admin"); } diff --git a/script/staking/UpgradeToWIMXV2.t.sol b/script/staking/UpgradeToWIMXV2.t.sol index 1b271dea..4566d32c 100644 --- a/script/staking/UpgradeToWIMXV2.t.sol +++ b/script/staking/UpgradeToWIMXV2.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.20; import {Test} from "forge-std/Test.sol"; import {console} from "forge-std/console.sol"; -import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/TimelockController.sol"; import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; @@ -75,7 +74,6 @@ contract UpgradeToWIMXV2 is Test { TimelockController stakeHolderTimeDelay = TimelockController(payable(TIMELOCK_CONTROLLER)); - function deployV2() external { address stakeHolderV2 = _deployV2(); console.log("Deployed StakeHolderWIMXV2 to: %s", stakeHolderV2); @@ -100,9 +98,7 @@ contract UpgradeToWIMXV2 is Test { // Deploy StakeHolderWIMXV2 via the Ownable Create3 factory. // Create deployment bytecode and encode constructor args - bytes memory deploymentBytecode = abi.encodePacked( - type(StakeHolderWIMXV2).creationCode - ); + bytes memory deploymentBytecode = abi.encodePacked(type(StakeHolderWIMXV2).creationCode); /// @dev Deploy the contract via the Ownable CREATE3 factory vm.startBroadcast(DEPLOYER_ADDRESS); address stakeHolderImplAddress = ownableCreate3.deploy(deploymentBytecode, salt); @@ -113,7 +109,7 @@ contract UpgradeToWIMXV2 is Test { function _proposeUpgradeToV2(address _proposer, address _v2Impl) internal { assertTrue(stakeHolderTimeDelay.hasRole(PROPOSER_ROLE, _proposer), "Proposer does not have proposer role"); - (address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) = + (address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) = _getProposalParams(_v2Impl); vm.startBroadcast(_proposer); @@ -125,7 +121,7 @@ contract UpgradeToWIMXV2 is Test { stakeHolderTimeDelay = TimelockController(payable(TIMELOCK_CONTROLLER)); assertTrue(stakeHolderTimeDelay.hasRole(EXECUTOR_ROLE, _executor), "Executor does not have executor role"); - (address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) = + (address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) = _getProposalParams(_v2Impl); bytes32 id = stakeHolderTimeDelay.hashOperation(target, value, data, predecessor, salt); @@ -139,15 +135,15 @@ contract UpgradeToWIMXV2 is Test { assertEq(stakeHolder.version(), 2, "Upgrade did not upgrade to version 2"); } - function _getProposalParams(address _v2Impl) private returns ( - address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) { - + function _getProposalParams(address _v2Impl) + private + returns (address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) + { stakeHolderTimeDelay = TimelockController(payable(TIMELOCK_CONTROLLER)); assertNotEq(_v2Impl, address(0), "StakeHolderV2 can not be address(0)"); bytes memory callData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); - bytes memory upgradeCall = abi.encodeWithSelector( - UUPSUpgradeable.upgradeToAndCall.selector, _v2Impl, callData); + bytes memory upgradeCall = abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, _v2Impl, callData); target = STAKE_HOLDER_PROXY; value = 0; @@ -156,7 +152,6 @@ contract UpgradeToWIMXV2 is Test { salt = bytes32(uint256(1)); } - // Test the remainder of the upgrade process. function testRemainderOfUpgradeProcessToV2() public { uint256 mainnetFork = vm.createFork(MAINNET_RPC_URL); @@ -175,7 +170,7 @@ contract UpgradeToWIMXV2 is Test { require(stakeHolderV2 == STAKE_HOLDER_V2, "Incorrect deployment address"); } - (address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) = + (address target, uint256 value, bytes memory data, bytes32 predecessor, bytes32 salt) = _getProposalParams(stakeHolderV2); bytes32 id = stakeHolderTimeDelay.hashOperation(target, value, data, predecessor, salt); if (!stakeHolderTimeDelay.isOperation(id)) { diff --git a/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol b/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol index 86f5f072..4b597bef 100644 --- a/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol +++ b/script/trading/seaport/DeployImmutableSignedZoneV2.s.sol @@ -1,11 +1,11 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable-next-line compiler-version pragma solidity 0.8.20; import {Test} from "forge-std/Test.sol"; -import {ImmutableSignedZoneV2} from - "../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; +import { + ImmutableSignedZoneV2 +} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; /** * @title IDeployer Interface @@ -63,10 +63,8 @@ contract DeployImmutableSignedZoneV2 is Test { ); assertEq( true, - ( - keccak256(abi.encodePacked(documentationURI)) - == keccak256(abi.encodePacked(zoneDeploymentArgs.documentationURI)) - ) + (keccak256(abi.encodePacked(documentationURI)) + == keccak256(abi.encodePacked(zoneDeploymentArgs.documentationURI))) ); } @@ -81,8 +79,9 @@ contract DeployImmutableSignedZoneV2 is Test { DeploymentArgs memory deploymentArgs = DeploymentArgs({signer: signer, factory: factory, salt: salt}); - ZoneDeploymentArgs memory zoneDeploymentArgs = - ZoneDeploymentArgs({owner: owner, apiEndpoint: apiEndpoint, documentationURI: documentationURI, name: name}); + ZoneDeploymentArgs memory zoneDeploymentArgs = ZoneDeploymentArgs({ + owner: owner, apiEndpoint: apiEndpoint, documentationURI: documentationURI, name: name + }); _deploy(deploymentArgs, zoneDeploymentArgs); } diff --git a/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol b/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol index 461387c7..9c889036 100644 --- a/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol +++ b/script/trading/seaport/DeployImmutableSignedZoneV2Dev.s.sol @@ -2,10 +2,10 @@ // SPDX-License-Identifier: Apache-2 import {Script} from "forge-std/Script.sol"; -import {ImmutableSignedZoneV2} from - "../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; +import { + ImmutableSignedZoneV2 +} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; -// solhint-disable-next-line compiler-version pragma solidity 0.8.20; // Deploy ImmutableSignedZoneV2 to dev environment (without create3) diff --git a/script/trading/seaport16/DeployConduitController.s.sol b/script/trading/seaport16/DeployConduitController.s.sol index a996ec89..0af646c2 100644 --- a/script/trading/seaport16/DeployConduitController.s.sol +++ b/script/trading/seaport16/DeployConduitController.s.sol @@ -15,15 +15,19 @@ contract DeployConduitController is Script { address private constant KEYLESS_CREATE2_ADDRESS = 0x7A0D94F55792C434d74a40883C6ed8545E406D12; address private constant INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS = 0xcfA3A7637547094fF06246817a35B8333C315196; address private constant IMMUTABLE_CREATE2_FACTORY_ADDRESS = 0x0000000000FFe8B47B3e2130213B802212439497; - address private constant CONDUIT_CONTROLLER_ADDRESS = 0x00000000F9490004C11Cef243f5400493c00Ad63; + address private constant CONDUIT_CONTROLLER_ADDRESS = 0x00000000F9490004C11Cef243f5400493c00Ad63; - bytes private constant CREATE_KEYLESS_CREATE2_RAW_SIGNED_TX = hex"f87e8085174876e800830186a08080ad601f80600e600039806000f350fe60003681823780368234f58015156014578182fd5b80825250506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; + bytes private constant CREATE_KEYLESS_CREATE2_RAW_SIGNED_TX = + hex"f87e8085174876e800830186a08080ad601f80600e600039806000f350fe60003681823780368234f58015156014578182fd5b80825250506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; - bytes private constant CREATE_INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_RAW_TX = hex"608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a0032"; + bytes private constant CREATE_INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_RAW_TX = + hex"608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a0032"; - bytes private constant CREATE_IMMUTABLE_CREATE2_FACTORY_RAW_TX = hex"64e030870000000000000000000000000000000000000000f4b0218f13a6440a6f02000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000853608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a003200000000000000000000000000"; + bytes private constant CREATE_IMMUTABLE_CREATE2_FACTORY_RAW_TX = + hex"64e030870000000000000000000000000000000000000000f4b0218f13a6440a6f02000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000853608060405234801561001057600080fd5b50610833806100206000396000f3fe60806040526004361061003f5760003560e01c806308508b8f1461004457806364e030871461009857806385cf97ab14610138578063a49a7c90146101bc575b600080fd5b34801561005057600080fd5b506100846004803603602081101561006757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166101ec565b604080519115158252519081900360200190f35b61010f600480360360408110156100ae57600080fd5b813591908101906040810160208201356401000000008111156100d057600080fd5b8201836020820111156100e257600080fd5b8035906020019184600183028401116401000000008311171561010457600080fd5b509092509050610217565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561014457600080fd5b5061010f6004803603604081101561015b57600080fd5b8135919081019060408101602082013564010000000081111561017d57600080fd5b82018360208201111561018f57600080fd5b803590602001918460018302840111640100000000831117156101b157600080fd5b509092509050610592565b3480156101c857600080fd5b5061010f600480360360408110156101df57600080fd5b508035906020013561069e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205460ff1690565b600083606081901c33148061024c57507fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116155b6102a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806107746045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250604051855195965090943094508b93508692506020918201918291908401908083835b6020831061033557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102f8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183528085528251928201929092207fff000000000000000000000000000000000000000000000000000000000000008383015260609890981b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260358201969096526055808201979097528251808203909701875260750182525084519484019490942073ffffffffffffffffffffffffffffffffffffffff81166000908152938490529390922054929350505060ff16156104a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180610735603f913960400191505060405180910390fd5b81602001825188818334f5955050508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461053a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260468152602001806107b96046913960600191505060405180910390fd5b50505073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559392505050565b6000308484846040516020018083838082843760408051919093018181037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001825280845281516020928301207fff000000000000000000000000000000000000000000000000000000000000008383015260609990991b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166021820152603581019790975260558088019890985282518088039098018852607590960182525085519585019590952073ffffffffffffffffffffffffffffffffffffffff81166000908152948590529490932054939450505060ff909116159050610697575060005b9392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b6021830152603582018590526055808301859052835180840390910181526075909201835281519181019190912073ffffffffffffffffffffffffffffffffffffffff81166000908152918290529190205460ff161561072e575060005b9291505056fe496e76616c696420636f6e7472616374206372656174696f6e202d20636f6e74726163742068617320616c7265616479206265656e206465706c6f7965642e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f7920636f6e7472616374207573696e672070726f76696465642073616c7420616e6420696e697469616c697a6174696f6e20636f64652ea265627a7a723058202bdc55310d97c4088f18acf04253db593f0914059f0c781a9df3624dcef0d1cf64736f6c634300050a003200000000000000000000000000"; - bytes private constant CREATE_CONDUIT_CONTROLLER_RAW_TX = hex"64e030870000000000000000000000000000000000000000dc0ef3c792976604960400000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000302760c08060405234620000ea57600090610c9f906001600160401b03603f8301601f1916820181811183821017620000da575b604052828252620023889160208101908484833951902060805260405192839281840192831184841017620000ca575b8339039082f58015620000ba575b6001600160a01b03163f60a05260405161227490816200011482396080518181816102b101528181610bcc0152610d06015260a0518181816102d401528181610c620152610da90152f35b620000c462000106565b6200006f565b620000d4620000ef565b62000061565b620000e4620000ef565b62000031565b600080fd5b50634e487b7160e01b600052604160045260246000fd5b506040513d6000823e3d90fdfe60806040526004361015610013575b600080fd5b60003560e01c8063027cc7641461012b5780630a96ad391461012257806313ad9cab1461011957806314afd79e1461011057806333bc8572146101075780634e3f9580146100fe57806351710e45146100f55780636d435421146100ec5780636e9bfd9f146100e3578063794593bc146100da5780637b37e561146100d15780638b9e028b146100c8578063906c87cc146100bf576393790f44146100b757600080fd5b61000e61126e565b5061000e6111fa565b5061000e61113c565b5061000e610fc8565b5061000e610c8a565b5061000e610b3c565b5061000e6109bf565b5061000e610765565b5061000e6106f3565b5061000e61064f565b5061000e6105db565b5061000e6102fa565b5061000e61027b565b5061000e61017a565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576101b2610134565b602435906101bf81611574565b73ffffffffffffffffffffffffffffffffffffffff80911691600083815280602052600360408220015482101561023f5790600360408361023b9661020a9552806020522001611400565b90549060031b1c166040519182918291909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0390f35b602484604051907f6ceb340b0000000000000000000000000000000000000000000000000000000082526004820152fd5b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57604080517f000000000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006020820152f35b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610332610134565b61033a610157565b90604435918215918215840361000e5761035381611505565b73ffffffffffffffffffffffffffffffffffffffff811690813b1561000e576040517fc4e8fcb500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201528515156024820152610401926000908290604490829084905af180156105ce575b6105b5575b5073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b92600484019261043183859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5491821590806105ae575b1561048157505050600361047d92930161045682826114ce565b54929073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b555b005b91949391816105a5575b5061049257005b6104df61047d938560037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600098019201916104ce83546113a4565b90808203610504575b505050611447565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6105766105449161053b61051b61059c9588611400565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b92839187611400565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b553880806104d7565b9050153861048b565b508061043c565b806105c26105c892611335565b80610270565b386103da565b6105d6611397565b6103d5565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610615610134565b61061e81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260016040600020015416604051908152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e861068c610134565b73ffffffffffffffffffffffffffffffffffffffff6106a9610157565b916106b381611574565b166000526000835260046040600020019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541515604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff610740610134565b61074981611574565b1660005260006020526020600360406000200154604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761079d610134565b6107a681611574565b61080c6107f360026107d88473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036109765761047f9060007f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a2610896600261086d8373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b73ffffffffffffffffffffffffffffffffffffffff3390806108dd60016107d88673ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b169083167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec6000604051a46001610935339273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6040517f88c3a11500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576109f7610134565b6109ff610157565b90610a0981611505565b73ffffffffffffffffffffffffffffffffffffffff808316908115610b095750610a5b6107f360026107d88573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b8114610ab95761093561047f93926002927f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6000604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b506040517fcbc080ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291166024820152604490fd5b82602491604051917fa388d263000000000000000000000000000000000000000000000000000000008352166004820152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576040517fff00000000000000000000000000000000000000000000000000000000000000602082019081523060601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260043560358301527f0000000000000000000000000000000000000000000000000000000000000000605583015273ffffffffffffffffffffffffffffffffffffffff91610c3b81607581015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611356565b519020604080519290911673ffffffffffffffffffffffffffffffffffffffff811683523f7f000000000000000000000000000000000000000000000000000000000000000014602083015290f35b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435610cc6610157565b73ffffffffffffffffffffffffffffffffffffffff91828216908115610f9f57338160601c03610f7657610da46107f386516020810190610d8881610c0f7f0000000000000000000000000000000000000000000000000000000000000000883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b92833f7f000000000000000000000000000000000000000000000000000000000000000014610f3057947f4397af6128d529b8ae0442f99db1296d5136062597a15bbc61c1b2a6431a7d15610eca838060009961023b989796865180610c9f8082019082821067ffffffffffffffff831117610f23575b6115a0833903908df515610f16575b610e9c610e578973ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91600183019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b55835173ffffffffffffffffffffffffffffffffffffffff8716815260208101919091529081906040820190565b0390a15194859483167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8287a473ffffffffffffffffffffffffffffffffffffffff1682526020820190565b610f1e611397565b610e2a565b610f2b611305565b610e1b565b85517f6328ccb200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602490fd5b600485517fcb6e5344000000000000000000000000000000000000000000000000000000008152fd5b600485517f99faaa04000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611000610134565b61100981611505565b73ffffffffffffffffffffffffffffffffffffffff9081811660009281845283602052600260408520015416156110ba575061108e600291837f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055604051f35b602490604051907f6b0136160000000000000000000000000000000000000000000000000000000082526004820152fd5b6020908160408183019282815285518094520193019160005b828110611112575050505090565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101611104565b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611175610134565b9061117f82611574565b73ffffffffffffffffffffffffffffffffffffffff91826000911681528082526003604082200192604051908193808654938481520195845280842093915b8383106111e15761023b866111d5818a0382611356565b604051918291826110eb565b84548116875295810195600194850194909201916111be565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020611234610134565b61123d81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260026040600020015416604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff6112bb610134565b16600052600060205260406000205480156112db57602090604051908152f35b60046040517f4ca82090000000000000000000000000000000000000000000000000000000008152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161134957604052565b611351611305565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761134957604052565b506040513d6000823e3d90fd5b600181106113d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80548210156114185760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8054801561149f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061147c8282611400565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b906105446114f692805490680100000000000000008210156114f8575b600182018155611400565b565b611500611305565b6114eb565b61150e81611574565b73ffffffffffffffffffffffffffffffffffffffff809116908160005260006020526001604060002001541633036115435750565b602490604051907fd4ed9a170000000000000000000000000000000000000000000000000000000082526004820152fd5b73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002054156112db5756fe60a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e0033a264697066735822122031e2de61a9e35e9e87d5eef6a36b045a0bab54c4031fd01a0f8138afce3cec3164736f6c634300080e003360a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e003300000000000000000000000000000000000000000000000000"; + bytes private constant CREATE_CONDUIT_CONTROLLER_RAW_TX = + hex"64e030870000000000000000000000000000000000000000dc0ef3c792976604960400000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000302760c08060405234620000ea57600090610c9f906001600160401b03603f8301601f1916820181811183821017620000da575b604052828252620023889160208101908484833951902060805260405192839281840192831184841017620000ca575b8339039082f58015620000ba575b6001600160a01b03163f60a05260405161227490816200011482396080518181816102b101528181610bcc0152610d06015260a0518181816102d401528181610c620152610da90152f35b620000c462000106565b6200006f565b620000d4620000ef565b62000061565b620000e4620000ef565b62000031565b600080fd5b50634e487b7160e01b600052604160045260246000fd5b506040513d6000823e3d90fdfe60806040526004361015610013575b600080fd5b60003560e01c8063027cc7641461012b5780630a96ad391461012257806313ad9cab1461011957806314afd79e1461011057806333bc8572146101075780634e3f9580146100fe57806351710e45146100f55780636d435421146100ec5780636e9bfd9f146100e3578063794593bc146100da5780637b37e561146100d15780638b9e028b146100c8578063906c87cc146100bf576393790f44146100b757600080fd5b61000e61126e565b5061000e6111fa565b5061000e61113c565b5061000e610fc8565b5061000e610c8a565b5061000e610b3c565b5061000e6109bf565b5061000e610765565b5061000e6106f3565b5061000e61064f565b5061000e6105db565b5061000e6102fa565b5061000e61027b565b5061000e61017a565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576101b2610134565b602435906101bf81611574565b73ffffffffffffffffffffffffffffffffffffffff80911691600083815280602052600360408220015482101561023f5790600360408361023b9661020a9552806020522001611400565b90549060031b1c166040519182918291909173ffffffffffffffffffffffffffffffffffffffff6020820193169052565b0390f35b602484604051907f6ceb340b0000000000000000000000000000000000000000000000000000000082526004820152fd5b600091031261000e57565b503461000e5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57604080517f000000000000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006020820152f35b503461000e5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57610332610134565b61033a610157565b90604435918215918215840361000e5761035381611505565b73ffffffffffffffffffffffffffffffffffffffff811690813b1561000e576040517fc4e8fcb500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201528515156024820152610401926000908290604490829084905af180156105ce575b6105b5575b5073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b92600484019261043183859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5491821590806105ae575b1561048157505050600361047d92930161045682826114ce565b54929073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b555b005b91949391816105a5575b5061049257005b6104df61047d938560037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600098019201916104ce83546113a4565b90808203610504575b505050611447565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b6105766105449161053b61051b61059c9588611400565b905473ffffffffffffffffffffffffffffffffffffffff9160031b1c1690565b92839187611400565b90919082549060031b9173ffffffffffffffffffffffffffffffffffffffff9283811b93849216901b16911916179055565b859073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b553880806104d7565b9050153861048b565b508061043c565b806105c26105c892611335565b80610270565b386103da565b6105d6611397565b6103d5565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020610615610134565b61061e81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260016040600020015416604051908152f35b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760206106e861068c610134565b73ffffffffffffffffffffffffffffffffffffffff6106a9610157565b916106b381611574565b166000526000835260046040600020019073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b541515604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff610740610134565b61074981611574565b1660005260006020526020600360406000200154604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5761079d610134565b6107a681611574565b61080c6107f360026107d88473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036109765761047f9060007f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a2610896600261086d8373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055565b73ffffffffffffffffffffffffffffffffffffffff3390806108dd60016107d88673ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b169083167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec6000604051a46001610935339273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6040517f88c3a11500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff919091166004820152602490fd5b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576109f7610134565b6109ff610157565b90610a0981611505565b73ffffffffffffffffffffffffffffffffffffffff808316908115610b095750610a5b6107f360026107d88573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b8114610ab95761093561047f93926002927f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da6000604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b506040517fcbc080ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015291166024820152604490fd5b82602491604051917fa388d263000000000000000000000000000000000000000000000000000000008352166004820152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576040517fff00000000000000000000000000000000000000000000000000000000000000602082019081523060601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602183015260043560358301527f0000000000000000000000000000000000000000000000000000000000000000605583015273ffffffffffffffffffffffffffffffffffffffff91610c3b81607581015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611356565b519020604080519290911673ffffffffffffffffffffffffffffffffffffffff811683523f7f000000000000000000000000000000000000000000000000000000000000000014602083015290f35b503461000e576040807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57600435610cc6610157565b73ffffffffffffffffffffffffffffffffffffffff91828216908115610f9f57338160601c03610f7657610da46107f386516020810190610d8881610c0f7f0000000000000000000000000000000000000000000000000000000000000000883087917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000605594927fff00000000000000000000000000000000000000000000000000000000000000855260601b166001840152601583015260358201520190565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b92833f7f000000000000000000000000000000000000000000000000000000000000000014610f3057947f4397af6128d529b8ae0442f99db1296d5136062597a15bbc61c1b2a6431a7d15610eca838060009961023b989796865180610c9f8082019082821067ffffffffffffffff831117610f23575b6115a0833903908df515610f16575b610e9c610e578973ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91600183019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b55835173ffffffffffffffffffffffffffffffffffffffff8716815260208101919091529081906040820190565b0390a15194859483167fc8894f26f396ce8c004245c8b7cd1b92103a6e4302fcbab883987149ac01b7ec8287a473ffffffffffffffffffffffffffffffffffffffff1682526020820190565b610f1e611397565b610e2a565b610f2b611305565b610e1b565b85517f6328ccb200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602490fd5b600485517fcb6e5344000000000000000000000000000000000000000000000000000000008152fd5b600485517f99faaa04000000000000000000000000000000000000000000000000000000008152fd5b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611000610134565b61100981611505565b73ffffffffffffffffffffffffffffffffffffffff9081811660009281845283602052600260408520015416156110ba575061108e600291837f11a3cf439fb225bfe74225716b6774765670ec1060e3796802e62139d69974da81604051a273ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b017fffffffffffffffffffffffff00000000000000000000000000000000000000008154169055604051f35b602490604051907f6b0136160000000000000000000000000000000000000000000000000000000082526004820152fd5b6020908160408183019282815285518094520193019160005b828110611112575050505090565b835173ffffffffffffffffffffffffffffffffffffffff1685529381019392810192600101611104565b503461000e576020807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e57611175610134565b9061117f82611574565b73ffffffffffffffffffffffffffffffffffffffff91826000911681528082526003604082200192604051908193808654938481520195845280842093915b8383106111e15761023b866111d5818a0382611356565b604051918291826110eb565b84548116875295810195600194850194909201916111be565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e576020611234610134565b61123d81611574565b73ffffffffffffffffffffffffffffffffffffffff8091166000526000825260026040600020015416604051908152f35b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5773ffffffffffffffffffffffffffffffffffffffff6112bb610134565b16600052600060205260406000205480156112db57602090604051908152f35b60046040517f4ca82090000000000000000000000000000000000000000000000000000000008152fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff811161134957604052565b611351611305565b604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761134957604052565b506040513d6000823e3d90fd5b600181106113d1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80548210156114185760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8054801561149f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061147c8282611400565b73ffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b906105446114f692805490680100000000000000008210156114f8575b600182018155611400565b565b611500611305565b6114eb565b61150e81611574565b73ffffffffffffffffffffffffffffffffffffffff809116908160005260006020526001604060002001541633036115435750565b602490604051907fd4ed9a170000000000000000000000000000000000000000000000000000000082526004820152fd5b73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002054156112db5756fe60a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e0033a264697066735822122031e2de61a9e35e9e87d5eef6a36b045a0bab54c4031fd01a0f8138afce3cec3164736f6c634300080e003360a080604052346100235733608052610c7690816100298239608051816103c50152f35b600080fdfe60806040526004361015610013575b600080fd5b6000803560e01c9081634ce34aa21461006657508063899e104c1461005d5780638df25d92146100545763c4e8fcb51461004c57600080fd5b61000e610362565b5061000e61027f565b5061000e6101ab565b346101465760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101465760043567ffffffffffffffff8111610142576100b5903690600401610149565b9133815280602052604081205415610116575b8281106100fa576040517f4ce34aa2000000000000000000000000000000000000000000000000000000008152602090f35b8061011061010b6001938686610532565b6105c4565b016100c8565b807f93daadf2000000000000000000000000000000000000000000000000000000006024925233600452fd5b5080fd5b80fd5b9181601f8401121561000e5782359167ffffffffffffffff831161000e5760208085019460c0850201011161000e57565b9181601f8401121561000e5782359167ffffffffffffffff831161000e576020808501948460051b01011161000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5767ffffffffffffffff60043581811161000e576101fc903690600401610149565b9160243590811161000e5761021590369060040161017a565b919092600033815280602052604081205415610116575b8181106102685761023d8486610acb565b6040517f899e104c000000000000000000000000000000000000000000000000000000008152602090f35b8061027961010b6001938587610532565b0161022c565b503461000e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043567ffffffffffffffff811161000e576102cf90369060040161017a565b33600052600060205260406000205415610316576102ec91610acb565b60206040517f8df25d92000000000000000000000000000000000000000000000000000000008152f35b7f93daadf2000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81160361000e57565b503461000e5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261000e5760043561039e81610344565b6024359081151580830361000e5773ffffffffffffffffffffffffffffffffffffffff90817f00000000000000000000000000000000000000000000000000000000000000001633036105085761041f6104188473ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b5460ff1690565b1515146104b657816104a6846104767fae63067d43ac07563b7eb8db6595635fc77f1578a2a5ea06ba91b63e2afa37e29573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b60405193151584521691602090a2005b506040517f924e341e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9190911660048201529015156024820152604490fd5b60046040517f6d5769be000000000000000000000000000000000000000000000000000000008152fd5b91908110156105425760c0020190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6004111561057b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b35600481101561000e5790565b356105c181610344565b90565b60016105cf826105aa565b6105d881610571565b0361061357806105ed602061061193016105b7565b906105fa604082016105b7565b60a0610608606084016105b7565b92013592610712565b565b600261061e826105aa565b61062781610571565b0361069657600160a08201350361066c5780610648602061061193016105b7565b90610655604082016105b7565b6080610663606084016105b7565b92013592610882565b60046040517fefcc00b1000000000000000000000000000000000000000000000000000000008152fd5b60036106a1826105aa565b6106aa81610571565b036106e857806106bf602061061193016105b7565b6106cb604083016105b7565b6106d7606084016105b7565b90608060a085013594013592610990565b60046040517f7932f1fc000000000000000000000000000000000000000000000000000000008152fd5b9092604051926000947f23b872dd00000000000000000000000000000000000000000000000000000000865280600452816024528260445260208660648180885af1803d15601f3d1160018a51141617163d151581161561077c575b505050505050604052606052565b80863b15151661076e579087959691156107bc57602486887f5f15d672000000000000000000000000000000000000000000000000000000008252600452fd5b156107f657506084947f98891923000000000000000000000000000000000000000000000000000000008552600452602452604452606452fd5b3d610835575b5060a4947ff486bc8700000000000000000000000000000000000000000000000000000000855260045260245260445281606452608452fd5b601f3d0160051c9060051c908060030291808211610869575b505060205a91011061086057856107fc565b833d81803e3d90fd5b8080600392028380020360091c9203020101868061084e565b9092813b1561096257604051926000947f23b872dd000000000000000000000000000000000000000000000000000000008652806004528160245282604452858060648180885af1156108db5750505050604052606052565b8593943d61091e575b5060a4947ff486bc870000000000000000000000000000000000000000000000000000000085526004526024526044526064526001608452fd5b601f3d0160051c9060051c908060030291808211610949575b505060205a91011061086057856108e4565b8080600392028380020360091c92030201018680610937565b507f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b929093833b15610a9d57604051936080519160a0519360c051956000987ff242432a000000000000000000000000000000000000000000000000000000008a528060045281602452826044528360645260a06084528960a452898060c48180895af115610a0d57505050505060805260a05260c052604052606052565b89949550883d610a50575b5060a4957ff486bc87000000000000000000000000000000000000000000000000000000008652600452602452604452606452608452fd5b601f3d0160051c9060051c908060030291808211610a84575b505060205a910110610a7b5786610a18565b843d81803e3d90fd5b8080600392028380020360091c92030201018780610a69565b837f5f15d6720000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020907f2eb2c2d600000000000000000000000000000000000000000000000000000000825260005b838110610b095750505050506080604052565b8435820194853590813b156109625760a09182880192833560059181831b948b60c08097608094818301868501351490606085013514169201013584141615610c165789019a890160243760061b9360e0850160a452610104850194600086526040019060c437600080858982865af115610b8a5750505050600101610af6565b869394503d610bcb575b507fafc445e20000000000000000000000000000000000000000000000000000000060005260045260645260849081510190526000fd5b84601f3d01821c911c90600381810292808311610bff575b505050835a910110610bf55784610b94565b3d6000803e3d6000fd5b8080028380020360091c9203020101858080610be3565b7feba2084c0000000000000000000000000000000000000000000000000000000060005260046000fdfea2646970667358221220c5c8d054d9d5df7c3530eab1c32506aad1fcb6772c1457f0da5443ad9e91b4a364736f6c634300080e003300000000000000000000000000000000000000000000000000"; function run() external { vm.startBroadcast(); @@ -31,20 +35,48 @@ contract DeployConduitController is Script { if (KEYLESS_CREATE2_ADDRESS.code.length == 0) { console.log("Deploying KEYLESS_CREATE2"); // Creates KEYLESS_CREATE2 contract using 0x4c8D290a1B368ac4728d83a9e8321fC3af2b39b1 as the deployer. This account must be funded with at least 0.01 ether. - require(KEYLESS_CREATE2_DEPLOYER_ADDRESS.balance >= 0.01 ether, string.concat("keylessCreate2Deployer balance must be at least ", vm.toString(uint256(0.01 ether)), " but is only ", vm.toString(KEYLESS_CREATE2_DEPLOYER_ADDRESS.balance))); + require( + KEYLESS_CREATE2_DEPLOYER_ADDRESS.balance >= 0.01 ether, + string.concat( + "keylessCreate2Deployer balance must be at least ", + vm.toString(uint256(0.01 ether)), + " but is only ", + vm.toString(KEYLESS_CREATE2_DEPLOYER_ADDRESS.balance) + ) + ); vm.broadcastRawTransaction(CREATE_KEYLESS_CREATE2_RAW_SIGNED_TX); } else { console.log("Skipping KEYLESS_CREATE2, already exists"); } - _createIfNotExist("INEFFICIENT_IMMUTABLE_CREATE2_FACTORY", INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS, KEYLESS_CREATE2_ADDRESS, CREATE_INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_RAW_TX); - _createIfNotExist("IMMUTABLE_CREATE2_FACTORY", IMMUTABLE_CREATE2_FACTORY_ADDRESS, INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS, CREATE_IMMUTABLE_CREATE2_FACTORY_RAW_TX); - _createIfNotExist("ConduitController", CONDUIT_CONTROLLER_ADDRESS, IMMUTABLE_CREATE2_FACTORY_ADDRESS, CREATE_CONDUIT_CONTROLLER_RAW_TX); - + _createIfNotExist( + "INEFFICIENT_IMMUTABLE_CREATE2_FACTORY", + INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS, + KEYLESS_CREATE2_ADDRESS, + CREATE_INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_RAW_TX + ); + _createIfNotExist( + "IMMUTABLE_CREATE2_FACTORY", + IMMUTABLE_CREATE2_FACTORY_ADDRESS, + INEFFICIENT_IMMUTABLE_CREATE2_FACTORY_ADDRESS, + CREATE_IMMUTABLE_CREATE2_FACTORY_RAW_TX + ); + _createIfNotExist( + "ConduitController", + CONDUIT_CONTROLLER_ADDRESS, + IMMUTABLE_CREATE2_FACTORY_ADDRESS, + CREATE_CONDUIT_CONTROLLER_RAW_TX + ); + vm.stopBroadcast(); } - function _createIfNotExist(string memory targetName, address targetAddress, address deployer, bytes memory creationTx) private { + function _createIfNotExist( + string memory targetName, + address targetAddress, + address deployer, + bytes memory creationTx + ) private { if (targetAddress.code.length == 0) { console.log("Deploying", targetName); (bool success,) = deployer.call(creationTx); diff --git a/script/trading/seaport16/DeployImmutableSeaport.s.sol b/script/trading/seaport16/DeployImmutableSeaport.s.sol index dccc44d2..45502ccb 100644 --- a/script/trading/seaport16/DeployImmutableSeaport.s.sol +++ b/script/trading/seaport16/DeployImmutableSeaport.s.sol @@ -27,20 +27,27 @@ contract DeployImmutableSeaport is Script { // Check supplied immutableSeaportAddress matches the expected address based on current creationCode bytes memory immutableSeaportDeploymentBytecode = abi.encodePacked( - type(ImmutableSeaport).creationCode, - abi.encode(CONDUIT_CONTROLLER_ADDRESS, SEAPORT_INITIAL_OWNER) + type(ImmutableSeaport).creationCode, abi.encode(CONDUIT_CONTROLLER_ADDRESS, SEAPORT_INITIAL_OWNER) + ); + address expectedImmutableSeaportAddress = create2Deployer.deployedAddress( + immutableSeaportDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT ); - address expectedImmutableSeaportAddress = create2Deployer.deployedAddress(immutableSeaportDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT); console.log("Expected ImmutableSeaport address: %s", expectedImmutableSeaportAddress); - require(expectedImmutableSeaportAddress == IMMUTABLE_SEAPORT_ADDRESS, "Expected ImmutableSeaport address mismatch"); + require( + expectedImmutableSeaportAddress == IMMUTABLE_SEAPORT_ADDRESS, "Expected ImmutableSeaport address mismatch" + ); vm.startBroadcast(); // Deploy ImmutableSeaport if it doesn't already exist if (IMMUTABLE_SEAPORT_ADDRESS.code.length == 0) { console.log("Deploying ImmutableSeaport"); - address deployedImmutableSeaportAddress = deployer.deploy(create2Deployer, immutableSeaportDeploymentBytecode, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT); - require(deployedImmutableSeaportAddress == IMMUTABLE_SEAPORT_ADDRESS, "Deployed ImmutableSeaport address mismatch"); + address deployedImmutableSeaportAddress = + deployer.deploy(create2Deployer, immutableSeaportDeploymentBytecode, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT); + require( + deployedImmutableSeaportAddress == IMMUTABLE_SEAPORT_ADDRESS, + "Deployed ImmutableSeaport address mismatch" + ); } else { console.log("Skipping ImmutableSeaport, already exists"); } diff --git a/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol b/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol index b18b63ee..eff1fae0 100644 --- a/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol +++ b/script/trading/seaport16/DeployImmutableSignedZoneV3.s.sol @@ -5,7 +5,9 @@ pragma solidity 0.8.24; import {console} from "forge-std/console.sol"; import {Script} from "forge-std/Script.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport16/ImmutableSeaport.sol"; -import {ImmutableSignedZoneV3} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; +import { + ImmutableSignedZoneV3 +} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; import {AccessControlledDeployer} from "../../../contracts/deployer/AccessControlledDeployer.sol"; import {IDeployer} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeployer.sol"; @@ -15,7 +17,7 @@ import {IDeployer} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/inter * @dev This script assumes that the ImmutableSeaport contract has already been deployed. */ contract DeployImmutableSignedZoneV3 is Script { -address private constant ACCESS_CONTROLLED_DEPLOYER_ADDRESS = 0x0B5B1d92259b13D516cCd5a6E63d7D94Ea2A4836; + address private constant ACCESS_CONTROLLED_DEPLOYER_ADDRESS = 0x0B5B1d92259b13D516cCd5a6E63d7D94Ea2A4836; address private constant CREATE2_DEPLOYER_ADDRESS = 0x9df760a54b3B00cC8B3d70A37d45fa97cCfdb4Db; address private constant CONDUIT_CONTROLLER_ADDRESS = 0x00000000F9490004C11Cef243f5400493c00Ad63; address private constant IMMUTABLE_SEAPORT_ADDRESS = 0xbE737Cf2C122F83d1610C1224f7B99ca9d0E09f6; @@ -23,7 +25,7 @@ address private constant ACCESS_CONTROLLED_DEPLOYER_ADDRESS = 0x0B5B1d92259b13D5 address private constant ZONE_ADDRESS = 0x18C12fb9c4f6165196c895aDF84230828A85B247; bytes32 private constant ZONE_DEPLOYMENT_SALT = keccak256(abi.encodePacked("immutable-signed-zone-v3")); address private constant SEAPORT_INITIAL_OWNER = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer - address private constant ZONE_INITIAL_OWNER = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer + address private constant ZONE_INITIAL_OWNER = 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333; // Immutable Deployer function run() external { AccessControlledDeployer deployer = AccessControlledDeployer(ACCESS_CONTROLLED_DEPLOYER_ADDRESS); @@ -31,19 +33,24 @@ address private constant ACCESS_CONTROLLED_DEPLOYER_ADDRESS = 0x0B5B1d92259b13D5 // Check supplied immutableSeaportAddress matches the expected address based on current creationCode bytes memory immutableSeaportDeploymentBytecode = abi.encodePacked( - type(ImmutableSeaport).creationCode, - abi.encode(CONDUIT_CONTROLLER_ADDRESS, SEAPORT_INITIAL_OWNER) + type(ImmutableSeaport).creationCode, abi.encode(CONDUIT_CONTROLLER_ADDRESS, SEAPORT_INITIAL_OWNER) + ); + address expectedIMMUTABLE_SEAPORT_ADDRESS = create2Deployer.deployedAddress( + immutableSeaportDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT ); - address expectedIMMUTABLE_SEAPORT_ADDRESS = create2Deployer.deployedAddress(immutableSeaportDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, IMMUTABLE_SEAPORT_DEPLOYMENT_SALT); console.log("Expected ImmutableSeaport address: %s", expectedIMMUTABLE_SEAPORT_ADDRESS); - require(expectedIMMUTABLE_SEAPORT_ADDRESS == IMMUTABLE_SEAPORT_ADDRESS, "Expected ImmutableSeaport address mismatch"); + require( + expectedIMMUTABLE_SEAPORT_ADDRESS == IMMUTABLE_SEAPORT_ADDRESS, "Expected ImmutableSeaport address mismatch" + ); // Check supplied ZONE_ADDRESS matches the expected address based on current creationCode bytes memory zoneDeploymentBytecode = abi.encodePacked( type(ImmutableSignedZoneV3).creationCode, abi.encode("ImmutableSignedZone", IMMUTABLE_SEAPORT_ADDRESS, "", "", ZONE_INITIAL_OWNER) ); - address expectedZoneAddress = create2Deployer.deployedAddress(zoneDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, ZONE_DEPLOYMENT_SALT); + address expectedZoneAddress = create2Deployer.deployedAddress( + zoneDeploymentBytecode, ACCESS_CONTROLLED_DEPLOYER_ADDRESS, ZONE_DEPLOYMENT_SALT + ); console.log("Expected ImmutableSignedZoneV3 address: %s", expectedZoneAddress); require(expectedZoneAddress == ZONE_ADDRESS, "Expected ImmutableSignedZoneV3 address mismatch"); diff --git a/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol b/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol index b7c299d2..436ca3e7 100644 --- a/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol +++ b/test/allowlist/AllowlistImmutableERC721MintByIDTransferApprovals.t.sol @@ -57,7 +57,7 @@ contract AllowlistERC721TransferApprovals is Test { _giveMinterRole(); } - function testDeployment() public { + function testDeployment() public view { assertEq(address(immutableERC721MintByID.operatorAllowlist()), proxyAddr); } diff --git a/test/allowlist/OperatorAllowlistUpgradeable.t.sol b/test/allowlist/OperatorAllowlistUpgradeable.t.sol index 6b78b652..7fc1de94 100644 --- a/test/allowlist/OperatorAllowlistUpgradeable.t.sol +++ b/test/allowlist/OperatorAllowlistUpgradeable.t.sol @@ -43,7 +43,7 @@ contract OperatorAllowlistTest is Test, OperatorAllowlistUpgradeable { deploySCWScript = new DeploySCWallet(); } - function testDeployment() public { + function testDeployment() public view { assertTrue(allowlist.hasRole(allowlist.DEFAULT_ADMIN_ROLE(), admin)); assertTrue(allowlist.hasRole(allowlist.REGISTRAR_ROLE(), registrar)); assertTrue(allowlist.hasRole(allowlist.UPGRADE_ROLE(), upgrader)); @@ -65,15 +65,17 @@ contract OperatorAllowlistTest is Test, OperatorAllowlistUpgradeable { function testUpgradeNoPerms() public { MockOperatorAllowlistUpgradeable oalImplV2 = new MockOperatorAllowlistUpgradeable(); vm.prank(nonAuthorizedWallet); - vm.expectRevert(abi.encodePacked( - "AccessControl: account ", - vm.toString(nonAuthorizedWallet), - " is missing role 0x555047524144455f524f4c450000000000000000000000000000000000000000" - )); + vm.expectRevert( + abi.encodePacked( + "AccessControl: account ", + vm.toString(nonAuthorizedWallet), + " is missing role 0x555047524144455f524f4c450000000000000000000000000000000000000000" + ) + ); allowlist.upgradeTo(address(oalImplV2)); } - function testShouldSupportIOperatorAllowlistInterface() public { + function testShouldSupportIOperatorAllowlistInterface() public view { assertTrue(allowlist.supportsInterface(0x05a3b809)); } diff --git a/test/deployer/AccessControlledDeployer.t.sol b/test/deployer/AccessControlledDeployer.t.sol index b4459e07..f4aeec85 100644 --- a/test/deployer/AccessControlledDeployer.t.sol +++ b/test/deployer/AccessControlledDeployer.t.sol @@ -5,8 +5,12 @@ pragma solidity >=0.8.19 <0.8.29; import {Test} from "forge-std/Test.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IDeployer} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeployer.sol"; -import {ERC20MintableBurnable} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnable.sol"; -import {ERC20MintableBurnableInit} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnableInit.sol"; +import { + ERC20MintableBurnable +} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnable.sol"; +import { + ERC20MintableBurnableInit +} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnableInit.sol"; import {OwnableCreate2Deployer} from "../../contracts/deployer/create2/OwnableCreate2Deployer.sol"; import {AccessControlledDeployer} from "../../contracts/deployer/AccessControlledDeployer.sol"; @@ -60,7 +64,7 @@ contract AccessControlledDeployerTest is Test, Create2Utils, Create3Utils { new AccessControlledDeployer(roleAdmin, ownershipManager, pauser, address(0)); } - function test_Constructor_AssignsRoles() public { + function test_Constructor_AssignsRoles() public view { assertTrue(rbacDeployer.hasRole(rbacDeployer.DEFAULT_ADMIN_ROLE(), roleAdmin)); assertTrue(rbacDeployer.hasRole(rbacDeployer.OWNERSHIP_MANAGER_ROLE(), ownershipManager)); assertTrue(rbacDeployer.hasRole(rbacDeployer.PAUSER_ROLE(), pauser)); @@ -298,17 +302,12 @@ contract AccessControlledDeployerTest is Test, Create2Utils, Create3Utils { function test_Deploy_UsingCreate2() public { OwnableCreate2Deployer create2Deployer = new OwnableCreate2Deployer(address(rbacDeployer)); - bytes memory erc20MintableBytecode = abi.encodePacked( - type(ERC20MintableBurnable).creationCode, - abi.encode("Test Token", "TEST", 10) - ); + bytes memory erc20MintableBytecode = + abi.encodePacked(type(ERC20MintableBurnable).creationCode, abi.encode("Test Token", "TEST", 10)); bytes32 erc20MintableSalt = createSaltFromKey("erc20-mintable-burnable-v1", address(rbacDeployer)); address expectedAddress = predictCreate2Address( - erc20MintableBytecode, - address(create2Deployer), - address(rbacDeployer), - erc20MintableSalt + erc20MintableBytecode, address(create2Deployer), address(rbacDeployer), erc20MintableSalt ); vm.startPrank(authDeployers[0]); @@ -325,34 +324,21 @@ contract AccessControlledDeployerTest is Test, Create2Utils, Create3Utils { function test_DeployAndInit_UsingCreate2() public { OwnableCreate2Deployer create2Deployer = new OwnableCreate2Deployer(address(rbacDeployer)); - bytes memory mintableInitBytecode = abi.encodePacked( - type(ERC20MintableBurnableInit).creationCode, - abi.encode(10) - ); + bytes memory mintableInitBytecode = + abi.encodePacked(type(ERC20MintableBurnableInit).creationCode, abi.encode(10)); bytes32 mintableInitSalt = createSaltFromKey("erc20-mintable-burnable-init-v1", address(rbacDeployer)); address expectedAddress = predictCreate2Address( - mintableInitBytecode, - address(create2Deployer), - address(rbacDeployer), - mintableInitSalt + mintableInitBytecode, address(create2Deployer), address(rbacDeployer), mintableInitSalt ); - bytes memory initPayload = abi.encodeWithSelector( - ERC20MintableBurnableInit.init.selector, - "Test Token", - "TEST" - ); + bytes memory initPayload = abi.encodeWithSelector(ERC20MintableBurnableInit.init.selector, "Test Token", "TEST"); vm.startPrank(authDeployers[0]); vm.expectEmit(); emit Deployed(expectedAddress, address(rbacDeployer), mintableInitSalt, keccak256(mintableInitBytecode)); - address deployedAddress = rbacDeployer.deployAndInit( - create2Deployer, - mintableInitBytecode, - mintableInitSalt, - initPayload - ); + address deployedAddress = + rbacDeployer.deployAndInit(create2Deployer, mintableInitBytecode, mintableInitSalt, initPayload); ERC20MintableBurnableInit deployed = ERC20MintableBurnableInit(deployedAddress); assertEq(deployedAddress, expectedAddress, "deployed address does not match expected"); @@ -363,10 +349,8 @@ contract AccessControlledDeployerTest is Test, Create2Utils, Create3Utils { function test_Deploy_UsingCreate3() public { OwnableCreate3Deployer create3Deployer = new OwnableCreate3Deployer(address(rbacDeployer)); - bytes memory erc20MintableBytecode = abi.encodePacked( - type(ERC20MintableBurnable).creationCode, - abi.encode("Test Token", "TEST", 10) - ); + bytes memory erc20MintableBytecode = + abi.encodePacked(type(ERC20MintableBurnable).creationCode, abi.encode("Test Token", "TEST", 10)); bytes32 erc20MintableSalt = createSaltFromKey("erc20-mintable-burnable-v1", address(rbacDeployer)); address expectedAddress = predictCreate3Address(create3Deployer, address(rbacDeployer), erc20MintableSalt); @@ -385,29 +369,19 @@ contract AccessControlledDeployerTest is Test, Create2Utils, Create3Utils { function test_DeployAndInit_UsingCreate3() public { OwnableCreate3Deployer create3Deployer = new OwnableCreate3Deployer(address(rbacDeployer)); - bytes memory erc20MintableInitBytcode = abi.encodePacked( - type(ERC20MintableBurnableInit).creationCode, - abi.encode(10) - ); + bytes memory erc20MintableInitBytcode = + abi.encodePacked(type(ERC20MintableBurnableInit).creationCode, abi.encode(10)); bytes32 erc20MintableSalt = createSaltFromKey("erc20-mintable-burnable-init-v1", address(rbacDeployer)); address expectedAddress = predictCreate3Address(create3Deployer, address(rbacDeployer), erc20MintableSalt); vm.startPrank(authDeployers[0]); - bytes memory initPayload = abi.encodeWithSelector( - ERC20MintableBurnableInit.init.selector, - "Test Token", - "TEST" - ); + bytes memory initPayload = abi.encodeWithSelector(ERC20MintableBurnableInit.init.selector, "Test Token", "TEST"); vm.expectEmit(); emit Deployed(expectedAddress, address(rbacDeployer), erc20MintableSalt, keccak256(erc20MintableInitBytcode)); - address deployedAddress = rbacDeployer.deployAndInit( - create3Deployer, - erc20MintableInitBytcode, - erc20MintableSalt, - initPayload - ); + address deployedAddress = + rbacDeployer.deployAndInit(create3Deployer, erc20MintableInitBytcode, erc20MintableSalt, initPayload); ERC20MintableBurnableInit deployed = ERC20MintableBurnableInit(deployedAddress); assertEq(deployedAddress, expectedAddress, "deployed address does not match expected"); diff --git a/test/deployer/create2/OwnableCreate2Deployer.t.sol b/test/deployer/create2/OwnableCreate2Deployer.t.sol index bf100bfd..8798d9ca 100644 --- a/test/deployer/create2/OwnableCreate2Deployer.t.sol +++ b/test/deployer/create2/OwnableCreate2Deployer.t.sol @@ -5,10 +5,12 @@ pragma solidity >=0.8.19 <0.8.29; import {Test} from "forge-std/Test.sol"; import {IDeploy} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeploy.sol"; import {ERC20Mock} from "@openzeppelin/contracts/mocks/ERC20Mock.sol"; -import {ERC20MintableBurnable} from - "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnable.sol"; -import {ERC20MintableBurnableInit} from - "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnableInit.sol"; +import { + ERC20MintableBurnable +} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnable.sol"; +import { + ERC20MintableBurnableInit +} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnableInit.sol"; import {ContractAddress} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/libs/ContractAddress.sol"; import {OwnableCreate2Deployer} from "../../../contracts/deployer/create2/OwnableCreate2Deployer.sol"; diff --git a/test/deployer/create3/OwnableCreate3Deployer.t.sol b/test/deployer/create3/OwnableCreate3Deployer.t.sol index 7d9b779a..3ca39db5 100644 --- a/test/deployer/create3/OwnableCreate3Deployer.t.sol +++ b/test/deployer/create3/OwnableCreate3Deployer.t.sol @@ -6,10 +6,12 @@ import {Test} from "forge-std/Test.sol"; import {console} from "forge-std/console.sol"; import {IDeploy} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IDeploy.sol"; import {ERC20Mock} from "@openzeppelin/contracts/mocks/ERC20Mock.sol"; -import {ERC20MintableBurnable} from - "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnable.sol"; -import {ERC20MintableBurnableInit} from - "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnableInit.sol"; +import { + ERC20MintableBurnable +} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnable.sol"; +import { + ERC20MintableBurnableInit +} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/test/token/ERC20MintableBurnableInit.sol"; import {ContractAddress} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/libs/ContractAddress.sol"; import {OwnableCreate3Deployer} from "../../../contracts/deployer/create3/OwnableCreate3Deployer.sol"; @@ -205,12 +207,13 @@ contract OwnableCreate3DeployerTest is Test, Create3Utils { vm.startPrank(address(factory)); singleUseDeployer.deploy(erc20MockBytecode); } + /** * deployedAddress */ /// @dev Same contracts initialised with different constructor parameters, should be deployed to the same address if using the same sender and salt - function test_deployedAddress_SameContractSameSaltDifferentConstructorParams() public { + function test_deployedAddress_SameContractSameSaltDifferentConstructorParams() public view { bytes memory bytecode1 = abi.encodePacked(type(ERC20MintableBurnable).creationCode, abi.encode("Token 1", "T1", 18)); bytes memory bytecode2 = @@ -224,7 +227,7 @@ contract OwnableCreate3DeployerTest is Test, Create3Utils { } /// @dev Different contracts should be deployed to the same address if using the same sender and salt - function test_deployedAddress_DifferentContractsSameSalt() public { + function test_deployedAddress_DifferentContractsSameSalt() public view { bytes32 salt = _createSaltFromKey("test-salt"); bytes memory bytecode1 = type(ERC20Mock).creationCode; bytes memory bytecode2 = type(ERC20MintableBurnable).creationCode; @@ -258,7 +261,7 @@ contract OwnableCreate3DeployerTest is Test, Create3Utils { */ function _create2Address(bytes memory bytecode, bytes32 salt, address deployer, address sender) internal - view + pure returns (address) { bytes32 deploySalt = keccak256(abi.encode(sender, salt)); diff --git a/test/games/gems/GemGame.t.sol b/test/games/gems/GemGame.t.sol index 912e39fd..aa7a82a2 100644 --- a/test/games/gems/GemGame.t.sol +++ b/test/games/gems/GemGame.t.sol @@ -1,7 +1,5 @@ // Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 -// solhint-disable not-rely-on-time - pragma solidity >=0.8.19 <0.8.29; import {Test} from "forge-std/Test.sol"; diff --git a/test/multicall/GuardedMulticaller2.t.sol b/test/multicall/GuardedMulticaller2.t.sol index 50b85b2b..22a1beb1 100644 --- a/test/multicall/GuardedMulticaller2.t.sol +++ b/test/multicall/GuardedMulticaller2.t.sol @@ -36,7 +36,7 @@ contract GuardedMulticaller2Test is Test { sigUtils = new SigUtils("name", "1", address(gmc)); } - function test_Roles() public { + function test_Roles() public view { assertTrue(gmc.hasRole(gmc.DEFAULT_ADMIN_ROLE(), defaultAdmin)); assertTrue(gmc.hasRole(gmc.MULTICALL_SIGNER_ROLE(), signer)); } @@ -45,17 +45,11 @@ contract GuardedMulticaller2Test is Test { bytes32 ref = keccak256("ref"); uint256 deadline = block.timestamp + 1; GuardedMulticaller2.Call[] memory calls = new GuardedMulticaller2.Call[](3); - calls[0] = GuardedMulticaller2.Call( - address(target), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[0] = + GuardedMulticaller2.Call(address(target), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); calls[1] = GuardedMulticaller2.Call(address(target), "succeed()", ""); - calls[2] = GuardedMulticaller2.Call( - address(target1), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[2] = + GuardedMulticaller2.Call(address(target1), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); bytes32 digest = sigUtils.hashTypedData(ref, calls, deadline); (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest); @@ -76,11 +70,8 @@ contract GuardedMulticaller2Test is Test { bytes32 ref = keccak256("ref"); uint256 deadline = block.timestamp - 1; GuardedMulticaller2.Call[] memory calls = new GuardedMulticaller2.Call[](1); - calls[0] = GuardedMulticaller2.Call( - address(target), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[0] = + GuardedMulticaller2.Call(address(target), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); bytes32 digest = sigUtils.hashTypedData(ref, calls, deadline); (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest); @@ -95,11 +86,8 @@ contract GuardedMulticaller2Test is Test { bytes32 ref = ""; uint256 deadline = block.timestamp + 1; GuardedMulticaller2.Call[] memory calls = new GuardedMulticaller2.Call[](1); - calls[0] = GuardedMulticaller2.Call( - address(target), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[0] = + GuardedMulticaller2.Call(address(target), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); bytes32 digest = sigUtils.hashTypedData(ref, calls, deadline); (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest); @@ -114,11 +102,8 @@ contract GuardedMulticaller2Test is Test { bytes32 ref = "ref"; uint256 deadline = block.timestamp + 1; GuardedMulticaller2.Call[] memory calls = new GuardedMulticaller2.Call[](1); - calls[0] = GuardedMulticaller2.Call( - address(target), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[0] = + GuardedMulticaller2.Call(address(target), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); bytes32 digest = sigUtils.hashTypedData(ref, calls, deadline); (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest); @@ -164,11 +149,8 @@ contract GuardedMulticaller2Test is Test { bytes32 ref = keccak256("ref"); uint256 deadline = block.timestamp + 1; GuardedMulticaller2.Call[] memory calls = new GuardedMulticaller2.Call[](1); - calls[0] = GuardedMulticaller2.Call( - address(target), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[0] = + GuardedMulticaller2.Call(address(target), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); bytes32 digest = sigUtils.hashTypedData(ref, calls, deadline); (uint8 v, bytes32 r, bytes32 s) = vm.sign(fakeSignerPk, digest); @@ -184,11 +166,8 @@ contract GuardedMulticaller2Test is Test { bytes32 ref = keccak256("ref"); uint256 deadline = block.timestamp + 1; GuardedMulticaller2.Call[] memory calls = new GuardedMulticaller2.Call[](1); - calls[0] = GuardedMulticaller2.Call( - address(target), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[0] = + GuardedMulticaller2.Call(address(target), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); bytes32 digest = sigUtils.hashTypedData(ref, calls, deadline); (uint8 v, bytes32 r, bytes32 s) = vm.sign(fakeSignerPk, digest); @@ -218,11 +197,8 @@ contract GuardedMulticaller2Test is Test { bytes32 ref = keccak256("ref"); uint256 deadline = block.timestamp + 1; GuardedMulticaller2.Call[] memory calls = new GuardedMulticaller2.Call[](1); - calls[0] = GuardedMulticaller2.Call( - address(target), - "succeedWithUint256(uint256)", - abi.encodePacked(uint256(42)) - ); + calls[0] = + GuardedMulticaller2.Call(address(target), "succeedWithUint256(uint256)", abi.encodePacked(uint256(42))); bytes32 digest = sigUtils.hashTypedData(ref, calls, deadline); (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, digest); diff --git a/test/multicall/MockFunctions.sol b/test/multicall/MockFunctions.sol index 41372e60..2a445d96 100644 --- a/test/multicall/MockFunctions.sol +++ b/test/multicall/MockFunctions.sol @@ -5,17 +5,14 @@ pragma solidity >=0.8.19 <0.8.29; contract MockFunctions { error RevertWithData(uint256 value); - // solhint-disable-next-line no-empty-blocks function succeed() public pure { // This function is intentionally left empty to simulate a successful call } function revertWithNoReason() public pure { - // solhint-disable-next-line custom-errors,reason-string revert(); } - // solhint-disable-next-line no-empty-blocks function notPermitted() public pure { // This function is intentionally left empty to simulate a non-permitted action } @@ -25,7 +22,6 @@ contract MockFunctions { } function revertWithData(uint256 value) public pure { - // solhint-disable-next-line custom-errors,reason-string revert RevertWithData(value); } -} \ No newline at end of file +} diff --git a/test/multicall/SigUtils.t.sol b/test/multicall/SigUtils.t.sol index 812c2c25..73bd86d8 100644 --- a/test/multicall/SigUtils.t.sol +++ b/test/multicall/SigUtils.t.sol @@ -11,54 +11,54 @@ contract SigUtils { bytes32 internal constant CALL_TYPEHASH = keccak256("Call(address target,string functionSignature,bytes data)"); bytes32 internal constant MULTICALL_TYPEHASHV1 = - keccak256( - "Multicall(bytes32 ref,address[] targets,bytes[] data,uint256 deadline)" - ); - - bytes32 internal constant MULTICALL_TYPEHASHV2 = - keccak256( - "Multicall(bytes32 ref,Call[] calls,uint256 deadline)Call(address target,string functionSignature,bytes data)" - ); + keccak256("Multicall(bytes32 ref,address[] targets,bytes[] data,uint256 deadline)"); + bytes32 internal constant MULTICALL_TYPEHASHV2 = keccak256( + "Multicall(bytes32 ref,Call[] calls,uint256 deadline)Call(address target,string functionSignature,bytes data)" + ); bytes32 private immutable CACHED_DOMAIN_SEPARATOR; constructor(string memory _name, string memory _version, address _verifyingContract) { - CACHED_DOMAIN_SEPARATOR = keccak256(abi.encode(_TYPE_HASH, keccak256(bytes(_name)), keccak256(bytes(_version)), block.chainid, _verifyingContract)); + CACHED_DOMAIN_SEPARATOR = keccak256( + abi.encode( + _TYPE_HASH, keccak256(bytes(_name)), keccak256(bytes(_version)), block.chainid, _verifyingContract + ) + ); } function _hashCallArray(GuardedMulticaller2.Call[] calldata _calls) internal pure returns (bytes32) { bytes32[] memory hashedCallArr = new bytes32[](_calls.length); for (uint256 i = 0; i < _calls.length; i++) { - hashedCallArr[i] = keccak256( - abi.encode(CALL_TYPEHASH, _calls[i].target, _calls[i].functionSignature, _calls[i].data) - ); + hashedCallArr[i] = + keccak256(abi.encode(CALL_TYPEHASH, _calls[i].target, _calls[i].functionSignature, _calls[i].data)); } return keccak256(abi.encode(hashedCallArr)); } - function hashTypedData( - bytes32 _reference, - GuardedMulticaller2.Call[] calldata _calls, - uint256 _deadline - ) public view returns (bytes32) { + function hashTypedData(bytes32 _reference, GuardedMulticaller2.Call[] calldata _calls, uint256 _deadline) + public + view + returns (bytes32) + { bytes32 digest = keccak256(abi.encode(MULTICALL_TYPEHASHV2, _reference, _hashCallArray(_calls), _deadline)); return keccak256(abi.encodePacked("\x19\x01", CACHED_DOMAIN_SEPARATOR, digest)); } - - function hashTypedData( - bytes32 _reference, - address[] calldata _targets, - bytes[] calldata _data, - uint256 _deadline - ) public view returns (bytes32) { - bytes32 digest = keccak256(abi.encode( - MULTICALL_TYPEHASHV1, - _reference, - keccak256(abi.encodePacked(_targets)), - hashBytesArray(_data), - _deadline)); + function hashTypedData(bytes32 _reference, address[] calldata _targets, bytes[] calldata _data, uint256 _deadline) + public + view + returns (bytes32) + { + bytes32 digest = keccak256( + abi.encode( + MULTICALL_TYPEHASHV1, + _reference, + keccak256(abi.encodePacked(_targets)), + hashBytesArray(_data), + _deadline + ) + ); return keccak256(abi.encodePacked("\x19\x01", CACHED_DOMAIN_SEPARATOR, digest)); } diff --git a/test/royalty-enforcement/MockMarketplace.sol b/test/royalty-enforcement/MockMarketplace.sol index 81221549..51b4e70a 100644 --- a/test/royalty-enforcement/MockMarketplace.sol +++ b/test/royalty-enforcement/MockMarketplace.sol @@ -39,7 +39,6 @@ contract MockMarketplace { if (from == address(0)) { revert ZeroAddress(); } - // solhint-disable-next-line custom-errors require(msg.value == price, "insufficient msg.value"); (address receiver, uint256 royaltyAmount) = ROYALTY_ADDRESS.royaltyInfo(_tokenId, price); if (receiver == address(0)) { @@ -53,7 +52,6 @@ contract MockMarketplace { } } - // function executeTransferRoyalties( // address seller, // address buyer, @@ -62,16 +60,16 @@ contract MockMarketplace { // ) external payable { // // Get royalty info // (address recipient, uint256 royaltyAmount) = IERC2981(address(nft)).royaltyInfo(tokenId, price); - + // // Transfer NFT // nft.transferFrom(seller, buyer, tokenId); - + // // Transfer royalty to recipient // if (royaltyAmount > 0) { // (bool success, ) = recipient.call{value: royaltyAmount}(""); // require(success, "Royalty transfer failed"); // } - + // // Transfer remaining amount to seller // uint256 sellerAmount = price - royaltyAmount; // if (sellerAmount > 0) { @@ -79,4 +77,4 @@ contract MockMarketplace { // require(success, "Seller transfer failed"); // } // } -// } +// } diff --git a/test/royalty-enforcement/RoyaltyMarketplace.t.sol b/test/royalty-enforcement/RoyaltyMarketplace.t.sol index 5151f8d7..1d98aa48 100644 --- a/test/royalty-enforcement/RoyaltyMarketplace.t.sol +++ b/test/royalty-enforcement/RoyaltyMarketplace.t.sol @@ -8,19 +8,18 @@ import {MockMarketplace} from "./MockMarketplace.sol"; import {OperatorAllowlistUpgradeable} from "../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {DeployOperatorAllowlist} from "../utils/DeployAllowlistProxy.sol"; - contract RoyaltyMarketplaceTest is Test { ImmutableERC721MintByID public erc721; OperatorAllowlistUpgradeable public operatorAllowlist; MockMarketplace public mockMarketplace; - + address public owner; address public minter; address public registrar; address public royaltyRecipient; address public buyer; address public seller; - + string public constant BASE_URI = "https://baseURI.com/"; string public constant CONTRACT_URI = "https://contractURI.com"; string public constant NAME = "ERC721Preset"; @@ -35,23 +34,16 @@ contract RoyaltyMarketplaceTest is Test { royaltyRecipient = makeAddr("royaltyRecipient"); buyer = makeAddr("buyer"); seller = makeAddr("seller"); - + // Deploy operator Allowlist DeployOperatorAllowlist deployScript = new DeployOperatorAllowlist(); address proxyAddr = deployScript.run(owner, owner, registrar); operatorAllowlist = OperatorAllowlistUpgradeable(proxyAddr); - + // Deploy ERC721 contract vm.prank(owner); erc721 = new ImmutableERC721MintByID( - owner, - NAME, - SYMBOL, - BASE_URI, - CONTRACT_URI, - address(operatorAllowlist), - royaltyRecipient, - ROYALTY + owner, NAME, SYMBOL, BASE_URI, CONTRACT_URI, address(operatorAllowlist), royaltyRecipient, ROYALTY ); // Deploy mock marketplace @@ -61,7 +53,7 @@ contract RoyaltyMarketplaceTest is Test { vm.prank(owner); erc721.grantMinterRole(minter); } - + function test_AllowlistMarketplace() public { address[] memory marketPlaces = new address[](1); marketPlaces[0] = address(mockMarketplace); @@ -97,12 +89,7 @@ contract RoyaltyMarketplaceTest is Test { // Execute trade vm.deal(buyer, salePrice); vm.prank(buyer); - mockMarketplace.executeTransferRoyalties{value: salePrice}( - seller, - buyer, - tokenId, - salePrice - ); + mockMarketplace.executeTransferRoyalties{value: salePrice}(seller, buyer, tokenId, salePrice); // Check if buyer received NFT assertEq(erc721.ownerOf(tokenId), buyer, "Buyer does not have NFT"); @@ -113,4 +100,4 @@ contract RoyaltyMarketplaceTest is Test { // Check if seller has increased balance assertEq(seller.balance, sellerBal + (salePrice - royaltyAmount), "Seller balance not correct"); } -} \ No newline at end of file +} diff --git a/test/staking/StakeHolderAttackWallet.sol b/test/staking/StakeHolderAttackWallet.sol index 2398efe6..329309b4 100644 --- a/test/staking/StakeHolderAttackWallet.sol +++ b/test/staking/StakeHolderAttackWallet.sol @@ -7,21 +7,25 @@ import {StakeHolderNative} from "../../contracts/staking/StakeHolderNative.sol"; // Wallet designed to attempt reentrancy attacks contract StakeHolderAttackWallet { StakeHolderNative public stakeHolder; + constructor(address _stakeHolder) { stakeHolder = StakeHolderNative(_stakeHolder); } + receive() external payable { // Assumung the call to unstake is for a "whole" number, say 1 ether, then - // this if statement will be chosen first time through the loop. The second - // time through, the msg.value will have the bottom bit set, and this if + // this if statement will be chosen first time through the loop. The second + // time through, the msg.value will have the bottom bit set, and this if // statement will be skipped. if (msg.value & 0x01 == 0) { stakeHolder.unstake(msg.value + 1); } } + function stake(uint256 _amount) external { stakeHolder.stake{value: _amount}(_amount); } + function unstake(uint256 _amount) external { stakeHolder.unstake(_amount); } diff --git a/test/staking/StakeHolderAttackWallet2.sol b/test/staking/StakeHolderAttackWallet2.sol index 9837491f..62515f6d 100644 --- a/test/staking/StakeHolderAttackWallet2.sol +++ b/test/staking/StakeHolderAttackWallet2.sol @@ -8,19 +8,22 @@ import {StakeHolderNative} from "../../contracts/staking/StakeHolderNative.sol"; // Not really an attack as such. contract StakeHolderAttackWallet2 { StakeHolderNative public stakeHolder; + constructor(address _stakeHolder) { stakeHolder = StakeHolderNative(_stakeHolder); } + receive() external payable { - // Cause a revert that has zero call data length. + // Cause a revert that has zero call data length. assembly ("memory-safe") { revert(0, 0) } - } + function stake(uint256 _amount) external { stakeHolder.stake{value: _amount}(_amount); } + function unstake(uint256 _amount) external { stakeHolder.unstake(_amount); } diff --git a/test/staking/StakeHolderBase.t.sol b/test/staking/StakeHolderBase.t.sol index 79b3842b..e5722a5b 100644 --- a/test/staking/StakeHolderBase.t.sol +++ b/test/staking/StakeHolderBase.t.sol @@ -1,10 +1,8 @@ // Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 -// solhint-disable not-rely-on-time pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; @@ -19,7 +17,6 @@ import {ERC20PresetFixedSupply} from "openzeppelin-contracts-4.9.3/token/ERC20/p import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; abstract contract StakeHolderBaseTest is Test { - bytes32 public defaultAdminRole; bytes32 public upgradeRole; bytes32 public distributeRole; @@ -38,7 +35,6 @@ abstract contract StakeHolderBaseTest is Test { ERC20PresetFixedSupply erc20; WIMX wimxErc20; - function setUp() public virtual { roleAdmin = makeAddr("RoleAdmin"); upgradeAdmin = makeAddr("UpgradeAdmin"); @@ -66,9 +62,8 @@ abstract contract StakeHolderBaseTest is Test { function deployStakeHolderNativeV1() internal { StakeHolderNative impl = new StakeHolderNative(); - bytes memory initData = abi.encodeWithSelector( - StakeHolderNative.initialize.selector, roleAdmin, upgradeAdmin, distributeAdmin - ); + bytes memory initData = + abi.encodeWithSelector(StakeHolderNative.initialize.selector, roleAdmin, upgradeAdmin, distributeAdmin); ERC1967Proxy proxy = new ERC1967Proxy(address(impl), initData); stakeHolder = IStakeHolder(address(proxy)); } diff --git a/test/staking/StakeHolderConfigBase.t.sol b/test/staking/StakeHolderConfigBase.t.sol index 837d54f2..b24af69d 100644 --- a/test/staking/StakeHolderConfigBase.t.sol +++ b/test/staking/StakeHolderConfigBase.t.sol @@ -2,12 +2,10 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import {Test} from "forge-std/Test.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; - abstract contract StakeHolderConfigBaseTest is StakeHolderBaseTest { function testUpgradeToV2() public virtual { IStakeHolder v2Impl = _deployV2(); @@ -44,7 +42,7 @@ abstract contract StakeHolderConfigBaseTest is StakeHolderBaseTest { function testUpgradeAuthFail() public { IStakeHolder v2Impl = _deployV2(); bytes memory initData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); - // Error will be of the form: + // Error will be of the form: // AccessControl: account 0x7fa9385be102ac3eac297483dd6233d62b3e1496 is missing role 0x555047524144455f524f4c450000000000000000000000000000000000000000 vm.expectRevert(); StakeHolderBase(address(stakeHolder)).upgradeToAndCall(address(v2Impl), initData); @@ -77,16 +75,15 @@ abstract contract StakeHolderConfigBaseTest is StakeHolderBaseTest { assertFalse(stakeHolder.hasRole(role, upgradeAdmin), "Upgrade admin should not have role"); } - function testRoleAdminAuthFail () public { + function testRoleAdminAuthFail() public { bytes32 role = defaultAdminRole; address newRoleAdmin = makeAddr("NewRoleAdmin"); - // Error will be of the form: + // Error will be of the form: // AccessControl: account 0x7fa9385be102ac3eac297483dd6233d62b3e1496 is missing role 0x555047524144455f524f4c450000000000000000000000000000000000000000 vm.expectRevert(); stakeHolder.grantRole(role, newRoleAdmin); } - - function _deployV1() internal virtual returns(IStakeHolder); - function _deployV2() internal virtual returns(IStakeHolder); + function _deployV1() internal virtual returns (IStakeHolder); + function _deployV2() internal virtual returns (IStakeHolder); } diff --git a/test/staking/StakeHolderConfigBaseV2.t.sol b/test/staking/StakeHolderConfigBaseV2.t.sol index 2540c21d..7d748fbc 100644 --- a/test/staking/StakeHolderConfigBaseV2.t.sol +++ b/test/staking/StakeHolderConfigBaseV2.t.sol @@ -6,9 +6,8 @@ import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderConfigBaseTest} from "./StakeHolderConfigBase.t.sol"; - abstract contract StakeHolderConfigBaseTestV2 is StakeHolderConfigBaseTest { - function testUpgradeToV2() override public { + function testUpgradeToV2() public override { IStakeHolder v2Impl = _deployV2(); bytes memory initData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); vm.prank(upgradeAdmin); @@ -16,7 +15,7 @@ abstract contract StakeHolderConfigBaseTestV2 is StakeHolderConfigBaseTest { StakeHolderBase(address(stakeHolder)).upgradeToAndCall(address(v2Impl), initData); } - function testUpgradeToV1() override public { + function testUpgradeToV1() public override { IStakeHolder v1Impl = _deployV1(); bytes memory initData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); vm.expectRevert(abi.encodeWithSelector(IStakeHolder.CanNotUpgradeToLowerOrSameVersion.selector, 2)); @@ -24,7 +23,7 @@ abstract contract StakeHolderConfigBaseTestV2 is StakeHolderConfigBaseTest { StakeHolderBase(address(stakeHolder)).upgradeToAndCall(address(v1Impl), initData); } - function testDowngradeV2ToV1() override public { + function testDowngradeV2ToV1() public override { // This test doesn't make sense in the context of V2. } @@ -51,5 +50,5 @@ abstract contract StakeHolderConfigBaseTestV2 is StakeHolderConfigBaseTest { StakeHolderBase(address(stakeHolder)).upgradeToAndCall(address(v2Impl), initData); } - function _deployV3() internal virtual returns(IStakeHolder); + function _deployV3() internal virtual returns (IStakeHolder); } diff --git a/test/staking/StakeHolderConfigERC20.t.sol b/test/staking/StakeHolderConfigERC20.t.sol index 3fe65c4a..eff02fff 100644 --- a/test/staking/StakeHolderConfigERC20.t.sol +++ b/test/staking/StakeHolderConfigERC20.t.sol @@ -8,24 +8,28 @@ import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderConfigBaseTest} from "./StakeHolderConfigBase.t.sol"; contract StakeHolderERC20V2a is StakeHolderERC20 { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBase) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBase) + { version = 2; } } contract StakeHolderConfigERC20Test is StakeHolderConfigBaseTest { - function setUp() public override { super.setUp(); deployERC20(); deployStakeHolderERC20V1(); } - function _deployV1() internal override returns(IStakeHolder) { + function _deployV1() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderERC20())); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderERC20V2a())); } -} \ No newline at end of file +} diff --git a/test/staking/StakeHolderConfigERC20V2.t.sol b/test/staking/StakeHolderConfigERC20V2.t.sol index fa017602..8b421ba4 100644 --- a/test/staking/StakeHolderConfigERC20V2.t.sol +++ b/test/staking/StakeHolderConfigERC20V2.t.sol @@ -10,13 +10,17 @@ import {StakeHolderConfigBaseTestV2} from "./StakeHolderConfigBaseV2.t.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; contract StakeHolderERC20V3a is StakeHolderERC20V2 { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBaseV2) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBaseV2) + { version = 3; } } contract StakeHolderConfigERC20TestV2 is StakeHolderConfigBaseTestV2 { - function setUp() public override { super.setUp(); deployERC20(); @@ -36,15 +40,15 @@ contract StakeHolderConfigERC20TestV2 is StakeHolderConfigBaseTestV2 { assertEq(stakeHolderV2.version(), 2, "Incorrect version"); } - function _deployV1() internal override returns(IStakeHolder) { + function _deployV1() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderERC20())); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderERC20V2())); } - function _deployV3() internal override returns(IStakeHolder) { + function _deployV3() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderERC20V3a())); } -} \ No newline at end of file +} diff --git a/test/staking/StakeHolderConfigNative.t.sol b/test/staking/StakeHolderConfigNative.t.sol index 54f0e0da..a206c6d6 100644 --- a/test/staking/StakeHolderConfigNative.t.sol +++ b/test/staking/StakeHolderConfigNative.t.sol @@ -8,25 +8,27 @@ import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderConfigBaseTest} from "./StakeHolderConfigBase.t.sol"; contract StakeHolderNativeV2a is StakeHolderNative { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBase) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBase) + { version = 2; } } - contract StakeHolderConfigNativeTest is StakeHolderConfigBaseTest { - function setUp() public override { super.setUp(); deployStakeHolderNativeV1(); } - function _deployV1() internal override returns(IStakeHolder) { + function _deployV1() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderNative())); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderNativeV2a())); } - } diff --git a/test/staking/StakeHolderConfigNativeV2.t.sol b/test/staking/StakeHolderConfigNativeV2.t.sol index 3a07ef55..14c7ae32 100644 --- a/test/staking/StakeHolderConfigNativeV2.t.sol +++ b/test/staking/StakeHolderConfigNativeV2.t.sol @@ -10,14 +10,17 @@ import {StakeHolderConfigBaseTestV2} from "./StakeHolderConfigBaseV2.t.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; contract StakeHolderNativeV3a is StakeHolderNativeV2 { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBaseV2) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBaseV2) + { version = 3; } } - contract StakeHolderConfigNativeTestV2 is StakeHolderConfigBaseTestV2 { - function setUp() public override { super.setUp(); deployStakeHolderNativeV1(); @@ -27,24 +30,23 @@ contract StakeHolderConfigNativeTestV2 is StakeHolderConfigBaseTestV2 { function testDeployStakeHolderNativeV2() public { // Check that V2 can be installed from scratch: that is, without upgrading form V1. StakeHolderNativeV2 impl = new StakeHolderNativeV2(); - bytes memory initData = abi.encodeWithSelector( - StakeHolderNativeV2.initialize.selector, roleAdmin, upgradeAdmin, distributeAdmin - ); + bytes memory initData = + abi.encodeWithSelector(StakeHolderNativeV2.initialize.selector, roleAdmin, upgradeAdmin, distributeAdmin); ERC1967Proxy proxy = new ERC1967Proxy(address(impl), initData); IStakeHolder stakeHolderV2 = IStakeHolder(address(proxy)); assertEq(stakeHolderV2.version(), 2, "Incorrect version"); } - function _deployV1() internal override returns(IStakeHolder) { + function _deployV1() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderNative())); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderNativeV2())); } - function _deployV3() internal override returns(IStakeHolder) { + function _deployV3() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderNativeV3a())); } } diff --git a/test/staking/StakeHolderConfigWIMX.t.sol b/test/staking/StakeHolderConfigWIMX.t.sol index 3f2954e9..bbb5432c 100644 --- a/test/staking/StakeHolderConfigWIMX.t.sol +++ b/test/staking/StakeHolderConfigWIMX.t.sol @@ -8,24 +8,28 @@ import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; import {StakeHolderConfigBaseTest} from "./StakeHolderConfigBase.t.sol"; contract StakeHolderWIMXV2a is StakeHolderWIMX { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBase) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBase) + { version = 2; } } contract StakeHolderConfigWIMXTest is StakeHolderConfigBaseTest { - function setUp() public override { super.setUp(); deployWIMX(); deployStakeHolderWIMXV1(); } - function _deployV1() internal override returns(IStakeHolder) { + function _deployV1() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderWIMX())); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderWIMXV2a())); } -} \ No newline at end of file +} diff --git a/test/staking/StakeHolderConfigWIMXV2.t.sol b/test/staking/StakeHolderConfigWIMXV2.t.sol index a02439a7..011ae581 100644 --- a/test/staking/StakeHolderConfigWIMXV2.t.sol +++ b/test/staking/StakeHolderConfigWIMXV2.t.sol @@ -10,13 +10,17 @@ import {StakeHolderConfigBaseTestV2} from "./StakeHolderConfigBaseV2.t.sol"; import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Proxy.sol"; contract StakeHolderWIMXV3a is StakeHolderWIMXV2 { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBaseV2) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBaseV2) + { version = 3; } } contract StakeHolderConfigWIMXTestV2 is StakeHolderConfigBaseTestV2 { - function setUp() public override { super.setUp(); deployWIMX(); @@ -36,15 +40,15 @@ contract StakeHolderConfigWIMXTestV2 is StakeHolderConfigBaseTestV2 { assertEq(stakeHolderV2.version(), 2, "Incorrect version"); } - function _deployV1() internal override returns(IStakeHolder) { + function _deployV1() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderWIMX())); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderWIMXV2())); } - function _deployV3() internal override returns(IStakeHolder) { + function _deployV3() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderWIMXV3a())); } -} \ No newline at end of file +} diff --git a/test/staking/StakeHolderInitBase.t.sol b/test/staking/StakeHolderInitBase.t.sol index b137c82f..83dec739 100644 --- a/test/staking/StakeHolderInitBase.t.sol +++ b/test/staking/StakeHolderInitBase.t.sol @@ -5,7 +5,7 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; abstract contract StakeHolderInitBaseTest is StakeHolderBaseTest { - function testGetVersion() public virtual view { + function testGetVersion() public view virtual { uint256 ver = stakeHolder.version(); assertEq(ver, 0, "Expect initial version of storage layout to be V0"); } diff --git a/test/staking/StakeHolderInitBaseV2.t.sol b/test/staking/StakeHolderInitBaseV2.t.sol index 7ecdbced..f9d5a8f6 100644 --- a/test/staking/StakeHolderInitBaseV2.t.sol +++ b/test/staking/StakeHolderInitBaseV2.t.sol @@ -5,7 +5,7 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; abstract contract StakeHolderInitBaseTestV2 is StakeHolderInitBaseTest { - function testGetVersion() public override view { + function testGetVersion() public view override { uint256 ver = stakeHolder.version(); assertEq(ver, 2, "Incorrect version"); } diff --git a/test/staking/StakeHolderInitERC20.t.sol b/test/staking/StakeHolderInitERC20.t.sol index 0708c26a..4bf684ec 100644 --- a/test/staking/StakeHolderInitERC20.t.sol +++ b/test/staking/StakeHolderInitERC20.t.sol @@ -5,7 +5,6 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; contract StakeHolderInitERC20Test is StakeHolderInitBaseTest { - function setUp() public override { super.setUp(); deployStakeHolderERC20V1(); diff --git a/test/staking/StakeHolderInitERC20V2.t.sol b/test/staking/StakeHolderInitERC20V2.t.sol index df4c1aa2..ca935fd3 100644 --- a/test/staking/StakeHolderInitERC20V2.t.sol +++ b/test/staking/StakeHolderInitERC20V2.t.sol @@ -5,7 +5,6 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTestV2} from "./StakeHolderInitBaseV2.t.sol"; contract StakeHolderInitERC20TestV2 is StakeHolderInitBaseTestV2 { - function setUp() public override { super.setUp(); deployStakeHolderERC20V1(); diff --git a/test/staking/StakeHolderInitNative.t.sol b/test/staking/StakeHolderInitNative.t.sol index 549b6990..40102cec 100644 --- a/test/staking/StakeHolderInitNative.t.sol +++ b/test/staking/StakeHolderInitNative.t.sol @@ -5,7 +5,6 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; contract StakeHolderInitNativeTest is StakeHolderInitBaseTest { - function setUp() public override { super.setUp(); deployStakeHolderNativeV1(); diff --git a/test/staking/StakeHolderInitNativeV2.t.sol b/test/staking/StakeHolderInitNativeV2.t.sol index 4d160963..b3be8a3d 100644 --- a/test/staking/StakeHolderInitNativeV2.t.sol +++ b/test/staking/StakeHolderInitNativeV2.t.sol @@ -5,7 +5,6 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTestV2} from "./StakeHolderInitBaseV2.t.sol"; contract StakeHolderInitNativeTestV2 is StakeHolderInitBaseTestV2 { - function setUp() public override { super.setUp(); deployStakeHolderNativeV1(); diff --git a/test/staking/StakeHolderInitWIMX.t.sol b/test/staking/StakeHolderInitWIMX.t.sol index 610099c1..86dcb518 100644 --- a/test/staking/StakeHolderInitWIMX.t.sol +++ b/test/staking/StakeHolderInitWIMX.t.sol @@ -5,7 +5,6 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTest} from "./StakeHolderInitBase.t.sol"; contract StakeHolderInitWIMXTest is StakeHolderInitBaseTest { - function setUp() public override { super.setUp(); deployWIMX(); diff --git a/test/staking/StakeHolderInitWIMXV2.t.sol b/test/staking/StakeHolderInitWIMXV2.t.sol index ee2c98c9..61334101 100644 --- a/test/staking/StakeHolderInitWIMXV2.t.sol +++ b/test/staking/StakeHolderInitWIMXV2.t.sol @@ -5,7 +5,6 @@ pragma solidity >=0.8.19 <0.8.29; import {StakeHolderInitBaseTestV2} from "./StakeHolderInitBaseV2.t.sol"; contract StakeHolderInitWIMXTestV2 is StakeHolderInitBaseTestV2 { - function setUp() public override { super.setUp(); deployWIMX(); diff --git a/test/staking/StakeHolderOperationalBase.t.sol b/test/staking/StakeHolderOperationalBase.t.sol index caace7df..607e00fc 100644 --- a/test/staking/StakeHolderOperationalBase.t.sol +++ b/test/staking/StakeHolderOperationalBase.t.sol @@ -119,7 +119,7 @@ abstract contract StakeHolderOperationalBaseTest is StakeHolderBaseTest { assertEq(stakeHolder.getBalance(staker1), 0 ether, "Incorrect balance2"); _addStake(staker1, 9 ether); assertEq(stakeHolder.getBalance(staker1), 9 ether, "Incorrect balance3"); - _addStake(staker1,2 ether); + _addStake(staker1, 2 ether); assertEq(stakeHolder.getBalance(staker1), 11 ether, "Incorrect balance4"); assertEq(stakeHolder.getNumStakers(), 1, "Incorrect number of stakers"); vm.stopPrank(); @@ -163,7 +163,7 @@ abstract contract StakeHolderOperationalBaseTest is StakeHolderBaseTest { vm.expectRevert(stdError.indexOOBError); stakeHolder.getStakers(1, 3); - } + } function testDistributeRewardsOne() public { _deal(staker1, 100 ether); @@ -215,8 +215,12 @@ abstract contract StakeHolderOperationalBaseTest is StakeHolderBaseTest { // Distribute rewards of 0 to staker1. IStakeHolder.AccountAmount[] memory accountsAmounts = new IStakeHolder.AccountAmount[](1); accountsAmounts[0] = IStakeHolder.AccountAmount(staker1, 0 ether); - _distributeRewards(distributeAdmin, 0 ether, accountsAmounts, - abi.encodeWithSelector(IStakeHolder.MustDistributeMoreThanZero.selector)); + _distributeRewards( + distributeAdmin, + 0 ether, + accountsAmounts, + abi.encodeWithSelector(IStakeHolder.MustDistributeMoreThanZero.selector) + ); } function testDistributeToEmptyAccount() public { @@ -244,8 +248,12 @@ abstract contract StakeHolderOperationalBaseTest is StakeHolderBaseTest { // Distribute rewards to staker2 only. IStakeHolder.AccountAmount[] memory accountsAmounts = new IStakeHolder.AccountAmount[](1); accountsAmounts[0] = IStakeHolder.AccountAmount(staker1, 0.5 ether); - _distributeRewards(distributeAdmin, 0.5 ether, accountsAmounts, - abi.encodeWithSelector(IStakeHolder.AttemptToDistributeToNewAccount.selector, staker1, 0.5 ether)); + _distributeRewards( + distributeAdmin, + 0.5 ether, + accountsAmounts, + abi.encodeWithSelector(IStakeHolder.AttemptToDistributeToNewAccount.selector, staker1, 0.5 ether) + ); } function testDistributeBadAuth() public { @@ -257,31 +265,50 @@ abstract contract StakeHolderOperationalBaseTest is StakeHolderBaseTest { // Distribute rewards to staker1 only, but not from distributeAdmin IStakeHolder.AccountAmount[] memory accountsAmounts = new IStakeHolder.AccountAmount[](1); accountsAmounts[0] = IStakeHolder.AccountAmount(staker1, 0.5 ether); - _distributeRewards(bank, 0.5 ether, accountsAmounts, - abi.encodePacked("AccessControl: account 0x3448fc79c22032be61bee8d832ebc59744f5cc40 is missing role 0x444953545249425554455f524f4c450000000000000000000000000000000000")); + _distributeRewards( + bank, + 0.5 ether, + accountsAmounts, + abi.encodePacked( + "AccessControl: account 0x3448fc79c22032be61bee8d832ebc59744f5cc40 is missing role 0x444953545249425554455f524f4c450000000000000000000000000000000000" + ) + ); } - function _deal(address _to, uint256 _amount) internal virtual; - function _getBalanceStaker(address _staker) internal virtual view returns (uint256); - function _getBalanceStakeHolderContract() internal virtual view returns (uint256); + function _getBalanceStaker(address _staker) internal view virtual returns (uint256); + function _getBalanceStakeHolderContract() internal view virtual returns (uint256); function _addStake(address _staker, uint256 _amount) internal { _addStake(_staker, _amount, false, bytes("")); } + function _addStake(address _staker, uint256 _amount, bytes memory _error) internal { _addStake(_staker, _amount, true, _error); - } function _addStake(address _staker, uint256 _amount, bool _hasError, bytes memory _error) internal virtual; - - function _distributeRewards(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts) internal { + function _distributeRewards( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts + ) internal { _distributeRewards(_distributor, _total, _accountAmounts, false, bytes("")); } - function _distributeRewards(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, bytes memory _error) internal { + + function _distributeRewards( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bytes memory _error + ) internal { _distributeRewards(_distributor, _total, _accountAmounts, true, _error); } - function _distributeRewards(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal virtual; + function _distributeRewards( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal virtual; } diff --git a/test/staking/StakeHolderOperationalBaseV2.t.sol b/test/staking/StakeHolderOperationalBaseV2.t.sol index 11c24682..e34d1859 100644 --- a/test/staking/StakeHolderOperationalBaseV2.t.sol +++ b/test/staking/StakeHolderOperationalBaseV2.t.sol @@ -56,8 +56,12 @@ abstract contract StakeHolderOperationalBaseTestV2 is StakeHolderOperationalBase // Stake for of 0 to staker1. IStakeHolder.AccountAmount[] memory accountsAmounts = new IStakeHolder.AccountAmount[](1); accountsAmounts[0] = IStakeHolder.AccountAmount(staker1, 0 ether); - _stakeFor(distributeAdmin, 0 ether, accountsAmounts, - abi.encodeWithSelector(IStakeHolder.MustDistributeMoreThanZero.selector)); + _stakeFor( + distributeAdmin, + 0 ether, + accountsAmounts, + abi.encodeWithSelector(IStakeHolder.MustDistributeMoreThanZero.selector) + ); } function testStakeForToEmptyAccount() public { @@ -101,16 +105,35 @@ abstract contract StakeHolderOperationalBaseTestV2 is StakeHolderOperationalBase // Distribute rewards to staker1 only, but not from distributeAdmin IStakeHolder.AccountAmount[] memory accountsAmounts = new IStakeHolder.AccountAmount[](1); accountsAmounts[0] = IStakeHolder.AccountAmount(staker1, 0.5 ether); - _stakeFor(bank, 0.5 ether, accountsAmounts, - abi.encodePacked("AccessControl: account 0x3448fc79c22032be61bee8d832ebc59744f5cc40 is missing role 0x444953545249425554455f524f4c450000000000000000000000000000000000")); + _stakeFor( + bank, + 0.5 ether, + accountsAmounts, + abi.encodePacked( + "AccessControl: account 0x3448fc79c22032be61bee8d832ebc59744f5cc40 is missing role 0x444953545249425554455f524f4c450000000000000000000000000000000000" + ) + ); } - function _stakeFor(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts) internal { + function _stakeFor(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts) + internal + { _stakeFor(_distributor, _total, _accountAmounts, false, bytes("")); } - function _stakeFor(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, bytes memory _error) internal { + + function _stakeFor( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bytes memory _error + ) internal { _stakeFor(_distributor, _total, _accountAmounts, true, _error); } - function _stakeFor(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal virtual; + function _stakeFor( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal virtual; } diff --git a/test/staking/StakeHolderOperationalERC20.t.sol b/test/staking/StakeHolderOperationalERC20.t.sol index a97cde6c..4068d7a7 100644 --- a/test/staking/StakeHolderOperationalERC20.t.sol +++ b/test/staking/StakeHolderOperationalERC20.t.sol @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderOperationalBaseTest} from "./StakeHolderOperationalBase.t.sol"; @@ -13,7 +12,6 @@ contract StakeHolderOperationalERC20Test is StakeHolderOperationalBaseTest { deployStakeHolderERC20V1(); } - function testStakeWithValue() public { uint256 amount = 100 ether; vm.deal(staker1, amount); @@ -41,8 +39,14 @@ contract StakeHolderOperationalERC20Test is StakeHolderOperationalBaseTest { vm.prank(_staker); stakeHolder.stake(_amount); } - function _distributeRewards(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal override { + + function _distributeRewards( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal override { vm.prank(_distributor); erc20.approve(address(stakeHolder), _total); if (_hasError) { @@ -51,9 +55,11 @@ contract StakeHolderOperationalERC20Test is StakeHolderOperationalBaseTest { vm.prank(_distributor); stakeHolder.distributeRewards(_accountAmounts); } + function _getBalanceStaker(address _staker) internal view override returns (uint256) { return erc20.balanceOf(_staker); } + function _getBalanceStakeHolderContract() internal view override returns (uint256) { return erc20.balanceOf(address(stakeHolder)); } diff --git a/test/staking/StakeHolderOperationalERC20V2.t.sol b/test/staking/StakeHolderOperationalERC20V2.t.sol index 82a164d2..4ce54674 100644 --- a/test/staking/StakeHolderOperationalERC20V2.t.sol +++ b/test/staking/StakeHolderOperationalERC20V2.t.sol @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import {StakeHolderERC20} from "../../contracts/staking/StakeHolderERC20.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {IStakeHolderV2} from "../../contracts/staking/IStakeHolderV2.sol"; import {StakeHolderBaseTest} from "./StakeHolderBase.t.sol"; @@ -10,13 +9,18 @@ import {StakeHolderOperationalBaseTestV2} from "./StakeHolderOperationalBaseV2.t import {StakeHolderOperationalERC20Test} from "./StakeHolderOperationalERC20.t.sol"; contract StakeHolderOperationalERC20TestV2 is StakeHolderOperationalERC20Test, StakeHolderOperationalBaseTestV2 { - function setUp() public override (StakeHolderOperationalERC20Test, StakeHolderBaseTest) { + function setUp() public override(StakeHolderOperationalERC20Test, StakeHolderBaseTest) { StakeHolderOperationalERC20Test.setUp(); upgradeToStakeHolderERC20V2(); } - function _stakeFor(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal override { + function _stakeFor( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal override { vm.prank(_distributor); erc20.approve(address(stakeHolder), _total); if (_hasError) { diff --git a/test/staking/StakeHolderOperationalNative.t.sol b/test/staking/StakeHolderOperationalNative.t.sol index de8abcd6..777226e5 100644 --- a/test/staking/StakeHolderOperationalNative.t.sol +++ b/test/staking/StakeHolderOperationalNative.t.sol @@ -2,14 +2,12 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -import {StakeHolderNative} from "../../contracts/staking/StakeHolderNative.sol"; import {IStakeHolder} from "../../contracts/staking/IStakeHolder.sol"; import {StakeHolderOperationalBaseTest} from "./StakeHolderOperationalBase.t.sol"; import {StakeHolderAttackWallet} from "./StakeHolderAttackWallet.sol"; import {StakeHolderAttackWallet2} from "./StakeHolderAttackWallet2.sol"; contract StakeHolderOperationalNativeTest is StakeHolderOperationalBaseTest { - function setUp() public virtual override { super.setUp(); deployStakeHolderNativeV1(); @@ -50,21 +48,26 @@ contract StakeHolderOperationalNativeTest is StakeHolderOperationalBaseTest { IStakeHolder.AccountAmount[] memory accountsAmounts = new IStakeHolder.AccountAmount[](2); accountsAmounts[0] = IStakeHolder.AccountAmount(staker2, 0.5 ether); accountsAmounts[1] = IStakeHolder.AccountAmount(staker3, 1 ether); - _distributeRewards(distributeAdmin, 1 ether, accountsAmounts, - abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, 1 ether, 1.5 ether)); + _distributeRewards( + distributeAdmin, + 1 ether, + accountsAmounts, + abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, 1 ether, 1.5 ether) + ); } function testAddStakeMismatch() public { uint256 amount = 100 ether; _deal(staker1, amount); vm.prank(staker1); - vm.expectRevert(abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, amount, amount+1)); + vm.expectRevert(abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, amount, amount + 1)); stakeHolder.stake{value: amount}(amount + 1); } function _deal(address _to, uint256 _amount) internal override { vm.deal(_to, _amount); } + function _addStake(address _staker, uint256 _amount, bool _hasError, bytes memory _error) internal override { if (_hasError) { vm.expectRevert(_error); @@ -72,19 +75,26 @@ contract StakeHolderOperationalNativeTest is StakeHolderOperationalBaseTest { vm.prank(_staker); stakeHolder.stake{value: _amount}(_amount); } - function _distributeRewards(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal override { + + function _distributeRewards( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal override { if (_hasError) { vm.expectRevert(_error); } vm.prank(_distributor); stakeHolder.distributeRewards{value: _total}(_accountAmounts); } + function _getBalanceStaker(address _staker) internal view override returns (uint256) { return _staker.balance; } + function _getBalanceStakeHolderContract() internal view override returns (uint256) { return address(stakeHolder).balance; } - } diff --git a/test/staking/StakeHolderOperationalNativeV2.t.sol b/test/staking/StakeHolderOperationalNativeV2.t.sol index 6a0b32a1..f42933b4 100644 --- a/test/staking/StakeHolderOperationalNativeV2.t.sol +++ b/test/staking/StakeHolderOperationalNativeV2.t.sol @@ -9,13 +9,18 @@ import {StakeHolderOperationalBaseTestV2} from "./StakeHolderOperationalBaseV2.t import {StakeHolderOperationalNativeTest} from "./StakeHolderOperationalNative.t.sol"; contract StakeHolderOperationalNativeTestV2 is StakeHolderOperationalNativeTest, StakeHolderOperationalBaseTestV2 { - function setUp() public override (StakeHolderOperationalNativeTest, StakeHolderBaseTest) { + function setUp() public override(StakeHolderOperationalNativeTest, StakeHolderBaseTest) { StakeHolderOperationalNativeTest.setUp(); upgradeToStakeHolderNativeV2(); } - function _stakeFor(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal override { + function _stakeFor( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal override { if (_hasError) { vm.expectRevert(_error); } diff --git a/test/staking/StakeHolderOperationalWIMX.t.sol b/test/staking/StakeHolderOperationalWIMX.t.sol index 923bf083..2785cb98 100644 --- a/test/staking/StakeHolderOperationalWIMX.t.sol +++ b/test/staking/StakeHolderOperationalWIMX.t.sol @@ -12,8 +12,7 @@ contract StakeHolderOperationalWIMXTest is StakeHolderOperationalBaseTest { deployStakeHolderWIMXV1(); } - -//TODO + //TODO // function testUnstakeReentrantAttack() public { // StakeHolderAttackWallet attacker = new StakeHolderAttackWallet(address(stakeHolder)); @@ -40,16 +39,19 @@ contract StakeHolderOperationalWIMXTest is StakeHolderOperationalBaseTest { IStakeHolder.AccountAmount[] memory accountsAmounts = new IStakeHolder.AccountAmount[](2); accountsAmounts[0] = IStakeHolder.AccountAmount(staker2, 0.5 ether); accountsAmounts[1] = IStakeHolder.AccountAmount(staker3, 1 ether); - _distributeRewards(distributeAdmin, 1 ether, accountsAmounts, - abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, 1 ether, 1.5 ether)); + _distributeRewards( + distributeAdmin, + 1 ether, + accountsAmounts, + abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, 1 ether, 1.5 ether) + ); } - function testAddStakeMismatch() public { uint256 amount = 100 ether; _deal(staker1, amount); vm.prank(staker1); - vm.expectRevert(abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, amount, amount+1)); + vm.expectRevert(abi.encodeWithSelector(IStakeHolder.MismatchMsgValueAmount.selector, amount, amount + 1)); stakeHolder.stake{value: amount}(amount + 1); } @@ -64,17 +66,25 @@ contract StakeHolderOperationalWIMXTest is StakeHolderOperationalBaseTest { vm.prank(_staker); stakeHolder.stake{value: _amount}(_amount); } - function _distributeRewards(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal override { + + function _distributeRewards( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal override { if (_hasError) { vm.expectRevert(_error); } vm.prank(_distributor); stakeHolder.distributeRewards{value: _total}(_accountAmounts); } + function _getBalanceStaker(address _staker) internal view override returns (uint256) { return _staker.balance; } + function _getBalanceStakeHolderContract() internal view override returns (uint256) { return wimxErc20.balanceOf(address(stakeHolder)); } diff --git a/test/staking/StakeHolderOperationalWIMXV2.t.sol b/test/staking/StakeHolderOperationalWIMXV2.t.sol index 78c30c0a..64d41124 100644 --- a/test/staking/StakeHolderOperationalWIMXV2.t.sol +++ b/test/staking/StakeHolderOperationalWIMXV2.t.sol @@ -10,7 +10,7 @@ import {StakeHolderOperationalWIMXTest} from "./StakeHolderOperationalWIMX.t.sol import {Address} from "@openzeppelin/contracts/utils/Address.sol"; contract StakeHolderOperationalWIMXTestV2 is StakeHolderOperationalWIMXTest, StakeHolderOperationalBaseTestV2 { - function setUp() public override (StakeHolderOperationalWIMXTest, StakeHolderBaseTest) { + function setUp() public override(StakeHolderOperationalWIMXTest, StakeHolderBaseTest) { StakeHolderOperationalWIMXTest.setUp(); upgradeToStakeHolderWIMXV2(); } @@ -24,9 +24,13 @@ contract StakeHolderOperationalWIMXTestV2 is StakeHolderOperationalWIMXTest, Sta Address.sendValue(payable(address(stakeHolder)), amount); } - - function _stakeFor(address _distributor, uint256 _total, IStakeHolder.AccountAmount[] memory _accountAmounts, - bool _hasError, bytes memory _error) internal override { + function _stakeFor( + address _distributor, + uint256 _total, + IStakeHolder.AccountAmount[] memory _accountAmounts, + bool _hasError, + bytes memory _error + ) internal override { if (_hasError) { vm.expectRevert(_error); } diff --git a/test/staking/StakeHolderTimeDelayBase.t.sol b/test/staking/StakeHolderTimeDelayBase.t.sol index d86b7af2..8382e608 100644 --- a/test/staking/StakeHolderTimeDelayBase.t.sol +++ b/test/staking/StakeHolderTimeDelayBase.t.sol @@ -8,7 +8,6 @@ import {TimelockController} from "openzeppelin-contracts-4.9.3/governance/Timelo import {UUPSUpgradeable} from "openzeppelin-contracts-upgradeable-4.9.3/proxy/utils/UUPSUpgradeable.sol"; import {StakeHolderBase} from "../../contracts/staking/StakeHolderBase.sol"; - abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { TimelockController stakeHolderTimeDelay; @@ -31,7 +30,6 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { stakeHolderTimeDelay = new TimelockController(delay, proposers, executors, address(0)); } - function testTimeLockControllerDeployment() public view { assertEq(stakeHolderTimeDelay.getMinDelay(), delay, "Incorrect time delay"); } @@ -40,8 +38,8 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { IStakeHolder v2Impl = _deployV2(); bytes memory callData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); - bytes memory upgradeCall = abi.encodeWithSelector( - UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), callData); + bytes memory upgradeCall = + abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), callData); address target = address(stakeHolder); uint256 value = 0; @@ -53,8 +51,7 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { uint256 timeNow = block.timestamp; vm.prank(adminProposer); - stakeHolderTimeDelay.schedule( - target, value, data, predecessor, salt, theDelay); + stakeHolderTimeDelay.schedule(target, value, data, predecessor, salt, theDelay); vm.warp(timeNow + delay); @@ -71,8 +68,8 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { IStakeHolder v3Impl = _deployV3(); bytes memory callData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); - bytes memory upgradeCall = abi.encodeWithSelector( - UUPSUpgradeable.upgradeToAndCall.selector, address(v3Impl), callData); + bytes memory upgradeCall = + abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, address(v3Impl), callData); address target = address(stakeHolder); uint256 value = 0; @@ -84,8 +81,7 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { uint256 timeNow = block.timestamp; vm.prank(adminProposer); - stakeHolderTimeDelay.schedule( - target, value, data, predecessor, salt, theDelay); + stakeHolderTimeDelay.schedule(target, value, data, predecessor, salt, theDelay); vm.warp(timeNow + delay); @@ -96,13 +92,12 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { assertEq(ver, 3, "Upgrade did not upgrade version 3"); } - function testTooShortDelay() public { IStakeHolder v2Impl = _deployV2(); bytes memory initData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); - bytes memory upgradeCall = abi.encodeWithSelector( - UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), initData); + bytes memory upgradeCall = + abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), initData); address target = address(stakeHolder); uint256 value = 0; @@ -113,16 +108,15 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { vm.expectRevert(abi.encodePacked("TimelockController: insufficient delay")); vm.prank(adminProposer); - stakeHolderTimeDelay.schedule( - target, value, data, predecessor, salt, theDelay); + stakeHolderTimeDelay.schedule(target, value, data, predecessor, salt, theDelay); } function testExecuteEarly() public { IStakeHolder v2Impl = _deployV2(); bytes memory initData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); - bytes memory upgradeCall = abi.encodeWithSelector( - UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), initData); + bytes memory upgradeCall = + abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), initData); address target = address(stakeHolder); uint256 value = 0; @@ -134,8 +128,7 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { uint256 timeNow = block.timestamp; vm.prank(adminProposer); - stakeHolderTimeDelay.schedule( - target, value, data, predecessor, salt, theDelay); + stakeHolderTimeDelay.schedule(target, value, data, predecessor, salt, theDelay); vm.expectRevert(abi.encodePacked("TimelockController: operation is not ready")); vm.warp(timeNow + delay - 1); // Too early @@ -144,6 +137,6 @@ abstract contract StakeHolderTimeDelayBaseTest is StakeHolderBaseTest { stakeHolderTimeDelay.execute(target, value, data, predecessor, salt); } - function _deployV2() internal virtual returns(IStakeHolder); - function _deployV3() internal virtual returns(IStakeHolder); + function _deployV2() internal virtual returns (IStakeHolder); + function _deployV3() internal virtual returns (IStakeHolder); } diff --git a/test/staking/StakeHolderTimeDelayERC20.t.sol b/test/staking/StakeHolderTimeDelayERC20.t.sol index 4b186259..dc83c9e7 100644 --- a/test/staking/StakeHolderTimeDelayERC20.t.sol +++ b/test/staking/StakeHolderTimeDelayERC20.t.sol @@ -10,32 +10,38 @@ import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Pr import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; contract StakeHolderERC20V3a is StakeHolderERC20V2 { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBaseV2) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBaseV2) + { version = 3; } } - contract StakeHolderTimeDelayERC20Test is StakeHolderTimeDelayBaseTest { - function setUp() public override { super.setUp(); deployERC20(); StakeHolderERC20 impl = new StakeHolderERC20(); bytes memory initData = abi.encodeWithSelector( - StakeHolderERC20.initialize.selector, address(stakeHolderTimeDelay), address(stakeHolderTimeDelay), - distributeAdmin, address(erc20) + StakeHolderERC20.initialize.selector, + address(stakeHolderTimeDelay), + address(stakeHolderTimeDelay), + distributeAdmin, + address(erc20) ); ERC1967Proxy proxy = new ERC1967Proxy(address(impl), initData); stakeHolder = IStakeHolder(address(proxy)); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderERC20V2())); } - function _deployV3() internal override returns(IStakeHolder) { + function _deployV3() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderERC20V3a())); } } diff --git a/test/staking/StakeHolderTimeDelayWIMX.t.sol b/test/staking/StakeHolderTimeDelayWIMX.t.sol index ea52215f..d996c970 100644 --- a/test/staking/StakeHolderTimeDelayWIMX.t.sol +++ b/test/staking/StakeHolderTimeDelayWIMX.t.sol @@ -10,14 +10,17 @@ import {ERC1967Proxy} from "openzeppelin-contracts-4.9.3/proxy/ERC1967/ERC1967Pr import {StakeHolderBaseV2} from "../../contracts/staking/StakeHolderBaseV2.sol"; contract StakeHolderWIMXV3a is StakeHolderWIMXV2 { - function upgradeStorage(bytes memory /* _data */) external override(StakeHolderBaseV2) { + function upgradeStorage( + bytes memory /* _data */ + ) + external + override(StakeHolderBaseV2) + { version = 3; } } - contract StakeHolderTimeDelayWIMXTest is StakeHolderTimeDelayBaseTest { - function setUp() public override { super.setUp(); deployWIMX(); @@ -25,19 +28,22 @@ contract StakeHolderTimeDelayWIMXTest is StakeHolderTimeDelayBaseTest { StakeHolderWIMX impl = new StakeHolderWIMX(); bytes memory initData = abi.encodeWithSelector( - StakeHolderWIMX.initialize.selector, address(stakeHolderTimeDelay), address(stakeHolderTimeDelay), - distributeAdmin, address(wimxErc20) + StakeHolderWIMX.initialize.selector, + address(stakeHolderTimeDelay), + address(stakeHolderTimeDelay), + distributeAdmin, + address(wimxErc20) ); ERC1967Proxy proxy = new ERC1967Proxy(address(impl), initData); stakeHolder = IStakeHolder(address(proxy)); } - function _deployV2() internal override returns(IStakeHolder) { + function _deployV2() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderWIMXV2())); } - function _deployV3() internal override returns(IStakeHolder) { + function _deployV3() internal override returns (IStakeHolder) { return IStakeHolder(address(new StakeHolderWIMXV3a())); } } diff --git a/test/staking/StakeHolderUpgradeForkTest.t.sol b/test/staking/StakeHolderUpgradeForkTest.t.sol index 0534bb2a..391d1914 100644 --- a/test/staking/StakeHolderUpgradeForkTest.t.sol +++ b/test/staking/StakeHolderUpgradeForkTest.t.sol @@ -28,7 +28,7 @@ contract StakeHolderUpgradeForkTest is Test { StakeHolderWIMX stakeHolder; TimelockController stakeHolderTimeDelay; - // Put the variables below into storage so we don't need to worry about + // Put the variables below into storage so we don't need to worry about // stack depth issues. address stakingTokenAddress; uint256 numStakers; @@ -74,8 +74,8 @@ contract StakeHolderUpgradeForkTest is Test { StakeHolderWIMXV2 v2Impl = new StakeHolderWIMXV2(); bytes memory callData = abi.encodeWithSelector(StakeHolderBase.upgradeStorage.selector, bytes("")); - bytes memory upgradeCall = abi.encodeWithSelector( - UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), callData); + bytes memory upgradeCall = + abi.encodeWithSelector(UUPSUpgradeable.upgradeToAndCall.selector, address(v2Impl), callData); address target = address(stakeHolder); uint256 value = 0; @@ -87,8 +87,7 @@ contract StakeHolderUpgradeForkTest is Test { uint256 timeNow = block.timestamp; vm.prank(PROPOSER); - stakeHolderTimeDelay.schedule( - target, value, data, predecessor, salt, theDelay); + stakeHolderTimeDelay.schedule(target, value, data, predecessor, salt, theDelay); vm.warp(timeNow + delay); diff --git a/test/token/erc1155/ImmutableERC1155.t.sol b/test/token/erc1155/ImmutableERC1155.t.sol index 5d14161c..803bcbc2 100644 --- a/test/token/erc1155/ImmutableERC1155.t.sol +++ b/test/token/erc1155/ImmutableERC1155.t.sol @@ -126,7 +126,13 @@ contract ImmutableERC1155Test is Test { address newFeeReceiver = vm.addr(anotherPrivateKey); ImmutableERC1155 anotherERC1155 = new ImmutableERC1155( - owner, "new erc1155", "https://base-uri.com", "https://contract-uri.com", address(operatorAllowlist), newFeeReceiver, feeNumerator + owner, + "new erc1155", + "https://base-uri.com", + "https://contract-uri.com", + address(operatorAllowlist), + newFeeReceiver, + feeNumerator ); assertEq(anotherERC1155.contractURI(), contractURI); @@ -470,7 +476,7 @@ contract ImmutableERC1155Test is Test { immutableERC1155.setNFTRoyaltyReceiverBatch(tokenIDs, newFeeReceiver, 100); - for (uint i = 0; i < tokenIDs.length; i++) { + for (uint256 i = 0; i < tokenIDs.length; i++) { (address receiver, uint256 royaltyAmount) = immutableERC1155.royaltyInfo(tokenIDs[i], 10000); assertEq(receiver, newFeeReceiver); assertEq(100, royaltyAmount); diff --git a/test/token/erc1155/ImmutableERC1155Costs.t.sol b/test/token/erc1155/ImmutableERC1155Costs.t.sol index 6446228a..d56db1ab 100644 --- a/test/token/erc1155/ImmutableERC1155Costs.t.sol +++ b/test/token/erc1155/ImmutableERC1155Costs.t.sol @@ -6,7 +6,7 @@ import {Test} from "forge-std/Test.sol"; import {ImmutableERC1155} from "../../../contracts/token/erc1155/preset/ImmutableERC1155.sol"; import {OperatorAllowlistUpgradeable} from "../../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {Sign} from "../../utils/Sign.sol"; -import {DeployOperatorAllowlist} from "../../utils/DeployAllowlistProxy.sol"; +import {DeployOperatorAllowlist} from "../../utils/DeployAllowlistProxy.sol"; import {MockWallet} from "../../../contracts/mocks/MockWallet.sol"; import {MockWalletFactory} from "../../../contracts/mocks/MockWalletFactory.sol"; @@ -20,7 +20,6 @@ contract ImmutableERC1155Costs is Test { MockWallet public anotherScw; address[] private operatorAddrs; - uint256 deployerPrivateKey = 1; uint256 ownerPrivateKey = 2; uint256 spenderPrivateKey = 3; @@ -49,13 +48,7 @@ contract ImmutableERC1155Costs is Test { operatorAllowlist = OperatorAllowlistUpgradeable(proxyAddr); immutableERC1155 = new ImmutableERC1155( - owner, - "test", - "test-base-uri", - "test-contract-uri", - address(operatorAllowlist), - feeReceiver, - 0 + owner, "test", "test-base-uri", "test-contract-uri", address(operatorAllowlist), feeReceiver, 0 ); operatorAddrs.push(minter); @@ -114,6 +107,7 @@ contract ImmutableERC1155Costs is Test { immutableERC1155.setApprovalForAll(_address, true); vm.stopPrank(); } + /* * Mints */ @@ -134,7 +128,7 @@ contract ImmutableERC1155Costs is Test { // immutableERC1155.safeMint(feeReceiver, 1, 5, ""); // immutableERC1155.safeMint(deployer, 1, 5, ""); } - + function test_Mint10To5() public { vm.startPrank(minter); immutableERC1155.safeMint(minter, 1, 10, ""); diff --git a/test/token/erc721/ERC721Base.t.sol b/test/token/erc721/ERC721Base.t.sol index bc4db872..9bbaa6b8 100644 --- a/test/token/erc721/ERC721Base.t.sol +++ b/test/token/erc721/ERC721Base.t.sol @@ -2,13 +2,11 @@ // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {OperatorAllowlistUpgradeable} from "../../../contracts/allowlist/OperatorAllowlistUpgradeable.sol"; import {DeployOperatorAllowlist} from "../../utils/DeployAllowlistProxy.sol"; - /** * Base contract for all ERC 721 tests. */ @@ -20,7 +18,6 @@ abstract contract ERC721BaseTest is Test { string public constant NAME = "ERC721Preset"; string public constant SYMBOL = "EP"; - IImmutableERC721 public erc721; OperatorAllowlistUpgradeable public allowlist; @@ -46,8 +43,6 @@ abstract contract ERC721BaseTest is Test { // Used in gas tests address public prefillUser1; - - function setUp() public virtual { owner = makeAddr("hubOwner"); feeReceiver = makeAddr("feeReceiver"); @@ -59,11 +54,12 @@ abstract contract ERC721BaseTest is Test { name = NAME; symbol = SYMBOL; baseURI = BASE_URI; - contractURI = CONTRACT_URI; - feeNumerator = 200; // 2% + contractURI = CONTRACT_URI; + feeNumerator = 200; // 2% DeployOperatorAllowlist deployScript = new DeployOperatorAllowlist(); - address proxyAddr = deployScript.run(operatorAllowListAdmin, operatorAllowListUpgrader, operatorAllowListRegistrar); + address proxyAddr = + deployScript.run(operatorAllowListAdmin, operatorAllowListUpgrader, operatorAllowListRegistrar); allowlist = OperatorAllowlistUpgradeable(proxyAddr); (user1, user1Pkey) = makeAddrAndKey("user1"); @@ -72,13 +68,12 @@ abstract contract ERC721BaseTest is Test { prefillUser1 = makeAddr("prefillUser1"); } - - // Return the type of revert message of abi encoding if an NFT is attempted + // Return the type of revert message of abi encoding if an NFT is attempted // to be burned when it isn't owned. function notOwnedRevertError(uint256 _tokenIdToBeBurned) public pure virtual returns (bytes memory); - function calcFee(uint256 _salePrice) public view returns(uint96) { - // forge-lint: disable-next-line(unsafe-typecast) + function calcFee(uint256 _salePrice) public view returns (uint96) { + // forge-lint: disable-next-line(unsafe-typecast) return uint96(feeNumerator * _salePrice / 10000); } @@ -98,11 +93,12 @@ abstract contract ERC721BaseTest is Test { assertEq(erc721.totalSupply(), 5); } - // User1 is detected as a non-EOA as msg.sender != tx.origin. + // User1 is detected as a non-EOA as msg.sender != tx.origin. // Add it to the allowlist so that transfer can be tested. function hackAddUser1ToAllowlist() internal { addAccountToAllowlist(user1); } + function hackAddUser3ToAllowlist() internal { addAccountToAllowlist(user3); } @@ -114,13 +110,11 @@ abstract contract ERC721BaseTest is Test { allowlist.addAddressesToAllowlist(addresses); } - function getSignature( - uint256 signerPkey, - address spender, - uint256 tokenId, - uint256 nonce, - uint256 deadline - ) internal view returns (bytes memory) { + function getSignature(uint256 signerPkey, address spender, uint256 tokenId, uint256 nonce, uint256 deadline) + internal + view + returns (bytes memory) + { bytes32 structHash = keccak256( abi.encode( keccak256("Permit(address spender,uint256 tokenId,uint256 nonce,uint256 deadline)"), @@ -131,9 +125,7 @@ abstract contract ERC721BaseTest is Test { ) ); - bytes32 hash = keccak256( - abi.encodePacked("\x19\x01", erc721.DOMAIN_SEPARATOR(), structHash) - ); + bytes32 hash = keccak256(abi.encodePacked("\x19\x01", erc721.DOMAIN_SEPARATOR(), structHash)); (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPkey, hash); return abi.encodePacked(r, s, v); diff --git a/test/token/erc721/ERC721ByQuantityBase.t.sol b/test/token/erc721/ERC721ByQuantityBase.t.sol index 134ddd20..cea006c4 100644 --- a/test/token/erc721/ERC721ByQuantityBase.t.sol +++ b/test/token/erc721/ERC721ByQuantityBase.t.sol @@ -5,7 +5,6 @@ pragma solidity >=0.8.19 <0.8.29; import {ERC721BaseTest} from "./ERC721Base.t.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; - /** * Base contract for all ERC 721 by quantity tests. */ diff --git a/test/token/erc721/ERC721ConfigBase.t.sol b/test/token/erc721/ERC721ConfigBase.t.sol index d63f36a9..c5974912 100644 --- a/test/token/erc721/ERC721ConfigBase.t.sol +++ b/test/token/erc721/ERC721ConfigBase.t.sol @@ -5,13 +5,11 @@ pragma solidity >=0.8.19 <0.8.29; import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {ERC721BaseTest} from "./ERC721Base.t.sol"; - abstract contract ERC721ConfigBaseTest is ERC721BaseTest { - function testContractDeployment() public { bytes32 adminRole = erc721.DEFAULT_ADMIN_ROLE(); assertTrue(erc721.hasRole(adminRole, owner)); - + assertEq(erc721.name(), name); assertEq(erc721.symbol(), symbol); assertEq(erc721.contractURI(), contractURI); @@ -48,12 +46,16 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { vm.prank(user1); // Note the test below is fragile. 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is user1's account number. - vm.expectRevert("AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000"); + vm.expectRevert( + "AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000" + ); erc721.mint(user1, 3); vm.prank(user1); // Note the test below is fragile. 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is user1's account number. - vm.expectRevert("AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000"); + vm.expectRevert( + "AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000" + ); erc721.safeMint(user1, 3); } @@ -79,16 +81,18 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { // Test batch minting without permission vm.prank(user1); // Note the test below is fragile. 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is user1's account number. - vm.expectRevert("AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000"); + vm.expectRevert( + "AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000" + ); erc721.mintBatch(mintRequests); // Test safe batch minting without permission vm.prank(user1); // Note the test below is fragile. 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is user1's account number. - vm.expectRevert("AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000"); + vm.expectRevert( + "AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x4d494e5445525f524f4c45000000000000000000000000000000000000000000" + ); erc721.mintBatch(mintRequests); - - } function testBurnTokenYouDontOwn() public { @@ -96,7 +100,7 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { erc721.mint(user1, 1); vm.prank(minter); erc721.mint(user1, 2); - + // Test burning token you don't own vm.prank(user2); vm.expectRevert(notOwnedRevertError(2)); @@ -108,11 +112,8 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { uint256 tokenId = 15; vm.prank(minter); erc721.mint(user1, tokenId); - - assertEq( - erc721.tokenURI(tokenId), - string(abi.encodePacked(baseURI, vm.toString(tokenId))) - ); + + assertEq(erc721.tokenURI(tokenId), string(abi.encodePacked(baseURI, vm.toString(tokenId)))); } function testTokenURIRevertBurnt() public { @@ -121,7 +122,7 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { erc721.mint(user1, tokenId); vm.prank(user1); erc721.burn(tokenId); - + vm.expectRevert("ERC721: invalid token ID"); erc721.tokenURI(tokenId); } @@ -140,7 +141,9 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { function testBaseURIRevertNonAdminSet() public { vm.prank(user1); - vm.expectRevert("AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x0000000000000000000000000000000000000000000000000000000000000000"); + vm.expectRevert( + "AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x0000000000000000000000000000000000000000000000000000000000000000" + ); erc721.setBaseURI("New Base URI"); } @@ -153,7 +156,9 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { function testContractURIRevertNonAdminSet() public { vm.prank(user1); - vm.expectRevert("AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x0000000000000000000000000000000000000000000000000000000000000000"); + vm.expectRevert( + "AccessControl: account 0x29e3b139f4393adda86303fcdaa35f60bb7092bf is missing role 0x0000000000000000000000000000000000000000000000000000000000000000" + ); erc721.setContractURI("New Contract URI"); } @@ -190,13 +195,13 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { function testRoyaltyMinterCanSetTokenRoyaltyReceiver() public { mintSomeTokens(); uint256 salePrice = 1 ether; - + vm.prank(minter); erc721.setNFTRoyaltyReceiver(2, user2, feeNumerator); - + (address receiver1,) = erc721.royaltyInfo(1, salePrice); (address receiver2,) = erc721.royaltyInfo(2, salePrice); - + assertEq(receiver1, feeReceiver); assertEq(receiver2, user2); } @@ -204,33 +209,32 @@ abstract contract ERC721ConfigBaseTest is ERC721BaseTest { function testMinterCanSetBatchTokenRoyaltyReceiver() public { mintSomeTokens(); uint256 salePrice = 1 ether; - + // Check initial receivers (address receiver3,) = erc721.royaltyInfo(3, salePrice); (address receiver4,) = erc721.royaltyInfo(4, salePrice); (address receiver5,) = erc721.royaltyInfo(5, salePrice); - + assertEq(receiver3, feeReceiver); assertEq(receiver4, feeReceiver); assertEq(receiver5, feeReceiver); - + // Set batch receivers uint256[] memory tokenIds = new uint256[](3); tokenIds[0] = 3; tokenIds[1] = 4; tokenIds[2] = 5; - + vm.prank(minter); erc721.setNFTRoyaltyReceiverBatch(tokenIds, user2, feeNumerator); - + // Verify new receivers (receiver3,) = erc721.royaltyInfo(3, salePrice); (receiver4,) = erc721.royaltyInfo(4, salePrice); (receiver5,) = erc721.royaltyInfo(5, salePrice); - + assertEq(receiver3, user2); assertEq(receiver4, user2); assertEq(receiver5, user2); } - -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721ConfigByIdV1.t.sol b/test/token/erc721/ERC721ConfigByIdV1.t.sol index 58172015..e2526cca 100644 --- a/test/token/erc721/ERC721ConfigByIdV1.t.sol +++ b/test/token/erc721/ERC721ConfigByIdV1.t.sol @@ -7,7 +7,6 @@ import {ImmutableERC721MintByID} from "../../../contracts/token/erc721/preset/Im import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; contract ERC721ConfigV1ByIdTest is ERC721ConfigBaseTest { - function setUp() public virtual override { super.setUp(); @@ -15,15 +14,22 @@ contract ERC721ConfigV1ByIdTest is ERC721ConfigBaseTest { owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); - // ImmutableERC721 does not implement the interface, and hence must be cast to the + // ImmutableERC721 does not implement the interface, and hence must be cast to the // interface type. erc721 = IImmutableERC721(address(immutableERC721)); vm.prank(owner); erc721.grantMinterRole(minter); - } + } - function notOwnedRevertError(uint256 /* _tokenIdToBeBurned */) public pure override returns (bytes memory) { + function notOwnedRevertError( + uint256 /* _tokenIdToBeBurned */ + ) + public + pure + override + returns (bytes memory) + { return "ERC721: caller is not token owner or approved"; } -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721ConfigByQuantityBase.t.sol b/test/token/erc721/ERC721ConfigByQuantityBase.t.sol index 217e1f80..2a9ff741 100644 --- a/test/token/erc721/ERC721ConfigByQuantityBase.t.sol +++ b/test/token/erc721/ERC721ConfigByQuantityBase.t.sol @@ -10,7 +10,10 @@ abstract contract ERC721ConfigByQuantityBaseTest is ERC721ConfigBaseTest { IImmutableERC721ByQuantity public erc721BQ; function notOwnedRevertError(uint256 _tokenIdToBeBurned) public pure override returns (bytes memory) { - return abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, _tokenIdToBeBurned); + return + abi.encodeWithSelector( + IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, _tokenIdToBeBurned + ); } function testByQuantityContractDeployment() public { @@ -19,17 +22,13 @@ abstract contract ERC721ConfigByQuantityBaseTest is ERC721ConfigBaseTest { erc721.ownerOf(tokenId); } - // Note that Open Zeppelin ERC721 contract handles the tokenURI request function testByQuantityTokenURIWithBaseURISet() public { uint256 qty = 1; uint256 tokenId = getFirst(); vm.prank(minter); erc721BQ.mintByQuantity(user1, qty); - assertEq( - erc721.tokenURI(tokenId), - string(abi.encodePacked(baseURI, vm.toString(tokenId))) - ); + assertEq(erc721.tokenURI(tokenId), string(abi.encodePacked(baseURI, vm.toString(tokenId)))); } // Note that Open Zeppelin ERC721 contract handles the tokenURI request @@ -41,14 +40,12 @@ abstract contract ERC721ConfigByQuantityBaseTest is ERC721ConfigBaseTest { vm.prank(user1); erc721.burn(tokenId); - + vm.expectRevert("ERC721: invalid token ID"); erc721.tokenURI(tokenId); } - function getFirst() internal view virtual returns (uint256) { return erc721BQ.mintBatchByQuantityThreshold(); } - -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721ConfigByQuantityV1.t.sol b/test/token/erc721/ERC721ConfigByQuantityV1.t.sol index 79598e67..5286adff 100644 --- a/test/token/erc721/ERC721ConfigByQuantityV1.t.sol +++ b/test/token/erc721/ERC721ConfigByQuantityV1.t.sol @@ -8,7 +8,6 @@ import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interf import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; contract ERC721ConfigByQuantityV1Test is ERC721ConfigByQuantityBaseTest { - function setUp() public virtual override { super.setUp(); @@ -16,13 +15,12 @@ contract ERC721ConfigByQuantityV1Test is ERC721ConfigByQuantityBaseTest { owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); - // ImmutableERC721 does not implement the interface, and hence must be cast to the + // ImmutableERC721 does not implement the interface, and hence must be cast to the // interface type. erc721 = IImmutableERC721(address(immutableERC721)); erc721BQ = IImmutableERC721ByQuantity(address(immutableERC721)); vm.prank(owner); erc721.grantMinterRole(minter); - } - -} \ No newline at end of file + } +} diff --git a/test/token/erc721/ERC721ConfigByQuantityV2.t.sol b/test/token/erc721/ERC721ConfigByQuantityV2.t.sol index c2d23b9b..de955f68 100644 --- a/test/token/erc721/ERC721ConfigByQuantityV2.t.sol +++ b/test/token/erc721/ERC721ConfigByQuantityV2.t.sol @@ -8,7 +8,6 @@ import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interf import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; contract ERC721ConfigByQuantityV2Test is ERC721ConfigByQuantityBaseTest { - function setUp() public virtual override { super.setUp(); @@ -16,17 +15,17 @@ contract ERC721ConfigByQuantityV2Test is ERC721ConfigByQuantityBaseTest { owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); - // ImmutableERC721 does not implement the interface, and hence must be cast to the + // ImmutableERC721 does not implement the interface, and hence must be cast to the // interface type. erc721 = IImmutableERC721(address(immutableERC721)); erc721BQ = IImmutableERC721ByQuantity(address(immutableERC721)); vm.prank(owner); erc721.grantMinterRole(minter); - } + } - function getFirst() internal override view returns (uint256) { + function getFirst() internal view override returns (uint256) { uint256 nominalFirst = erc721BQ.mintBatchByQuantityThreshold(); return ((nominalFirst / 256) + 1) * 256; } -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721OperationalBase.t.sol b/test/token/erc721/ERC721OperationalBase.t.sol index 6f075e2c..2be1661c 100644 --- a/test/token/erc721/ERC721OperationalBase.t.sol +++ b/test/token/erc721/ERC721OperationalBase.t.sol @@ -3,12 +3,14 @@ pragma solidity >=0.8.19 <0.8.29; import {ERC721BaseTest} from "./ERC721Base.t.sol"; -import {IImmutableERC721, IImmutableERC721Structs, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import { + IImmutableERC721, + IImmutableERC721Structs, + IImmutableERC721Errors +} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {MockEIP1271Wallet} from "../../../contracts/mocks/MockEIP1271Wallet.sol"; abstract contract ERC721OperationalBaseTest is ERC721BaseTest { - - function testMint() public { vm.prank(minter); erc721.mint(user1, 1); @@ -34,7 +36,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { uint256[] memory tokenIds2 = new uint256[](2); tokenIds2[0] = 6; tokenIds2[1] = 7; - + mintRequests[0].to = user1; mintRequests[0].tokenIds = tokenIds1; mintRequests[1].to = user2; @@ -42,7 +44,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { vm.prank(minter); erc721.mintBatch(mintRequests); - + assertEq(erc721.balanceOf(user1), 3); assertEq(erc721.balanceOf(user2), 2); assertEq(erc721.totalSupply(), 5); @@ -62,7 +64,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { uint256[] memory tokenIds2 = new uint256[](2); tokenIds2[0] = 6; tokenIds2[1] = 7; - + mintRequests[0].to = user1; mintRequests[0].tokenIds = tokenIds1; mintRequests[1].to = user2; @@ -70,7 +72,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { vm.prank(minter); erc721.safeMintBatch(mintRequests); - + assertEq(erc721.balanceOf(user1), 3); assertEq(erc721.balanceOf(user2), 2); assertEq(erc721.totalSupply(), 5); @@ -102,7 +104,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { tokenIds1[0] = 3; tokenIds1[1] = 1; tokenIds1[2] = 5; - + mintRequests[0].to = user1; mintRequests[0].tokenIds = tokenIds1; @@ -118,7 +120,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { tokenIds1[0] = 3; tokenIds1[1] = 1; tokenIds1[2] = 5; - + mintRequests[0].to = user1; mintRequests[0].tokenIds = tokenIds1; @@ -133,7 +135,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { tokenIds1[0] = 3; tokenIds1[1] = 1; tokenIds1[2] = 3; - + mintRequests[0].to = user1; mintRequests[0].tokenIds = tokenIds1; @@ -148,7 +150,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { tokenIds1[0] = 3; tokenIds1[1] = 1; tokenIds1[2] = 3; - + mintRequests[0].to = user1; mintRequests[0].tokenIds = tokenIds1; @@ -179,7 +181,9 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { mintSomeTokens(); vm.prank(user2); - vm.expectRevert(abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721MismatchedTokenOwner.selector, 2, user1)); + vm.expectRevert( + abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721MismatchedTokenOwner.selector, 2, user1) + ); erc721.safeBurn(user2, 2); } @@ -187,7 +191,9 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { mintSomeTokens(); vm.prank(user1); - vm.expectRevert(abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721MismatchedTokenOwner.selector, 2, user1)); + vm.expectRevert( + abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721MismatchedTokenOwner.selector, 2, user1) + ); erc721.safeBurn(user2, 2); } @@ -286,9 +292,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { // Try to mint the burned token vm.prank(minter); - vm.expectRevert( - abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721TokenAlreadyBurned.selector, 1) - ); + vm.expectRevert(abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721TokenAlreadyBurned.selector, 1)); erc721.mint(user3, 1); } @@ -319,17 +323,14 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { address[] memory tos = new address[](2); tos[0] = user2; tos[1] = user3; - + uint256[] memory tokenIds = new uint256[](2); tokenIds[0] = 1; tokenIds[1] = 2; - - IImmutableERC721Structs.TransferRequest memory transferRequest = IImmutableERC721Structs.TransferRequest({ - from: user1, - tos: tos, - tokenIds: tokenIds - }); - + + IImmutableERC721Structs.TransferRequest memory transferRequest = + IImmutableERC721Structs.TransferRequest({from: user1, tos: tos, tokenIds: tokenIds}); + vm.prank(user1); erc721.safeTransferFromBatch(transferRequest); } @@ -339,16 +340,14 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { address[] memory tos = new address[](5); uint256[] memory tokenIds = new uint256[](4); - - IImmutableERC721Structs.TransferRequest memory transferRequest = IImmutableERC721Structs.TransferRequest({ - from: user1, - tos: tos, - tokenIds: tokenIds - }); - + + IImmutableERC721Structs.TransferRequest memory transferRequest = + IImmutableERC721Structs.TransferRequest({from: user1, tos: tos, tokenIds: tokenIds}); + vm.prank(user1); vm.expectRevert( - abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721MismatchedTransferLengths.selector)); + abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721MismatchedTransferLengths.selector) + ); erc721.safeTransferFromBatch(transferRequest); } @@ -382,8 +381,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { assertEq(address(0), erc721.getApproved(tokenId)); vm.prank(user2); - vm.expectRevert( - abi.encodeWithSelector(IImmutableERC721Errors.PermitExpired.selector)); + vm.expectRevert(abi.encodeWithSelector(IImmutableERC721Errors.PermitExpired.selector)); erc721.permit(user2, tokenId, deadline, signature); assertEq(address(0), erc721.getApproved(tokenId)); } @@ -397,8 +395,7 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { bytes memory signature = getSignature(user1Pkey, user2, tokenId, nonce, deadline); vm.prank(user2); - vm.expectRevert( - abi.encodeWithSelector(IImmutableERC721Errors.InvalidSignature.selector)); + vm.expectRevert(abi.encodeWithSelector(IImmutableERC721Errors.InvalidSignature.selector)); erc721.permit(user2, tokenId, deadline, signature); } @@ -450,21 +447,18 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { // Expect to fail as user1 is no longer the owner. vm.prank(user2); - vm.expectRevert( - abi.encodeWithSelector(IImmutableERC721Errors.InvalidSignature.selector)); + vm.expectRevert(abi.encodeWithSelector(IImmutableERC721Errors.InvalidSignature.selector)); erc721.permit(user2, tokenId, deadline, signature); vm.prank(user3); erc721.safeTransferFrom(user3, user1, tokenId); - // Expect to fail as ownership has changed. + // Expect to fail as ownership has changed. vm.prank(user2); - vm.expectRevert( - abi.encodeWithSelector(IImmutableERC721Errors.InvalidSignature.selector)); + vm.expectRevert(abi.encodeWithSelector(IImmutableERC721Errors.InvalidSignature.selector)); erc721.permit(user2, tokenId, deadline, signature); } - function testPermitContractWallet() public { MockEIP1271Wallet eip1271Wallet = new MockEIP1271Wallet(user1); @@ -484,4 +478,4 @@ abstract contract ERC721OperationalBaseTest is ERC721BaseTest { erc721.permit(user2, tokenId, deadline, signature); assertEq(erc721.getApproved(tokenId), user2); } -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721OperationalByIdV1.t.sol b/test/token/erc721/ERC721OperationalByIdV1.t.sol index da9ad7b5..300a30f9 100644 --- a/test/token/erc721/ERC721OperationalByIdV1.t.sol +++ b/test/token/erc721/ERC721OperationalByIdV1.t.sol @@ -4,12 +4,10 @@ pragma solidity >=0.8.19 <0.8.29; import {ERC721OperationalBaseTest} from "./ERC721OperationalBase.t.sol"; import {ImmutableERC721MintByID} from "../../../contracts/token/erc721/preset/ImmutableERC721MintByID.sol"; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; - +import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; // Test the original ImmutableERC721 contract: Operational tests contract ERC721OperationalV1ByIdTest is ERC721OperationalBaseTest { - function setUp() public virtual override { super.setUp(); @@ -17,15 +15,22 @@ contract ERC721OperationalV1ByIdTest is ERC721OperationalBaseTest { owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); - // ImmutableERC721 does not implement the interface, and hence must be cast to the + // ImmutableERC721 does not implement the interface, and hence must be cast to the // interface type. erc721 = IImmutableERC721(address(immutableERC721)); vm.prank(owner); erc721.grantMinterRole(minter); - } + } - function notOwnedRevertError(uint256 /* _tokenIdToBeBurned */) public pure override returns (bytes memory) { + function notOwnedRevertError( + uint256 /* _tokenIdToBeBurned */ + ) + public + pure + override + returns (bytes memory) + { return "ERC721: caller is not token owner or approved"; } -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721OperationalByQuantityBase.t.sol b/test/token/erc721/ERC721OperationalByQuantityBase.t.sol index 8362a574..619f5644 100644 --- a/test/token/erc721/ERC721OperationalByQuantityBase.t.sol +++ b/test/token/erc721/ERC721OperationalByQuantityBase.t.sol @@ -4,17 +4,19 @@ pragma solidity >=0.8.19 <0.8.29; import {ERC721OperationalBaseTest} from "./ERC721OperationalBase.t.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; +import { + IImmutableERC721, + IImmutableERC721Errors +} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {MockEIP1271Wallet} from "../../../contracts/mocks/MockEIP1271Wallet.sol"; - // Test the original ImmutableERC721 contract: Operational tests abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTest { IImmutableERC721ByQuantity public erc721BQ; function testThreshold() public view { uint256 first = erc721BQ.mintBatchByQuantityThreshold(); - assertTrue(first >= 2**128); + assertTrue(first >= 2 ** 128); } function testMintByQuantity() public { @@ -29,10 +31,10 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe vm.prank(minter); vm.expectEmit(true, true, false, false); emit Transfer(address(0), user1, first); - emit Transfer(address(0), user1, first+1); - emit Transfer(address(0), user1, first+2); - emit Transfer(address(0), user1, first+3); - emit Transfer(address(0), user1, first+4); + emit Transfer(address(0), user1, first + 1); + emit Transfer(address(0), user1, first + 2); + emit Transfer(address(0), user1, first + 3); + emit Transfer(address(0), user1, first + 4); erc721BQ.mintByQuantity(user1, qty); assertEq(erc721.balanceOf(user1), originalBalance + qty); @@ -116,7 +118,7 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe erc721BQ.mintByQuantity(user1, qty); vm.prank(user1); - erc721BQ.burn(first+1); + erc721BQ.burn(first + 1); assertEq(erc721.balanceOf(user1), qty - 1); assertEq(erc721.totalSupply(), qty - 1); } @@ -128,21 +130,21 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe erc721BQ.mintByQuantity(user1, qty); vm.prank(user1); - erc721BQ.burn(first+1); + erc721BQ.burn(first + 1); assertEq(erc721.balanceOf(user1), qty - 1); assertEq(erc721.totalSupply(), qty - 1); // Burn a token that has already been burnt vm.prank(user1); vm.expectRevert("ERC721Psi: operator query for nonexistent token"); - erc721BQ.burn(first+1); + erc721BQ.burn(first + 1); } function testMintByQuantityBurnNonExistentToken() public { uint256 first = getFirst(); vm.prank(user1); vm.expectRevert("ERC721Psi: operator query for nonexistent token"); - erc721BQ.burn(first+1); + erc721BQ.burn(first + 1); } function testMintByQuantityBurnBatch() public { @@ -183,8 +185,9 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe batch[0] = first + 1; vm.prank(user2); - vm.expectRevert(abi.encodeWithSelector( - IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, first+1)); + vm.expectRevert( + abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, first + 1) + ); erc721.burnBatch(batch); assertEq(erc721.balanceOf(user1), qty + user1Bal, "Final balance"); assertEq(erc721.totalSupply(), originalSupply + qty, "Final supply"); @@ -193,8 +196,9 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe function testSingleMintAboveMintByQuantityThreshold() public { uint256 tokenId = getFirst(); vm.prank(minter); - vm.expectRevert(abi.encodeWithSelector( - IImmutableERC721Errors.IImmutableERC721IDAboveThreshold.selector, tokenId)); + vm.expectRevert( + abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721IDAboveThreshold.selector, tokenId) + ); erc721BQ.mint(user1, tokenId); } @@ -224,7 +228,6 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe assertEq(erc721.ownerOf(tokenId), user3); } - function testExistsForQuantityMinted() public { testMintByQuantity(); assertTrue(erc721BQ.exists(getFirst())); @@ -238,7 +241,7 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe function testExistsForInvalidTokenByQ() public { testMintByQuantity(); - assertFalse(erc721BQ.exists(getFirst()+10)); + assertFalse(erc721BQ.exists(getFirst() + 10)); } function testExistsForInvalidTokenByID() public { @@ -262,7 +265,6 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe assertEq(erc721.getApproved(tokenId), user2); } - function testByQuantitySafeTransferFrom() public { hackAddUser1ToAllowlist(); uint256 qty = 1; @@ -315,5 +317,4 @@ abstract contract ERC721OperationalByQuantityBaseTest is ERC721OperationalBaseTe function getFirst() internal view virtual returns (uint256) { return erc721BQ.mintBatchByQuantityThreshold(); } - -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721OperationalByQuantityV1.t.sol b/test/token/erc721/ERC721OperationalByQuantityV1.t.sol index d79cc45f..38697cc1 100644 --- a/test/token/erc721/ERC721OperationalByQuantityV1.t.sol +++ b/test/token/erc721/ERC721OperationalByQuantityV1.t.sol @@ -8,10 +8,8 @@ import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interf import {IImmutableERC721} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; import {IImmutableERC721Errors} from "../../../contracts/errors/Errors.sol"; - // Test the original ImmutableERC721 contract: Operational tests contract ERC721OperationalByQuantityV1Test is ERC721OperationalByQuantityBaseTest { - function setUp() public virtual override { super.setUp(); @@ -19,16 +17,19 @@ contract ERC721OperationalByQuantityV1Test is ERC721OperationalByQuantityBaseTes owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); - // ImmutableERC721 does not implement the interface, and hence must be cast to the + // ImmutableERC721 does not implement the interface, and hence must be cast to the // interface type. erc721BQ = IImmutableERC721ByQuantity(address(immutableERC721)); erc721 = IImmutableERC721(address(immutableERC721)); vm.prank(owner); erc721.grantMinterRole(minter); - } + } function notOwnedRevertError(uint256 _tokenIdToBeBurned) public pure override returns (bytes memory) { - return abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, _tokenIdToBeBurned); + return + abi.encodeWithSelector( + IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, _tokenIdToBeBurned + ); } -} \ No newline at end of file +} diff --git a/test/token/erc721/ERC721OperationalByQuantityV2.t.sol b/test/token/erc721/ERC721OperationalByQuantityV2.t.sol index 6dee1334..3aff015a 100644 --- a/test/token/erc721/ERC721OperationalByQuantityV2.t.sol +++ b/test/token/erc721/ERC721OperationalByQuantityV2.t.sol @@ -5,8 +5,10 @@ pragma solidity >=0.8.19 <0.8.29; import {ERC721OperationalByQuantityBaseTest} from "./ERC721OperationalByQuantityBase.t.sol"; import {ImmutableERC721V2} from "../../../contracts/token/erc721/preset/ImmutableERC721V2.sol"; import {IImmutableERC721ByQuantity} from "../../../contracts/token/erc721/interfaces/IImmutableERC721ByQuantity.sol"; -import {IImmutableERC721, IImmutableERC721Errors} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; - +import { + IImmutableERC721, + IImmutableERC721Errors +} from "../../../contracts/token/erc721/interfaces/IImmutableERC721.sol"; // Test the original ImmutableERC721 contract: Operational tests contract ERC721OperationalByQuantityV2Test is ERC721OperationalByQuantityBaseTest { @@ -19,15 +21,14 @@ contract ERC721OperationalByQuantityV2Test is ERC721OperationalByQuantityBaseTes owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); - // ImmutableERC721 does not implement the interface, and hence must be cast to the + // ImmutableERC721 does not implement the interface, and hence must be cast to the // interface type. erc721BQ = IImmutableERC721ByQuantity(address(erc721BQv2)); erc721 = IImmutableERC721(address(erc721BQv2)); vm.prank(owner); erc721.grantMinterRole(minter); - } - + } function testMintBatchByQuantityNextTokenId() public { uint256 nextId = erc721BQv2.mintBatchByQuantityNextTokenId(); @@ -52,12 +53,14 @@ contract ERC721OperationalByQuantityV2Test is ERC721OperationalByQuantityBaseTes } function notOwnedRevertError(uint256 _tokenIdToBeBurned) public pure override returns (bytes memory) { - return abi.encodeWithSelector(IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, _tokenIdToBeBurned); + return + abi.encodeWithSelector( + IImmutableERC721Errors.IImmutableERC721NotOwnerOrOperator.selector, _tokenIdToBeBurned + ); } - function getFirst() internal override view returns (uint256) { + function getFirst() internal view override returns (uint256) { uint256 nominalFirst = erc721BQ.mintBatchByQuantityThreshold(); return ((nominalFirst / 256) + 1) * 256; } - -} \ No newline at end of file +} diff --git a/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol b/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol index b27d2f3c..7153f5b1 100644 --- a/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol +++ b/test/token/erc721/fuzz/ERC721PsiV2.Echidna.sol @@ -8,18 +8,13 @@ import {IERC721Receiver} from "openzeppelin-contracts-4.9.3/token/ERC721/IERC721 contract TestReceiver is IERC721Receiver { bool public received; bool public shouldReject; - + // Add setter function function setReject(bool _shouldReject) external { shouldReject = _shouldReject; } - - function onERC721Received( - address, - address, - uint256, - bytes calldata - ) external override returns (bytes4) { + + function onERC721Received(address, address, uint256, bytes calldata) external override returns (bytes4) { if (shouldReject) revert("TestReceiver: rejected"); received = true; return this.onERC721Received.selector; @@ -30,17 +25,12 @@ contract TestReceiver is IERC721Receiver { contract MaliciousReceiver is IERC721Receiver { ERC721PsiV2Echidna private token; bool public attemptedReentrancy; - + constructor(address _token) { token = ERC721PsiV2Echidna(_token); } - - function onERC721Received( - address, - address, - uint256 tokenId, - bytes calldata - ) external override returns (bytes4) { + + function onERC721Received(address, address, uint256 tokenId, bytes calldata) external override returns (bytes4) { if (!attemptedReentrancy) { attemptedReentrancy = true; // Attempt reentrancy @@ -54,24 +44,24 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { // --- Constants --- uint256 public constant GROUP_SIZE = 256; uint256 private constant MAX_BATCH_SIZE = 50; - uint256 private constant BOUNDARY_2_128 = 2**128; - + uint256 private constant BOUNDARY_2_128 = 2 ** 128; + // --- State Variables --- address echidna_caller = msg.sender; uint256 public totalMinted; uint256 private currentTokenId; - + // --- Tracking Maps --- mapping(uint256 => bool) public minted; mapping(uint256 => bool) public burned; mapping(uint256 => address) public tokenOwnersMap; mapping(uint256 => uint256) public groupOccupancy; mapping(address => mapping(address => bool)) private _operatorApprovals; - + // --- Test Contracts --- TestReceiver public testReceiver; MaliciousReceiver public maliciousReceiver; - + constructor() ERC721PsiBurnableV2() { _mint(address(this), 10); testReceiver = new TestReceiver(); @@ -81,7 +71,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { // --- Helper Functions --- function mintForTest(address to, uint256 quantity) external { _mint(to, quantity); - for(uint256 i = 0; i < quantity; i++) { + for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = totalMinted + i; minted[tokenId] = true; tokenOwnersMap[tokenId] = to; @@ -111,17 +101,17 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_balance_consistency() public view returns (bool) { uint256 totalBalance = 0; - for(uint160 i = 0; i < 10; i++) { + for (uint160 i = 0; i < 10; i++) { address owner = address(i + 1); uint256 expectedBalance = 0; - - for(uint256 j = 0; j < totalMinted; j++) { - if(tokenOwnersMap[j] == owner && !burned[j]) { + + for (uint256 j = 0; j < totalMinted; j++) { + if (tokenOwnersMap[j] == owner && !burned[j]) { expectedBalance++; } } - - if(balanceOf(owner) != expectedBalance) return false; + + if (balanceOf(owner) != expectedBalance) return false; totalBalance += expectedBalance; } return totalBalance == totalSupply(); @@ -129,7 +119,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_balance_sum_property() public view returns (bool) { uint256 totalBalance = 0; - for(uint160 i = 1; i <= 10; i++) { + for (uint160 i = 1; i <= 10; i++) { totalBalance += balanceOf(address(i)); } return totalBalance == totalSupply(); @@ -163,7 +153,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_nonexistent_ownership1() public view returns (bool) { uint256 nonexistentTokenId = totalMinted + 1; - + try this.ownerOf(nonexistentTokenId) { return false; // Should revert } catch { @@ -190,14 +180,14 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_group_operations_sequence() public returns (bool) { uint256 numGroups = 3; uint256 totalTokens = GROUP_SIZE * numGroups; - + try this.mintForTest(msg.sender, totalTokens) { - for(uint256 i = 0; i < numGroups; i++) { + for (uint256 i = 0; i < numGroups; i++) { uint256 startTokenId = i * GROUP_SIZE; (uint256 startIndex,,, address owner) = _tokenInfo(startTokenId); - - if(startIndex != startTokenId || owner != msg.sender) return false; - if(groupOccupancy[i] > GROUP_SIZE) return false; + + if (startIndex != startTokenId || owner != msg.sender) return false; + if (groupOccupancy[i] > GROUP_SIZE) return false; } return true; } catch { @@ -210,7 +200,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { uint256 groupIndex = i / GROUP_SIZE; groupOccupancy[groupIndex] = 0; } - + for (uint256 i = 0; i < totalMinted; i++) { if (minted[i] && !burned[i]) { uint256 groupIndex = i / GROUP_SIZE; @@ -223,7 +213,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_group_boundary_sequence() public returns (bool) { uint256 initialSupply = totalSupply(); - + // Try to mint exactly one group uint256 groupSize = GROUP_SIZE; try this.mint(msg.sender, groupSize) { @@ -234,7 +224,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { return totalSupply() == initialSupply + groupSize; } } catch { - return true; + return true; } } @@ -242,7 +232,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { uint256 groupSize = GROUP_SIZE; // forge-lint: disable-next-line(divide-before-multiply) uint256 tokenId = (currentTokenId / groupSize) * groupSize; // Align to group boundary - + try this.mint(address(this), groupSize + 1) { // Verify ownership across group boundary address owner1 = ownerOf(tokenId); @@ -259,14 +249,14 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { testAmounts[0] = BOUNDARY_2_128 - 1; testAmounts[1] = BOUNDARY_2_128; testAmounts[2] = BOUNDARY_2_128 + 1; - - for(uint256 i = 0; i < testAmounts.length; i++) { + + for (uint256 i = 0; i < testAmounts.length; i++) { try this.mint(msg.sender, testAmounts[i]) { - if(i >= 2) return false; + if (i >= 2) return false; uint256 lastTokenId = totalMinted - 1; - if(lastTokenId >= BOUNDARY_2_128) return false; + if (lastTokenId >= BOUNDARY_2_128) return false; } catch { - if(i < 2) return false; + if (i < 2) return false; } } return true; @@ -276,7 +266,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { // Test exactly at boundary try this.mint(msg.sender, 1) { uint256 mintedId = totalMinted - 1; - return mintedId < 2**128; + return mintedId < 2 ** 128; } catch { return true; } @@ -284,10 +274,10 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_mint_quantity_range() public returns (bool) { uint256 startTokenId = totalMinted; - + // Try minting across the 2^128 boundary - if (startTokenId < 2**128) { - uint256 quantity = (2**128 - startTokenId) + 1; + if (startTokenId < 2 ** 128) { + uint256 quantity = (2 ** 128 - startTokenId) + 1; try this.mint(msg.sender, quantity) { return false; // Should not succeed } catch { @@ -300,7 +290,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_max_token_id_overflow() public returns (bool) { uint256 currentSupply = totalSupply(); uint256 maxMint = type(uint256).max - currentSupply; - + try this.mint(msg.sender, maxMint + 1) { return false; } catch { @@ -309,9 +299,9 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { } function echidna_mint_threshold_respected() public view returns (bool) { - for (uint256 i = 0; i < 2**128; i++) { + for (uint256 i = 0; i < 2 ** 128; i++) { if (minted[i]) { - if (i >= 2**128) return false; + if (i >= 2 ** 128) return false; } } return true; @@ -319,31 +309,26 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { // === TRANSFER & APPROVAL LOGIC === function echidna_complex_transfer_sequence() public returns (bool) { - if(totalMinted == 0) return true; - - address[4] memory accounts = [ - msg.sender, - address(uint160(0x1234)), - address(uint160(0x5678)), - address(uint160(0x9ABC)) - ]; - + if (totalMinted == 0) return true; + + address[4] memory accounts = + [msg.sender, address(uint160(0x1234)), address(uint160(0x5678)), address(uint160(0x9ABC))]; + uint256 tokenId = currentTokenId % totalMinted; - + // Complex transfer pattern: A -> B -> C -> D -> A try this.transferFrom(accounts[0], accounts[1], tokenId) { // Rest of transfers _approveForTest(accounts[2], tokenId); this.transferFrom(accounts[1], accounts[2], tokenId); - + _approveForTest(accounts[3], tokenId); this.transferFrom(accounts[2], accounts[3], tokenId); - + _approveForTest(accounts[0], tokenId); this.transferFrom(accounts[3], accounts[0], tokenId); - - return ownerOf(tokenId) == accounts[0] && - getApproved(tokenId) == address(0); + + return ownerOf(tokenId) == accounts[0] && getApproved(tokenId) == address(0); } catch { return true; } @@ -355,7 +340,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { address originalOwner = tokenOwnersMap[tokenId]; // forge-lint: disable-next-line(unsafe-typecast) address newOwner = address(uint160(currentTokenId % 100)); - + try this.transferFrom(originalOwner, newOwner, tokenId) { return ownerOf(tokenId) == newOwner; } catch { @@ -382,7 +367,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { if (totalMinted == 0) return true; uint256 tokenId = currentTokenId % totalMinted; address approved = address(0x123); - + try this.approve(approved, tokenId) { address originalApproved = getApproved(tokenId); try this.transferFrom(msg.sender, address(0x456), tokenId) { @@ -399,7 +384,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_reentrancy_protection() public returns (bool) { if (totalMinted == 0) return true; uint256 tokenId = currentTokenId % totalMinted; - + try this.safeTransferFrom(msg.sender, address(maliciousReceiver), tokenId) { // If transfer succeeded, verify no state inconsistencies return balanceOf(msg.sender) + balanceOf(address(maliciousReceiver)) == 1; @@ -411,7 +396,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_concurrent_operations() public returns (bool) { if (totalMinted == 0) return true; uint256 tokenId = currentTokenId % totalMinted; - + // Simulate concurrent operations try this.transferFrom(msg.sender, address(0x1), tokenId) { try this.approve(address(0x2), tokenId) { @@ -433,7 +418,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { try this.mint(address(0), 1) { return false; } catch {} - + // Test transfers if (totalMinted > 0) { uint256 tokenId = currentTokenId % totalMinted; @@ -447,10 +432,10 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_safe_transfer_callback() public returns (bool) { if (totalMinted == 0) return true; uint256 tokenId = currentTokenId % totalMinted; - + // Reset receiver state using the setter testReceiver.setReject(false); - + try this.safeTransferFrom(msg.sender, address(testReceiver), tokenId) { return testReceiver.received(); } catch { @@ -486,20 +471,20 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_total_supply_sequence() public returns (bool) { // Store initial supply uint256 initialSupply = totalSupply(); - + // GROUP_SIZE is 256 // Let's test with amounts that might cross group boundaries // currentTokenId % 256 will give us values 0-255 - uint256 amount = (currentTokenId % GROUP_SIZE) + 1; - + uint256 amount = (currentTokenId % GROUP_SIZE) + 1; + this.mint(msg.sender, amount); - + // For burning, we want to ensure we're testing both: // 1. Burning from the same group // 2. Burning from different groups uint256 burnTokenId = currentTokenId % totalMinted; this.burn(burnTokenId); - + // Verify supply changes return totalSupply() == initialSupply + amount - 1; } @@ -518,11 +503,11 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { // === BASIC OPERATIONS === function echidna_mint_by_id() public returns (bool) { - uint256 tokenId = currentTokenId % 2**128; + uint256 tokenId = currentTokenId % 2 ** 128; currentTokenId++; - + if (minted[tokenId] || burned[tokenId]) return true; - + try this.mint(msg.sender, 1) { minted[tokenId] = true; tokenOwnersMap[tokenId] = msg.sender; @@ -536,10 +521,10 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_mint_by_quantity() public returns (bool) { uint256 quantity = (currentTokenId % 100) + 1; currentTokenId++; - uint256 startTokenId = 2**128 + totalMinted; - + uint256 startTokenId = 2 ** 128 + totalMinted; + try this.mint(msg.sender, quantity) { - for(uint256 i = 0; i < quantity; i++) { + for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = startTokenId + i; minted[tokenId] = true; tokenOwnersMap[tokenId] = msg.sender; @@ -554,9 +539,9 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_burn() public returns (bool) { uint256 tokenId = currentTokenId % totalMinted; currentTokenId++; - + if (!minted[tokenId] || burned[tokenId]) return true; - + try this.burn(tokenId) { burned[tokenId] = true; delete tokenOwnersMap[tokenId]; @@ -568,7 +553,7 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function echidna_burn_unminted() public returns (bool) { uint256 unmintedTokenId = totalMinted + 1; - + try this.burn(unmintedTokenId) { return false; // Should not succeed } catch { @@ -612,4 +597,4 @@ contract ERC721PsiV2Echidna is ERC721PsiBurnableV2 { function burn(uint256 tokenId) external { _burn(tokenId); } -} \ No newline at end of file +} diff --git a/test/token/x/Asset.t.sol b/test/token/x/Asset.t.sol deleted file mode 100644 index f7d64e36..00000000 --- a/test/token/x/Asset.t.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.13; - -import {Test} from "forge-std/Test.sol"; -import {Asset} from "../../../contracts/token/erc721/x/Asset.sol"; - -contract AssetTest is Test { - Asset public asset; - address public owner; - address public imx; - - function setUp() public { - owner = makeAddr("owner"); - imx = makeAddr("imx"); - vm.startPrank(owner); - asset = new Asset(owner, "Gods Unchained", "GU", imx); - vm.stopPrank(); - } - - function testMintWithValidBlueprint() public { - uint256 tokenID = 123; - string memory tokenIDStr = "123"; - string memory blueprint = "1000"; - bytes memory blob = abi.encodePacked("{", tokenIDStr, "}:{", blueprint, "}"); - - vm.startPrank(imx); - asset.mintFor(owner, 1, blob); - vm.stopPrank(); - - assertEq(asset.ownerOf(tokenID), owner, "Incorrect owner"); - assertEq(asset.blueprints(tokenID).length, bytes(blueprint).length, "Incorrect blueprint length"); - for (uint256 i = 0; i < bytes(blueprint).length; i++) { - assertEq(asset.blueprints(tokenID)[i], bytes(blueprint)[i], "Incorrect blueprint"); - } - } - - function testMintWithEmptyBlueprint() public { - uint256 tokenID = 123; - string memory tokenIDStr = "123"; - string memory blueprint = ""; - bytes memory blob = abi.encodePacked("{", tokenIDStr, "}:{", blueprint, "}"); - - vm.startPrank(imx); - asset.mintFor(owner, 1, blob); - vm.stopPrank(); - - assertEq(asset.ownerOf(tokenID), owner, "Incorrect owner"); - assertEq(asset.blueprints(tokenID).length, 0, "Incorrect blueprint length"); - } - - function testMintWithInvalidBlueprint() public { - bytes memory separator = ":"; - bytes memory blob = separator; - - vm.startPrank(imx); - vm.expectRevert(); - asset.mintFor(owner, 1, blob); - vm.stopPrank(); - } -} \ No newline at end of file diff --git a/test/trading/seaport/ImmutableSeaportBase.t.sol b/test/trading/seaport/ImmutableSeaportBase.t.sol index d6a972e6..a464c41c 100644 --- a/test/trading/seaport/ImmutableSeaportBase.t.sol +++ b/test/trading/seaport/ImmutableSeaportBase.t.sol @@ -3,12 +3,13 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport/ImmutableSeaport.sol"; -import {ImmutableSignedZone} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; +import { + ImmutableSignedZone +} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; import {ConduitController} from "seaport-core/src/conduit/ConduitController.sol"; import {Conduit} from "seaport-core/src/conduit/Conduit.sol"; - abstract contract ImmutableSeaportBaseTest is Test { event AllowedZoneSet(address zoneAddress, bool allowed); @@ -29,7 +30,7 @@ abstract contract ImmutableSeaportBaseTest is Test { function setUp() public virtual { // Set up chain ID //uint256 chainId = block.chainid; - + // Create test addresses owner = makeAddr("owner"); (immutableSigner, immutableSignerPkey) = makeAddrAndKey("immutableSigner"); @@ -42,7 +43,7 @@ abstract contract ImmutableSeaportBaseTest is Test { immutableSignedZone.addSigner(immutableSigner); // The conduit key used to deploy the conduit. Note that the first twenty bytes of the conduit key must match the caller of this contract. - conduitKey = bytes32(uint256(uint160(owner)) << (256-160)); + conduitKey = bytes32(uint256(uint160(owner)) << (256 - 160)); conduitController = new ConduitController(); vm.prank(owner); conduitController.createConduit(conduitKey, owner); @@ -58,4 +59,4 @@ abstract contract ImmutableSeaportBaseTest is Test { vm.prank(owner); conduitController.updateChannel(conduitAddress, address(immutableSeaport), true); } -} \ No newline at end of file +} diff --git a/test/trading/seaport/ImmutableSeaportConfig.t.sol b/test/trading/seaport/ImmutableSeaportConfig.t.sol index 1342c27b..05685269 100644 --- a/test/trading/seaport/ImmutableSeaportConfig.t.sol +++ b/test/trading/seaport/ImmutableSeaportConfig.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.13; import {ImmutableSeaportBaseTest} from "./ImmutableSeaportBase.t.sol"; contract ImmutableSeaportConfigTest is ImmutableSeaportBaseTest { - function testEmitsAllowedZoneSetEvent() public { address zone = makeAddr("zone"); bool allowed = true; @@ -14,4 +13,4 @@ contract ImmutableSeaportConfigTest is ImmutableSeaportBaseTest { emit AllowedZoneSet(zone, allowed); immutableSeaport.setAllowedZone(zone, allowed); } -} \ No newline at end of file +} diff --git a/test/trading/seaport/ImmutableSeaportHarness.t.sol b/test/trading/seaport/ImmutableSeaportHarness.t.sol index 1ec0e38f..48abce02 100644 --- a/test/trading/seaport/ImmutableSeaportHarness.t.sol +++ b/test/trading/seaport/ImmutableSeaportHarness.t.sol @@ -1,12 +1,9 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ImmutableSeaport} from "../../../contracts/trading/seaport/ImmutableSeaport.sol"; -// solhint-disable func-name-mixedcase contract ImmutableSeaportHarness is ImmutableSeaport { constructor(address conduitController, address owner) ImmutableSeaport(conduitController, owner) {} @@ -24,4 +21,3 @@ contract ImmutableSeaportHarness is ImmutableSeaport { } } -// solhint-enable func-name-mixedcase diff --git a/test/trading/seaport/ImmutableSeaportOperational.t.sol b/test/trading/seaport/ImmutableSeaportOperational.t.sol index 4c64c4b3..7ee745fb 100644 --- a/test/trading/seaport/ImmutableSeaportOperational.t.sol +++ b/test/trading/seaport/ImmutableSeaportOperational.t.sol @@ -3,18 +3,22 @@ pragma solidity ^0.8.13; import {ImmutableSeaportBaseTest} from "./ImmutableSeaportBase.t.sol"; - -import {Test} from "forge-std/Test.sol"; import {ImmutableSeaportTestHelper} from "./ImmutableSeaportTestHelper.t.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport/ImmutableSeaport.sol"; -import {SIP7EventsAndErrors} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; - -import {OrderParameters, OrderComponents, AdvancedOrder, CriteriaResolver} from "seaport-types/src/lib/ConsiderationStructs.sol"; +import { + SIP7EventsAndErrors +} from "../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; + +import { + OrderParameters, + OrderComponents, + AdvancedOrder, + CriteriaResolver +} from "seaport-types/src/lib/ConsiderationStructs.sol"; import {OrderType} from "seaport-types/src/lib/ConsiderationEnums.sol"; import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; - contract TestERC721 is ERC721("Test721", "TST721") { function mint(address to, uint256 tokenId) public returns (bool) { _mint(to, tokenId); @@ -32,16 +36,32 @@ contract SellerWallet { bytes4 private constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b; bytes4 private constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e; - function isValidSignature(bytes calldata /*_data */, bytes calldata /*_signatures*/) external pure returns (bytes4) { -// if (_signatureValidationInternal(_subDigest(keccak256(_data)), _signatures)) { - return SELECTOR_ERC1271_BYTES_BYTES; + function isValidSignature( + bytes calldata, + /*_data */ + bytes calldata /*_signatures*/ + ) + external + pure + returns (bytes4) + { + // if (_signatureValidationInternal(_subDigest(keccak256(_data)), _signatures)) { + return SELECTOR_ERC1271_BYTES_BYTES; // } // return 0; } - function isValidSignature(bytes32 /*_hash*/, bytes calldata /*_signatures*/) external pure returns (bytes4) { + function isValidSignature( + bytes32, + /*_hash*/ + bytes calldata /*_signatures*/ + ) + external + pure + returns (bytes4) + { // if (_signatureValidationInternal(_subDigest(_hash), _signatures)) { - return SELECTOR_ERC1271_BYTES32_BYTES; + return SELECTOR_ERC1271_BYTES32_BYTES; // } // return 0; } @@ -50,12 +70,9 @@ contract SellerWallet { ERC721(_erc721).setApprovalForAll(_seaport, true); } - receive() external payable { } + receive() external payable {} } - - - contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableSeaportTestHelper { SellerWallet public sellerWallet; TestERC721 public erc721; @@ -69,7 +86,6 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS vm.deal(buyer, 10 ether); } - function testFulfillFullRestrictedOrder() public { _checkFulfill(OrderType.FULL_RESTRICTED); } @@ -78,7 +94,6 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS _checkFulfill(OrderType.PARTIAL_RESTRICTED); } - function testRejectUnsupportedZones() public { // Create order with random zone address randomZone = makeAddr("randomZone"); @@ -93,7 +108,9 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS AdvancedOrder memory order = _prepareCheckFulfill(OrderType.FULL_OPEN); vm.prank(buyer); - vm.expectRevert(abi.encodeWithSelector(ImmutableSeaport.OrderNotRestricted.selector, uint8(OrderType.FULL_OPEN))); + vm.expectRevert( + abi.encodeWithSelector(ImmutableSeaport.OrderNotRestricted.selector, uint8(OrderType.FULL_OPEN)) + ); immutableSeaport.fulfillAdvancedOrder{value: 10 ether}(order, new CriteriaResolver[](0), conduitKey, buyer); } @@ -133,7 +150,6 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS immutableSeaport.fulfillAdvancedOrder{value: 10 ether}(order, new CriteriaResolver[](0), conduitKey, buyer); } - function _checkFulfill(OrderType _orderType) internal { AdvancedOrder memory order = _prepareCheckFulfill(_orderType); @@ -152,14 +168,14 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } function _prepareCheckFulfill() internal returns (AdvancedOrder memory) { - return _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, false); + return + _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, false); } function _prepareCheckFulfill(OrderType _orderType) internal returns (AdvancedOrder memory) { return _prepareCheckFulfill(_orderType, address(immutableSignedZone), immutableSignerPkey, false); } - function _prepareCheckFulfill(address _zone) internal returns (AdvancedOrder memory) { return _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, _zone, immutableSignerPkey, false); } @@ -169,11 +185,14 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } function _prepareCheckFulfillWithBadExtraData() internal returns (AdvancedOrder memory) { - return _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, true); + return + _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, true); } - - function _prepareCheckFulfill(OrderType _orderType, address _zone, uint256 _signer, bool _useBadExtraData) internal returns (AdvancedOrder memory) { + function _prepareCheckFulfill(OrderType _orderType, address _zone, uint256 _signer, bool _useBadExtraData) + internal + returns (AdvancedOrder memory) + { // Deploy test ERC721 erc721 = new TestERC721(); erc721.mint(address(sellerWallet), nftId); @@ -210,14 +229,17 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS }); bytes32 orderHash = immutableSeaport.getOrderHash(orderComponents); - bytes memory extraData = _generateSip7Signature(orderHash, buyer, _signer, expiration, orderParams.consideration); + bytes memory extraData = + _generateSip7Signature(orderHash, buyer, _signer, expiration, orderParams.consideration); if (_useBadExtraData) { orderParams.consideration[0].recipient = payable(buyer); extraData = _generateSip7Signature(orderHash, buyer, _signer, expiration, orderParams.consideration); } bytes memory signature = _signOrder(sellerPkey, orderHash); - AdvancedOrder memory order = AdvancedOrder(orderParams, 1, 1, signature, extraData); + AdvancedOrder memory order = AdvancedOrder({ + parameters: orderParams, numerator: 1, denominator: 1, signature: signature, extraData: extraData + }); return order; } -} \ No newline at end of file +} diff --git a/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol b/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol index 84682348..8676e33b 100644 --- a/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol +++ b/test/trading/seaport/ImmutableSeaportSignedZoneV2Integration.t.sol @@ -1,10 +1,8 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; @@ -26,7 +24,7 @@ import {IOperatorAllowlistUpgradeable} from "./utils/IOperatorAllowlistUpgradeab import {SigningTestHelper} from "./utils/SigningTestHelper.t.sol"; import {IImmutableSignedZoneV2Harness} from "./zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol"; -// solhint-disable func-name-mixedcase, private-vars-leading-underscore +// forge-lint: disable-start(erc20-unchecked-transfer) contract ImmutableSeaportSignedZoneV2IntegrationTest is Test, SigningTestHelper { // Foundry artifacts allow the test to deploy contracts separately that aren't compatible with @@ -268,13 +266,12 @@ contract ImmutableSeaportSignedZoneV2IntegrationTest is Test, SigningTestHelper // mints vm.prank(OWNER); - erc20Token.transfer( + bool success = erc20Token.transfer( FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) + (considerationItems[0].startAmount + considerationItems[1].startAmount + considerationItems[2].startAmount + + considerationItems[3].startAmount) ); + require(success, "ERC20 transfer failed"); vm.prank(OWNER); erc721Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria); @@ -448,13 +445,14 @@ contract ImmutableSeaportSignedZoneV2IntegrationTest is Test, SigningTestHelper // mints vm.prank(OWNER); - erc20Token.transfer( + bool success = erc20Token.transfer( FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) / 100 + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) / 100 ); + require(success, "ERC20 transfer failed"); vm.prank(OWNER); erc1155Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria, offerItems[0].startAmount, new bytes(0)); @@ -632,13 +630,14 @@ contract ImmutableSeaportSignedZoneV2IntegrationTest is Test, SigningTestHelper // mints vm.prank(OWNER); - erc20Token.transfer( + bool success = erc20Token.transfer( FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) * 2 / 100 + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) * 2 / 100 ); + require(success, "ERC20 transfer failed"); vm.prank(OWNER); erc1155Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria, offerItems[0].startAmount, new bytes(0)); @@ -847,18 +846,16 @@ contract ImmutableSeaportSignedZoneV2IntegrationTest is Test, SigningTestHelper vm.prank(OWNER); erc20Token.transfer( FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) / 2 + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) / 2 ); vm.prank(OWNER); erc20Token.transfer( FULFILLER_TWO, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) + (considerationItems[0].startAmount + considerationItems[1].startAmount + considerationItems[2].startAmount + + considerationItems[3].startAmount) ); vm.prank(OWNER); erc1155Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria, offerItems[0].startAmount, new bytes(0)); @@ -887,10 +884,10 @@ contract ImmutableSeaportSignedZoneV2IntegrationTest is Test, SigningTestHelper assertEq(erc20Token.balanceOf(FULFILLER), 0); assertEq( erc20Token.balanceOf(FULFILLER_TWO), - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) / 2 + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) / 2 ); assertEq(erc20Token.balanceOf(PROTOCOL_FEE_RECEIVER), considerationItems[1].startAmount); assertEq(erc20Token.balanceOf(ROYALTY_FEE_RECEIVER), considerationItems[2].startAmount); @@ -898,4 +895,4 @@ contract ImmutableSeaportSignedZoneV2IntegrationTest is Test, SigningTestHelper } } -// solhint-enable func-name-mixedcase, private-vars-leading-underscore +// forge-lint: disable-end(erc20-unchecked-transfer) diff --git a/test/trading/seaport/ImmutableSeaportTestHelper.t.sol b/test/trading/seaport/ImmutableSeaportTestHelper.t.sol index e947eac1..99de0bf2 100644 --- a/test/trading/seaport/ImmutableSeaportTestHelper.t.sol +++ b/test/trading/seaport/ImmutableSeaportTestHelper.t.sol @@ -3,23 +3,27 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol"; -import {ZoneParameters, ConsiderationItem, OfferItem, ReceivedItem, SpentItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; - +import { + ZoneParameters, + ConsiderationItem, + OfferItem, + ReceivedItem, + SpentItem +} from "seaport-types/src/lib/ConsiderationStructs.sol"; abstract contract ImmutableSeaportTestHelper is Test { bytes internal constant CONSIDERATION_BYTES = abi.encodePacked("Consideration(", "ReceivedItem[] consideration", ")"); - bytes internal constant RECEIVED_ITEM_BYTES = - abi.encodePacked( - "ReceivedItem(", - "uint8 itemType,", - "address token,", - "uint256 identifier,", - "uint256 amount,", - "address recipient", - ")" - ); + bytes internal constant RECEIVED_ITEM_BYTES = abi.encodePacked( + "ReceivedItem(", + "uint8 itemType,", + "address token,", + "uint256 identifier,", + "uint256 amount,", + "address recipient", + ")" + ); bytes32 internal constant RECEIVED_ITEM_TYPEHASH = keccak256(RECEIVED_ITEM_BYTES); @@ -38,24 +42,35 @@ abstract contract ImmutableSeaportTestHelper is Test { theZone = _zone; } - // Helper functions function _createZoneParameters(bytes memory _extraData) internal returns (ZoneParameters memory) { bytes32 orderHash = keccak256("0x1234"); return _createZoneParameters(_extraData, orderHash, _createMockConsideration(10)); } - function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash) internal returns (ZoneParameters memory) { + function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash) + internal + returns (ZoneParameters memory) + { return _createZoneParameters(_extraData, _orderHash, _createMockConsideration(10)); } - function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash, ReceivedItem[] memory _consideration) internal view returns (ZoneParameters memory) { + function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash, ReceivedItem[] memory _consideration) + internal + view + returns (ZoneParameters memory) + { bytes32[] memory orderHashes = new bytes32[](1); orderHashes[0] = _orderHash; return _createZoneParameters(_extraData, _orderHash, orderHashes, _consideration); } - function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash, bytes32[] memory _orderHashes, ReceivedItem[] memory _consideration) internal view returns (ZoneParameters memory) { + function _createZoneParameters( + bytes memory _extraData, + bytes32 _orderHash, + bytes32[] memory _orderHashes, + ReceivedItem[] memory _consideration + ) internal view returns (ZoneParameters memory) { return ZoneParameters({ orderHash: _orderHash, fulfiller: theFulfiller, @@ -76,17 +91,17 @@ abstract contract ImmutableSeaportTestHelper is Test { address payable recipient = payable(makeAddr(string(abi.encodePacked("recipient", vm.toString(i))))); address payable token = payable(makeAddr(string(abi.encodePacked("token", vm.toString(i))))); consideration[i] = ReceivedItem({ - itemType: ItemType.NATIVE, - token: token, - identifier: 123, - amount: 12, - recipient: recipient + itemType: ItemType.NATIVE, token: token, identifier: 123, amount: 12, recipient: recipient }); } return consideration; } - function _convertConsiderationToReceivedItem(ConsiderationItem[] memory _items) internal pure returns (ReceivedItem[] memory) { + function _convertConsiderationToReceivedItem(ConsiderationItem[] memory _items) + internal + pure + returns (ReceivedItem[] memory) + { ReceivedItem[] memory consideration = new ReceivedItem[](_items.length); for (uint256 i = 0; i < _items.length; i++) { consideration[i] = ReceivedItem({ @@ -100,7 +115,11 @@ abstract contract ImmutableSeaportTestHelper is Test { return consideration; } - function _createConsiderationItems(address recipient, uint256 amount) internal pure returns (ConsiderationItem[] memory) { + function _createConsiderationItems(address recipient, uint256 amount) + internal + pure + returns (ConsiderationItem[] memory) + { ConsiderationItem[] memory consideration = new ConsiderationItem[](1); consideration[0] = ConsiderationItem({ itemType: ItemType.NATIVE, @@ -131,17 +150,15 @@ abstract contract ImmutableSeaportTestHelper is Test { return keccak256(abi.encode(CONSIDERATION_TYPEHASH, keccak256(abi.encodePacked(considerationHashes)))); } - function _signOrder(uint256 signerPkey, bytes32 orderHash) internal view returns (bytes memory) { return _signOrder(signerPkey, orderHash, 0, ""); } - function _signOrder( - uint256 _signerPkey, - bytes32 orderHash, - uint64 expiration, - bytes memory context - ) internal view returns (bytes memory) { + function _signOrder(uint256 _signerPkey, bytes32 orderHash, uint64 expiration, bytes memory context) + internal + view + returns (bytes memory) + { uint256 chainId = block.chainid; bytes32 domainSeparator = keccak256( abi.encode( @@ -165,9 +182,7 @@ abstract contract ImmutableSeaportTestHelper is Test { ); //console.logBytes32(structHash); - bytes32 digest = keccak256( - abi.encodePacked("\x19\x01", domainSeparator, structHash) - ); + bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); //console.logBytes32(digest); (uint8 v, bytes32 r, bytes32 s) = vm.sign(_signerPkey, digest); @@ -188,17 +203,18 @@ abstract contract ImmutableSeaportTestHelper is Test { function _createOfferItems(address token, uint256 tokenId) internal pure returns (OfferItem[] memory) { OfferItem[] memory offer = new OfferItem[](1); offer[0] = OfferItem({ - itemType: ItemType.ERC721, - token: token, - identifierOrCriteria: tokenId, - startAmount: 1, - endAmount: 1 + itemType: ItemType.ERC721, token: token, identifierOrCriteria: tokenId, startAmount: 1, endAmount: 1 }); return offer; } - - function _generateSip7Signature(bytes32 orderHash, address fulfiller, uint256 signerPkey, uint64 _expiration, ConsiderationItem[] memory _consideration) internal view returns (bytes memory) { + function _generateSip7Signature( + bytes32 orderHash, + address fulfiller, + uint256 signerPkey, + uint64 _expiration, + ConsiderationItem[] memory _consideration + ) internal view returns (bytes memory) { bytes32[] memory orderHashes = new bytes32[](1); orderHashes[0] = orderHash; ReceivedItem[] memory consideration = _convertConsiderationToReceivedItem(_consideration); @@ -219,7 +235,8 @@ abstract contract ImmutableSeaportTestHelper is Test { bytes memory data = abi.encodePacked(_orders); return this._stripArrayLength(data); } + function _stripArrayLength(bytes calldata _data) external pure returns (bytes memory) { return _data[32:_data.length]; } -} \ No newline at end of file +} diff --git a/test/trading/seaport/utils/IImmutableERC1155.t.sol b/test/trading/seaport/utils/IImmutableERC1155.t.sol index 27dc3988..75aa637e 100644 --- a/test/trading/seaport/utils/IImmutableERC1155.t.sol +++ b/test/trading/seaport/utils/IImmutableERC1155.t.sol @@ -1,7 +1,5 @@ // Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; diff --git a/test/trading/seaport/utils/IImmutableERC721.t.sol b/test/trading/seaport/utils/IImmutableERC721.t.sol index 6682d52e..791eada6 100644 --- a/test/trading/seaport/utils/IImmutableERC721.t.sol +++ b/test/trading/seaport/utils/IImmutableERC721.t.sol @@ -1,7 +1,6 @@ // Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; diff --git a/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol b/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol index ae445d0d..1fe31735 100644 --- a/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol +++ b/test/trading/seaport/utils/IOperatorAllowlistUpgradeable.t.sol @@ -1,7 +1,5 @@ // Copyright Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache 2.0 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; /** diff --git a/test/trading/seaport/utils/SigningTestHelper.t.sol b/test/trading/seaport/utils/SigningTestHelper.t.sol index bd6699c5..217d5f07 100644 --- a/test/trading/seaport/utils/SigningTestHelper.t.sol +++ b/test/trading/seaport/utils/SigningTestHelper.t.sol @@ -1,10 +1,7 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; abstract contract SigningTestHelper is Test { diff --git a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol index 70ccb4b8..8e995c1b 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOrderValidation.t.sol @@ -3,12 +3,17 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; import {ImmutableSeaportTestHelper} from "../../../ImmutableSeaportTestHelper.t.sol"; -import {ImmutableSignedZone} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; -import {SIP7EventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; -import {SIP6EventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol"; +import { + ImmutableSignedZone +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; +import { + SIP7EventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; +import { + SIP6EventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP6EventsAndErrors.sol"; import {ZoneParameters, ReceivedItem} from "seaport-types/src/lib/ConsiderationStructs.sol"; - contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHelper { ImmutableSignedZone public zone; address public owner; @@ -52,7 +57,14 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ZoneParameters memory params = _createZoneParameters(extraData, orderHash, consideration); bytes4 selector = zone.validateOrder(params); - assertEq(selector, bytes4(keccak256("validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))"))); + assertEq( + selector, + bytes4( + keccak256( + "validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))" + ) + ) + ); } function testValidateOrderWithMultipleOrderHashes() public { @@ -60,13 +72,13 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel uint64 expiration = uint64(block.timestamp + 90); ReceivedItem[] memory consideration = _createMockConsideration(10); bytes32 considerationHash = this._deriveConsiderationHash(consideration); - + // Create array of order hashes bytes32[] memory orderHashes = new bytes32[](10); for (uint256 i = 0; i < 10; i++) { orderHashes[i] = keccak256(abi.encodePacked("order", i)); } - + // Create context with consideration hash and order hashes bytes memory context = abi.encodePacked(considerationHash, _convertToBytesWithoutArrayLength(orderHashes)); @@ -80,23 +92,39 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ); ZoneParameters memory params = _createZoneParameters(extraData, orderHash, orderHashes, consideration); - + bytes4 selector = zone.validateOrder(params); - assertEq(selector, bytes4(keccak256("validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))"))); + assertEq( + selector, + bytes4( + keccak256( + "validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))" + ) + ) + ); } function testValidateOrderWithoutExtraData() public { bytes memory extraData = ""; ZoneParameters memory params = _createZoneParameters(extraData); - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.InvalidExtraData.selector, - "extraData is empty", params.orderHash)); + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.InvalidExtraData.selector, "extraData is empty", params.orderHash + ) + ); zone.validateOrder(params); } function testValidateOrderWithInvalidExtraData() public { bytes memory extraData = abi.encodePacked(uint8(1), uint8(2), uint8(3)); ZoneParameters memory params = _createZoneParameters(extraData); - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.InvalidExtraData.selector, "extraData length must be at least 93 bytes", params.orderHash)); + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.InvalidExtraData.selector, + "extraData length must be at least 93 bytes", + params.orderHash + ) + ); zone.validateOrder(params); } @@ -119,7 +147,9 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel vm.warp(uint256(timeNow)); ZoneParameters memory params = _createZoneParameters(extraData, orderHash); - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SignatureExpired.selector, timeNow, expiration, orderHash)); + vm.expectRevert( + abi.encodeWithSelector(SIP7EventsAndErrors.SignatureExpired.selector, timeNow, expiration, orderHash) + ); zone.validateOrder(params); } @@ -139,7 +169,11 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ); ZoneParameters memory params = _createZoneParameters(extraData, orderHash); - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.InvalidFulfiller.selector, invalidFulfiller, fulfiller, orderHash)); + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.InvalidFulfiller.selector, invalidFulfiller, fulfiller, orderHash + ) + ); zone.validateOrder(params); } @@ -177,8 +211,13 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ); ZoneParameters memory params = _createZoneParameters(extraData, orderHash); - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.InvalidExtraData.selector, - "invalid context, expecting consideration hash followed by order hashes", params.orderHash)); + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.InvalidExtraData.selector, + "invalid context, expecting consideration hash followed by order hashes", + params.orderHash + ) + ); zone.validateOrder(params); } @@ -198,8 +237,11 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ZoneParameters memory params = _createZoneParameters(extraData, orderHash); params.consideration = _createMockConsideration(10); - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SubstandardViolation.selector, - 3, "invalid consideration hash", orderHash)); + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.SubstandardViolation.selector, 3, "invalid consideration hash", orderHash + ) + ); zone.validateOrder(params); } @@ -220,16 +262,27 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ); ZoneParameters memory params = _createZoneParameters(extraData); - + // First validate should succeed bytes4 selector = zone.validateOrder(params); - assertEq(selector, bytes4(keccak256("validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))"))); + assertEq( + selector, + bytes4( + keccak256( + "validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))" + ) + ) + ); // Advance time past expiration vm.warp(block.timestamp + 900); // Second validate should fail - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SignatureExpired.selector, uint64(block.timestamp), expiration, orderHash)); + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.SignatureExpired.selector, uint64(block.timestamp), expiration, orderHash + ) + ); zone.validateOrder(params); } @@ -238,20 +291,21 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel uint64 expiration = uint64(block.timestamp + 90); ReceivedItem[] memory consideration = _createMockConsideration(10); bytes32 considerationHash = this._deriveConsiderationHash(consideration); - + // Create array of order hashes bytes32[] memory orderHashes = new bytes32[](10); for (uint256 i = 0; i < 10; i++) { orderHashes[i] = keccak256(abi.encodePacked("order", i)); } - + // Create partial array of order hashes (first 2) bytes32[] memory partialOrderHashes = new bytes32[](2); partialOrderHashes[0] = orderHashes[0]; partialOrderHashes[1] = orderHashes[1]; - + // Create context with consideration hash and partial order hashes - bytes memory context = abi.encodePacked(considerationHash, _convertToBytesWithoutArrayLength(partialOrderHashes)); + bytes memory context = + abi.encodePacked(considerationHash, _convertToBytesWithoutArrayLength(partialOrderHashes)); bytes memory signature = _signOrder(signerPkey, orderHash, expiration, context); bytes memory extraData = abi.encodePacked( @@ -263,9 +317,16 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ); ZoneParameters memory params = _createZoneParameters(extraData, orderHash, orderHashes, consideration); - + bytes4 selector = zone.validateOrder(params); - assertEq(selector, bytes4(keccak256("validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))"))); + assertEq( + selector, + bytes4( + keccak256( + "validateOrder((bytes32,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256,address)[],bytes,bytes32[],uint256,uint256,bytes32))" + ) + ) + ); } function testValidateOrderWhenNotAllExpectedOrdersAreZoneParameters() public { @@ -273,13 +334,13 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel uint64 expiration = uint64(block.timestamp + 90); ReceivedItem[] memory consideration = _createMockConsideration(10); bytes32 considerationHash = this._deriveConsiderationHash(consideration); - + // Create array of order hashes bytes32[] memory orderHashes = new bytes32[](10); for (uint256 i = 0; i < 10; i++) { orderHashes[i] = keccak256(abi.encodePacked("order", i)); } - + // Create context with consideration hash and full order hashes bytes memory context = abi.encodePacked(considerationHash, _convertToBytesWithoutArrayLength(orderHashes)); @@ -298,9 +359,12 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel partialOrderHashes[1] = orderHashes[1]; ZoneParameters memory params = _createZoneParameters(extraData, orderHash, partialOrderHashes, consideration); - - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SubstandardViolation.selector, - 4, "invalid order hashes", orderHash)); + + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.SubstandardViolation.selector, 4, "invalid order hashes", orderHash + ) + ); zone.validateOrder(params); } @@ -309,13 +373,13 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel uint64 expiration = uint64(block.timestamp + 90); ReceivedItem[] memory consideration = _createMockConsideration(10); bytes32 considerationHash = this._deriveConsiderationHash(consideration); - + // Create array of order hashes bytes32[] memory orderHashes = new bytes32[](10); for (uint256 i = 0; i < 10; i++) { orderHashes[i] = keccak256(abi.encodePacked("order", i)); } - + // Create context with consideration hash and full order hashes bytes memory context = abi.encodePacked(considerationHash, _convertToBytesWithoutArrayLength(orderHashes)); @@ -336,9 +400,12 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel mixedOrderHashes[3] = keccak256("0x66"); ZoneParameters memory params = _createZoneParameters(extraData, orderHash, mixedOrderHashes, consideration); - - vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SubstandardViolation.selector, - 4, "invalid order hashes", orderHash)); + + vm.expectRevert( + abi.encodeWithSelector( + SIP7EventsAndErrors.SubstandardViolation.selector, 4, "invalid order hashes", orderHash + ) + ); zone.validateOrder(params); } @@ -347,20 +414,20 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel uint64 expiration = uint64(block.timestamp + 90); ReceivedItem[] memory consideration = _createMockConsideration(10); bytes32 considerationHash = this._deriveConsiderationHash(consideration); - + // Create array of order hashes bytes32[] memory orderHashes = new bytes32[](10); for (uint256 i = 0; i < 10; i++) { orderHashes[i] = keccak256(abi.encodePacked("order", i)); } - + // Create context with consideration hash and order hashes bytes memory context = abi.encodePacked(considerationHash, _convertToBytesWithoutArrayLength(orderHashes)); // Sign with wrong signer (address wrongSigner, uint256 wrongSignerPkey) = makeAddrAndKey("wrongSigner"); bytes memory signature = _signOrder(wrongSignerPkey, orderHash, expiration, context); - + bytes memory extraData = abi.encodePacked( uint8(0), // SIP6 version fulfiller, @@ -370,8 +437,8 @@ contract ImmutableSignedZoneOrderValidationTest is Test, ImmutableSeaportTestHel ); ZoneParameters memory params = _createZoneParameters(extraData, orderHash, orderHashes, consideration); - + vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SignerNotActive.selector, wrongSigner)); zone.validateOrder(params); } -} \ No newline at end of file +} diff --git a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol index 16a85164..9de658fa 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneOwnership.t.sol @@ -2,9 +2,9 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; -import {ImmutableSignedZone} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; - - +import { + ImmutableSignedZone +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; contract ImmutableSignedZoneOwnershipTest is Test { ImmutableSignedZone public zone; @@ -28,7 +28,7 @@ contract ImmutableSignedZoneOwnershipTest is Test { function testTransferOwnership() public { address newOwner = makeAddr("newOwner"); - + vm.startPrank(owner); zone.transferOwnership(newOwner); vm.stopPrank(); @@ -38,7 +38,7 @@ contract ImmutableSignedZoneOwnershipTest is Test { function testNonOwnerCannotTransferOwnership() public { address newOwner = makeAddr("newOwner"); - + vm.startPrank(user); vm.expectRevert("Ownable: caller is not the owner"); zone.transferOwnership(newOwner); @@ -58,4 +58,4 @@ contract ImmutableSignedZoneOwnershipTest is Test { zone.removeSigner(user); vm.stopPrank(); } -} \ No newline at end of file +} diff --git a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol index 915b9d60..03b4aa5e 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZoneSignerManagement.t.sol @@ -2,8 +2,12 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; -import {ImmutableSignedZone} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; -import {SIP7EventsAndErrors} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; +import { + ImmutableSignedZone +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/ImmutableSignedZone.sol"; +import { + SIP7EventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v1/interfaces/SIP7EventsAndErrors.sol"; contract ImmutableSignedZoneSignerManagementTest is Test { ImmutableSignedZone public zone; @@ -32,7 +36,7 @@ contract ImmutableSignedZoneSignerManagementTest is Test { function testOwnerCanAddAndRemoveActiveSigner() public { vm.startPrank(owner); zone.addSigner(signer); - + vm.expectEmit(true, true, true, true); emit SIP7EventsAndErrors.SignerRemoved(signer); zone.removeSigner(signer); @@ -43,7 +47,7 @@ contract ImmutableSignedZoneSignerManagementTest is Test { vm.startPrank(owner); zone.addSigner(signer); zone.removeSigner(signer); - + // Try to add deactivated signer vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SignerCannotBeReauthorized.selector, signer)); zone.addSigner(signer); @@ -53,10 +57,10 @@ contract ImmutableSignedZoneSignerManagementTest is Test { function testAlreadyActiveSignerCannotBeAdded() public { vm.startPrank(owner); zone.addSigner(signer); - + // Try to add same signer again vm.expectRevert(abi.encodeWithSelector(SIP7EventsAndErrors.SignerAlreadyActive.selector, signer)); zone.addSigner(signer); vm.stopPrank(); } -} \ No newline at end of file +} diff --git a/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol index 80e6ff77..7113b57e 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v2/IImmutableSignedZoneV2Harness.t.sol @@ -1,15 +1,12 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ZoneInterface} from "seaport/contracts/interfaces/ZoneInterface.sol"; import {ReceivedItem, ZoneParameters} from "seaport-types/src/lib/ConsiderationStructs.sol"; -import {SIP7Interface} from - "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol"; - -// solhint-disable func-name-mixedcase +import { + SIP7Interface +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7Interface.sol"; interface IImmutableSignedZoneV2Harness is ZoneInterface, SIP7Interface { function grantRole(bytes32 role, address account) external; @@ -31,9 +28,7 @@ interface IImmutableSignedZoneV2Harness is ZoneInterface, SIP7Interface { bytes calldata context ) external view returns (bytes32 signedOrderHash); - function exposed_validateSubstandards(bytes calldata context, ZoneParameters calldata zoneParameters) - external - pure; + function exposed_validateSubstandards(bytes calldata context, ZoneParameters calldata zoneParameters) external pure; function exposed_validateSubstandard3(bytes calldata context, ZoneParameters calldata zoneParameters) external @@ -61,5 +56,3 @@ interface IImmutableSignedZoneV2Harness is ZoneInterface, SIP7Interface { pure returns (bool); } - -// solhint-enable func-name-mixedcase diff --git a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol index 2700527e..5225e400 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.t.sol @@ -1,29 +1,29 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol"; import {ReceivedItem, Schema, SpentItem, ZoneParameters} from "seaport-types/src/lib/ConsiderationStructs.sol"; -import {ImmutableSignedZoneV2} from - "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; -import {SIP5EventsAndErrors} from - "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol"; -import {SIP6EventsAndErrors} from - "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol"; -import {SIP7EventsAndErrors} from - "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol"; -import {ZoneAccessControlEventsAndErrors} from - "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol"; +import { + ImmutableSignedZoneV2 +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; +import { + SIP5EventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP5EventsAndErrors.sol"; +import { + SIP6EventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP6EventsAndErrors.sol"; +import { + SIP7EventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/SIP7EventsAndErrors.sol"; +import { + ZoneAccessControlEventsAndErrors +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/interfaces/ZoneAccessControlEventsAndErrors.sol"; import {SigningTestHelper} from "../../../utils/SigningTestHelper.t.sol"; import {ImmutableSignedZoneV2Harness} from "./ImmutableSignedZoneV2Harness.t.sol"; -// solhint-disable func-name-mixedcase - contract ImmutableSignedZoneV2Test is Test, SigningTestHelper, @@ -32,13 +32,11 @@ contract ImmutableSignedZoneV2Test is SIP6EventsAndErrors, SIP7EventsAndErrors { - // solhint-disable private-vars-leading-underscore address private immutable OWNER = makeAddr("owner"); address private immutable FULFILLER = makeAddr("fulfiller"); address private immutable OFFERER = makeAddr("offerer"); address private immutable SIGNER; uint256 private immutable SIGNER_PRIVATE_KEY; - // solhint-enable private-vars-leading-underscore // OpenZeppelin v5 access/IAccessControl.sol error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); @@ -528,11 +526,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x4), - identifier: 0, - amount: 20, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x4), identifier: 0, amount: 20, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -583,11 +577,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x4), - identifier: 0, - amount: 20, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x4), identifier: 0, amount: 20, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -634,11 +624,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x4), - identifier: 0, - amount: 20, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x4), identifier: 0, amount: 20, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -773,11 +759,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -837,11 +819,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); ZoneParameters memory zoneParameters = ZoneParameters({ @@ -869,11 +847,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -909,11 +883,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x4), - identifier: 0, - amount: 20, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x4), identifier: 0, amount: 20, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -946,11 +916,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x4), - identifier: 0, - amount: 20, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x4), identifier: 0, amount: 20, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -986,11 +952,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -1076,11 +1038,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -1108,11 +1066,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; @@ -1302,11 +1256,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); ZoneParameters memory zoneParameters = ZoneParameters({ @@ -1338,11 +1288,7 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); ZoneParameters memory zoneParameters = ZoneParameters({ @@ -1383,18 +1329,10 @@ contract ImmutableSignedZoneV2Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](2); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[1] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 199, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 199, amount: 10, recipient: payable(address(0x3)) }); // console.logBytes32(zone.exposed_deriveReceivedItemsHash(receivedItems, 100, 10)); @@ -1406,11 +1344,7 @@ contract ImmutableSignedZoneV2Test is ImmutableSignedZoneV2Harness zone = _newZoneHarness(OWNER); ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); // console.logBytes32(zone.exposed_deriveReceivedItemsHash(receivedItems, type(uint256).max, 100)); @@ -1477,9 +1411,10 @@ contract ImmutableSignedZoneV2Test is /* helper functions */ function _newZone(address owner) private returns (ImmutableSignedZoneV2) { - return new ImmutableSignedZoneV2( - "MyZoneName", "https://www.immutable.com", "https://www.immutable.com/docs", owner - ); + return + new ImmutableSignedZoneV2( + "MyZoneName", "https://www.immutable.com", "https://www.immutable.com/docs", owner + ); } function _newZoneHarness(address owner) private returns (ImmutableSignedZoneV2Harness) { @@ -1501,7 +1436,9 @@ contract ImmutableSignedZoneV2Test is bytes1(0), fulfiller, expiration, - _signCompact(signerPrivateKey, ECDSA.toTypedDataHash(zone.exposed_domainSeparator(), eip712SignedOrderHash)), + _signCompact( + signerPrivateKey, ECDSA.toTypedDataHash(zone.exposed_domainSeparator(), eip712SignedOrderHash) + ), context ); return extraData; @@ -1526,4 +1463,3 @@ contract ImmutableSignedZoneV2Test is } } -// solhint-enable func-name-mixedcase diff --git a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol index b6cfe368..b94f0b7e 100644 --- a/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol +++ b/test/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2Harness.t.sol @@ -1,14 +1,11 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ReceivedItem, ZoneParameters} from "seaport-types/src/lib/ConsiderationStructs.sol"; -import {ImmutableSignedZoneV2} from - "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; - -// solhint-disable func-name-mixedcase +import { + ImmutableSignedZoneV2 +} from "../../../../../../contracts/trading/seaport/zones/immutable-signed-zone/v2/ImmutableSignedZoneV2.sol"; contract ImmutableSignedZoneV2Harness is ImmutableSignedZoneV2 { constructor(string memory zoneName, string memory apiEndpoint, string memory documentationURI, address owner) @@ -84,4 +81,3 @@ contract ImmutableSignedZoneV2Harness is ImmutableSignedZoneV2 { } } -// solhint-enable func-name-mixedcase diff --git a/test/trading/seaport16/ImmutableSeaportBase.t.sol b/test/trading/seaport16/ImmutableSeaportBase.t.sol index b3ad1b88..021f1163 100644 --- a/test/trading/seaport16/ImmutableSeaportBase.t.sol +++ b/test/trading/seaport16/ImmutableSeaportBase.t.sol @@ -4,12 +4,13 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport16/ImmutableSeaport.sol"; -import {ImmutableSignedZoneV3} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; +import { + ImmutableSignedZoneV3 +} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; import {ConduitController} from "seaport-core-16/src/conduit/ConduitController.sol"; import {Conduit} from "seaport-core-16/src/conduit/Conduit.sol"; - abstract contract ImmutableSeaportBaseTest is Test { event AllowedZoneSet(address zoneAddress, bool allowed); @@ -42,7 +43,7 @@ abstract contract ImmutableSeaportBaseTest is Test { // Deploy contracts // The conduit key used to deploy the conduit. Note that the first twenty bytes of the conduit key must match the caller of this contract. - conduitKey = bytes32(uint256(uint160(owner)) << (256-160)); + conduitKey = bytes32(uint256(uint160(owner)) << (256 - 160)); conduitController = new ConduitController(); vm.prank(owner); conduitController.createConduit(conduitKey, owner); @@ -65,4 +66,4 @@ abstract contract ImmutableSeaportBaseTest is Test { vm.prank(owner); conduitController.updateChannel(conduitAddress, address(immutableSeaport), true); } -} \ No newline at end of file +} diff --git a/test/trading/seaport16/ImmutableSeaportHarness.t.sol b/test/trading/seaport16/ImmutableSeaportHarness.t.sol index 18e9b6d8..317d0b45 100644 --- a/test/trading/seaport16/ImmutableSeaportHarness.t.sol +++ b/test/trading/seaport16/ImmutableSeaportHarness.t.sol @@ -1,13 +1,9 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ImmutableSeaport} from "../../../contracts/trading/seaport16/ImmutableSeaport.sol"; -// solhint-disable func-name-mixedcase - contract ImmutableSeaportHarness is ImmutableSeaport { constructor(address conduitController, address owner) ImmutableSeaport(conduitController, owner) {} @@ -24,4 +20,3 @@ contract ImmutableSeaportHarness is ImmutableSeaport { } } -// solhint-enable func-name-mixedcase diff --git a/test/trading/seaport16/ImmutableSeaportOperational.t.sol b/test/trading/seaport16/ImmutableSeaportOperational.t.sol index 811907ae..4d29abdb 100644 --- a/test/trading/seaport16/ImmutableSeaportOperational.t.sol +++ b/test/trading/seaport16/ImmutableSeaportOperational.t.sol @@ -2,14 +2,18 @@ pragma solidity ^0.8.13; import {ImmutableSeaportBaseTest} from "./ImmutableSeaportBase.t.sol"; - - -import {Test} from "forge-std/Test.sol"; import {ImmutableSeaportTestHelper} from "./ImmutableSeaportTestHelper.t.sol"; import {ImmutableSeaport} from "../../../contracts/trading/seaport16/ImmutableSeaport.sol"; -import {SIP7EventsAndErrors} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol"; - -import {OrderParameters, OrderComponents, AdvancedOrder, CriteriaResolver} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; +import { + SIP7EventsAndErrors +} from "../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol"; + +import { + OrderParameters, + OrderComponents, + AdvancedOrder, + CriteriaResolver +} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; import {OrderType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; @@ -31,16 +35,32 @@ contract SellerWallet { bytes4 private constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b; bytes4 private constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e; - function isValidSignature(bytes calldata /*_data */, bytes calldata /*_signatures*/) external pure returns (bytes4) { -// if (_signatureValidationInternal(_subDigest(keccak256(_data)), _signatures)) { - return SELECTOR_ERC1271_BYTES_BYTES; + function isValidSignature( + bytes calldata, + /*_data */ + bytes calldata /*_signatures*/ + ) + external + pure + returns (bytes4) + { + // if (_signatureValidationInternal(_subDigest(keccak256(_data)), _signatures)) { + return SELECTOR_ERC1271_BYTES_BYTES; // } // return 0; } - function isValidSignature(bytes32 /*_hash*/, bytes calldata /*_signatures*/) external pure returns (bytes4) { + function isValidSignature( + bytes32, + /*_hash*/ + bytes calldata /*_signatures*/ + ) + external + pure + returns (bytes4) + { // if (_signatureValidationInternal(_subDigest(_hash), _signatures)) { - return SELECTOR_ERC1271_BYTES32_BYTES; + return SELECTOR_ERC1271_BYTES32_BYTES; // } // return 0; } @@ -49,12 +69,9 @@ contract SellerWallet { ERC721(_erc721).setApprovalForAll(_seaport, true); } - receive() external payable { } + receive() external payable {} } - - - contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableSeaportTestHelper { SellerWallet public sellerWallet; TestERC721 public erc721; @@ -68,7 +85,6 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS vm.deal(buyer, 10 ether); } - function testFulfillFullRestrictedOrder() public { _checkFulfill(OrderType.FULL_RESTRICTED); } @@ -91,7 +107,9 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS AdvancedOrder memory order = _prepareCheckFulfill(OrderType.FULL_OPEN); vm.prank(buyer); - vm.expectRevert(abi.encodeWithSelector(ImmutableSeaport.OrderNotRestricted.selector, uint8(OrderType.FULL_OPEN))); + vm.expectRevert( + abi.encodeWithSelector(ImmutableSeaport.OrderNotRestricted.selector, uint8(OrderType.FULL_OPEN)) + ); immutableSeaport.fulfillAdvancedOrder{value: 10 ether}(order, new CriteriaResolver[](0), conduitKey, buyer); } @@ -131,7 +149,6 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS immutableSeaport.fulfillAdvancedOrder{value: 10 ether}(order, new CriteriaResolver[](0), conduitKey, buyer); } - function _checkFulfill(OrderType _orderType) internal { AdvancedOrder memory order = _prepareCheckFulfill(_orderType); @@ -150,14 +167,14 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } function _prepareCheckFulfill() internal returns (AdvancedOrder memory) { - return _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, false); + return + _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, false); } function _prepareCheckFulfill(OrderType _orderType) internal returns (AdvancedOrder memory) { return _prepareCheckFulfill(_orderType, address(immutableSignedZone), immutableSignerPkey, false); } - function _prepareCheckFulfill(address _zone) internal returns (AdvancedOrder memory) { return _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, _zone, immutableSignerPkey, false); } @@ -167,11 +184,14 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS } function _prepareCheckFulfillWithBadExtraData() internal returns (AdvancedOrder memory) { - return _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, true); + return + _prepareCheckFulfill(OrderType.PARTIAL_RESTRICTED, address(immutableSignedZone), immutableSignerPkey, true); } - - function _prepareCheckFulfill(OrderType _orderType, address _zone, uint256 _signer, bool _useBadExtraData) internal returns (AdvancedOrder memory) { + function _prepareCheckFulfill(OrderType _orderType, address _zone, uint256 _signer, bool _useBadExtraData) + internal + returns (AdvancedOrder memory) + { // Deploy test ERC721 erc721 = new TestERC721(); erc721.mint(address(sellerWallet), nftId); @@ -208,14 +228,17 @@ contract ImmutableSeaportOperationalTest is ImmutableSeaportBaseTest, ImmutableS }); bytes32 orderHash = immutableSeaport.getOrderHash(orderComponents); - bytes memory extraData = _generateSip7Signature(orderHash, buyer, _signer, expiration, orderParams.consideration); + bytes memory extraData = + _generateSip7Signature(orderHash, buyer, _signer, expiration, orderParams.consideration); if (_useBadExtraData) { orderParams.consideration[0].recipient = payable(buyer); extraData = _generateSip7Signature(orderHash, buyer, _signer, expiration, orderParams.consideration); } bytes memory signature = _signOrder(sellerPkey, orderHash); - AdvancedOrder memory order = AdvancedOrder(orderParams, 1, 1, signature, extraData ); + AdvancedOrder memory order = AdvancedOrder({ + parameters: orderParams, numerator: 1, denominator: 1, signature: signature, extraData: extraData + }); return order; } -} \ No newline at end of file +} diff --git a/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol b/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol index 3061d2c4..df104efa 100644 --- a/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol +++ b/test/trading/seaport16/ImmutableSeaportSignedZoneV3Integration.t.sol @@ -1,10 +1,8 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; @@ -26,7 +24,7 @@ import {IOperatorAllowlistUpgradeable} from "../seaport/utils/IOperatorAllowlist import {SigningTestHelper} from "../seaport/utils/SigningTestHelper.t.sol"; import {IImmutableSignedZoneV3Harness} from "./zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol"; -// solhint-disable func-name-mixedcase, private-vars-leading-underscore +// forge-lint: disable-start(erc20-unchecked-transfer) contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper { // Foundry artifacts allow the test to deploy contracts separately that aren't compatible with @@ -99,7 +97,9 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper zone = IImmutableSignedZoneV3Harness( deployCode( ZONE_ARTIFACT, - abi.encode("MyZoneName", address(seaport), "https://www.immutable.com", "https://www.immutable.com/docs", OWNER) + abi.encode( + "MyZoneName", address(seaport), "https://www.immutable.com", "https://www.immutable.com/docs", OWNER + ) ) ); vm.prank(OWNER); @@ -272,10 +272,8 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper vm.prank(OWNER); bool success = erc20Token.transfer( FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) + (considerationItems[0].startAmount + considerationItems[1].startAmount + considerationItems[2].startAmount + + considerationItems[3].startAmount) ); require(success, "Unexpectedly, ERC20 transfer failed"); vm.prank(OWNER); @@ -453,10 +451,10 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper vm.prank(OWNER); bool success = erc20Token.transfer( FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) / 100 + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) / 100 ); require(success, "Unexpectedly, ERC20 transfer failed"); vm.prank(OWNER); @@ -638,10 +636,10 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper vm.prank(OWNER); bool success = erc20Token.transfer( FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) * 2 / 100 + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) * 2 / 100 ); require(success, "Unexpectedly, ERC20 transfer failed"); vm.prank(OWNER); @@ -849,26 +847,20 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper }); // mints - { - vm.prank(OWNER); - erc20Token.transfer( - FULFILLER, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) / 2 - ); - } - { - vm.prank(OWNER); - erc20Token.transfer( - FULFILLER_TWO, - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) - ); - } + vm.prank(OWNER); + erc20Token.transfer( + FULFILLER, + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) / 2 + ); + vm.prank(OWNER); + erc20Token.transfer( + FULFILLER_TWO, + (considerationItems[0].startAmount + considerationItems[1].startAmount + considerationItems[2].startAmount + + considerationItems[3].startAmount) + ); vm.prank(OWNER); erc1155Token.safeMint(OFFERER, offerItems[0].identifierOrCriteria, offerItems[0].startAmount, new bytes(0)); @@ -896,10 +888,10 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper assertEq(erc20Token.balanceOf(FULFILLER), 0); assertEq( erc20Token.balanceOf(FULFILLER_TWO), - ( - considerationItems[0].startAmount + considerationItems[1].startAmount - + considerationItems[2].startAmount + considerationItems[3].startAmount - ) / 2 + (considerationItems[0].startAmount + + considerationItems[1].startAmount + + considerationItems[2].startAmount + + considerationItems[3].startAmount) / 2 ); assertEq(erc20Token.balanceOf(PROTOCOL_FEE_RECEIVER), considerationItems[1].startAmount); assertEq(erc20Token.balanceOf(ROYALTY_FEE_RECEIVER), considerationItems[2].startAmount); @@ -907,4 +899,4 @@ contract ImmutableSeaportSignedZoneV3IntegrationTest is Test, SigningTestHelper } } -// solhint-enable func-name-mixedcase, private-vars-leading-underscore +// forge-lint: disable-end(erc20-unchecked-transfer) diff --git a/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol b/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol index 8f3298eb..a1ab1a37 100644 --- a/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol +++ b/test/trading/seaport16/ImmutableSeaportTestHelper.t.sol @@ -5,11 +5,15 @@ import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {SigningTestHelper} from "./utils/SigningTestHelper.t.sol"; import {ItemType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; -import {ZoneParameters, ConsiderationItem, OfferItem, ReceivedItem, SpentItem} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; +import { + ZoneParameters, + ConsiderationItem, + OfferItem, + ReceivedItem, + SpentItem +} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; import {Math} from "openzeppelin-contracts-5.0.2/utils/math/Math.sol"; - - abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { string public constant ZONE_NAME = "ImmutableSignedZone"; string public constant VERSION = "3.0"; @@ -29,17 +33,29 @@ abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { return _createZoneParameters(_extraData, orderHash, _createMockConsideration(10)); } - function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash) internal returns (ZoneParameters memory) { + function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash) + internal + returns (ZoneParameters memory) + { return _createZoneParameters(_extraData, _orderHash, _createMockConsideration(10)); } - function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash, ReceivedItem[] memory _consideration) internal view returns (ZoneParameters memory) { + function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash, ReceivedItem[] memory _consideration) + internal + view + returns (ZoneParameters memory) + { bytes32[] memory orderHashes = new bytes32[](1); orderHashes[0] = _orderHash; return _createZoneParameters(_extraData, _orderHash, orderHashes, _consideration); } - function _createZoneParameters(bytes memory _extraData, bytes32 _orderHash, bytes32[] memory _orderHashes, ReceivedItem[] memory _consideration) internal view returns (ZoneParameters memory) { + function _createZoneParameters( + bytes memory _extraData, + bytes32 _orderHash, + bytes32[] memory _orderHashes, + ReceivedItem[] memory _consideration + ) internal view returns (ZoneParameters memory) { return ZoneParameters({ orderHash: _orderHash, fulfiller: theFulfiller, @@ -60,17 +76,17 @@ abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { address payable recipient = payable(makeAddr(string(abi.encodePacked("recipient", vm.toString(i))))); address payable token = payable(makeAddr(string(abi.encodePacked("token", vm.toString(i))))); consideration[i] = ReceivedItem({ - itemType: ItemType.NATIVE, - token: token, - identifier: 123, - amount: 12, - recipient: recipient + itemType: ItemType.NATIVE, token: token, identifier: 123, amount: 12, recipient: recipient }); } return consideration; } - function _convertConsiderationToReceivedItems(ConsiderationItem[] memory _items) internal pure returns (ReceivedItem[] memory) { + function _convertConsiderationToReceivedItems(ConsiderationItem[] memory _items) + internal + pure + returns (ReceivedItem[] memory) + { ReceivedItem[] memory receivedItems = new ReceivedItem[](_items.length); for (uint256 i = 0; i < _items.length; i++) { receivedItems[i] = ReceivedItem({ @@ -84,7 +100,11 @@ abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { return receivedItems; } - function _createConsiderationItems(address recipient, uint256 amount) internal pure returns (ConsiderationItem[] memory) { + function _createConsiderationItems(address recipient, uint256 amount) + internal + pure + returns (ConsiderationItem[] memory) + { ConsiderationItem[] memory consideration = new ConsiderationItem[](1); consideration[0] = ConsiderationItem({ itemType: ItemType.NATIVE, @@ -97,9 +117,7 @@ abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { return consideration; } - function _deriveReceivedItemsHash( - ReceivedItem[] calldata receivedItems - ) public pure returns (bytes32) { + function _deriveReceivedItemsHash(ReceivedItem[] calldata receivedItems) public pure returns (bytes32) { return _deriveReceivedItemsHash(receivedItems, 1, 1); } @@ -125,17 +143,24 @@ abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { return keccak256(receivedItemsHash); } - function _signOrder(uint256 /* _signerPkey */, bytes32 /* _orderHash */) internal pure returns (bytes memory) { + function _signOrder( + uint256, + /* _signerPkey */ + bytes32 /* _orderHash */ + ) + internal + pure + returns (bytes memory) + { // For the purposes of testing, the offerer wallet will always return valid for signature checks return abi.encodePacked("Hello!"); } - function _signSIP7Order( - uint256 _signerPkey, - bytes32 orderHash, - uint64 expiration, - bytes memory context - ) internal view returns (bytes memory) { + function _signSIP7Order(uint256 _signerPkey, bytes32 orderHash, uint64 expiration, bytes memory context) + internal + view + returns (bytes memory) + { uint256 chainId = block.chainid; bytes32 domainSeparator = keccak256( abi.encode( @@ -166,16 +191,18 @@ abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { function _createOfferItems(address token, uint256 tokenId) internal pure returns (OfferItem[] memory) { OfferItem[] memory offer = new OfferItem[](1); offer[0] = OfferItem({ - itemType: ItemType.ERC721, - token: token, - identifierOrCriteria: tokenId, - startAmount: 1, - endAmount: 1 + itemType: ItemType.ERC721, token: token, identifierOrCriteria: tokenId, startAmount: 1, endAmount: 1 }); return offer; } - function _generateSip7Signature(bytes32 orderHash, address fulfiller, uint256 signerPkey, uint64 _expiration, ConsiderationItem[] memory _consideration) internal view returns (bytes memory) { + function _generateSip7Signature( + bytes32 orderHash, + address fulfiller, + uint256 signerPkey, + uint64 _expiration, + ConsiderationItem[] memory _consideration + ) internal view returns (bytes memory) { ReceivedItem[] memory receivedItems = _convertConsiderationToReceivedItems(_consideration); bytes32 substandard3Data = this._deriveReceivedItemsHash(receivedItems); bytes32[] memory orderHashes = new bytes32[](1); @@ -184,12 +211,6 @@ abstract contract ImmutableSeaportTestHelper is Test, SigningTestHelper { bytes memory context = abi.encodePacked(bytes1(0x03), substandard3Data, bytes1(0x04), substandard4Data); bytes memory signature = _signSIP7Order(signerPkey, orderHash, _expiration, context); - return abi.encodePacked( - bytes1(0), - fulfiller, - _expiration, - signature, - context - ); + return abi.encodePacked(bytes1(0), fulfiller, _expiration, signature, context); } -} \ No newline at end of file +} diff --git a/test/trading/seaport16/utils/MockTransferValidator.t.sol b/test/trading/seaport16/utils/MockTransferValidator.t.sol index d88416aa..c31f6c49 100644 --- a/test/trading/seaport16/utils/MockTransferValidator.t.sol +++ b/test/trading/seaport16/utils/MockTransferValidator.t.sol @@ -1,7 +1,5 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ITransferValidator} from "@limitbreak/creator-token-standards/src/interfaces/ITransferValidator.sol"; @@ -81,7 +79,13 @@ contract MockTransferValidator is ITransferValidator { _revertValidateTransferWithTokenIdTokenId = tokenId; } - function revertValidateTransferWithTokenIdAndAmount(address caller, address from, address to, uint256 tokenId, uint256 amount) public { + function revertValidateTransferWithTokenIdAndAmount( + address caller, + address from, + address to, + uint256 tokenId, + uint256 amount + ) public { _shouldRevertValidateTransferWithTokenIdAndAmount = true; _revertValidateTransferWithTokenIdAndAmountCaller = caller; _revertValidateTransferWithTokenIdAndAmountFrom = from; @@ -90,7 +94,9 @@ contract MockTransferValidator is ITransferValidator { _revertValidateTransferWithTokenIdAndAmountAmount = amount; } - function revertBeforeAuthorizedTransferWithOperatorAndTokenId(address operator, address token, uint256 tokenId) public { + function revertBeforeAuthorizedTransferWithOperatorAndTokenId(address operator, address token, uint256 tokenId) + public + { _shouldRevertBeforeAuthorizedTransferWithOperatorAndTokenId = true; _revertBeforeAuthorizedTransferWithOperatorAndTokenIdOperator = operator; _revertBeforeAuthorizedTransferWithOperatorAndTokenIdToken = token; @@ -135,10 +141,8 @@ contract MockTransferValidator is ITransferValidator { function applyCollectionTransferPolicy(address caller, address from, address to) external view override { if ( - _shouldRevertApplyCollectionTransferPolicy && - caller == _revertApplyCollectionTransferPolicyCaller && - from == _revertApplyCollectionTransferPolicyFrom && - to == _revertApplyCollectionTransferPolicyTo + _shouldRevertApplyCollectionTransferPolicy && caller == _revertApplyCollectionTransferPolicyCaller + && from == _revertApplyCollectionTransferPolicyFrom && to == _revertApplyCollectionTransferPolicyTo ) { revert MockTransferValidatorRevert("applyCollectionTransferPolicy(address caller, address from, address to)"); } @@ -146,10 +150,8 @@ contract MockTransferValidator is ITransferValidator { function validateTransfer(address caller, address from, address to) external view override { if ( - _shouldRevertValidateTransfer && - caller == _revertValidateTransferCaller && - from == _revertValidateTransferFrom && - to == _revertValidateTransferTo + _shouldRevertValidateTransfer && caller == _revertValidateTransferCaller + && from == _revertValidateTransferFrom && to == _revertValidateTransferTo ) { revert MockTransferValidatorRevert("validateTransfer(address caller, address from, address to)"); } @@ -157,24 +159,26 @@ contract MockTransferValidator is ITransferValidator { function validateTransfer(address caller, address from, address to, uint256 tokenId) external view override { if ( - _shouldRevertValidateTransferWithTokenId && - caller == _revertValidateTransferWithTokenIdCaller && - from == _revertValidateTransferWithTokenIdFrom && - to == _revertValidateTransferWithTokenIdTo && - tokenId == _revertValidateTransferWithTokenIdTokenId + _shouldRevertValidateTransferWithTokenId && caller == _revertValidateTransferWithTokenIdCaller + && from == _revertValidateTransferWithTokenIdFrom && to == _revertValidateTransferWithTokenIdTo + && tokenId == _revertValidateTransferWithTokenIdTokenId ) { revert MockTransferValidatorRevert("validateTransfer(address caller, address from, address to, uint256 tokenId)"); } } - function validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount) external view override { + function validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount) + external + view + override + { if ( - _shouldRevertValidateTransferWithTokenIdAndAmount && - caller == _revertValidateTransferWithTokenIdAndAmountCaller && - from == _revertValidateTransferWithTokenIdAndAmountFrom && - to == _revertValidateTransferWithTokenIdAndAmountTo && - tokenId == _revertValidateTransferWithTokenIdAndAmountTokenId && - amount == _revertValidateTransferWithTokenIdAndAmountAmount + _shouldRevertValidateTransferWithTokenIdAndAmount + && caller == _revertValidateTransferWithTokenIdAndAmountCaller + && from == _revertValidateTransferWithTokenIdAndAmountFrom + && to == _revertValidateTransferWithTokenIdAndAmountTo + && tokenId == _revertValidateTransferWithTokenIdAndAmountTokenId + && amount == _revertValidateTransferWithTokenIdAndAmountAmount ) { revert MockTransferValidatorRevert("validateTransfer(address caller, address from, address to, uint256 tokenId, uint256 amount)"); } @@ -182,10 +186,10 @@ contract MockTransferValidator is ITransferValidator { function beforeAuthorizedTransfer(address operator, address token, uint256 tokenId) external view override { if ( - _shouldRevertBeforeAuthorizedTransferWithOperatorAndTokenId && - operator == _revertBeforeAuthorizedTransferWithOperatorAndTokenIdOperator && - token == _revertBeforeAuthorizedTransferWithOperatorAndTokenIdToken && - tokenId == _revertBeforeAuthorizedTransferWithOperatorAndTokenIdTokenId + _shouldRevertBeforeAuthorizedTransferWithOperatorAndTokenId + && operator == _revertBeforeAuthorizedTransferWithOperatorAndTokenIdOperator + && token == _revertBeforeAuthorizedTransferWithOperatorAndTokenIdToken + && tokenId == _revertBeforeAuthorizedTransferWithOperatorAndTokenIdTokenId ) { revert MockTransferValidatorRevert("beforeAuthorizedTransfer(address operator, address token, uint256 tokenId)"); } @@ -193,9 +197,8 @@ contract MockTransferValidator is ITransferValidator { function afterAuthorizedTransfer(address token, uint256 tokenId) external view override { if ( - _shouldRevertAfterAuthorizedTransferWithTokenId && - token == _revertAfterAuthorizedTransferWithTokenIdToken && - tokenId == _revertAfterAuthorizedTransferWithTokenIdTokenId + _shouldRevertAfterAuthorizedTransferWithTokenId && token == _revertAfterAuthorizedTransferWithTokenIdToken + && tokenId == _revertAfterAuthorizedTransferWithTokenIdTokenId ) { revert MockTransferValidatorRevert("afterAuthorizedTransfer(address token, uint256 tokenId)"); } @@ -203,28 +206,24 @@ contract MockTransferValidator is ITransferValidator { function beforeAuthorizedTransfer(address operator, address token) external view override { if ( - _shouldRevertBeforeAuthorizedTransferWithOperator && - operator == _revertBeforeAuthorizedTransferWithOperatorOperator && - token == _revertBeforeAuthorizedTransferWithOperatorToken + _shouldRevertBeforeAuthorizedTransferWithOperator + && operator == _revertBeforeAuthorizedTransferWithOperatorOperator + && token == _revertBeforeAuthorizedTransferWithOperatorToken ) { revert MockTransferValidatorRevert("beforeAuthorizedTransfer(address operator, address token)"); } } function afterAuthorizedTransfer(address token) external view override { - if ( - _shouldRevertAfterAuthorizedTransfer && - token == _revertAfterAuthorizedTransferToken - ) { + if (_shouldRevertAfterAuthorizedTransfer && token == _revertAfterAuthorizedTransferToken) { revert MockTransferValidatorRevert("afterAuthorizedTransfer(address token)"); } } function beforeAuthorizedTransfer(address token, uint256 tokenId) external view override { if ( - _shouldRevertBeforeAuthorizedTransferWithTokenId && - token == _revertBeforeAuthorizedTransferWithTokenIdToken && - tokenId == _revertBeforeAuthorizedTransferWithTokenIdTokenId + _shouldRevertBeforeAuthorizedTransferWithTokenId && token == _revertBeforeAuthorizedTransferWithTokenIdToken + && tokenId == _revertBeforeAuthorizedTransferWithTokenIdTokenId ) { revert MockTransferValidatorRevert("beforeAuthorizedTransfer(address token, uint256 tokenId)"); } @@ -232,10 +231,9 @@ contract MockTransferValidator is ITransferValidator { function beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 amount) external view override { if ( - _shouldRevertBeforeAuthorizedTransferWithAmount && - token == _revertBeforeAuthorizedTransferWithAmountToken && - tokenId == _revertBeforeAuthorizedTransferWithAmountTokenId && - amount == _revertBeforeAuthorizedTransferWithAmountAmount + _shouldRevertBeforeAuthorizedTransferWithAmount && token == _revertBeforeAuthorizedTransferWithAmountToken + && tokenId == _revertBeforeAuthorizedTransferWithAmountTokenId + && amount == _revertBeforeAuthorizedTransferWithAmountAmount ) { revert MockTransferValidatorRevert("beforeAuthorizedTransferWithAmount(address token, uint256 tokenId, uint256 amount)"); } @@ -243,9 +241,8 @@ contract MockTransferValidator is ITransferValidator { function afterAuthorizedTransferWithAmount(address token, uint256 tokenId) external view override { if ( - _shouldRevertAfterAuthorizedTransferWithAmount && - token == _revertAfterAuthorizedTransferWithAmountToken && - tokenId == _revertAfterAuthorizedTransferWithAmountTokenId + _shouldRevertAfterAuthorizedTransferWithAmount && token == _revertAfterAuthorizedTransferWithAmountToken + && tokenId == _revertAfterAuthorizedTransferWithAmountTokenId ) { revert MockTransferValidatorRevert("afterAuthorizedTransferWithAmount(address token, uint256 tokenId)"); } diff --git a/test/trading/seaport16/utils/SigningTestHelper.t.sol b/test/trading/seaport16/utils/SigningTestHelper.t.sol index bd6699c5..217d5f07 100644 --- a/test/trading/seaport16/utils/SigningTestHelper.t.sol +++ b/test/trading/seaport16/utils/SigningTestHelper.t.sol @@ -1,10 +1,7 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; abstract contract SigningTestHelper is Test { diff --git a/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol b/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol index ca2bf26a..40fffc00 100644 --- a/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol +++ b/test/trading/seaport16/zones/immutable-signed-zone/v3/IImmutableSignedZoneV3Harness.t.sol @@ -1,14 +1,12 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ZoneInterface} from "seaport-16/contracts/interfaces/ZoneInterface.sol"; import {ReceivedItem, ZoneParameters} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; -import {SIP7Interface} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol"; - -// solhint-disable func-name-mixedcase +import { + SIP7Interface +} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7Interface.sol"; interface IImmutableSignedZoneV3Harness is ZoneInterface, SIP7Interface { function grantRole(bytes32 role, address account) external; @@ -67,5 +65,3 @@ interface IImmutableSignedZoneV3Harness is ZoneInterface, SIP7Interface { pure returns (bool); } - -// solhint-enable func-name-mixedcase diff --git a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol index 50bdd8a3..19ae3daa 100644 --- a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol +++ b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.t.sol @@ -1,30 +1,30 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; -// solhint-disable-next-line no-global-import import {Test} from "forge-std/Test.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import {ItemType} from "seaport-types-16/src/lib/ConsiderationEnums.sol"; import {ReceivedItem, Schema, SpentItem, ZoneParameters} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; -import {ImmutableSignedZoneV3} from - "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; -import {SIP5EventsAndErrors} from - "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol"; -import {SIP6EventsAndErrors} from - "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol"; -import {SIP7EventsAndErrors} from - "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol"; -import {ZoneAccessControlEventsAndErrors} from - "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol"; +import { + ImmutableSignedZoneV3 +} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; +import { + SIP5EventsAndErrors +} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP5EventsAndErrors.sol"; +import { + SIP6EventsAndErrors +} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP6EventsAndErrors.sol"; +import { + SIP7EventsAndErrors +} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/SIP7EventsAndErrors.sol"; +import { + ZoneAccessControlEventsAndErrors +} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/interfaces/ZoneAccessControlEventsAndErrors.sol"; import {SigningTestHelper} from "../../../../seaport/utils/SigningTestHelper.t.sol"; import {ImmutableSignedZoneV3Harness} from "./ImmutableSignedZoneV3Harness.t.sol"; import {MockTransferValidator, MockTransferValidatorRevert} from "../../../utils/MockTransferValidator.t.sol"; -// solhint-disable func-name-mixedcase - contract ImmutableSignedZoneV3Test is Test, SigningTestHelper, @@ -33,7 +33,6 @@ contract ImmutableSignedZoneV3Test is SIP6EventsAndErrors, SIP7EventsAndErrors { - // solhint-disable private-vars-leading-underscore uint64 private constant DEFAULT_EXPIRATION = 100; address private immutable OWNER = makeAddr("owner"); address private immutable FULFILLER = makeAddr("fulfiller"); @@ -41,7 +40,6 @@ contract ImmutableSignedZoneV3Test is address private immutable SIGNER; uint256 private immutable SIGNER_PRIVATE_KEY; address private immutable SEAPORT = makeAddr("seaport"); - // solhint-enable private-vars-leading-underscore // OpenZeppelin v5 access/IAccessControl.sol error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); @@ -369,8 +367,9 @@ contract ImmutableSignedZoneV3Test is string memory expectedApiEndpoint = "https://www.immutable.com"; string memory expectedDocumentationURI = "https://www.immutable.com/docs"; - ImmutableSignedZoneV3Harness zone = - new ImmutableSignedZoneV3Harness(expectedZoneName, SEAPORT, expectedApiEndpoint, expectedDocumentationURI, OWNER); + ImmutableSignedZoneV3Harness zone = new ImmutableSignedZoneV3Harness( + expectedZoneName, SEAPORT, expectedApiEndpoint, expectedDocumentationURI, OWNER + ); bytes32 expectedDomainSeparator = zone.exposed_deriveDomainSeparator(); uint256[] memory expectedSubstandards = zone.exposed_getSupportedSubstandards(); @@ -398,8 +397,9 @@ contract ImmutableSignedZoneV3Test is string memory expectedApiEndpoint = "https://www.immutable.com"; string memory expectedDocumentationURI = "https://www.immutable.com/docs"; - ImmutableSignedZoneV3Harness zone = - new ImmutableSignedZoneV3Harness("MyZoneName", SEAPORT, expectedApiEndpoint, expectedDocumentationURI, OWNER); + ImmutableSignedZoneV3Harness zone = new ImmutableSignedZoneV3Harness( + "MyZoneName", SEAPORT, expectedApiEndpoint, expectedDocumentationURI, OWNER + ); bytes32 expectedDomainSeparator = zone.exposed_deriveDomainSeparator(); uint256[] memory expectedSubstandards = zone.exposed_getSupportedSubstandards(); @@ -512,14 +512,7 @@ contract ImmutableSignedZoneV3Test is new bytes(0) ); - vm.expectRevert( - abi.encodeWithSelector( - SignatureExpired.selector, - 1000, - 100, - zoneParameters.orderHash - ) - ); + vm.expectRevert(abi.encodeWithSelector(SignatureExpired.selector, 1000, 100, zoneParameters.orderHash)); // set current block.timestamp to be 1000 vm.warp(1000); vm.prank(SEAPORT); @@ -532,20 +525,12 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); zoneParameters.fulfiller = makeAddr("random"); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - FULFILLER, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - new bytes(0) + zone, SIGNER_PRIVATE_KEY, FULFILLER, DEFAULT_EXPIRATION, zoneParameters.orderHash, new bytes(0) ); vm.expectRevert( abi.encodeWithSelector( - InvalidFulfiller.selector, - FULFILLER, - zoneParameters.fulfiller, - zoneParameters.orderHash + InvalidFulfiller.selector, FULFILLER, zoneParameters.fulfiller, zoneParameters.orderHash ) ); vm.prank(SEAPORT); @@ -566,12 +551,7 @@ contract ImmutableSignedZoneV3Test is new bytes(0) ); - vm.expectRevert( - abi.encodeWithSelector( - NoSpentItems.selector, - zoneParameters.orderHash - ) - ); + vm.expectRevert(abi.encodeWithSelector(NoSpentItems.selector, zoneParameters.orderHash)); vm.prank(SEAPORT); zone.authorizeOrder(zoneParameters); } @@ -590,12 +570,7 @@ contract ImmutableSignedZoneV3Test is new bytes(0) ); - vm.expectRevert( - abi.encodeWithSelector( - NoReceivedItems.selector, - zoneParameters.orderHash - ) - ); + vm.expectRevert(abi.encodeWithSelector(NoReceivedItems.selector, zoneParameters.orderHash)); vm.prank(SEAPORT); zone.authorizeOrder(zoneParameters); } @@ -821,12 +796,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = new bytes(0); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -852,12 +822,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x01), zoneParameters.consideration[0].identifier); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -878,12 +843,7 @@ contract ImmutableSignedZoneV3Test is bytes32 substandard3Data = zone.exposed_deriveReceivedItemsHash(zoneParameters.consideration, 1, 1); bytes memory context = abi.encodePacked(bytes1(0x03), substandard3Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -904,12 +864,7 @@ contract ImmutableSignedZoneV3Test is bytes memory substandard4Data = abi.encode(zoneParameters.orderHashes); bytes memory context = abi.encodePacked(bytes1(0x04), substandard4Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -934,23 +889,14 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; bytes32 substandard6Data = zone.exposed_deriveReceivedItemsHash(zoneParameters.consideration, 100, 10); bytes memory context = abi.encodePacked(bytes1(0x06), uint256(100), substandard6Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -971,34 +917,23 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - SpentItem memory spentItem = SpentItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100 - }); + SpentItem memory spentItem = + SpentItem({itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100}); spentItems[0] = spentItem; zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1, - recipient: payable(address(0x3)) + itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), address(0x7)); + bytes memory context = abi.encodePacked( + bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), address(0x7) + ); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -1019,34 +954,22 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - SpentItem memory spentItem = SpentItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100 - }); + SpentItem memory spentItem = + SpentItem({itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100}); spentItems[0] = spentItem; zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1, - recipient: payable(address(0x3)) + itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); + bytes memory context = + abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -1069,12 +992,7 @@ contract ImmutableSignedZoneV3Test is bytes memory substandard4Data = abi.encode(zoneParameters.orderHashes); bytes memory context = abi.encodePacked(bytes1(0x03), substandard3Data, bytes1(0x04), substandard4Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -1099,11 +1017,7 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x4), - identifier: 0, - amount: 20, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x4), identifier: 0, amount: 20, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; zoneParameters.consideration = receivedItems; @@ -1112,12 +1026,7 @@ contract ImmutableSignedZoneV3Test is bytes memory substandard6Data = abi.encodePacked(uint256(10), substandard3Data); bytes memory context = abi.encodePacked(bytes1(0x03), substandard3Data, bytes1(0x06), substandard6Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -1142,11 +1051,7 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x4), - identifier: 0, - amount: 20, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x4), identifier: 0, amount: 20, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; zoneParameters.consideration = receivedItems; @@ -1156,15 +1061,17 @@ contract ImmutableSignedZoneV3Test is bytes memory substandard4Data = abi.encode(zoneParameters.orderHashes); bytes memory substandard6Data = abi.encodePacked(uint256(10), substandard3Data); bytes memory context = abi.encodePacked( - bytes1(0x01), substandard1Data, bytes1(0x03), substandard3Data, bytes1(0x04), substandard4Data, bytes1(0x06), substandard6Data + bytes1(0x01), + substandard1Data, + bytes1(0x03), + substandard3Data, + bytes1(0x04), + substandard4Data, + bytes1(0x06), + substandard6Data ); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); zone.exposed_validateSubstandards(context, zoneParameters, before); @@ -1177,11 +1084,7 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; zoneParameters.consideration = receivedItems; @@ -1190,12 +1093,7 @@ contract ImmutableSignedZoneV3Test is bytes memory substandard4Data = abi.encode(zoneParameters.orderHashes); bytes memory context = abi.encodePacked(bytes1(0x04), substandard4Data, bytes1(0x03), substandard3Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1214,12 +1112,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x03)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard1(context, zoneParameters, true); @@ -1232,12 +1125,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x01), bytes10(0)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1259,23 +1147,14 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC721, - token: address(0x2), - identifier: 45, - amount: 1, - recipient: payable(address(0x3)) + itemType: ItemType.ERC721, token: address(0x2), identifier: 45, amount: 1, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; zoneParameters.consideration = receivedItems; bytes memory context = abi.encodePacked(bytes1(0x01), uint256(46)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert(abi.encodeWithSelector(Substandard1Violation.selector, zoneParameters.orderHash, 45, 46)); @@ -1301,23 +1180,14 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); ReceivedItem memory receivedItem = ReceivedItem({ - itemType: ItemType.ERC721, - token: address(0x2), - identifier: 45, - amount: 1, - recipient: payable(address(0x3)) + itemType: ItemType.ERC721, token: address(0x2), identifier: 45, amount: 1, recipient: payable(address(0x3)) }); receivedItems[0] = receivedItem; zoneParameters.consideration = receivedItems; bytes memory context = abi.encodePacked(bytes1(0x01), uint256(45)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard1(context, zoneParameters, before); @@ -1332,12 +1202,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x04)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard3(context, zoneParameters, true); @@ -1350,12 +1215,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x03), bytes10(0)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1372,12 +1232,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x03), bytes32(0)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert(abi.encodeWithSelector(Substandard3Violation.selector, zoneParameters.orderHash)); @@ -1400,12 +1255,7 @@ contract ImmutableSignedZoneV3Test is bytes32 substandard3Data = zone.exposed_deriveReceivedItemsHash(zoneParameters.consideration, 1, 1); bytes memory context = abi.encodePacked(bytes1(0x03), substandard3Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard3(context, zoneParameters, before); @@ -1420,12 +1270,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x02)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard4(context, zoneParameters, true); @@ -1439,12 +1284,7 @@ contract ImmutableSignedZoneV3Test is bytes memory context = abi.encodePacked(bytes1(0x04), bytes10(0)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1469,12 +1309,7 @@ contract ImmutableSignedZoneV3Test is bytes memory context = abi.encodePacked(bytes1(0x04), abi.encode(expectedOrderHashes)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1502,12 +1337,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x04), abi.encode(zoneParameters.orderHashes)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard4(context, zoneParameters, before); @@ -1523,12 +1353,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x04)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard6(context, zoneParameters, true); @@ -1541,12 +1366,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x06), bytes10(0)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1563,16 +1383,13 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x06), uint256(100), bytes32(uint256(0x123456))); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( - abi.encodeWithSelector(Substandard6Violation.selector, zoneParameters.offer[0].amount, 100, zoneParameters.orderHash) + abi.encodeWithSelector( + Substandard6Violation.selector, zoneParameters.offer[0].amount, 100, zoneParameters.orderHash + ) ); zone.exposed_validateSubstandard6(context, zoneParameters, true); } @@ -1596,23 +1413,14 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; bytes32 substandard6Data = zone.exposed_deriveReceivedItemsHash(zoneParameters.consideration, 100, 10); bytes memory context = abi.encodePacked(bytes1(0x06), uint256(100), substandard6Data); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard6(context, zoneParameters, before); @@ -1628,12 +1436,7 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); bytes memory context = abi.encodePacked(bytes1(0x04)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard7(context, zoneParameters, true); @@ -1647,12 +1450,7 @@ contract ImmutableSignedZoneV3Test is bytes memory context = abi.encodePacked(bytes1(0x07), bytes10(0)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1674,25 +1472,18 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC721, - token: address(0x2), - identifier: 45, - amount: 1, - recipient: payable(address(0x3)) + itemType: ItemType.ERC721, token: address(0x2), identifier: 45, amount: 1, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; bytes memory context = abi.encodePacked(bytes1(0x07), uint256(46), address(0x6), address(0x7)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); - vm.expectRevert(abi.encodeWithSelector(Substandard7IdentifierViolation.selector, zoneParameters.orderHash, 45, 46)); + vm.expectRevert( + abi.encodeWithSelector(Substandard7IdentifierViolation.selector, zoneParameters.orderHash, 45, 46) + ); zone.exposed_validateSubstandard7(context, zoneParameters, true); } @@ -1702,35 +1493,23 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 0, - amount: 50 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC20, token: address(0x2), identifier: 0, amount: 50}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; bytes memory context = abi.encodePacked(bytes1(0x07), uint256(0), address(0x6), address(0x7)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); - vm.expectRevert(abi.encodeWithSelector(Substandard7UnexpectedItemTypeViolation.selector, zoneParameters.orderHash)); + vm.expectRevert( + abi.encodeWithSelector(Substandard7UnexpectedItemTypeViolation.selector, zoneParameters.orderHash) + ); zone.exposed_validateSubstandard7(context, zoneParameters, true); } @@ -1742,36 +1521,28 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), operator); + bytes memory context = abi.encodePacked( + bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), operator + ); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); transferValidator.revertBeforeAuthorizedTransferWithOperator(operator, zoneParameters.offer[0].token); - vm.expectRevert(abi.encodeWithSelector(MockTransferValidatorRevert.selector, "beforeAuthorizedTransfer(address operator, address token)")); + vm.expectRevert( + abi.encodeWithSelector( + MockTransferValidatorRevert.selector, "beforeAuthorizedTransfer(address operator, address token)" + ) + ); zone.exposed_validateSubstandard7(context, zoneParameters, true); } @@ -1783,36 +1554,26 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), operator); + bytes memory context = abi.encodePacked( + bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), operator + ); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); transferValidator.revertAfterAuthorizedTransfer(zoneParameters.offer[0].token); - vm.expectRevert(abi.encodeWithSelector(MockTransferValidatorRevert.selector, "afterAuthorizedTransfer(address token)")); + vm.expectRevert( + abi.encodeWithSelector(MockTransferValidatorRevert.selector, "afterAuthorizedTransfer(address token)") + ); zone.exposed_validateSubstandard7(context, zoneParameters, false); } @@ -1832,32 +1593,20 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), operator); + bytes memory context = abi.encodePacked( + bytes1(0x07), zoneParameters.consideration[0].identifier, address(transferValidator), operator + ); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard7(context, zoneParameters, before); @@ -1873,12 +1622,7 @@ contract ImmutableSignedZoneV3Test is bytes memory context = abi.encodePacked(bytes1(0x04)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard8(context, zoneParameters, true); @@ -1892,12 +1636,7 @@ contract ImmutableSignedZoneV3Test is bytes memory context = abi.encodePacked(bytes1(0x08), bytes10(0)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); vm.expectRevert( @@ -1914,35 +1653,23 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 0, - amount: 50 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC20, token: address(0x2), identifier: 0, amount: 50}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC721, - token: address(0x5), - identifier: 45, - amount: 1, - recipient: payable(address(0x3)) + itemType: ItemType.ERC721, token: address(0x5), identifier: 45, amount: 1, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; bytes memory context = abi.encodePacked(bytes1(0x08), uint256(46), address(0x6)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); - vm.expectRevert(abi.encodeWithSelector(Substandard8IdentifierViolation.selector, zoneParameters.orderHash, 45, 46)); + vm.expectRevert( + abi.encodeWithSelector(Substandard8IdentifierViolation.selector, zoneParameters.orderHash, 45, 46) + ); zone.exposed_validateSubstandard8(context, zoneParameters, true); } @@ -1952,35 +1679,23 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 0, - amount: 50 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC20, token: address(0x2), identifier: 0, amount: 50}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; bytes memory context = abi.encodePacked(bytes1(0x08), uint256(0), address(0x6)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); - vm.expectRevert(abi.encodeWithSelector(Substandard8UnexpectedItemTypeViolation.selector, zoneParameters.orderHash)); + vm.expectRevert( + abi.encodeWithSelector(Substandard8UnexpectedItemTypeViolation.selector, zoneParameters.orderHash) + ); zone.exposed_validateSubstandard8(context, zoneParameters, true); } @@ -1991,36 +1706,27 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); + bytes memory context = + abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); transferValidator.revertBeforeAuthorizedTransferWithTokenId(address(0x8), zoneParameters.offer[0].identifier); - vm.expectRevert(abi.encodeWithSelector(MockTransferValidatorRevert.selector, "beforeAuthorizedTransfer(address token, uint256 tokenId)")); + vm.expectRevert( + abi.encodeWithSelector( + MockTransferValidatorRevert.selector, "beforeAuthorizedTransfer(address token, uint256 tokenId)" + ) + ); zone.exposed_validateSubstandard8(context, zoneParameters, true); } @@ -2031,36 +1737,27 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); + bytes memory context = + abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); transferValidator.revertAfterAuthorizedTransferWithTokenId(address(0x8), zoneParameters.offer[0].identifier); - vm.expectRevert(abi.encodeWithSelector(MockTransferValidatorRevert.selector, "afterAuthorizedTransfer(address token, uint256 tokenId)")); + vm.expectRevert( + abi.encodeWithSelector( + MockTransferValidatorRevert.selector, "afterAuthorizedTransfer(address token, uint256 tokenId)" + ) + ); zone.exposed_validateSubstandard8(context, zoneParameters, false); } @@ -2079,32 +1776,19 @@ contract ImmutableSignedZoneV3Test is ZoneParameters memory zoneParameters = _defaultBaseZoneParameters(); SpentItem[] memory spentItems = new SpentItem[](1); - spentItems[0] = SpentItem({ - itemType: ItemType.ERC721, - token: address(0x8), - identifier: 222, - amount: 1 - }); + spentItems[0] = SpentItem({itemType: ItemType.ERC721, token: address(0x8), identifier: 222, amount: 1}); zoneParameters.offer = spentItems; ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x9), - identifier: 0, - amount: 100, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x9), identifier: 0, amount: 100, recipient: payable(address(0x3)) }); zoneParameters.consideration = receivedItems; - bytes memory context = abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); + bytes memory context = + abi.encodePacked(bytes1(0x08), zoneParameters.consideration[0].identifier, address(transferValidator)); zoneParameters.extraData = _buildExtraData( - zone, - SIGNER_PRIVATE_KEY, - zoneParameters.fulfiller, - DEFAULT_EXPIRATION, - zoneParameters.orderHash, - context + zone, SIGNER_PRIVATE_KEY, zoneParameters.fulfiller, DEFAULT_EXPIRATION, zoneParameters.orderHash, context ); uint256 substandardLengthResult = zone.exposed_validateSubstandard8(context, zoneParameters, before); @@ -2127,18 +1811,10 @@ contract ImmutableSignedZoneV3Test is ReceivedItem[] memory receivedItems = new ReceivedItem[](2); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); receivedItems[1] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 199, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 199, amount: 10, recipient: payable(address(0x3)) }); // console.logBytes32(zone.exposed_deriveReceivedItemsHash(receivedItems, 100, 10)); @@ -2150,11 +1826,7 @@ contract ImmutableSignedZoneV3Test is ImmutableSignedZoneV3Harness zone = _newZoneHarness(OWNER); ReceivedItem[] memory receivedItems = new ReceivedItem[](1); receivedItems[0] = ReceivedItem({ - itemType: ItemType.ERC20, - token: address(0x2), - identifier: 222, - amount: 10, - recipient: payable(address(0x3)) + itemType: ItemType.ERC20, token: address(0x2), identifier: 222, amount: 10, recipient: payable(address(0x3)) }); // console.logBytes32(zone.exposed_deriveReceivedItemsHash(receivedItems, type(uint256).max, 100)); @@ -2237,7 +1909,9 @@ contract ImmutableSignedZoneV3Test is spentItems[0] = SpentItem({itemType: ItemType.ERC721, token: address(0x66), identifier: 111, amount: 1}); ReceivedItem[] memory receivedItems = new ReceivedItem[](1); - receivedItems[0] = ReceivedItem({itemType: ItemType.ERC20, token: address(0x77), identifier: 0, amount: 10, recipient: payable(address(0x3))}); + receivedItems[0] = ReceivedItem({ + itemType: ItemType.ERC20, token: address(0x77), identifier: 0, amount: 10, recipient: payable(address(0x3)) + }); bytes32 orderHash = bytes32(0x43592598d0419e49d268e9b553427fd7ba1dd091eaa3f6127161e44afb7b40f9); bytes32[] memory orderHashes = new bytes32[](1); @@ -2272,11 +1946,11 @@ contract ImmutableSignedZoneV3Test is bytes1(0), fulfiller, expiration, - _signCompact(signerPrivateKey, ECDSA.toTypedDataHash(zone.exposed_domainSeparator(), eip712SignedOrderHash)), + _signCompact( + signerPrivateKey, ECDSA.toTypedDataHash(zone.exposed_domainSeparator(), eip712SignedOrderHash) + ), context ); return extraData; } } - -// solhint-enable func-name-mixedcase diff --git a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol index 59caebdf..9f4d380b 100644 --- a/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol +++ b/test/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3Harness.t.sol @@ -1,14 +1,11 @@ // Copyright (c) Immutable Pty Ltd 2018 - 2026 // SPDX-License-Identifier: Apache-2 - -// solhint-disable-next-line compiler-version pragma solidity ^0.8.17; import {ReceivedItem, ZoneParameters} from "seaport-types-16/src/lib/ConsiderationStructs.sol"; -import {ImmutableSignedZoneV3} from - "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; - -// solhint-disable func-name-mixedcase +import { + ImmutableSignedZoneV3 +} from "../../../../../../contracts/trading/seaport16/zones/immutable-signed-zone/v3/ImmutableSignedZoneV3.sol"; contract ImmutableSignedZoneV3Harness is ImmutableSignedZoneV3 { constructor( @@ -17,9 +14,7 @@ contract ImmutableSignedZoneV3Harness is ImmutableSignedZoneV3 { string memory apiEndpoint, string memory documentationURI, address owner - ) - ImmutableSignedZoneV3(zoneName, seaport, apiEndpoint, documentationURI, owner) - {} + ) ImmutableSignedZoneV3(zoneName, seaport, apiEndpoint, documentationURI, owner) {} function exposed_domainSeparator() external view returns (bytes32) { return _domainSeparator(); @@ -110,5 +105,3 @@ contract ImmutableSignedZoneV3Harness is ImmutableSignedZoneV3 { return _bytes32ArrayIncludes(sourceArray, values); } } - -// solhint-enable func-name-mixedcase diff --git a/test/utils/Sign.sol b/test/utils/Sign.sol index 2d69ba42..c8ff2427 100644 --- a/test/utils/Sign.sol +++ b/test/utils/Sign.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; -import {Test} from "forge-std/Test.sol"; - contract Sign { bytes32 private _DOMAIN_SEPARATOR; bytes32 private immutable _PERMIT_TYPEHASH = diff --git a/yarn.lock b/yarn.lock index 0973ed46..fd442865 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,90 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== - dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" - -"@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-identifier@^7.27.1": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@humanwhocodes/momoa@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@humanwhocodes/momoa/-/momoa-2.0.4.tgz#8b9e7a629651d15009c3587d07a222deeb829385" - integrity sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA== - -"@pnpm/config.env-replace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" - integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== - -"@pnpm/network.ca-file@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" - integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== - dependencies: - graceful-fs "4.2.10" - -"@pnpm/npm-conf@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== - dependencies: - "@pnpm/config.env-replace" "^1.1.0" - "@pnpm/network.ca-file" "^1.0.1" - config-chain "^1.1.11" - -"@sindresorhus/is@^5.2.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" - integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== - -"@solidity-parser/parser@^0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.20.2.tgz#e07053488ed60dae1b54f6fe37bb6d2c5fe146a7" - integrity sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA== - -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - -"@types/http-cache-semantics@^4.0.2": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== - "@types/node@^22.15.0": version "22.19.19" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.19.tgz#3124bf26ded54168b768138321fef99b420c6112" @@ -93,650 +9,6 @@ dependencies: undici-types "~6.21.0" -ajv-errors@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-3.0.0.tgz#e54f299f3a3d30fe144161e5f0d8d51196c527bc" - integrity sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ== - -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^8.18.0: - version "8.20.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" - integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -ast-parents@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -balanced-match@^4.0.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" - integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== - -better-ajv-errors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/better-ajv-errors/-/better-ajv-errors-2.0.2.tgz#868e7b9ea091077de0fca41770995868baa30ed6" - integrity sha512-1cLrJXEq46n0hjV8dDYwg9LKYjDb3KbeW7nZTv4kvfoDD9c2DXHIE31nxM+Y/cIfXMggLUfmxbm6h/JoM/yotA== - dependencies: - "@babel/code-frame" "^7.27.1" - "@humanwhocodes/momoa" "^2.0.4" - chalk "^4.1.2" - jsonpointer "^5.0.1" - leven "^3.1.0 < 4" - -brace-expansion@^5.0.5: - version "5.0.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.6.tgz#ec68fe0a641a29d8711579caf641d05bae1f2285" - integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g== - dependencies: - balanced-match "^4.0.2" - -cacheable-lookup@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" - integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== - -cacheable-request@^10.2.8: - version "10.2.14" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" - integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== - dependencies: - "@types/http-cache-semantics" "^4.0.2" - get-stream "^6.0.1" - http-cache-semantics "^4.1.1" - keyv "^4.5.3" - mimic-response "^4.0.0" - normalize-url "^8.0.0" - responselike "^3.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -config-chain@^1.1.11: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -cosmiconfig@^8.0.0: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-uri@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec" - integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== - -form-data-encoder@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" - integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== - -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob@^13.0.6: - version "13.0.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" - integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== - dependencies: - minimatch "^10.2.2" - minipass "^7.1.3" - path-scurry "^2.0.2" - -got@^12.1.0: - version "12.6.1" - resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" - integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== - dependencies: - "@sindresorhus/is" "^5.2.0" - "@szmarczak/http-timer" "^5.0.1" - cacheable-lookup "^7.0.0" - cacheable-request "^10.2.8" - decompress-response "^6.0.0" - form-data-encoder "^2.1.2" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^3.0.0" - -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http2-wrapper@^2.1.10: - version "2.2.1" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" - integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - -ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -jsonpointer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" - integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -latest-version@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-7.0.0.tgz#843201591ea81a4d404932eeb61240fe04e9e5da" - integrity sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg== - dependencies: - package-json "^8.1.0" - -"leven@^3.1.0 < 4": - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - -lru-cache@^11.0.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.0.tgz#14117229fd25bc9c67936e32de90ca047488c97a" - integrity sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -mimic-response@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" - integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== - -minimatch@^10.2.2: - version "10.2.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1" - integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== - dependencies: - brace-expansion "^5.0.5" - -minimist@^1.2.0: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minipass@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" - integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== - -normalize-url@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" - integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== - -package-json@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" - integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== - dependencies: - got "^12.1.0" - registry-auth-token "^5.0.1" - registry-url "^6.0.0" - semver "^7.3.7" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-scurry@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" - integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -prettier@^3.0.0: - version "3.8.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.3.tgz#560f2de55bf01b4c0503bc629d5df99b9a1d09b0" - integrity sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw== - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -rc@1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -registry-auth-token@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" - integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== - dependencies: - "@pnpm/npm-conf" "^2.1.0" - -registry-url@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-6.0.1.tgz#056d9343680f2f64400032b1e199faa692286c58" - integrity sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q== - dependencies: - rc "1.2.8" - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -responselike@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" - integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== - dependencies: - lowercase-keys "^3.0.0" - -semver@^7.3.7, semver@^7.5.2: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -solhint@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-6.2.1.tgz#05af1624365969e7350da8ec8cdb9b2488a6f411" - integrity sha512-+VHSa84CRjm2s+KZWYxIDnI+NokcLsZHOSpRtg5nBFmnVfh6RPmPaFd5TN922Cfrm2i85kNoQtLiapALe26b5w== - dependencies: - "@solidity-parser/parser" "^0.20.2" - ajv "^8.18.0" - ajv-errors "^3.0.0" - ast-parents "^0.0.1" - better-ajv-errors "^2.0.2" - chalk "^4.1.2" - commander "^10.0.0" - cosmiconfig "^8.0.0" - fast-diff "^1.2.0" - glob "^13.0.6" - ignore "^5.2.4" - js-yaml "^4.1.0" - latest-version "^7.0.0" - lodash "^4.17.21" - pluralize "^8.0.0" - semver "^7.5.2" - table "^6.8.1" - text-table "^0.2.0" - optionalDependencies: - prettier "^3.0.0" - -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -table@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - typescript@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" @@ -746,15 +18,3 @@ undici-types@~6.21.0: version "6.21.0" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== From 4d9b718a0da0fab1a88928df4bf86e2def372a9c Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 25 May 2026 10:31:13 +1000 Subject: [PATCH 4/9] Re-add validators used in active deployment --- .../trading/seaport/validators/ReadOnlyOrderValidator.sol | 5 +++++ contracts/trading/seaport/validators/SeaportValidator.sol | 5 +++++ .../trading/seaport/validators/SeaportValidatorHelper.sol | 5 +++++ .../trading/seaport16/validators/ReadOnlyOrderValidator.sol | 5 +++++ contracts/trading/seaport16/validators/SeaportValidator.sol | 5 +++++ .../trading/seaport16/validators/SeaportValidatorHelper.sol | 5 +++++ 6 files changed, 30 insertions(+) create mode 100644 contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol create mode 100644 contracts/trading/seaport/validators/SeaportValidator.sol create mode 100644 contracts/trading/seaport/validators/SeaportValidatorHelper.sol create mode 100644 contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol create mode 100644 contracts/trading/seaport16/validators/SeaportValidator.sol create mode 100644 contracts/trading/seaport16/validators/SeaportValidatorHelper.sol diff --git a/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol b/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol new file mode 100644 index 00000000..bfe332b3 --- /dev/null +++ b/contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.17; + +import {ReadOnlyOrderValidator} from "seaport/contracts/helpers/order-validator/lib/ReadOnlyOrderValidator.sol"; diff --git a/contracts/trading/seaport/validators/SeaportValidator.sol b/contracts/trading/seaport/validators/SeaportValidator.sol new file mode 100644 index 00000000..772502fe --- /dev/null +++ b/contracts/trading/seaport/validators/SeaportValidator.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.17; + +import {SeaportValidator} from "seaport/contracts/helpers/order-validator/SeaportValidator.sol"; diff --git a/contracts/trading/seaport/validators/SeaportValidatorHelper.sol b/contracts/trading/seaport/validators/SeaportValidatorHelper.sol new file mode 100644 index 00000000..e7a001f3 --- /dev/null +++ b/contracts/trading/seaport/validators/SeaportValidatorHelper.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.17; + +import {SeaportValidatorHelper} from "seaport/contracts/helpers/order-validator/lib/SeaportValidatorHelper.sol"; diff --git a/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol b/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol new file mode 100644 index 00000000..74de5531 --- /dev/null +++ b/contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.17; + +import {ReadOnlyOrderValidator} from "seaport-16/contracts/helpers/order-validator/lib/ReadOnlyOrderValidator.sol"; diff --git a/contracts/trading/seaport16/validators/SeaportValidator.sol b/contracts/trading/seaport16/validators/SeaportValidator.sol new file mode 100644 index 00000000..196db81b --- /dev/null +++ b/contracts/trading/seaport16/validators/SeaportValidator.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.17; + +import {SeaportValidator} from "seaport-16/contracts/helpers/order-validator/SeaportValidator.sol"; diff --git a/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol b/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol new file mode 100644 index 00000000..8f565398 --- /dev/null +++ b/contracts/trading/seaport16/validators/SeaportValidatorHelper.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: MIT +// solhint-disable +pragma solidity ^0.8.17; + +import {SeaportValidatorHelper} from "seaport-16/contracts/helpers/order-validator/lib/SeaportValidatorHelper.sol"; From 11a4115e78b66fe31ff21388eea726ff49d03d73 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 25 May 2026 13:02:07 +1000 Subject: [PATCH 5/9] Terminate forge-lint starts --- contracts/token/erc721/abstract/ERC721Hybrid.sol | 1 + contracts/token/erc721/abstract/ImmutableERC721Base.sol | 1 + contracts/token/erc721/erc721psi/ERC721Psi.sol | 1 + contracts/token/erc721/interfaces/IImmutableERC721Structs.sol | 1 + 4 files changed, 4 insertions(+) diff --git a/contracts/token/erc721/abstract/ERC721Hybrid.sol b/contracts/token/erc721/abstract/ERC721Hybrid.sol index 9994bb6a..02f234e7 100644 --- a/contracts/token/erc721/abstract/ERC721Hybrid.sol +++ b/contracts/token/erc721/abstract/ERC721Hybrid.sol @@ -494,3 +494,4 @@ abstract contract ERC721Hybrid is ERC721PsiBurnable, ERC721, IImmutableERC721Err return ERC721._baseURI(); } } +// forge-lint: disable-end(pascal-case-struct) diff --git a/contracts/token/erc721/abstract/ImmutableERC721Base.sol b/contracts/token/erc721/abstract/ImmutableERC721Base.sol index 30084949..83d23067 100644 --- a/contracts/token/erc721/abstract/ImmutableERC721Base.sol +++ b/contracts/token/erc721/abstract/ImmutableERC721Base.sol @@ -298,3 +298,4 @@ abstract contract ImmutableERC721Base is OperatorAllowlistEnforced, MintingAcces return baseURI; } } +// forge-lint: disable-end(pascal-case-struct) diff --git a/contracts/token/erc721/erc721psi/ERC721Psi.sol b/contracts/token/erc721/erc721psi/ERC721Psi.sol index fd3637d9..80b41326 100644 --- a/contracts/token/erc721/erc721psi/ERC721Psi.sol +++ b/contracts/token/erc721/erc721psi/ERC721Psi.sol @@ -464,3 +464,4 @@ contract ERC721Psi is Context, ERC165, IERC721, IERC721Metadata { */ function _afterTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal virtual {} } +// forge-lint: disable-end(all) diff --git a/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol b/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol index fe6c6e53..89656b4a 100644 --- a/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol +++ b/contracts/token/erc721/interfaces/IImmutableERC721Structs.sol @@ -34,3 +34,4 @@ interface IImmutableERC721Structs { uint256 quantity; } } +// forge-lint: disable-end(pascal-case-struct) From 077ce23d78bf86a31678d608be8f87e1706a00df Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 25 May 2026 16:17:33 +1000 Subject: [PATCH 6/9] Add end for slither exclusion --- contracts/allowlist/OperatorAllowlistEnforced.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/allowlist/OperatorAllowlistEnforced.sol b/contracts/allowlist/OperatorAllowlistEnforced.sol index e104372c..575caf05 100644 --- a/contracts/allowlist/OperatorAllowlistEnforced.sol +++ b/contracts/allowlist/OperatorAllowlistEnforced.sol @@ -91,4 +91,6 @@ abstract contract OperatorAllowlistEnforced is OperatorAllowlistEnforcementError operatorAllowlist = IOperatorAllowlist(_operatorAllowlist); } } + // forge-lint: disable-end(unwrapped-modifier-logic) +// slither-disable-end calls-loop From bfc4f517eb09b8a28a3114dc606a4d5e0fa4fedc Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 25 May 2026 16:18:18 +1000 Subject: [PATCH 7/9] Revert changes to OwnableCreate3 related files and add to linter exclusions --- .../deployer/create/OwnableCreateDeploy.sol | 12 ++++++---- contracts/deployer/create3/OwnableCreate3.sol | 2 +- .../create3/OwnableCreate3Address.sol | 8 +++---- .../create3/OwnableCreate3Deployer.sol | 2 +- foundry.toml | 23 ++++++++++++++++++- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/contracts/deployer/create/OwnableCreateDeploy.sol b/contracts/deployer/create/OwnableCreateDeploy.sol index c5de8b12..3829dc90 100644 --- a/contracts/deployer/create/OwnableCreateDeploy.sol +++ b/contracts/deployer/create/OwnableCreateDeploy.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2026 +// Copyright Immutable Pty Ltd 2018 - 2024 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; @@ -12,10 +12,10 @@ pragma solidity >=0.8.19 <0.8.29; */ contract OwnableCreateDeploy { // Address that is authorised to call the deploy function. - address private immutable OWNER; + address private immutable owner; constructor() { - OWNER = msg.sender; + owner = msg.sender; } /** @@ -24,8 +24,10 @@ contract OwnableCreateDeploy { */ // slither-disable-next-line locked-ether function deploy(bytes memory bytecode) external payable { - require(msg.sender == OWNER, "CreateDeploy: caller is not the owner"); - assembly ("memory-safe") { + // solhint-disable-next-line custom-errors, reason-string + require(msg.sender == owner, "CreateDeploy: caller is not the owner"); + // solhint-disable no-inline-assembly + assembly { if iszero(create(callvalue(), add(bytecode, 32), mload(bytecode))) { revert(0, 0) } diff --git a/contracts/deployer/create3/OwnableCreate3.sol b/contracts/deployer/create3/OwnableCreate3.sol index 9937482f..ad88b747 100644 --- a/contracts/deployer/create3/OwnableCreate3.sol +++ b/contracts/deployer/create3/OwnableCreate3.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2026 +// Copyright Immutable Pty Ltd 2018 - 2024 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; diff --git a/contracts/deployer/create3/OwnableCreate3Address.sol b/contracts/deployer/create3/OwnableCreate3Address.sol index 0eda8c11..4116431d 100644 --- a/contracts/deployer/create3/OwnableCreate3Address.sol +++ b/contracts/deployer/create3/OwnableCreate3Address.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2026 +// Copyright Immutable Pty Ltd 2018 - 2024 // SPDX-License-Identifier: MIT pragma solidity >=0.8.19 <0.8.29; @@ -12,13 +12,13 @@ import {OwnableCreateDeploy} from "../create/OwnableCreateDeploy.sol"; */ abstract contract OwnableCreate3Address { /// @dev bytecode hash of the CreateDeploy helper contract - bytes32 internal immutable CREATE_DEPLOY_BYTECODE_HASH; + bytes32 internal immutable createDeployBytecodeHash; constructor() { // Slither is mistakenly seeing the expansion of type(OwnableCreateDeploy).creationCode // as a very large number. // slither-disable-next-line too-many-digits - CREATE_DEPLOY_BYTECODE_HASH = keccak256(type(OwnableCreateDeploy).creationCode); + createDeployBytecodeHash = keccak256(type(OwnableCreateDeploy).creationCode); } /** @@ -29,7 +29,7 @@ abstract contract OwnableCreate3Address { function _create3Address(bytes32 deploySalt) internal view returns (address deployed) { address deployer = address( uint160( - uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, CREATE_DEPLOY_BYTECODE_HASH))) + uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, createDeployBytecodeHash))) ) ); diff --git a/contracts/deployer/create3/OwnableCreate3Deployer.sol b/contracts/deployer/create3/OwnableCreate3Deployer.sol index 6886e236..601ea2c4 100644 --- a/contracts/deployer/create3/OwnableCreate3Deployer.sol +++ b/contracts/deployer/create3/OwnableCreate3Deployer.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2026 +// Copyright Immutable Pty Ltd 2018 - 2024 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/foundry.toml b/foundry.toml index 2ee4f6ba..165e9a61 100644 --- a/foundry.toml +++ b/foundry.toml @@ -20,5 +20,26 @@ ignored_error_codes = [2424, 3860, 5574, 2394] # For list of linting rules see https://www.getfoundry.sh/forge/linting exclude_lints = ["mixed-case-function","mixed-case-variable","asm-keccak256"] -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options +ignore = [ + # Ignore OwnableCreate3 related files so that the source code does not need + # to change to remove linter warnings. Changing the source code would cause + # the source code hash, stored in the contract metadata, to change. This would + # cause the hash of the deployed contract to change, which in turn would alter + # the behaviour of OwnableCreate3Deployer.sol. + "contracts/deployer/create/OwnableCreateDeploy.sol", + "contracts/deployer/create3/OwnableCreate3Address.sol", + "contracts/deployer/create3/OwnableCreate3Deployer.sol", + "contracts/deployer/create3/OwnableCreate3.sol", + + # Ignore empty files that are used by the deployed Seaport, put have no + # contents, so produce empty AST warnings. + "contracts/trading/seaport/validators/SeaportValidator.sol", + "contracts/trading/seaport/validators/SeaportValidatorHelper.sol", + "contracts/trading/seaport16/validators/SeaportValidator.sol", + "contracts/trading/seaport16/validators/SeaportValidatorHelper.sol", + "contracts/trading/seaport/validators/ReadOnlyOrderValidator.sol", + "contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol" + ] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options From 94493664ebb38016d578fe5806cf71f0780ffdc5 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 25 May 2026 16:29:34 +1000 Subject: [PATCH 8/9] Revert formatting and exclude from future formatting --- contracts/deployer/create/OwnableCreateDeploy.sol | 3 +-- contracts/deployer/create3/OwnableCreate3Address.sol | 4 +--- contracts/deployer/create3/OwnableCreate3Deployer.sol | 2 +- foundry.toml | 9 +++++++++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/contracts/deployer/create/OwnableCreateDeploy.sol b/contracts/deployer/create/OwnableCreateDeploy.sol index 3829dc90..25ef28a8 100644 --- a/contracts/deployer/create/OwnableCreateDeploy.sol +++ b/contracts/deployer/create/OwnableCreateDeploy.sol @@ -17,7 +17,6 @@ contract OwnableCreateDeploy { constructor() { owner = msg.sender; } - /** * @dev Deploys a new contract with the specified bytecode using the `CREATE` opcode. * @param bytecode The bytecode of the contract to be deployed @@ -27,7 +26,7 @@ contract OwnableCreateDeploy { // solhint-disable-next-line custom-errors, reason-string require(msg.sender == owner, "CreateDeploy: caller is not the owner"); // solhint-disable no-inline-assembly - assembly { + assembly { if iszero(create(callvalue(), add(bytecode, 32), mload(bytecode))) { revert(0, 0) } diff --git a/contracts/deployer/create3/OwnableCreate3Address.sol b/contracts/deployer/create3/OwnableCreate3Address.sol index 4116431d..2b88bcbb 100644 --- a/contracts/deployer/create3/OwnableCreate3Address.sol +++ b/contracts/deployer/create3/OwnableCreate3Address.sol @@ -28,9 +28,7 @@ abstract contract OwnableCreate3Address { */ function _create3Address(bytes32 deploySalt) internal view returns (address deployed) { address deployer = address( - uint160( - uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, createDeployBytecodeHash))) - ) + uint160(uint256(keccak256(abi.encodePacked(hex"ff", address(this), deploySalt, createDeployBytecodeHash)))) ); deployed = address(uint160(uint256(keccak256(abi.encodePacked(hex"d694", deployer, hex"01"))))); diff --git a/contracts/deployer/create3/OwnableCreate3Deployer.sol b/contracts/deployer/create3/OwnableCreate3Deployer.sol index 601ea2c4..9775a444 100644 --- a/contracts/deployer/create3/OwnableCreate3Deployer.sol +++ b/contracts/deployer/create3/OwnableCreate3Deployer.sol @@ -1,4 +1,4 @@ -// Copyright Immutable Pty Ltd 2018 - 2024 +// Copyright Immutable Pty Ltd 2018 - 2023 // SPDX-License-Identifier: Apache 2.0 pragma solidity >=0.8.19 <0.8.29; diff --git a/foundry.toml b/foundry.toml index 165e9a61..72a28c04 100644 --- a/foundry.toml +++ b/foundry.toml @@ -41,5 +41,14 @@ ignore = [ "contracts/trading/seaport16/validators/ReadOnlyOrderValidator.sol" ] +[fmt] +ignore = [ + # Ignore OwnableCreate3 related files so that they don't change due + # to reformatting. + "contracts/deployer/create/OwnableCreateDeploy.sol", + "contracts/deployer/create3/OwnableCreate3Address.sol", + "contracts/deployer/create3/OwnableCreate3Deployer.sol", + "contracts/deployer/create3/OwnableCreate3.sol", + ] # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options From 6d7879794c554c95b1a4117b4b509bd81a1dd7bb Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Mon, 25 May 2026 16:30:50 +1000 Subject: [PATCH 9/9] Fix formatting --- contracts/allowlist/OperatorAllowlistEnforced.sol | 5 +---- test/trading/seaport/ImmutableSeaportHarness.t.sol | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/contracts/allowlist/OperatorAllowlistEnforced.sol b/contracts/allowlist/OperatorAllowlistEnforced.sol index 575caf05..4079488b 100644 --- a/contracts/allowlist/OperatorAllowlistEnforced.sol +++ b/contracts/allowlist/OperatorAllowlistEnforced.sol @@ -52,10 +52,7 @@ abstract contract OperatorAllowlistEnforced is OperatorAllowlistEnforcementError // Check for: // 1. caller is an EOA // 2. caller is Allowlisted or is the calling address bytecode is Allowlisted - if ( - msg.sender != tx.origin - && !operatorAllowlist.isAllowlisted(msg.sender) - ) { + if (msg.sender != tx.origin && !operatorAllowlist.isAllowlisted(msg.sender)) { revert CallerNotInAllowlist(msg.sender); } diff --git a/test/trading/seaport/ImmutableSeaportHarness.t.sol b/test/trading/seaport/ImmutableSeaportHarness.t.sol index 48abce02..475d9469 100644 --- a/test/trading/seaport/ImmutableSeaportHarness.t.sol +++ b/test/trading/seaport/ImmutableSeaportHarness.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.17; import {ImmutableSeaport} from "../../../contracts/trading/seaport/ImmutableSeaport.sol"; - contract ImmutableSeaportHarness is ImmutableSeaport { constructor(address conduitController, address owner) ImmutableSeaport(conduitController, owner) {}