// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
address constant SYSTEM_ADDR = 0x0000000000000000000000000000000000000900;
interface ISystem {
/// Computes the BLAKE2 256-bit hash on the given input.
function hashBlake256(bytes memory input) external pure returns (bytes32 digest);
/// Computes the BLAKE2 128-bit hash on the given input.
function hashBlake128(bytes memory input) external pure returns (bytes32 digest);
/// Retrieve the account id for a specified `H160` address.
///
/// Calling this function on a native `H160` chain (`type AccountId = H160`)
/// does not make sense, as it would just return the `address` that it was
/// called with.
///
/// # Note
///
/// If no mapping exists for `addr`, the fallback account id will be returned.
function toAccountId(address input) external view returns (bytes memory account_id);
/// Checks whether the caller of the contract calling this function is the origin
/// of the whole call stack.
function callerIsOrigin() external view returns (bool);
/// Checks whether the caller of the contract calling this function is root.
///
/// Note that only the origin of the call stack can be root. Hence this
/// function returning `true` implies that the contract is being called by the origin.
///
/// A return value of `true` indicates that this contract is being called by a root origin,
/// and `false` indicates that the caller is a signed origin.
function callerIsRoot() external view returns (bool);
/// Returns the minimum balance that is required for creating an account
/// (the existential deposit).
function minimumBalance() external view returns (uint);
/// Returns the code hash of the caller.
function ownCodeHash() external view returns (bytes32);
/// Returns the amount of `Weight` left.
function weightLeft() external view returns (uint64 refTime, uint64 proofSize);
/// Terminate the calling contract of this function and send balance to `beneficiary`.
/// This will revert if:
/// - called from constructor
/// - called from static context
/// - called from delegate context
/// - the contract introduced balance locks
function terminate(address beneficiary) external;
}