// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.13; abstract contract NonReentrant { /// @notice The slot used for re-entrance protection. /// @dev /// 0xa2df719fa6ce35dee70f7a6f6c8087eb6e4e1e302979ab963fd34848c3a589af bytes32 public constant ENTERED_SLOT = bytes32(uint256(keccak256("eip1967.proxy.accumulate.re-entrance")) - 1); /// @notice Indicates a re-entrance /// @dev Selector 0xc07c7e13 error Reentrance(); /// @notice Modifier to prevent re-entrance. modifier nonReentrant() { if (isEntered()) revert Reentrance(); setEntered(); _; clearEntered(); } /// @notice Set the re-entrance guard. function setEntered() internal { bytes32 slot = ENTERED_SLOT; assembly ("memory-safe") { sstore(slot, 1) } } /// @notice Clear the re-entrance guard. function clearEntered() internal { bytes32 slot = ENTERED_SLOT; assembly ("memory-safe") { sstore(slot, 0) } } /// @notice Retrieve the entrance status. /// @return status True if entered guard is set, false otherwise. function isEntered() internal view returns (bool status) { bytes32 slot = ENTERED_SLOT; assembly ("memory-safe") { status := sload(slot) } } }