// SPDX-License-Identifier: UNLICENSED
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)
        }
    }
}
[{"inputs":[{"internalType":"address","name":"attestor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ATTESTOR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"core","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"deploy","outputs":[],"stateMutability":"nonpayable","type":"function"}]