// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;
interface Hevm {
/// @notice Sets the block timestamp.
function warp(uint256) external;
/// @notice Sets the block height.
function roll(uint256) external;
/// @notice Sets the block base fee.
function fee(uint256) external;
/// @notice Loads a storage slot from an address.
function load(address, bytes32) external returns (bytes32);
/// @notice Stores a value to an address' storage slot.
function store(
address,
bytes32,
bytes32
) external;
/// @notice Signs a digest with a private key, returns v r s.
function sign(uint256, bytes32)
external
returns (
uint8,
bytes32,
bytes32
);
/// @notice Gets address for a given private key.
function addr(uint256) external returns (address);
/// @notice Performs a foreign function call via a terminal call.
function ffi(string[] calldata) external returns (bytes memory);
/// @notice Sets the next call's msg.sender to be the input address.
function prank(address) external;
/// @notice Sets all subsequent calls' msg.sender to be the input address until stopPrank is called.
function startPrank(address) external;
/// @notice Sets the next call's msg.sender to be the input address and the tx.origin to be the second input.
function prank(address, address) external;
/// @notice Sets all subsequent calls' msg.sender to be the input address and
/// sets tx.origin to be the second address inputted until stopPrank is called.
function startPrank(address, address) external;
/// @notice Resets msg.sender to its original value before a prank.
function stopPrank() external;
/// @notice Sets an address' balance.
function deal(address, uint256) external;
/// @notice Sets an address' code.
function etch(address, bytes calldata) external;
/// @notice Expects an error from the next call.
function expectRevert(bytes calldata) external;
/// @notice Expects a revert from the next call.
function expectRevert(bytes4) external;
/// @notice Record all storage reads and writes.
function record() external;
/// @notice Gets all accessed reads and write slots from a recording session, for a given address.
function accesses(address) external returns (bytes32[] memory reads, bytes32[] memory writes);
/// @notice Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData).
/// @notice Call this function, then emit an event, then call a function. Internally after the call, we check
/// if logs were emitted in the expected order with the expected topics and data as specified by the booleans.
function expectEmit(
bool,
bool,
bool,
bool
) external;
/// @notice Mocks the behavior of a contract call, setting the input and output for a function.
/// @notice Calldata can either be strict or a partial match, e.g. if only passed
/// a selector to the expected calldata, then the entire function will be mocked.
function mockCall(
address,
bytes calldata,
bytes calldata
) external;
/// @notice Clears all mocked calls.
function clearMockedCalls() external;
/// @notice Expect a call to an address with the specified calldata.
/// @notice Calldata can either be strict or a partial match.
function expectCall(address, bytes calldata) external;
/// @notice Fetches the contract bytecode from its artifact file.
function getCode(string calldata) external returns (bytes memory);
/// @notice Label an address in test traces.
function label(address addr, string calldata label) external;
/// @notice When fuzzing, generate new inputs if the input conditional is not met.
function assume(bool) external;
}