// SPDX-License-Identifier: MIT
pragma solidity >=0.8.4;

/// @notice Reentrancy protection for smart contracts.
/// @author z0r0z.eth
/// @author Modified from Seaport
///         (https://github.com/ProjectOpenSea/seaport/blob/main/contracts/lib/ReentrancyGuard.sol)
/// @author Modified from Solmate
///         (https://github.com/Rari-Capital/solmate/blob/main/src/utils/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
    error Reentrancy();

    uint256 private guard = 1;

    modifier nonReentrant() virtual {
        setReentrancyGuard();

        _;

        clearReentrancyGuard();
    }

    /// @dev Check guard sentinel value and set it.
    function setReentrancyGuard() internal virtual {
        if (guard == 2) revert Reentrancy();

        guard = 2;
    }

    /// @dev Unset sentinel value.
    function clearReentrancyGuard() internal virtual {
        guard = 1;
    }
}
