creation_sourcecode: {{
    "language": "Solidity",
    "sources": {
      "src/main/zones/signed-zone/signed-zone-sub-1/captain/OpenSeaSignedZoneCaptain.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport { SignedZoneCaptainSub1 } from \"./SignedZoneCaptainSub1.sol\";\n\ncontract OpenSeaSignedZoneCaptain is SignedZoneCaptainSub1 {\n    constructor(\n        address signedZoneController\n    ) SignedZoneCaptainSub1(signedZoneController) {}\n\n    /**\n     * @notice Internal function to assert that the caller is a valid deployer.\n     */\n    function _assertValidDeployer() internal view override {\n        // Ensure that the contract is being deployed by an approved\n        // deployer.\n        // tx.origin is used here, because we use the SignedZoneDeployer\n        // contract to deploy this contract, and initailize the owner,\n        // rotator, and sanitizer roles.\n        if (\n            tx.origin != address(0x939C8d89EBC11fA45e576215E2353673AD0bA18A) &&\n            tx.origin != address(0xe80a65eB7a3018DedA407e621Ef5fb5B416678CA) &&\n            tx.origin != address(0x86D26897267711ea4b173C8C124a0A73612001da) &&\n            tx.origin != address(0xbF81D02F3Ee59E79af3D9337a186F65c9faE39F3)\n        ) {\n            revert InvalidDeployer();\n        }\n    }\n}\n"
      },
      "src/main/zones/signed-zone/signed-zone-sub-1/captain/SignedZoneCaptainSub1.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {\n    SignedZoneCaptainSub1Interface\n} from \"./interfaces/SignedZoneCaptainSub1Interface.sol\";\n\nimport {\n    SignedZoneCaptainEventsAndErrors\n} from \"../../interfaces/SignedZoneCaptainEventsAndErrors.sol\";\n\nimport {\n    SignedZoneControllerSub1Interface\n} from \"../controller/interfaces/SignedZoneControllerSub1Interface.sol\";\n\nimport { TwoStepOwnable } from \"../../ownable/TwoStepOwnable.sol\";\n\n/**\n * @title SignedZoneCaptain\n * @author BCLeFevre\n * @notice SignedZoneCaptain is a contract that owns signed zones and manages\n *         their active signers via two roles. The rotator role can update\n *         the active signers of a zone. The sanitizer role can remove all\n *         active signers of a zone controlled by the captain and clear the\n *         rotator role on the captain.\n */\nabstract contract SignedZoneCaptainSub1 is\n    TwoStepOwnable,\n    SignedZoneCaptainSub1Interface,\n    SignedZoneCaptainEventsAndErrors\n{\n    // The address of the signed zone controller. The signed zone controller\n    // manages signed zones.\n    SignedZoneControllerSub1Interface private immutable _SIGNED_ZONE_CONTROLLER;\n\n    // The address of the rotator. The rotator can manage the active signers of\n    // a zone controlled by this contract.\n    address private _rotator;\n\n    // The address of the sanitizer. The sanitizer can remove all active\n    // signers of a zone controlled by the captain and clear the rotator role\n    // on the captain.\n    address private _sanitizer;\n\n    /**\n     * @dev Initialize contract by setting the signed zone controller.\n     *\n     * @param signedZoneController The address of the signed zone controller.\n     */\n    constructor(address signedZoneController) {\n        // Ensure that the contract is being deployed by an approved deployer.\n        _assertValidDeployer();\n\n        // Ensure that a contract is deployed to the given signed zone controller.\n        if (signedZoneController.code.length == 0) {\n            revert InvalidSignedZoneController(signedZoneController);\n        }\n\n        // Set the signed zone controller.\n        _SIGNED_ZONE_CONTROLLER = SignedZoneControllerSub1Interface(\n            signedZoneController\n        );\n    }\n\n    /**\n     * @notice External initialization called by the deployer to set the owner,\n     *         rotator and sanitizer, and create a signed zone with the given\n     *         name, API endpoint, documentation URI. This function can only be\n     *         called once, as there is a check to ensure that the current\n     *         owner is address(0) before the initialization is performed, the\n     *         owner must then be set to a non address(0) address during\n     *         initialization and finally the owner cannot be set to address(0)\n     *         after initialization.\n     *\n     * @param initialOwner     The address to be set as the owner.\n     * @param initialRotator   The address to be set as the rotator.\n     * @param initialSanitizer The address to be set as the sanitizer.\n     * @param zoneName         The name of the zone being created.\n     * @param apiEndpoint      The API endpoint of the zone being created.\n     * @param documentationURI The documentation URI of the zone being created.\n     * @param zoneSalt         The salt to use when creating the zone.\n     */\n    function initialize(\n        address initialOwner,\n        address initialRotator,\n        address initialSanitizer,\n        string memory zoneName,\n        string memory apiEndpoint,\n        string memory documentationURI,\n        bytes32 zoneSalt\n    ) external override {\n        // Ensure the origin is an approved deployer.\n        _assertValidDeployer();\n\n        // Call initialize.\n        _initialize(\n            initialOwner,\n            initialRotator,\n            initialSanitizer,\n            zoneName,\n            apiEndpoint,\n            documentationURI,\n            zoneSalt\n        );\n    }\n\n    /**\n     * @notice Internal initialization function to set the owner, rotator, and\n     *         sanitizer and create a new zone with the given name, API\n     *         endpoint, documentation URI and the captain as the zone owner.\n     *\n     * @param initialOwner     The address to be set as the owner.\n     * @param initialRotator   The address to be set as the rotator.\n     * @param initialSanitizer The address to be set as the sanitizer.\n     * @param zoneName         The name of the zone being created.\n     * @param apiEndpoint      The API endpoint of the zone being created.\n     * @param documentationURI The documentation URI of the zone being created.\n     * @param zoneSalt         The salt to use when creating the zone.\n     */\n    function _initialize(\n        address initialOwner,\n        address initialRotator,\n        address initialSanitizer,\n        string memory zoneName,\n        string memory apiEndpoint,\n        string memory documentationURI,\n        bytes32 zoneSalt\n    ) internal {\n        // Set the owner of the captain.\n        _setInitialOwner(initialOwner);\n\n        // Set the rotator.\n        _setRotator(initialRotator);\n\n        // Set the sanitizer.\n        _setSanitizer(initialSanitizer);\n\n        // Create a new zone, with the captain as the zone owner, the given\n        // zone name, API endpoint, and documentation URI.\n        SignedZoneControllerSub1Interface(_SIGNED_ZONE_CONTROLLER).createZone(\n            zoneName,\n            apiEndpoint,\n            documentationURI,\n            address(this),\n            zoneSalt\n        );\n    }\n\n    /**\n     * @notice Update the API endpoint returned by the supplied zone.\n     *         Only the owner can call this function.\n     *\n     * @param zone           The signed zone to update the API endpoint for.\n     * @param newApiEndpoint The new API endpoint.\n     */\n    function updateZoneAPIEndpoint(\n        address zone,\n        string calldata newApiEndpoint\n    ) external override {\n        // Ensure caller is the owner.\n        _assertCallerIsOwner();\n\n        // Call to the signed zone controller to update the zone API endpoint.\n        _SIGNED_ZONE_CONTROLLER.updateAPIEndpoint(zone, newApiEndpoint);\n    }\n\n    /**\n     * @notice Update the documentationURI returned by a zone. Only the owner\n     *         of the supplied zone can call this function.\n     *\n     * @param zone                The signed zone to update the API endpoint\n     *                            for.\n     * @param newDocumentationURI The new documentation URI.\n     */\n    function updateZoneDocumentationURI(\n        address zone,\n        string calldata newDocumentationURI\n    ) external override {\n        // Ensure caller is the owner.\n        _assertCallerIsOwner();\n\n        // Call to the signed zone controller to update the zone documentation\n        // URI.\n        _SIGNED_ZONE_CONTROLLER.updateDocumentationURI(\n            zone,\n            newDocumentationURI\n        );\n    }\n\n    /**\n     * @notice Update the signer for a given signed zone.\n     *\n     * @param zone       The signed zone to update the signer for.\n     * @param signer     The signer to update.\n     * @param active     If the signer should be active or not.\n     */\n    function updateZoneSigner(\n        address zone,\n        address signer,\n        bool active\n    ) external override {\n        // Ensure caller is the owner.\n        _assertCallerIsOwner();\n\n        // Call to the signed zone controller to update the zone signer.\n        _SIGNED_ZONE_CONTROLLER.updateSigner(zone, signer, active);\n    }\n\n    /**\n     * @notice Update the rotator role on the captain.\n     *\n     * @param newRotator The new rotator of the captain.\n     */\n    function updateRotator(address newRotator) external override {\n        // Ensure caller is owner.\n        _assertCallerIsOwner();\n\n        // Set the new rotator.\n        _setRotator(newRotator);\n    }\n\n    /**\n     * @notice Update the sanitizer role on the captain.\n     *\n     * @param newSanitizer The new sanitizer of the captain.\n     */\n    function updateSanitizer(address newSanitizer) external override {\n        // Ensure caller is owner.\n        _assertCallerIsOwner();\n\n        // Set the new sanitizer.\n        _setSanitizer(newSanitizer);\n    }\n\n    /**\n     * @notice Initiate zone ownership transfer by assigning a new potential\n     *         owner for the given zone. Only callable by the owner.\n     *\n     * @param zone              The zone for which to initiate ownership\n     *                          transfer.\n     * @param newPotentialOwner The new potential owner to set.\n     */\n    function transferZoneOwnership(\n        address zone,\n        address newPotentialOwner\n    ) external override {\n        // Ensure caller is the owner.\n        _assertCallerIsOwner();\n\n        // Call to the signed zone controller to transfer the zone ownership.\n        _SIGNED_ZONE_CONTROLLER.transferOwnership(zone, newPotentialOwner);\n    }\n\n    /**\n     * @notice Clear the currently set potential owner, if any, from a zone.\n     *         Only callable by the owner.\n     *\n     * @param zone The zone for which to cancel ownership transfer.\n     */\n    function cancelZoneOwnershipTransfer(address zone) external override {\n        // Ensure caller is the owner.\n        _assertCallerIsOwner();\n\n        // Call to the signed zone controller to cancel the zone ownership\n        // transfer.\n        _SIGNED_ZONE_CONTROLLER.cancelOwnershipTransfer(zone);\n    }\n\n    /**\n     * @notice Accept ownership of a given zone once the address has been set\n     *         as the current potential owner. Only callable by the owner.\n     *\n     * @param zone The zone for which to accept ownership transfer.\n     */\n    function acceptZoneOwnership(address zone) external override {\n        // Ensure caller is the owner.\n        _assertCallerIsOwner();\n\n        // Call to the signed zone controller to accept the zone ownership.\n        _SIGNED_ZONE_CONTROLLER.acceptOwnership(zone);\n    }\n\n    /**\n     * @notice Rotate the signers for a given zone. Only callable by the owner\n     *         or the rotator of the zone.\n     *\n     * @param zone              The zone to rotate the signers for.\n     * @param signerToRemove    The signer to remove.\n     * @param signerToAdd       The signer to add.\n     */\n    function rotateSigners(\n        address zone,\n        address signerToRemove,\n        address signerToAdd\n    ) external override {\n        // Ensure caller is the owner or the rotator.\n        _assertCallerIsOwnerOrRotator();\n\n        // Call to the signed zone controller to remove the signer.\n        _SIGNED_ZONE_CONTROLLER.updateSigner(zone, signerToRemove, false);\n\n        // Call to the signed zone controller to add the signer.\n        _SIGNED_ZONE_CONTROLLER.updateSigner(zone, signerToAdd, true);\n    }\n\n    /**\n     * @notice This will remove all active signers of the given zone and clear\n     *         the rotator address on the captain. Only callable by the owner\n     *         or the sanitizer of the zone.\n     *\n     * @param zone The zone to revoke.\n     */\n    function sanitizeSignedZone(address zone) external override {\n        // Ensure caller is the owner or the sanitizer.\n        _assertCallerIsOwnerOrSanitizer();\n\n        // Call to the signed zone controller to sanitize the signed zone.\n        address[] memory signers = _SIGNED_ZONE_CONTROLLER.getActiveSigners(\n            zone\n        );\n\n        // Loop through the signers and deactivate them.\n        for (uint256 i = 0; i < signers.length; i++) {\n            _SIGNED_ZONE_CONTROLLER.updateSigner(zone, signers[i], false);\n        }\n\n        // Clear the rotator role.\n        delete _rotator;\n\n        // Emit the sanitized event.\n        emit ZoneSanitized(zone);\n    }\n\n    /**\n     * @notice Get the rotator address.\n     *\n     * @return The rotator address.\n     */\n    function getRotator() external view override returns (address) {\n        return _rotator;\n    }\n\n    /**\n     * @notice Get the sanitizer address.\n     *\n     * @return The sanitizer address.\n     */\n    function getSanitizer() external view override returns (address) {\n        return _sanitizer;\n    }\n\n    /**\n     * @notice Internal function to set the rotator role on the contract,\n     *         checking to make sure the provided address is not the null\n     *         address\n     *\n     * @param newRotator The new rotator address.\n     */\n    function _setRotator(address newRotator) internal {\n        // Ensure new rotator is not null.\n        if (newRotator == address(0)) {\n            revert RotatorCannotBeNullAddress();\n        }\n\n        _rotator = newRotator;\n\n        emit RotatorUpdated(newRotator);\n    }\n\n    /**\n     * @notice Internal function to set the sanitizer role on the contract,\n     *         checking to make sure the provided address is not the null\n     *         address\n     *\n     * @param newSanitizer The new sanitizer address.\n     */\n    function _setSanitizer(address newSanitizer) internal {\n        // Ensure new sanitizer is not null.\n        if (newSanitizer == address(0)) {\n            revert SanitizerCannotBeNullAddress();\n        }\n\n        _sanitizer = newSanitizer;\n\n        emit SanitizerUpdated(newSanitizer);\n    }\n\n    /**\n     * @notice Internal function to assert that the caller is a valid deployer.\n     *         This must be overwritten by the contract that inherits from this\n     *         contract.  This is to ensure that the caller or tx.orign is\n     *         permitted to deploy this contract.\n     */\n    function _assertValidDeployer() internal view virtual {\n        revert(\"Not implemented assertValidDeployer\");\n    }\n\n    /**\n     * @dev Internal view function to revert if the caller is not the owner or\n     *      the sanitizer.\n     */\n    function _assertCallerIsOwnerOrSanitizer() internal view {\n        // Ensure caller is the owner or the sanitizer.\n        if (msg.sender != owner() && msg.sender != _sanitizer) {\n            revert CallerIsNotOwnerOrSanitizer();\n        }\n    }\n\n    /**\n     * @dev Internal view function to revert if the caller is not the owner or\n     *      the rotator.\n     */\n    function _assertCallerIsOwnerOrRotator() internal view {\n        // Ensure caller is the owner or the rotator.\n        if (msg.sender != owner() && msg.sender != _rotator) {\n            revert CallerIsNotOwnerOrRotator();\n        }\n    }\n}\n"
      },
      "src/main/zones/signed-zone/signed-zone-sub-1/captain/interfaces/SignedZoneCaptainSub1Interface.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {\n    SignedZoneCaptainInterface\n} from \"../../../interfaces/SignedZoneCaptainInterface.sol\";\n\n/**\n * @title  SignedZoneCaptainSub1Interface\n * @author BCLeFevre\n * @notice SignedZoneCaptainSub1Interface contains function declarations for the\n *         SignedZoneCaptain contract with additional functions for sub1.\n */\ninterface SignedZoneCaptainSub1Interface is SignedZoneCaptainInterface {\n    /**\n     * @notice External initialization called by the deployer to set the owner,\n     *         rotator and sanitizer, and create a signed zone with the given\n     *         name, API endpoint, documentation URI.\n     *\n     * @param initialOwner     The address to be set as the owner.\n     * @param initialRotator   The address to be set as the rotator.\n     * @param initialSanitizer The address to be set as the sanitizer.\n     * @param zoneName         The name of the zone being created.\n     * @param apiEndpoint      The API endpoint of the zone being created.\n     * @param documentationURI The documentation URI of the zone being created.\n     * @param zoneSalt         The salt to use when creating the zone.\n     */\n    function initialize(\n        address initialOwner,\n        address initialRotator,\n        address initialSanitizer,\n        string calldata zoneName,\n        string calldata apiEndpoint,\n        string calldata documentationURI,\n        bytes32 zoneSalt\n    ) external;\n}\n"
      },
      "src/main/zones/signed-zone/interfaces/SignedZoneCaptainEventsAndErrors.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/**\n * @notice SignedZoneCaptainEventsAndErrors contains errors and events\n *         related to owning signed zones.\n */\ninterface SignedZoneCaptainEventsAndErrors {\n    /**\n     * @dev Emit an event when the contract owner updates the rotator.\n     *\n     * @param newRotator The new rotator of the contract.\n     */\n    event RotatorUpdated(address newRotator);\n\n    /**\n     * @dev Emit an event when the contract owner updates the sanitizer.\n     *\n     * @param newSanitizer The new sanitizer of the contract.\n     */\n    event SanitizerUpdated(address newSanitizer);\n\n    /**\n     * @dev Emit an event when the sanitizer sanitizes a zone.\n     *\n     * @param zone The zone address being sanitized.\n     */\n    event ZoneSanitized(address zone);\n\n    /**\n     * @dev Revert with an error when attempting to deploy the contract with an\n     *      invalid deployer.\n     */\n    error InvalidDeployer();\n\n    /**\n     * @dev Revert with an error when attempting to set a zone controller\n     *      that does not contain contract code.\n     *\n     * @param signedZoneController The invalid address.\n     */\n    error InvalidSignedZoneController(address signedZoneController);\n\n    /**\n     * @dev Revert with an error when attempting to set the rotator\n     *      to the null address.\n     */\n    error RotatorCannotBeNullAddress();\n\n    /**\n     * @dev Revert with an error when attempting to set the sanitizer\n     *      to the null address.\n     */\n    error SanitizerCannotBeNullAddress();\n\n    /**\n     * @dev Revert with an error when attempting to call a function that\n     *      requires the caller to be the owner or sanitizer of the zone.\n     */\n    error CallerIsNotOwnerOrSanitizer();\n\n    /**\n     * @dev Revert with an error when attempting to call a function that\n     *      requires the caller to be the owner or rotator of the zone.\n     */\n    error CallerIsNotOwnerOrRotator();\n}\n"
      },
      "src/main/zones/signed-zone/signed-zone-sub-1/controller/interfaces/SignedZoneControllerSub1Interface.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {\n    SignedZoneControllerInterface\n} from \"../../../interfaces/SignedZoneControllerInterface.sol\";\n\n/**\n * @title  SignedZoneControllerSub1Interface\n * @author BCLeFevre\n * @notice SignedZoneControllerSub1Interface enables the deploying of SignedZones.\n *         SignedZones are an implementation of SIP-7 that requires orders\n *         to be signed by an approved signer.\n *         https://github.com/ProjectOpenSea/SIPs/blob/main/SIPS/sip-7.md\n *\n */\ninterface SignedZoneControllerSub1Interface is SignedZoneControllerInterface {\n    /**\n     * @notice Deploy a SignedZone to a precomputed address.\n     *\n     * @param zoneName          The name for the zone returned in\n     *                          getSeaportMetadata().\n     * @param apiEndpoint       The API endpoint where orders for this zone can\n     *                          be signed.\n     * @param documentationURI  The URI to the documentation describing the\n     *                          behavior of the contract. Request and response\n     *                          payloads are defined in SIP-7.\n     * @param salt              The salt to be used to derive the zone address\n     * @param initialOwner      The initial owner to set for the new zone.\n     *\n     * @return signedZone The derived address for the zone.\n     */\n    function createZone(\n        string memory zoneName,\n        string memory apiEndpoint,\n        string memory documentationURI,\n        address initialOwner,\n        bytes32 salt\n    ) external returns (address signedZone);\n\n    /**\n     * @notice Derive the zone address associated with a salt.\n     *\n     * @param zoneName The name of the zone.\n     * @param salt     The salt to be used to derive the zone address.\n     *\n     * @return derivedAddress The derived address of the signed zone.\n     */\n    function getZone(\n        string memory zoneName,\n        bytes32 salt\n    ) external view returns (address derivedAddress);\n}\n"
      },
      "src/main/zones/signed-zone/ownable/TwoStepOwnable.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {\n    TwoStepOwnableInterface\n} from \"./interfaces/TwoStepOwnableInterface.sol\";\n\n/**\n * @title   TwoStepOwnable\n * @author  OpenSea Protocol Team\n * @notice  TwoStepOwnable provides access control for inheriting contracts,\n *          where the ownership of the contract can be exchanged via a two step\n *          process. A potential owner is set by the current owner by calling\n *          `transferOwnership`, then accepted by the new potential owner by\n *          calling `acceptOwnership`.\n */\nabstract contract TwoStepOwnable is TwoStepOwnableInterface {\n    // The address of the owner.\n    address private _owner;\n\n    // The address of the new potential owner.\n    address private _potentialOwner;\n\n    /**\n     * @notice Initiate ownership transfer by assigning a new potential owner\n     *         to this contract. Once set, the new potential owner may call\n     *         `acceptOwnership` to claim ownership. Only the owner may call\n     *         this function.\n     *\n     * @param newPotentialOwner The address for which to initiate ownership\n     *                          transfer to.\n     */\n    function transferOwnership(address newPotentialOwner) external override {\n        // Ensure the caller is the owner.\n        _assertCallerIsOwner();\n\n        // Ensure the new potential owner is not an invalid address.\n        if (newPotentialOwner == address(0)) {\n            revert NewPotentialOwnerIsNullAddress();\n        }\n\n        // Ensure the new potential owner is not already set.\n        if (newPotentialOwner == _potentialOwner) {\n            revert NewPotentialOwnerAlreadySet(_potentialOwner);\n        }\n\n        // Emit an event indicating that the potential owner has been updated.\n        emit PotentialOwnerUpdated(newPotentialOwner);\n\n        // Set the new potential owner as the potential owner.\n        _potentialOwner = newPotentialOwner;\n    }\n\n    /**\n     * @notice Clear the currently set potential owner, if any. Only the owner\n     *         of this contract may call this function.\n     */\n    function cancelOwnershipTransfer() external override {\n        // Ensure the caller is the owner.\n        _assertCallerIsOwner();\n\n        // Emit an event indicating that the potential owner has been cleared.\n        emit PotentialOwnerUpdated(address(0));\n\n        // Ensure that ownership transfer is currently possible.\n        if (_potentialOwner == address(0)) {\n            revert NoPotentialOwnerCurrentlySet();\n        }\n\n        // Clear the current new potential owner.\n        delete _potentialOwner;\n    }\n\n    /**\n     * @notice Accept ownership of this contract. Only the account that the\n     *         current owner has set as the new potential owner may call this\n     *         function.\n     */\n    function acceptOwnership() external override {\n        // Ensure the caller is the potential owner.\n        if (msg.sender != _potentialOwner) {\n            // Revert, indicating that caller is not current potential owner.\n            revert CallerIsNotNewPotentialOwner();\n        }\n\n        // Emit an event indicating that the potential owner has been cleared.\n        emit PotentialOwnerUpdated(address(0));\n\n        // Clear the current new potential owner.\n        delete _potentialOwner;\n\n        // Set the caller as the owner of this contract.\n        _setOwner(msg.sender);\n    }\n\n    /**\n     * @notice An external view function that returns the potential owner.\n     *\n     * @return The address of the potential owner.\n     */\n    function potentialOwner() external view override returns (address) {\n        return _potentialOwner;\n    }\n\n    /**\n     * @notice A public view function that returns the owner.\n     *\n     * @return The address of the owner.\n     */\n    function owner() public view override returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @notice Internal function that sets the inital owner of the base\n     *         contract. The initial owner must not already be set.\n     *         To be called in the constructor or when initializing a proxy.\n     *\n     * @param initialOwner The address to set for initial ownership.\n     */\n    function _setInitialOwner(address initialOwner) internal {\n        // Ensure that an initial owner has been supplied.\n        if (initialOwner == address(0)) {\n            revert InitialOwnerIsNullAddress();\n        }\n\n        // Ensure that the owner has not already been set.\n        if (_owner != address(0)) {\n            revert OwnerAlreadySet(_owner);\n        }\n\n        // Set the initial owner.\n        _setOwner(initialOwner);\n    }\n\n    /**\n     * @dev Internal view function to revert if the caller is not the owner.\n     */\n    function _assertCallerIsOwner() internal view {\n        // Ensure caller is the owner.\n        if (msg.sender != owner()) {\n            revert CallerIsNotOwner();\n        }\n    }\n\n    /**\n     * @notice Private function that sets a new owner and emits a corresponding\n     *         event.\n     *\n     * @param newOwner The address to assign as the new owner.\n     */\n    function _setOwner(address newOwner) private {\n        // Emit an event indicating that the new owner has been set.\n        emit OwnershipTransferred(_owner, newOwner);\n\n        // Set the new owner.\n        _owner = newOwner;\n    }\n}\n"
      },
      "src/main/zones/signed-zone/interfaces/SignedZoneCaptainInterface.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/**\n * @title  SignedZoneCaptainInterface\n * @author BCLeFevre\n * @notice SignedZoneCaptainInterface contains function declarations for the\n *         SignedZoneCaptain contract.\n */\ninterface SignedZoneCaptainInterface {\n    /**\n     * @notice Update the signer for a given signed zone.\n     *\n     * @param zone       The signed zone to update the signer for.\n     * @param signer     The signer to update.\n     * @param active     If the signer should be active or not.\n     */\n    function updateZoneSigner(\n        address zone,\n        address signer,\n        bool active\n    ) external;\n\n    /**\n     * @notice Update the API endpoint returned by the supplied zone.\n     *         Only the owner can call this function.\n     *\n     * @param zone           The signed zone to update the API endpoint for.\n     * @param newApiEndpoint The new API endpoint.\n     */\n    function updateZoneAPIEndpoint(\n        address zone,\n        string calldata newApiEndpoint\n    ) external;\n\n    /**\n     * @notice Update the documentationURI returned by a zone. Only the owner\n     *         of the supplied zone can call this function.\n     *\n     * @param zone                The signed zone to update the API endpoint\n     *                            for.\n     * @param newDocumentationURI The new documentation URI.\n     */\n    function updateZoneDocumentationURI(\n        address zone,\n        string calldata newDocumentationURI\n    ) external;\n\n    /**\n     * @notice Initiate zone ownership transfer by assigning a new potential\n     *         owner for the given zone. Only callable by the owner.\n     *\n     * @param zone              The zone for which to initiate ownership\n     *                          transfer.\n     * @param newPotentialOwner The new potential owner to set.\n     */\n    function transferZoneOwnership(\n        address zone,\n        address newPotentialOwner\n    ) external;\n\n    /**\n     * @notice Clear the currently set potential owner, if any, from a zone.\n     *         Only callable by the owner.\n     *\n     * @param zone The zone for which to cancel ownership transfer.\n     */\n    function cancelZoneOwnershipTransfer(address zone) external;\n\n    /**\n     * @notice Accept ownership of a given zone once the address has been set\n     *         as the current potential owner. Only callable by the owner.\n     *\n     * @param zone The zone for which to accept ownership transfer.\n     */\n    function acceptZoneOwnership(address zone) external;\n\n    /**\n     * @notice Rotate the signers for a given zone. Only callable by the owner\n     *         or the rotator of the zone.\n     *\n     * @param zone              The zone to rotate the signers for.\n     * @param signerToRemove    The signer to remove.\n     * @param signerToAdd       The signer to add.\n     */\n    function rotateSigners(\n        address zone,\n        address signerToRemove,\n        address signerToAdd\n    ) external;\n\n    /**\n     * @notice This will remove all active signers and clear the rotator\n     *         address on the captain. Only callable by the owner or the\n     *         sanitizer of the zone.\n     *\n     * @param zone The zone to sanitize.\n     */\n    function sanitizeSignedZone(address zone) external;\n\n    /**\n     * @notice Update the rotator role on the captain.\n     *\n     * @param newRotator The new rotator of the captain.\n     */\n    function updateRotator(address newRotator) external;\n\n    /**\n     * @notice Update the sanitizer role on the captain.\n     *\n     * @param newSanitizer The new sanitizer of the captain.\n     */\n    function updateSanitizer(address newSanitizer) external;\n\n    /**\n     * @notice Get the rotator address.\n     *\n     * @return The rotator address.\n     */\n    function getRotator() external view returns (address);\n\n    /**\n     * @notice Get the sanitizer address.\n     *\n     * @return The sanitizer address.\n     */\n    function getSanitizer() external view returns (address);\n}\n"
      },
      "src/main/zones/signed-zone/interfaces/SignedZoneControllerInterface.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/**\n * @title  SignedZoneControllerInterface\n * @author BCLeFevre\n * @notice SignedZoneControllerInterface enables the deploying of SignedZones.\n *         SignedZones are an implementation of SIP-7 that requires orders\n *         to be signed by an approved signer.\n *         https://github.com/ProjectOpenSea/SIPs/blob/main/SIPS/sip-7.md\n *\n */\ninterface SignedZoneControllerInterface {\n    /**\n     * @notice Returns the active signers for the zone.\n     *\n     * @param signedZone The signed zone to get the active signers for.\n     *\n     * @return signers The active signers.\n     */\n    function getActiveSigners(\n        address signedZone\n    ) external view returns (address[] memory signers);\n\n    /**\n     * @notice Returns additional information about the zone.\n     *\n     * @param zone The zone to get the additional information for.\n     *\n     * @return domainSeparator  The domain separator used for signing.\n     * @return zoneName         The name of the zone.\n     * @return apiEndpoint      The API endpoint for the zone.\n     * @return substandards     The substandards supported by the zone.\n     * @return documentationURI The documentation URI for the zone.\n     */\n    function getAdditionalZoneInformation(\n        address zone\n    )\n        external\n        view\n        returns (\n            bytes32 domainSeparator,\n            string memory zoneName,\n            string memory apiEndpoint,\n            uint256[] memory substandards,\n            string memory documentationURI\n        );\n\n    /**\n     * @notice Update the API endpoint returned by the supplied zone.\n     *         Only the owner or an active signer can call this function.\n     *\n     * @param signedZone     The signed zone to update the API endpoint for.\n     * @param newApiEndpoint The new API endpoint.\n     */\n    function updateAPIEndpoint(\n        address signedZone,\n        string calldata newApiEndpoint\n    ) external;\n\n    /**\n     * @notice Update the documentationURI returned by a zone.\n     *         Only the owner or an active signer of the supplied zone can call\n     *         this function.\n     *\n     * @param zone             The signed zone to update the API endpoint for.\n     * @param documentationURI The new documentation URI.\n     */\n    function updateDocumentationURI(\n        address zone,\n        string calldata documentationURI\n    ) external;\n\n    /**\n     * @notice Update the signer for a given signed zone.\n     *\n     * @param signedZone The signed zone to update the signer for.\n     * @param signer     The signer to update.\n     * @param active     If the signer should be active or not.\n     */\n    function updateSigner(\n        address signedZone,\n        address signer,\n        bool active\n    ) external;\n\n    /**\n     * @notice Initiate zone ownership transfer by assigning a new potential\n     *         owner for the given zone. Once set, the new potential owner\n     *         may call `acceptOwnership` to claim ownership of the zone.\n     *         Only the owner of the zone in question may call this function.\n     *\n     * @param zone              The zone for which to initiate ownership\n     *                          transfer.\n     * @param newPotentialOwner The new potential owner of the zone.\n     */\n    function transferOwnership(\n        address zone,\n        address newPotentialOwner\n    ) external;\n\n    /**\n     * @notice Clear the currently set potential owner, if any, from a zone.\n     *         Only the owner of the zone in question may call this function.\n     *\n     * @param zone The zone for which to cancel ownership transfer.\n     */\n    function cancelOwnershipTransfer(address zone) external;\n\n    /**\n     * @notice Accept ownership of a supplied zone. Only accounts that the\n     *         current owner has set as the new potential owner may call this\n     *         function.\n     *\n     * @param zone The zone for which to accept ownership.\n     */\n    function acceptOwnership(address zone) external;\n\n    /**\n     * @notice Retrieve the current owner of a deployed zone.\n     *\n     * @param zone The zone for which to retrieve the associated owner.\n     *\n     * @return owner The owner of the supplied zone.\n     */\n    function ownerOf(address zone) external view returns (address owner);\n\n    /**\n     * @notice Retrieve the potential owner, if any, for a given zone. The\n     *         current owner may set a new potential owner via\n     *         `transferOwnership` and that owner may then accept ownership of\n     *         the zone in question via `acceptOwnership`.\n     *\n     * @param zone The zone for which to retrieve the potential owner.\n     *\n     * @return potentialOwner The potential owner, if any, for the zone.\n     */\n    function getPotentialOwner(\n        address zone\n    ) external view returns (address potentialOwner);\n\n    /**\n     * @notice Returns whether or not the supplied address is an active signer\n     *         for the supplied zone.\n     *\n     * @param zone   The zone to check if the supplied address is an active\n     *               signer for.\n     * @param signer The address to check if it is an active signer for\n     *\n     * @return active If the supplied address is an active signer for the\n     *                supplied zone.\n     */\n    function isActiveSigner(\n        address zone,\n        address signer\n    ) external view returns (bool);\n}\n"
      },
      "src/main/zones/signed-zone/ownable/interfaces/TwoStepOwnableInterface.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\n/**\n * @title   TwoStepOwnableInterface\n * @author  OpenSea Protocol\n * @notice  TwoStepOwnableInterface contains all external function interfaces,\n *          events and errors for the TwoStepOwnable contract.\n */\ninterface TwoStepOwnableInterface {\n    /**\n     * @dev Emit an event whenever the contract owner registers a new potential\n     *      owner.\n     *\n     * @param newPotentialOwner The new potential owner of the contract.\n     */\n    event PotentialOwnerUpdated(address newPotentialOwner);\n\n    /**\n     * @dev Emit an event whenever contract ownership is transferred.\n     *\n     * @param previousOwner The previous owner of the contract.\n     * @param newOwner      The new owner of the contract.\n     */\n    event OwnershipTransferred(address previousOwner, address newOwner);\n\n    /**\n     * @dev Revert with an error when attempting to call a function that\n     *      requires ownership with a caller that is not the owner.\n     */\n    error CallerIsNotOwner();\n\n    /**\n     * @dev Revert with an error when attempting to register an initial owner\n     *      and supplying the null address.\n     */\n    error InitialOwnerIsNullAddress();\n\n    /**\n     * @dev Revert with an error when attempting to call a function that\n     *      requires the owner to not have been set.\n     */\n    error OwnerAlreadySet(address owner);\n\n    /**\n     * @dev Revert with an error when attempting to register a new potential\n     *      owner and supplying the null address.\n     */\n    error NewPotentialOwnerIsNullAddress();\n\n    /**\n     * @dev Revert with an error when attempting to set a new potential owner\n     *      that is already set.\n     */\n    error NewPotentialOwnerAlreadySet(address newPotentialOwner);\n\n    /**\n     * @dev Revert with an error when attempting to claim ownership of the\n     *      contract with a caller that is not the current potential owner.\n     */\n    error CallerIsNotNewPotentialOwner();\n\n    /**\n     * @dev Revert with an error when attempting to cancel ownership transfer\n     *      when no new potential owner is currently set.\n     */\n    error NoPotentialOwnerCurrentlySet();\n\n    /**\n     * @notice Initiate ownership transfer by assigning a new potential owner\n     *         to this contract. Once set, the new potential owner may call\n     *         `acceptOwnership` to claim ownership. Only the owner may call\n     *         this function.\n     *\n     * @param newPotentialOwner The address for which to initiate ownership\n     *                          transfer to.\n     */\n    function transferOwnership(address newPotentialOwner) external;\n\n    /**\n     * @notice Clear the currently set potential owner, if any. Only the owner\n     *         of this contract may call this function.\n     */\n    function cancelOwnershipTransfer() external;\n\n    /**\n     * @notice Accept ownership of this contract. Only the account that the\n     *         current owner has set as the new potential owner may call this\n     *         function.\n     */\n    function acceptOwnership() external;\n\n    /**\n     * @notice An external view function that returns the potential owner.\n     *\n     * @return The address of the potential owner.\n     */\n    function potentialOwner() external view returns (address);\n\n    /**\n     * @notice An external view function that returns the owner.\n     *\n     * @return The address of the owner.\n     */\n    function owner() external view returns (address);\n}\n"
      }
    },
    "settings": {
      "remappings": [
        "@rari-capital/solmate/=lib/solmate/",
        "ds-test/=lib/ds-test/src/",
        "forge-std/=lib/forge-std/src/",
        "murky/=lib/murky/src/",
        "@openzeppelin/=lib/openzeppelin-contracts/",
        "solarray/=lib/solarray/src/",
        "solady/=lib/solady/",
        "seaport-sol/src/=src/sol/",
        "seaport-sol/=src/sol/",
        "seaport-types/src/=src/types/",
        "seaport-types/=src/types/",
        "seaport-core/src/=src/core/",
        "seaport-core/=src/core/",
        "seaport/=src/main/",
        "@limitbreak/creator-token-standards/=lib/erc721c-seaport/lib/creator-token-standards/src/",
        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
        "ERC721A/=lib/erc721c-seaport/lib/creator-token-standards/lib/ERC721A/contracts/",
        "creator-token-standards/=lib/erc721c-seaport/lib/creator-token-standards/",
        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
        "erc721a/=lib/erc721c-seaport/lib/creator-token-standards/lib/ERC721A/",
        "erc721c-seaport/=lib/erc721c-seaport/src/",
        "openzeppelin-contracts/=lib/openzeppelin-contracts/",
        "seaport-deploy/=lib/erc721c-seaport/lib/seaport-deploy/",
        "solmate/=lib/solmate/src/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 9999999
      },
      "metadata": {
        "useLiteralContent": false,
        "bytecodeHash": "ipfs",
        "appendCBOR": true
      },
      "outputSelection": {
        "*": {
          "*": [
            "evm.bytecode",
            "evm.deployedBytecode",
            "devdoc",
            "userdoc",
            "metadata",
            "abi"
          ]
        }
      },
      "evmVersion": "cancun",
      "viaIR": false,
      "libraries": {}
    }
  }}