// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IGatekeeper {
    error NotStaking();
    error SendFailed();
    error WrongChainId();
    error BadSignature();
    error NotGatekeeper();
    error AlreadyExecuted();
    error InvalidCalldata();
    error NonExistentAmount();
    error InsufficientValue();
    error ExecutionReverted();

    event Ghosted(bytes32 indexed receiver, uint256 indexed amount);
    event Materialized(address indexed receiver, uint256 indexed amount);
    event Rotated(bytes32 indexed aggregatedPublicKey, uint8 indexed parity);

    function staking() external view returns (address);
    function storageHistory() external view returns (address);
    function ghostedSupply() external view returns (uint256);
    function existentialDeposit() external view returns (uint256);
    function latestPublicKeyInfo() external view returns (bytes32, uint8, uint64);
    function getRotationInfoAt(uint256 session) external view returns (bytes32, uint8, uint64);

    function materialize(uint256 session, uint256 amount, uint256 payload) external payable;
    function rotate(uint256 session, bytes32 publicKey, uint8 parity) external;
    function ghost(bytes32 receiver, uint256 amount) external returns (uint256);
}
