foundry_cheatcodes_spec/
vm.rs

1// We don't document function parameters individually so we can't enable `missing_docs` for this
2// module. Instead, we emit custom diagnostics in `#[derive(Cheatcode)]`.
3#![allow(missing_docs)]
4
5use super::*;
6use crate::Vm::ForgeContext;
7use alloy_sol_types::sol;
8use foundry_macros::Cheatcode;
9
10sol! {
11// Cheatcodes are marked as view/pure/none using the following rules:
12// 0. A call's observable behaviour includes its return value, logs, reverts and state writes,
13// 1. If you can influence a later call's observable behaviour, you're neither `view` nor `pure`
14//    (you are modifying some state be it the EVM, interpreter, filesystem, etc),
15// 2. Otherwise if you can be influenced by an earlier call, or if reading some state, you're `view`,
16// 3. Otherwise you're `pure`.
17
18/// Foundry cheatcodes interface.
19#[derive(Debug, Cheatcode)] // Keep this list small to avoid unnecessary bloat.
20#[sol(abi)]
21interface Vm {
22    //  ======== Types ========
23
24    /// Error thrown by cheatcodes.
25    error CheatcodeError(string message);
26
27    /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`.
28    enum CallerMode {
29        /// No caller modification is currently active.
30        None,
31        /// A one time broadcast triggered by a `vm.broadcast()` call is currently active.
32        Broadcast,
33        /// A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active.
34        RecurrentBroadcast,
35        /// A one time prank triggered by a `vm.prank()` call is currently active.
36        Prank,
37        /// A recurrent prank triggered by a `vm.startPrank()` call is currently active.
38        RecurrentPrank,
39    }
40
41    /// The kind of account access that occurred.
42    enum AccountAccessKind {
43        /// The account was called.
44        Call,
45        /// The account was called via delegatecall.
46        DelegateCall,
47        /// The account was called via callcode.
48        CallCode,
49        /// The account was called via staticcall.
50        StaticCall,
51        /// The account was created.
52        Create,
53        /// The account was selfdestructed.
54        SelfDestruct,
55        /// Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess).
56        Resume,
57        /// The account's balance was read.
58        Balance,
59        /// The account's codesize was read.
60        Extcodesize,
61        /// The account's codehash was read.
62        Extcodehash,
63        /// The account's code was copied.
64        Extcodecopy,
65    }
66
67    /// Forge execution contexts.
68    enum ForgeContext {
69        /// Test group execution context (test, coverage or snapshot).
70        TestGroup,
71        /// `forge test` execution context.
72        Test,
73        /// `forge coverage` execution context.
74        Coverage,
75        /// `forge snapshot` execution context.
76        Snapshot,
77        /// Script group execution context (dry run, broadcast or resume).
78        ScriptGroup,
79        /// `forge script` execution context.
80        ScriptDryRun,
81        /// `forge script --broadcast` execution context.
82        ScriptBroadcast,
83        /// `forge script --resume` execution context.
84        ScriptResume,
85        /// Unknown `forge` execution context.
86        Unknown,
87    }
88
89    /// An Ethereum log. Returned by `getRecordedLogs`.
90    struct Log {
91        /// The topics of the log, including the signature, if any.
92        bytes32[] topics;
93        /// The raw data of the log.
94        bytes data;
95        /// The address of the log's emitter.
96        address emitter;
97    }
98
99    /// Gas used. Returned by `lastCallGas`.
100    struct Gas {
101        /// The gas limit of the call.
102        uint64 gasLimit;
103        /// The total gas used.
104        uint64 gasTotalUsed;
105        /// DEPRECATED: The amount of gas used for memory expansion. Ref: <https://github.com/foundry-rs/foundry/pull/7934#pullrequestreview-2069236939>
106        uint64 gasMemoryUsed;
107        /// The amount of gas refunded.
108        int64 gasRefunded;
109        /// The amount of gas remaining.
110        uint64 gasRemaining;
111    }
112
113    /// An RPC URL and its alias. Returned by `rpcUrlStructs`.
114    struct Rpc {
115        /// The alias of the RPC URL.
116        string key;
117        /// The RPC URL.
118        string url;
119    }
120
121    /// An RPC log object. Returned by `eth_getLogs`.
122    struct EthGetLogs {
123        /// The address of the log's emitter.
124        address emitter;
125        /// The topics of the log, including the signature, if any.
126        bytes32[] topics;
127        /// The raw data of the log.
128        bytes data;
129        /// The block hash.
130        bytes32 blockHash;
131        /// The block number.
132        uint64 blockNumber;
133        /// The transaction hash.
134        bytes32 transactionHash;
135        /// The transaction index in the block.
136        uint64 transactionIndex;
137        /// The log index.
138        uint256 logIndex;
139        /// Whether the log was removed.
140        bool removed;
141    }
142
143    /// A single entry in a directory listing. Returned by `readDir`.
144    struct DirEntry {
145        /// The error message, if any.
146        string errorMessage;
147        /// The path of the entry.
148        string path;
149        /// The depth of the entry.
150        uint64 depth;
151        /// Whether the entry is a directory.
152        bool isDir;
153        /// Whether the entry is a symlink.
154        bool isSymlink;
155    }
156
157    /// Metadata information about a file.
158    ///
159    /// This structure is returned from the `fsMetadata` function and represents known
160    /// metadata about a file such as its permissions, size, modification
161    /// times, etc.
162    struct FsMetadata {
163        /// True if this metadata is for a directory.
164        bool isDir;
165        /// True if this metadata is for a symlink.
166        bool isSymlink;
167        /// The size of the file, in bytes, this metadata is for.
168        uint256 length;
169        /// True if this metadata is for a readonly (unwritable) file.
170        bool readOnly;
171        /// The last modification time listed in this metadata.
172        uint256 modified;
173        /// The last access time of this metadata.
174        uint256 accessed;
175        /// The creation time listed in this metadata.
176        uint256 created;
177    }
178
179    /// A wallet with a public and private key.
180    struct Wallet {
181        /// The wallet's address.
182        address addr;
183        /// The wallet's public key `X`.
184        uint256 publicKeyX;
185        /// The wallet's public key `Y`.
186        uint256 publicKeyY;
187        /// The wallet's private key.
188        uint256 privateKey;
189    }
190
191    /// The result of a `tryFfi` call.
192    struct FfiResult {
193        /// The exit code of the call.
194        int32 exitCode;
195        /// The optionally hex-decoded `stdout` data.
196        bytes stdout;
197        /// The `stderr` data.
198        bytes stderr;
199    }
200
201    /// Information on the chain and fork.
202    struct ChainInfo {
203        /// The fork identifier. Set to zero if no fork is active.
204        uint256 forkId;
205        /// The chain ID of the current fork.
206        uint256 chainId;
207    }
208
209    /// Information about a blockchain.
210    struct Chain {
211        /// The chain name.
212        string name;
213        /// The chain's Chain ID.
214        uint256 chainId;
215        /// The chain's alias. (i.e. what gets specified in `foundry.toml`).
216        string chainAlias;
217        /// A default RPC endpoint for this chain.
218        string rpcUrl;
219    }
220
221    /// The storage accessed during an `AccountAccess`.
222    struct StorageAccess {
223        /// The account whose storage was accessed.
224        address account;
225        /// The slot that was accessed.
226        bytes32 slot;
227        /// If the access was a write.
228        bool isWrite;
229        /// The previous value of the slot.
230        bytes32 previousValue;
231        /// The new value of the slot.
232        bytes32 newValue;
233        /// If the access was reverted.
234        bool reverted;
235    }
236
237    /// An EIP-2930 access list item.
238    struct AccessListItem {
239        /// The address to be added in access list.
240        address target;
241        /// The storage keys to be added in access list.
242        bytes32[] storageKeys;
243    }
244
245    /// The result of a `stopAndReturnStateDiff` call.
246    struct AccountAccess {
247        /// The chain and fork the access occurred.
248        ChainInfo chainInfo;
249        /// The kind of account access that determines what the account is.
250        /// If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee.
251        /// If kind is Create, then the account is the newly created account.
252        /// If kind is SelfDestruct, then the account is the selfdestruct recipient.
253        /// If kind is a Resume, then account represents a account context that has resumed.
254        AccountAccessKind kind;
255        /// The account that was accessed.
256        /// It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT.
257        address account;
258        /// What accessed the account.
259        address accessor;
260        /// If the account was initialized or empty prior to the access.
261        /// An account is considered initialized if it has code, a
262        /// non-zero nonce, or a non-zero balance.
263        bool initialized;
264        /// The previous balance of the accessed account.
265        uint256 oldBalance;
266        /// The potential new balance of the accessed account.
267        /// That is, all balance changes are recorded here, even if reverts occurred.
268        uint256 newBalance;
269        /// Code of the account deployed by CREATE.
270        bytes deployedCode;
271        /// Value passed along with the account access
272        uint256 value;
273        /// Input data provided to the CREATE or CALL
274        bytes data;
275        /// If this access reverted in either the current or parent context.
276        bool reverted;
277        /// An ordered list of storage accesses made during an account access operation.
278        StorageAccess[] storageAccesses;
279        /// Call depth traversed during the recording of state differences
280        uint64 depth;
281        /// The previous nonce of the accessed account.
282        uint64 oldNonce;
283        /// The new nonce of the accessed account.
284        uint64 newNonce;
285    }
286
287    /// The result of the `stopDebugTraceRecording` call
288    struct DebugStep {
289        /// The stack before executing the step of the run.
290        /// stack\[0\] represents the top of the stack.
291        /// and only stack data relevant to the opcode execution is contained.
292        uint256[] stack;
293        /// The memory input data before executing the step of the run.
294        /// only input data relevant to the opcode execution is contained.
295        ///
296        /// e.g. for MLOAD, it will have memory\[offset:offset+32\] copied here.
297        /// the offset value can be get by the stack data.
298        bytes memoryInput;
299        /// The opcode that was accessed.
300        uint8 opcode;
301        /// The call depth of the step.
302        uint64 depth;
303        /// Whether the call end up with out of gas error.
304        bool isOutOfGas;
305        /// The contract address where the opcode is running
306        address contractAddr;
307    }
308
309    /// The transaction type (`txType`) of the broadcast.
310    enum BroadcastTxType {
311        /// Represents a CALL broadcast tx.
312        Call,
313        /// Represents a CREATE broadcast tx.
314        Create,
315        /// Represents a CREATE2 broadcast tx.
316        Create2
317    }
318
319    /// Represents a transaction's broadcast details.
320    struct BroadcastTxSummary {
321        /// The hash of the transaction that was broadcasted
322        bytes32 txHash;
323        /// Represent the type of transaction among CALL, CREATE, CREATE2
324        BroadcastTxType txType;
325        /// The address of the contract that was called or created.
326        /// This is address of the contract that is created if the txType is CREATE or CREATE2.
327        address contractAddress;
328        /// The block number the transaction landed in.
329        uint64 blockNumber;
330        /// Status of the transaction, retrieved from the transaction receipt.
331        bool success;
332    }
333
334    /// Holds a signed EIP-7702 authorization for an authority account to delegate to an implementation.
335    struct SignedDelegation {
336        /// The y-parity of the recovered secp256k1 signature (0 or 1).
337        uint8 v;
338        /// First 32 bytes of the signature.
339        bytes32 r;
340        /// Second 32 bytes of the signature.
341        bytes32 s;
342        /// The current nonce of the authority account at signing time.
343        /// Used to ensure signature can't be replayed after account nonce changes.
344        uint64 nonce;
345        /// Address of the contract implementation that will be delegated to.
346        /// Gets encoded into delegation code: 0xef0100 || implementation.
347        address implementation;
348    }
349
350    /// Represents a "potential" revert reason from a single subsequent call when using `vm.assumeNoReverts`.
351    /// Reverts that match will result in a FOUNDRY::ASSUME rejection, whereas unmatched reverts will be surfaced
352    /// as normal.
353    struct PotentialRevert {
354        /// The allowed origin of the revert opcode; address(0) allows reverts from any address
355        address reverter;
356        /// When true, only matches on the beginning of the revert data, otherwise, matches on entire revert data
357        bool partialMatch;
358        /// The data to use to match encountered reverts
359        bytes revertData;
360    }
361
362    // ======== EVM ========
363
364    /// Gets the address for a given private key.
365    #[cheatcode(group = Evm, safety = Safe)]
366    function addr(uint256 privateKey) external pure returns (address keyAddr);
367
368    /// Dump a genesis JSON file's `allocs` to disk.
369    #[cheatcode(group = Evm, safety = Unsafe)]
370    function dumpState(string calldata pathToStateJson) external;
371
372    /// Gets the nonce of an account.
373    #[cheatcode(group = Evm, safety = Safe)]
374    function getNonce(address account) external view returns (uint64 nonce);
375
376    /// Get the nonce of a `Wallet`.
377    #[cheatcode(group = Evm, safety = Safe)]
378    function getNonce(Wallet calldata wallet) external view returns (uint64 nonce);
379
380    /// Loads a storage slot from an address.
381    #[cheatcode(group = Evm, safety = Safe)]
382    function load(address target, bytes32 slot) external view returns (bytes32 data);
383
384    /// Load a genesis JSON file's `allocs` into the in-memory EVM state.
385    #[cheatcode(group = Evm, safety = Unsafe)]
386    function loadAllocs(string calldata pathToAllocsJson) external;
387
388    // -------- Record Debug Traces --------
389
390    /// Records the debug trace during the run.
391    #[cheatcode(group = Evm, safety = Safe)]
392    function startDebugTraceRecording() external;
393
394    /// Stop debug trace recording and returns the recorded debug trace.
395    #[cheatcode(group = Evm, safety = Safe)]
396    function stopAndReturnDebugTraceRecording() external returns (DebugStep[] memory step);
397
398
399    /// Clones a source account code, state, balance and nonce to a target account and updates in-memory EVM state.
400    #[cheatcode(group = Evm, safety = Unsafe)]
401    function cloneAccount(address source, address target) external;
402
403    // -------- Record Storage --------
404
405    /// Records all storage reads and writes. Use `accesses` to get the recorded data.
406    /// Subsequent calls to `record` will clear the previous data.
407    #[cheatcode(group = Evm, safety = Safe)]
408    function record() external;
409
410    /// Stops recording storage reads and writes.
411    #[cheatcode(group = Evm, safety = Safe)]
412    function stopRecord() external;
413
414    /// Gets all accessed reads and write slot from a `vm.record` session, for a given address.
415    #[cheatcode(group = Evm, safety = Safe)]
416    function accesses(address target) external view returns (bytes32[] memory readSlots, bytes32[] memory writeSlots);
417
418    /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order,
419    /// along with the context of the calls
420    #[cheatcode(group = Evm, safety = Safe)]
421    function startStateDiffRecording() external;
422
423    /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session.
424    #[cheatcode(group = Evm, safety = Safe)]
425    function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses);
426
427    /// Returns state diffs from current `vm.startStateDiffRecording` session.
428    #[cheatcode(group = Evm, safety = Safe)]
429    function getStateDiff() external view returns (string memory diff);
430
431    /// Returns state diffs from current `vm.startStateDiffRecording` session, in json format.
432    #[cheatcode(group = Evm, safety = Safe)]
433    function getStateDiffJson() external view returns (string memory diff);
434
435    /// Returns an array of storage slots occupied by the specified variable.
436    #[cheatcode(group = Evm, safety = Safe)]
437    function getStorageSlots(address target, string calldata variableName) external view returns (uint256[] memory slots);
438
439    /// Returns an array of `StorageAccess` from current `vm.stateStateDiffRecording` session
440    #[cheatcode(group = Evm, safety = Safe)]
441    function getStorageAccesses() external view returns (StorageAccess[] memory storageAccesses);
442
443    // -------- Recording Map Writes --------
444
445    /// Starts recording all map SSTOREs for later retrieval.
446    #[cheatcode(group = Evm, safety = Safe)]
447    function startMappingRecording() external;
448
449    /// Stops recording all map SSTOREs for later retrieval and clears the recorded data.
450    #[cheatcode(group = Evm, safety = Safe)]
451    function stopMappingRecording() external;
452
453    /// Gets the number of elements in the mapping at the given slot, for a given address.
454    #[cheatcode(group = Evm, safety = Safe)]
455    function getMappingLength(address target, bytes32 mappingSlot) external view returns (uint256 length);
456
457    /// Gets the elements at index idx of the mapping at the given slot, for a given address. The
458    /// index must be less than the length of the mapping (i.e. the number of keys in the mapping).
459    #[cheatcode(group = Evm, safety = Safe)]
460    function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external view returns (bytes32 value);
461
462    /// Gets the map key and parent of a mapping at a given slot, for a given address.
463    #[cheatcode(group = Evm, safety = Safe)]
464    function getMappingKeyAndParentOf(address target, bytes32 elementSlot)
465        external
466        view
467        returns (bool found, bytes32 key, bytes32 parent);
468
469    // -------- Block and Transaction Properties --------
470
471    /// Gets the current `block.chainid` of the currently selected environment.
472    /// You should use this instead of `block.chainid` if you use `vm.selectFork` or `vm.createSelectFork`, as `block.chainid` could be assumed
473    /// to be constant across a transaction, and as a result will get optimized out by the compiler.
474    /// See https://github.com/foundry-rs/foundry/issues/6180
475    #[cheatcode(group = Evm, safety = Safe)]
476    function getChainId() external view returns (uint256 blockChainId);
477
478    /// Sets `block.chainid`.
479    #[cheatcode(group = Evm, safety = Unsafe)]
480    function chainId(uint256 newChainId) external;
481
482    /// Sets `block.coinbase`.
483    #[cheatcode(group = Evm, safety = Unsafe)]
484    function coinbase(address newCoinbase) external;
485
486    /// Sets `block.difficulty`.
487    /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead.
488    /// Reverts if used on unsupported EVM versions.
489    #[cheatcode(group = Evm, safety = Unsafe)]
490    function difficulty(uint256 newDifficulty) external;
491
492    /// Sets `block.basefee`.
493    #[cheatcode(group = Evm, safety = Unsafe)]
494    function fee(uint256 newBasefee) external;
495
496    /// Sets `block.prevrandao`.
497    /// Not available on EVM versions before Paris. Use `difficulty` instead.
498    /// If used on unsupported EVM versions it will revert.
499    #[cheatcode(group = Evm, safety = Unsafe)]
500    function prevrandao(bytes32 newPrevrandao) external;
501    /// Sets `block.prevrandao`.
502    /// Not available on EVM versions before Paris. Use `difficulty` instead.
503    /// If used on unsupported EVM versions it will revert.
504    #[cheatcode(group = Evm, safety = Unsafe)]
505    function prevrandao(uint256 newPrevrandao) external;
506
507    /// Sets the blobhashes in the transaction.
508    /// Not available on EVM versions before Cancun.
509    /// If used on unsupported EVM versions it will revert.
510    #[cheatcode(group = Evm, safety = Unsafe)]
511    function blobhashes(bytes32[] calldata hashes) external;
512
513    /// Gets the blockhashes from the current transaction.
514    /// Not available on EVM versions before Cancun.
515    /// If used on unsupported EVM versions it will revert.
516    #[cheatcode(group = Evm, safety = Unsafe)]
517    function getBlobhashes() external view returns (bytes32[] memory hashes);
518
519    /// Sets `block.height`.
520    #[cheatcode(group = Evm, safety = Unsafe)]
521    function roll(uint256 newHeight) external;
522
523    /// Gets the current `block.number`.
524    /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction,
525    /// and as a result will get optimized out by the compiler.
526    /// See https://github.com/foundry-rs/foundry/issues/6180
527    #[cheatcode(group = Evm, safety = Safe)]
528    function getBlockNumber() external view returns (uint256 height);
529
530    /// Sets `tx.gasprice`.
531    #[cheatcode(group = Evm, safety = Unsafe)]
532    function txGasPrice(uint256 newGasPrice) external;
533
534    /// Sets `block.timestamp`.
535    #[cheatcode(group = Evm, safety = Unsafe)]
536    function warp(uint256 newTimestamp) external;
537
538    /// Gets the current `block.timestamp`.
539    /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction,
540    /// and as a result will get optimized out by the compiler.
541    /// See https://github.com/foundry-rs/foundry/issues/6180
542    #[cheatcode(group = Evm, safety = Safe)]
543    function getBlockTimestamp() external view returns (uint256 timestamp);
544
545    /// Gets the RLP encoded block header for a given block number.
546    /// Returns the block header in the same format as `cast block <block_number> --raw`.
547    #[cheatcode(group = Evm, safety = Safe)]
548    function getRawBlockHeader(uint256 blockNumber) external view returns (bytes memory rlpHeader);
549
550    /// Sets `block.blobbasefee`
551    #[cheatcode(group = Evm, safety = Unsafe)]
552    function blobBaseFee(uint256 newBlobBaseFee) external;
553
554    /// Gets the current `block.blobbasefee`.
555    /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction,
556    /// and as a result will get optimized out by the compiler.
557    /// See https://github.com/foundry-rs/foundry/issues/6180
558    #[cheatcode(group = Evm, safety = Safe)]
559    function getBlobBaseFee() external view returns (uint256 blobBaseFee);
560
561    /// Set blockhash for the current block.
562    /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`.
563    #[cheatcode(group = Evm, safety = Unsafe)]
564    function setBlockhash(uint256 blockNumber, bytes32 blockHash) external;
565
566    // -------- Account State --------
567
568    /// Sets an address' balance.
569    #[cheatcode(group = Evm, safety = Unsafe)]
570    function deal(address account, uint256 newBalance) external;
571
572    /// Sets an address' code.
573    #[cheatcode(group = Evm, safety = Unsafe)]
574    function etch(address target, bytes calldata newRuntimeBytecode) external;
575
576    /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts.
577    #[cheatcode(group = Evm, safety = Unsafe)]
578    function resetNonce(address account) external;
579
580    /// Sets the nonce of an account. Must be higher than the current nonce of the account.
581    #[cheatcode(group = Evm, safety = Unsafe)]
582    function setNonce(address account, uint64 newNonce) external;
583
584    /// Sets the nonce of an account to an arbitrary value.
585    #[cheatcode(group = Evm, safety = Unsafe)]
586    function setNonceUnsafe(address account, uint64 newNonce) external;
587
588    /// Stores a value to an address' storage slot.
589    #[cheatcode(group = Evm, safety = Unsafe)]
590    function store(address target, bytes32 slot, bytes32 value) external;
591
592    /// Marks the slots of an account and the account address as cold.
593    #[cheatcode(group = Evm, safety = Unsafe)]
594    function cool(address target) external;
595
596    /// Utility cheatcode to set an EIP-2930 access list for all subsequent transactions.
597    #[cheatcode(group = Evm, safety = Unsafe)]
598    function accessList(AccessListItem[] calldata access) external;
599
600    /// Utility cheatcode to remove any EIP-2930 access list set by `accessList` cheatcode.
601    #[cheatcode(group = Evm, safety = Unsafe)]
602    function noAccessList() external;
603
604    /// Utility cheatcode to mark specific storage slot as warm, simulating a prior read.
605    #[cheatcode(group = Evm, safety = Unsafe)]
606    function warmSlot(address target, bytes32 slot) external;
607
608    /// Utility cheatcode to mark specific storage slot as cold, simulating no prior read.
609    #[cheatcode(group = Evm, safety = Unsafe)]
610    function coolSlot(address target, bytes32 slot) external;
611
612    /// Returns the test or script execution evm version.
613    ///
614    /// **Note:** The execution evm version is not the same as the compilation one.
615    #[cheatcode(group = Evm, safety = Safe)]
616    function getEvmVersion() external pure returns (string memory evm);
617
618    /// Set the exact test or script execution evm version, e.g. `berlin`, `cancun`.
619    ///
620    /// **Note:** The execution evm version is not the same as the compilation one.
621    #[cheatcode(group = Evm, safety = Safe)]
622    function setEvmVersion(string calldata evm) external;
623
624    // -------- Call Manipulation --------
625    // --- Mocks ---
626
627    /// Clears all mocked calls.
628    #[cheatcode(group = Evm, safety = Unsafe)]
629    function clearMockedCalls() external;
630
631    /// Mocks a call to an address, returning specified data.
632    /// Calldata can either be strict or a partial match, e.g. if you only
633    /// pass a Solidity selector to the expected calldata, then the entire Solidity
634    /// function will be mocked.
635    #[cheatcode(group = Evm, safety = Unsafe)]
636    function mockCall(address callee, bytes calldata data, bytes calldata returnData) external;
637
638    /// Mocks a call to an address with a specific `msg.value`, returning specified data.
639    /// Calldata match takes precedence over `msg.value` in case of ambiguity.
640    #[cheatcode(group = Evm, safety = Unsafe)]
641    function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external;
642
643    /// Mocks a call to an address, returning specified data.
644    /// Calldata can either be strict or a partial match, e.g. if you only
645    /// pass a Solidity selector to the expected calldata, then the entire Solidity
646    /// function will be mocked.
647    ///
648    /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
649    #[cheatcode(group = Evm, safety = Unsafe)]
650    function mockCall(address callee, bytes4 data, bytes calldata returnData) external;
651
652    /// Mocks a call to an address with a specific `msg.value`, returning specified data.
653    /// Calldata match takes precedence over `msg.value` in case of ambiguity.
654    ///
655    /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
656    #[cheatcode(group = Evm, safety = Unsafe)]
657    function mockCall(address callee, uint256 msgValue, bytes4 data, bytes calldata returnData) external;
658
659    /// Mocks multiple calls to an address, returning specified data for each call.
660    #[cheatcode(group = Evm, safety = Unsafe)]
661    function mockCalls(address callee, bytes calldata data, bytes[] calldata returnData) external;
662
663    /// Mocks multiple calls to an address with a specific `msg.value`, returning specified data for each call.
664    #[cheatcode(group = Evm, safety = Unsafe)]
665    function mockCalls(address callee, uint256 msgValue, bytes calldata data, bytes[] calldata returnData) external;
666
667    /// Reverts a call to an address with specified revert data.
668    #[cheatcode(group = Evm, safety = Unsafe)]
669    function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external;
670
671    /// Reverts a call to an address with a specific `msg.value`, with specified revert data.
672    #[cheatcode(group = Evm, safety = Unsafe)]
673    function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData)
674        external;
675
676    /// Reverts a call to an address with specified revert data.
677    ///
678    /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
679    #[cheatcode(group = Evm, safety = Unsafe)]
680    function mockCallRevert(address callee, bytes4 data, bytes calldata revertData) external;
681
682    /// Reverts a call to an address with a specific `msg.value`, with specified revert data.
683    ///
684    /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`.
685    #[cheatcode(group = Evm, safety = Unsafe)]
686    function mockCallRevert(address callee, uint256 msgValue, bytes4 data, bytes calldata revertData)
687        external;
688
689    /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls
690    /// `target` with the same calldata. This functionality is similar to a delegate call made to
691    /// `target` contract from `callee`.
692    /// Can be used to substitute a call to a function with another implementation that captures
693    /// the primary logic of the original function but is easier to reason about.
694    /// If calldata is not a strict match then partial match by selector is attempted.
695    #[cheatcode(group = Evm, safety = Unsafe)]
696    function mockFunction(address callee, address target, bytes calldata data) external;
697
698    // --- Impersonation (pranks) ---
699
700    /// Sets the *next* call's `msg.sender` to be the input address.
701    #[cheatcode(group = Evm, safety = Unsafe)]
702    function prank(address msgSender) external;
703
704    /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called.
705    #[cheatcode(group = Evm, safety = Unsafe)]
706    function startPrank(address msgSender) external;
707
708    /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.
709    #[cheatcode(group = Evm, safety = Unsafe)]
710    function prank(address msgSender, address txOrigin) external;
711
712    /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.
713    #[cheatcode(group = Evm, safety = Unsafe)]
714    function startPrank(address msgSender, address txOrigin) external;
715
716    /// Sets the *next* delegate call's `msg.sender` to be the input address.
717    #[cheatcode(group = Evm, safety = Unsafe)]
718    function prank(address msgSender, bool delegateCall) external;
719
720    /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called.
721    #[cheatcode(group = Evm, safety = Unsafe)]
722    function startPrank(address msgSender, bool delegateCall) external;
723
724    /// Sets the *next* delegate call's `msg.sender` to be the input address, and the `tx.origin` to be the second input.
725    #[cheatcode(group = Evm, safety = Unsafe)]
726    function prank(address msgSender, address txOrigin, bool delegateCall) external;
727
728    /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input.
729    #[cheatcode(group = Evm, safety = Unsafe)]
730    function startPrank(address msgSender, address txOrigin, bool delegateCall) external;
731
732    /// Resets subsequent calls' `msg.sender` to be `address(this)`.
733    #[cheatcode(group = Evm, safety = Unsafe)]
734    function stopPrank() external;
735
736    /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification.
737    #[cheatcode(group = Evm, safety = Unsafe)]
738    function readCallers() external view returns (CallerMode callerMode, address msgSender, address txOrigin);
739
740    // ----- Arbitrary Snapshots -----
741
742    /// Snapshot capture an arbitrary numerical value by name.
743    /// The group name is derived from the contract name.
744    #[cheatcode(group = Evm, safety = Unsafe)]
745    function snapshotValue(string calldata name, uint256 value) external;
746
747    /// Snapshot capture an arbitrary numerical value by name in a group.
748    #[cheatcode(group = Evm, safety = Unsafe)]
749    function snapshotValue(string calldata group, string calldata name, uint256 value) external;
750
751    // -------- Gas Snapshots --------
752
753    /// Snapshot capture the gas usage of the last call by name from the callee perspective.
754    #[cheatcode(group = Evm, safety = Unsafe)]
755    function snapshotGasLastCall(string calldata name) external returns (uint256 gasUsed);
756
757    /// Snapshot capture the gas usage of the last call by name in a group from the callee perspective.
758    #[cheatcode(group = Evm, safety = Unsafe)]
759    function snapshotGasLastCall(string calldata group, string calldata name) external returns (uint256 gasUsed);
760
761    /// Start a snapshot capture of the current gas usage by name.
762    /// The group name is derived from the contract name.
763    #[cheatcode(group = Evm, safety = Unsafe)]
764    function startSnapshotGas(string calldata name) external;
765
766    /// Start a snapshot capture of the current gas usage by name in a group.
767    #[cheatcode(group = Evm, safety = Unsafe)]
768    function startSnapshotGas(string calldata group, string calldata name) external;
769
770    /// Stop the snapshot capture of the current gas by latest snapshot name, capturing the gas used since the start.
771    #[cheatcode(group = Evm, safety = Unsafe)]
772    function stopSnapshotGas() external returns (uint256 gasUsed);
773
774    /// Stop the snapshot capture of the current gas usage by name, capturing the gas used since the start.
775    /// The group name is derived from the contract name.
776    #[cheatcode(group = Evm, safety = Unsafe)]
777    function stopSnapshotGas(string calldata name) external returns (uint256 gasUsed);
778
779    /// Stop the snapshot capture of the current gas usage by name in a group, capturing the gas used since the start.
780    #[cheatcode(group = Evm, safety = Unsafe)]
781    function stopSnapshotGas(string calldata group, string calldata name) external returns (uint256 gasUsed);
782
783    // -------- State Snapshots --------
784
785    /// `snapshot` is being deprecated in favor of `snapshotState`. It will be removed in future versions.
786    #[cheatcode(group = Evm, safety = Unsafe, status = Deprecated(Some("replaced by `snapshotState`")))]
787    function snapshot() external returns (uint256 snapshotId);
788
789    /// Snapshot the current state of the evm.
790    /// Returns the ID of the snapshot that was created.
791    /// To revert a snapshot use `revertToState`.
792    #[cheatcode(group = Evm, safety = Unsafe)]
793    function snapshotState() external returns (uint256 snapshotId);
794
795    /// `revertTo` is being deprecated in favor of `revertToState`. It will be removed in future versions.
796    #[cheatcode(group = Evm, safety = Unsafe, status = Deprecated(Some("replaced by `revertToState`")))]
797    function revertTo(uint256 snapshotId) external returns (bool success);
798
799    /// Revert the state of the EVM to a previous snapshot
800    /// Takes the snapshot ID to revert to.
801    ///
802    /// Returns `true` if the snapshot was successfully reverted.
803    /// Returns `false` if the snapshot does not exist.
804    ///
805    /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteStateSnapshot`.
806    #[cheatcode(group = Evm, safety = Unsafe)]
807    function revertToState(uint256 snapshotId) external returns (bool success);
808
809    /// `revertToAndDelete` is being deprecated in favor of `revertToStateAndDelete`. It will be removed in future versions.
810    #[cheatcode(group = Evm, safety = Unsafe, status = Deprecated(Some("replaced by `revertToStateAndDelete`")))]
811    function revertToAndDelete(uint256 snapshotId) external returns (bool success);
812
813    /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots
814    /// Takes the snapshot ID to revert to.
815    ///
816    /// Returns `true` if the snapshot was successfully reverted and deleted.
817    /// Returns `false` if the snapshot does not exist.
818    #[cheatcode(group = Evm, safety = Unsafe)]
819    function revertToStateAndDelete(uint256 snapshotId) external returns (bool success);
820
821    /// `deleteSnapshot` is being deprecated in favor of `deleteStateSnapshot`. It will be removed in future versions.
822    #[cheatcode(group = Evm, safety = Unsafe, status = Deprecated(Some("replaced by `deleteStateSnapshot`")))]
823    function deleteSnapshot(uint256 snapshotId) external returns (bool success);
824
825    /// Removes the snapshot with the given ID created by `snapshot`.
826    /// Takes the snapshot ID to delete.
827    ///
828    /// Returns `true` if the snapshot was successfully deleted.
829    /// Returns `false` if the snapshot does not exist.
830    #[cheatcode(group = Evm, safety = Unsafe)]
831    function deleteStateSnapshot(uint256 snapshotId) external returns (bool success);
832
833    /// `deleteSnapshots` is being deprecated in favor of `deleteStateSnapshots`. It will be removed in future versions.
834    #[cheatcode(group = Evm, safety = Unsafe, status = Deprecated(Some("replaced by `deleteStateSnapshots`")))]
835    function deleteSnapshots() external;
836
837    /// Removes _all_ snapshots previously created by `snapshot`.
838    #[cheatcode(group = Evm, safety = Unsafe)]
839    function deleteStateSnapshots() external;
840
841    // -------- Forking --------
842    // --- Creation and Selection ---
843
844    /// Returns the identifier of the currently active fork. Reverts if no fork is currently active.
845    #[cheatcode(group = Evm, safety = Unsafe)]
846    function activeFork() external view returns (uint256 forkId);
847
848    /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork.
849    #[cheatcode(group = Evm, safety = Unsafe)]
850    function createFork(string calldata urlOrAlias) external returns (uint256 forkId);
851    /// Creates a new fork with the given endpoint and block and returns the identifier of the fork.
852    #[cheatcode(group = Evm, safety = Unsafe)]
853    function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
854    /// Creates a new fork with the given endpoint and at the block the given transaction was mined in,
855    /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork.
856    #[cheatcode(group = Evm, safety = Unsafe)]
857    function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
858
859    /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork.
860    #[cheatcode(group = Evm, safety = Unsafe)]
861    function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId);
862    /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork.
863    #[cheatcode(group = Evm, safety = Unsafe)]
864    function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId);
865    /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in,
866    /// replays all transaction mined in the block before the transaction, returns the identifier of the fork.
867    #[cheatcode(group = Evm, safety = Unsafe)]
868    function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId);
869
870    /// Updates the currently active fork to given block number
871    /// This is similar to `roll` but for the currently active fork.
872    #[cheatcode(group = Evm, safety = Unsafe)]
873    function rollFork(uint256 blockNumber) external;
874    /// Updates the currently active fork to given transaction. This will `rollFork` with the number
875    /// of the block the transaction was mined in and replays all transaction mined before it in the block.
876    #[cheatcode(group = Evm, safety = Unsafe)]
877    function rollFork(bytes32 txHash) external;
878    /// Updates the given fork to given block number.
879    #[cheatcode(group = Evm, safety = Unsafe)]
880    function rollFork(uint256 forkId, uint256 blockNumber) external;
881    /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block.
882    #[cheatcode(group = Evm, safety = Unsafe)]
883    function rollFork(uint256 forkId, bytes32 txHash) external;
884
885    /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active.
886    #[cheatcode(group = Evm, safety = Unsafe)]
887    function selectFork(uint256 forkId) external;
888
889    /// Fetches the given transaction from the active fork and executes it on the current state.
890    #[cheatcode(group = Evm, safety = Unsafe)]
891    function transact(bytes32 txHash) external;
892    /// Fetches the given transaction from the given fork and executes it on the current state.
893    #[cheatcode(group = Evm, safety = Unsafe)]
894    function transact(uint256 forkId, bytes32 txHash) external;
895
896    /// Performs an Ethereum JSON-RPC request to the current fork URL.
897    #[cheatcode(group = Evm, safety = Safe)]
898    function rpc(string calldata method, string calldata params) external returns (bytes memory data);
899
900    /// Performs an Ethereum JSON-RPC request to the given endpoint.
901    #[cheatcode(group = Evm, safety = Safe)]
902    function rpc(string calldata urlOrAlias, string calldata method, string calldata params)
903        external
904        returns (bytes memory data);
905
906    /// Gets all the logs according to specified filter.
907    #[cheatcode(group = Evm, safety = Safe)]
908    function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics)
909        external
910        view
911        returns (EthGetLogs[] memory logs);
912
913    // --- Behavior ---
914
915    /// In forking mode, explicitly grant the given address cheatcode access.
916    #[cheatcode(group = Evm, safety = Unsafe)]
917    function allowCheatcodes(address account) external;
918
919    /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup
920    /// Meaning, changes made to the state of this account will be kept when switching forks.
921    #[cheatcode(group = Evm, safety = Unsafe)]
922    function makePersistent(address account) external;
923    /// See `makePersistent(address)`.
924    #[cheatcode(group = Evm, safety = Unsafe)]
925    function makePersistent(address account0, address account1) external;
926    /// See `makePersistent(address)`.
927    #[cheatcode(group = Evm, safety = Unsafe)]
928    function makePersistent(address account0, address account1, address account2) external;
929    /// See `makePersistent(address)`.
930    #[cheatcode(group = Evm, safety = Unsafe)]
931    function makePersistent(address[] calldata accounts) external;
932
933    /// Revokes persistent status from the address, previously added via `makePersistent`.
934    #[cheatcode(group = Evm, safety = Unsafe)]
935    function revokePersistent(address account) external;
936    /// See `revokePersistent(address)`.
937    #[cheatcode(group = Evm, safety = Unsafe)]
938    function revokePersistent(address[] calldata accounts) external;
939
940    /// Returns true if the account is marked as persistent.
941    #[cheatcode(group = Evm, safety = Unsafe)]
942    function isPersistent(address account) external view returns (bool persistent);
943
944    // -------- Record Logs --------
945
946    /// Record all the transaction logs.
947    #[cheatcode(group = Evm, safety = Safe)]
948    function recordLogs() external;
949
950    /// Gets all the recorded logs.
951    #[cheatcode(group = Evm, safety = Safe)]
952    function getRecordedLogs() external view returns (Log[] memory logs);
953
954    // -------- Gas Metering --------
955
956    // It's recommend to use the `noGasMetering` modifier included with forge-std, instead of
957    // using these functions directly.
958
959    /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused.
960    #[cheatcode(group = Evm, safety = Safe)]
961    function pauseGasMetering() external;
962
963    /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on.
964    #[cheatcode(group = Evm, safety = Safe)]
965    function resumeGasMetering() external;
966
967    /// Reset gas metering (i.e. gas usage is set to gas limit).
968    #[cheatcode(group = Evm, safety = Safe)]
969    function resetGasMetering() external;
970
971    // -------- Gas Measurement --------
972
973    /// Gets the gas used in the last call from the callee perspective.
974    #[cheatcode(group = Evm, safety = Safe)]
975    function lastCallGas() external view returns (Gas memory gas);
976
977    // ======== Test Assertions and Utilities ========
978
979    /// If the condition is false, discard this run's fuzz inputs and generate new ones.
980    #[cheatcode(group = Testing, safety = Safe)]
981    function assume(bool condition) external pure;
982
983    /// Discard this run's fuzz inputs and generate new ones if next call reverted.
984    #[cheatcode(group = Testing, safety = Safe)]
985    function assumeNoRevert() external pure;
986
987    /// Discard this run's fuzz inputs and generate new ones if next call reverts with the potential revert parameters.
988    #[cheatcode(group = Testing, safety = Safe)]
989    function assumeNoRevert(PotentialRevert calldata potentialRevert) external pure;
990
991    /// Discard this run's fuzz inputs and generate new ones if next call reverts with the any of the potential revert parameters.
992    #[cheatcode(group = Testing, safety = Safe)]
993    function assumeNoRevert(PotentialRevert[] calldata potentialReverts) external pure;
994
995    /// Writes a breakpoint to jump to in the debugger.
996    #[cheatcode(group = Testing, safety = Safe)]
997    function breakpoint(string calldata char) external pure;
998
999    /// Writes a conditional breakpoint to jump to in the debugger.
1000    #[cheatcode(group = Testing, safety = Safe)]
1001    function breakpoint(string calldata char, bool value) external pure;
1002
1003    /// Returns the Foundry version.
1004    /// Format: <cargo_version>-<tag>+<git_sha_short>.<unix_build_timestamp>.<profile>
1005    /// Sample output: 0.3.0-nightly+3cb96bde9b.1737036656.debug
1006    /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs.
1007    /// For reliable version comparisons, use UNIX format (e.g., >= 1700000000)
1008    /// to compare timestamps while ignoring minor time differences.
1009    #[cheatcode(group = Testing, safety = Safe)]
1010    function getFoundryVersion() external view returns (string memory version);
1011
1012    /// Returns the RPC url for the given alias.
1013    #[cheatcode(group = Testing, safety = Safe)]
1014    function rpcUrl(string calldata rpcAlias) external view returns (string memory json);
1015
1016    /// Returns all rpc urls and their aliases `[alias, url][]`.
1017    #[cheatcode(group = Testing, safety = Safe)]
1018    function rpcUrls() external view returns (string[2][] memory urls);
1019
1020    /// Returns all rpc urls and their aliases as structs.
1021    #[cheatcode(group = Testing, safety = Safe)]
1022    function rpcUrlStructs() external view returns (Rpc[] memory urls);
1023
1024    /// Returns a Chain struct for specific alias
1025    #[cheatcode(group = Testing, safety = Safe)]
1026    function getChain(string calldata chainAlias) external view returns (Chain memory chain);
1027
1028    /// Returns a Chain struct for specific chainId
1029    #[cheatcode(group = Testing, safety = Safe)]
1030    function getChain(uint256 chainId) external view returns (Chain memory chain);
1031
1032    /// Suspends execution of the main thread for `duration` milliseconds.
1033    #[cheatcode(group = Testing, safety = Safe)]
1034    function sleep(uint256 duration) external;
1035
1036    /// Expects a call to an address with the specified calldata.
1037    /// Calldata can either be a strict or a partial match.
1038    #[cheatcode(group = Testing, safety = Unsafe)]
1039    function expectCall(address callee, bytes calldata data) external;
1040
1041    /// Expects given number of calls to an address with the specified calldata.
1042    #[cheatcode(group = Testing, safety = Unsafe)]
1043    function expectCall(address callee, bytes calldata data, uint64 count) external;
1044
1045    /// Expects a call to an address with the specified `msg.value` and calldata.
1046    #[cheatcode(group = Testing, safety = Unsafe)]
1047    function expectCall(address callee, uint256 msgValue, bytes calldata data) external;
1048
1049    /// Expects given number of calls to an address with the specified `msg.value` and calldata.
1050    #[cheatcode(group = Testing, safety = Unsafe)]
1051    function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external;
1052
1053    /// Expect a call to an address with the specified `msg.value`, gas, and calldata.
1054    #[cheatcode(group = Testing, safety = Unsafe)]
1055    function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external;
1056
1057    /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata.
1058    #[cheatcode(group = Testing, safety = Unsafe)]
1059    function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external;
1060
1061    /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
1062    #[cheatcode(group = Testing, safety = Unsafe)]
1063    function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external;
1064
1065    /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas.
1066    #[cheatcode(group = Testing, safety = Unsafe)]
1067    function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count)
1068        external;
1069
1070    /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
1071    /// Call this function, then emit an event, then call a function. Internally after the call, we check if
1072    /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
1073    #[cheatcode(group = Testing, safety = Unsafe)]
1074    function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;
1075
1076    /// Same as the previous method, but also checks supplied address against emitting contract.
1077    #[cheatcode(group = Testing, safety = Unsafe)]
1078    function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)
1079        external;
1080
1081    /// Prepare an expected log with all topic and data checks enabled.
1082    /// Call this function, then emit an event, then call a function. Internally after the call, we check if
1083    /// logs were emitted in the expected order with the expected topics and data.
1084    #[cheatcode(group = Testing, safety = Unsafe)]
1085    function expectEmit() external;
1086
1087    /// Same as the previous method, but also checks supplied address against emitting contract.
1088    #[cheatcode(group = Testing, safety = Unsafe)]
1089    function expectEmit(address emitter) external;
1090
1091    /// Expect a given number of logs with the provided topics.
1092    #[cheatcode(group = Testing, safety = Unsafe)]
1093    function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, uint64 count) external;
1094
1095    /// Expect a given number of logs from a specific emitter with the provided topics.
1096    #[cheatcode(group = Testing, safety = Unsafe)]
1097    function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter, uint64 count)
1098        external;
1099
1100    /// Expect a given number of logs with all topic and data checks enabled.
1101    #[cheatcode(group = Testing, safety = Unsafe)]
1102    function expectEmit(uint64 count) external;
1103
1104    /// Expect a given number of logs from a specific emitter with all topic and data checks enabled.
1105    #[cheatcode(group = Testing, safety = Unsafe)]
1106    function expectEmit(address emitter, uint64 count) external;
1107
1108    /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.).
1109    /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
1110    /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans).
1111    #[cheatcode(group = Testing, safety = Unsafe)]
1112    function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external;
1113
1114    /// Same as the previous method, but also checks supplied address against emitting contract.
1115    #[cheatcode(group = Testing, safety = Unsafe)]
1116    function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter)
1117        external;
1118
1119    /// Prepare an expected anonymous log with all topic and data checks enabled.
1120    /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if
1121    /// logs were emitted in the expected order with the expected topics and data.
1122    #[cheatcode(group = Testing, safety = Unsafe)]
1123    function expectEmitAnonymous() external;
1124
1125    /// Same as the previous method, but also checks supplied address against emitting contract.
1126    #[cheatcode(group = Testing, safety = Unsafe)]
1127    function expectEmitAnonymous(address emitter) external;
1128
1129    /// Expects the deployment of the specified bytecode by the specified address using the CREATE opcode
1130    #[cheatcode(group = Testing, safety = Unsafe)]
1131    function expectCreate(bytes calldata bytecode, address deployer) external;
1132
1133    /// Expects the deployment of the specified bytecode by the specified address using the CREATE2 opcode
1134    #[cheatcode(group = Testing, safety = Unsafe)]
1135    function expectCreate2(bytes calldata bytecode, address deployer) external;
1136
1137    /// Expects an error on next call with any revert data.
1138    #[cheatcode(group = Testing, safety = Unsafe)]
1139    function expectRevert() external;
1140
1141    /// Expects an error on next call that exactly matches the revert data.
1142    #[cheatcode(group = Testing, safety = Unsafe)]
1143    function expectRevert(bytes4 revertData) external;
1144
1145    /// Expects an error on next call that exactly matches the revert data.
1146    #[cheatcode(group = Testing, safety = Unsafe)]
1147    function expectRevert(bytes calldata revertData) external;
1148
1149    /// Expects an error with any revert data on next call to reverter address.
1150    #[cheatcode(group = Testing, safety = Unsafe)]
1151    function expectRevert(address reverter) external;
1152
1153    /// Expects an error from reverter address on next call, with any revert data.
1154    #[cheatcode(group = Testing, safety = Unsafe)]
1155    function expectRevert(bytes4 revertData, address reverter) external;
1156
1157    /// Expects an error from reverter address on next call, that exactly matches the revert data.
1158    #[cheatcode(group = Testing, safety = Unsafe)]
1159    function expectRevert(bytes calldata revertData, address reverter) external;
1160
1161    /// Expects a `count` number of reverts from the upcoming calls with any revert data or reverter.
1162    #[cheatcode(group = Testing, safety = Unsafe)]
1163    function expectRevert(uint64 count) external;
1164
1165    /// Expects a `count` number of reverts from the upcoming calls that match the revert data.
1166    #[cheatcode(group = Testing, safety = Unsafe)]
1167    function expectRevert(bytes4 revertData, uint64 count) external;
1168
1169    /// Expects a `count` number of reverts from the upcoming calls that exactly match the revert data.
1170    #[cheatcode(group = Testing, safety = Unsafe)]
1171    function expectRevert(bytes calldata revertData, uint64 count) external;
1172
1173    /// Expects a `count` number of reverts from the upcoming calls from the reverter address.
1174    #[cheatcode(group = Testing, safety = Unsafe)]
1175    function expectRevert(address reverter, uint64 count) external;
1176
1177    /// Expects a `count` number of reverts from the upcoming calls from the reverter address that match the revert data.
1178    #[cheatcode(group = Testing, safety = Unsafe)]
1179    function expectRevert(bytes4 revertData, address reverter, uint64 count) external;
1180
1181    /// Expects a `count` number of reverts from the upcoming calls from the reverter address that exactly match the revert data.
1182    #[cheatcode(group = Testing, safety = Unsafe)]
1183    function expectRevert(bytes calldata revertData, address reverter, uint64 count) external;
1184
1185    /// Expects an error on next call that starts with the revert data.
1186    #[cheatcode(group = Testing, safety = Unsafe)]
1187    function expectPartialRevert(bytes4 revertData) external;
1188
1189    /// Expects an error on next call to reverter address, that starts with the revert data.
1190    #[cheatcode(group = Testing, safety = Unsafe)]
1191    function expectPartialRevert(bytes4 revertData, address reverter) external;
1192
1193    /// Expects an error on next cheatcode call with any revert data.
1194    #[cheatcode(group = Testing, safety = Unsafe, status = Internal)]
1195    function _expectCheatcodeRevert() external;
1196
1197    /// Expects an error on next cheatcode call that starts with the revert data.
1198    #[cheatcode(group = Testing, safety = Unsafe, status = Internal)]
1199    function _expectCheatcodeRevert(bytes4 revertData) external;
1200
1201    /// Expects an error on next cheatcode call that exactly matches the revert data.
1202    #[cheatcode(group = Testing, safety = Unsafe, status = Internal)]
1203    function _expectCheatcodeRevert(bytes calldata revertData) external;
1204
1205    /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other
1206    /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set.
1207    #[cheatcode(group = Testing, safety = Unsafe)]
1208    function expectSafeMemory(uint64 min, uint64 max) external;
1209
1210    /// Stops all safe memory expectation in the current subcontext.
1211    #[cheatcode(group = Testing, safety = Unsafe)]
1212    function stopExpectSafeMemory() external;
1213
1214    /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext.
1215    /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges
1216    /// to the set.
1217    #[cheatcode(group = Testing, safety = Unsafe)]
1218    function expectSafeMemoryCall(uint64 min, uint64 max) external;
1219
1220    /// Marks a test as skipped. Must be called at the top level of a test.
1221    #[cheatcode(group = Testing, safety = Unsafe)]
1222    function skip(bool skipTest) external;
1223
1224    /// Marks a test as skipped with a reason. Must be called at the top level of a test.
1225    #[cheatcode(group = Testing, safety = Unsafe)]
1226    function skip(bool skipTest, string calldata reason) external;
1227
1228    /// Asserts that the given condition is true.
1229    #[cheatcode(group = Testing, safety = Safe)]
1230    function assertTrue(bool condition) external pure;
1231
1232    /// Asserts that the given condition is true and includes error message into revert string on failure.
1233    #[cheatcode(group = Testing, safety = Safe)]
1234    function assertTrue(bool condition, string calldata error) external pure;
1235
1236    /// Asserts that the given condition is false.
1237    #[cheatcode(group = Testing, safety = Safe)]
1238    function assertFalse(bool condition) external pure;
1239
1240    /// Asserts that the given condition is false and includes error message into revert string on failure.
1241    #[cheatcode(group = Testing, safety = Safe)]
1242    function assertFalse(bool condition, string calldata error) external pure;
1243
1244    /// Asserts that two `bool` values are equal.
1245    #[cheatcode(group = Testing, safety = Safe)]
1246    function assertEq(bool left, bool right) external pure;
1247
1248    /// Asserts that two `bool` values are equal and includes error message into revert string on failure.
1249    #[cheatcode(group = Testing, safety = Safe)]
1250    function assertEq(bool left, bool right, string calldata error) external pure;
1251
1252    /// Asserts that two `uint256` values are equal.
1253    #[cheatcode(group = Testing, safety = Safe)]
1254    function assertEq(uint256 left, uint256 right) external pure;
1255
1256    /// Asserts that two `uint256` values are equal and includes error message into revert string on failure.
1257    #[cheatcode(group = Testing, safety = Safe)]
1258    function assertEq(uint256 left, uint256 right, string calldata error) external pure;
1259
1260    /// Asserts that two `int256` values are equal.
1261    #[cheatcode(group = Testing, safety = Safe)]
1262    function assertEq(int256 left, int256 right) external pure;
1263
1264    /// Asserts that two `int256` values are equal and includes error message into revert string on failure.
1265    #[cheatcode(group = Testing, safety = Safe)]
1266    function assertEq(int256 left, int256 right, string calldata error) external pure;
1267
1268    /// Asserts that two `address` values are equal.
1269    #[cheatcode(group = Testing, safety = Safe)]
1270    function assertEq(address left, address right) external pure;
1271
1272    /// Asserts that two `address` values are equal and includes error message into revert string on failure.
1273    #[cheatcode(group = Testing, safety = Safe)]
1274    function assertEq(address left, address right, string calldata error) external pure;
1275
1276    /// Asserts that two `bytes32` values are equal.
1277    #[cheatcode(group = Testing, safety = Safe)]
1278    function assertEq(bytes32 left, bytes32 right) external pure;
1279
1280    /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure.
1281    #[cheatcode(group = Testing, safety = Safe)]
1282    function assertEq(bytes32 left, bytes32 right, string calldata error) external pure;
1283
1284    /// Asserts that two `string` values are equal.
1285    #[cheatcode(group = Testing, safety = Safe)]
1286    function assertEq(string calldata left, string calldata right) external pure;
1287
1288    /// Asserts that two `string` values are equal and includes error message into revert string on failure.
1289    #[cheatcode(group = Testing, safety = Safe)]
1290    function assertEq(string calldata left, string calldata right, string calldata error) external pure;
1291
1292    /// Asserts that two `bytes` values are equal.
1293    #[cheatcode(group = Testing, safety = Safe)]
1294    function assertEq(bytes calldata left, bytes calldata right) external pure;
1295
1296    /// Asserts that two `bytes` values are equal and includes error message into revert string on failure.
1297    #[cheatcode(group = Testing, safety = Safe)]
1298    function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
1299
1300    /// Asserts that two arrays of `bool` values are equal.
1301    #[cheatcode(group = Testing, safety = Safe)]
1302    function assertEq(bool[] calldata left, bool[] calldata right) external pure;
1303
1304    /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure.
1305    #[cheatcode(group = Testing, safety = Safe)]
1306    function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
1307
1308    /// Asserts that two arrays of `uint256 values are equal.
1309    #[cheatcode(group = Testing, safety = Safe)]
1310    function assertEq(uint256[] calldata left, uint256[] calldata right) external pure;
1311
1312    /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure.
1313    #[cheatcode(group = Testing, safety = Safe)]
1314    function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
1315
1316    /// Asserts that two arrays of `int256` values are equal.
1317    #[cheatcode(group = Testing, safety = Safe)]
1318    function assertEq(int256[] calldata left, int256[] calldata right) external pure;
1319
1320    /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure.
1321    #[cheatcode(group = Testing, safety = Safe)]
1322    function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
1323
1324    /// Asserts that two arrays of `address` values are equal.
1325    #[cheatcode(group = Testing, safety = Safe)]
1326    function assertEq(address[] calldata left, address[] calldata right) external pure;
1327
1328    /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure.
1329    #[cheatcode(group = Testing, safety = Safe)]
1330    function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
1331
1332    /// Asserts that two arrays of `bytes32` values are equal.
1333    #[cheatcode(group = Testing, safety = Safe)]
1334    function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
1335
1336    /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure.
1337    #[cheatcode(group = Testing, safety = Safe)]
1338    function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
1339
1340    /// Asserts that two arrays of `string` values are equal.
1341    #[cheatcode(group = Testing, safety = Safe)]
1342    function assertEq(string[] calldata left, string[] calldata right) external pure;
1343
1344    /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure.
1345    #[cheatcode(group = Testing, safety = Safe)]
1346    function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
1347
1348    /// Asserts that two arrays of `bytes` values are equal.
1349    #[cheatcode(group = Testing, safety = Safe)]
1350    function assertEq(bytes[] calldata left, bytes[] calldata right) external pure;
1351
1352    /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure.
1353    #[cheatcode(group = Testing, safety = Safe)]
1354    function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
1355
1356    /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
1357    #[cheatcode(group = Testing, safety = Safe)]
1358    function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
1359
1360    /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message.
1361    /// Includes error message into revert string on failure.
1362    #[cheatcode(group = Testing, safety = Safe)]
1363    function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
1364
1365    /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
1366    #[cheatcode(group = Testing, safety = Safe)]
1367    function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
1368
1369    /// Asserts that two `int256` values are equal, formatting them with decimals in failure message.
1370    /// Includes error message into revert string on failure.
1371    #[cheatcode(group = Testing, safety = Safe)]
1372    function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
1373
1374    /// Asserts that two `bool` values are not equal.
1375    #[cheatcode(group = Testing, safety = Safe)]
1376    function assertNotEq(bool left, bool right) external pure;
1377
1378    /// Asserts that two `bool` values are not equal and includes error message into revert string on failure.
1379    #[cheatcode(group = Testing, safety = Safe)]
1380    function assertNotEq(bool left, bool right, string calldata error) external pure;
1381
1382    /// Asserts that two `uint256` values are not equal.
1383    #[cheatcode(group = Testing, safety = Safe)]
1384    function assertNotEq(uint256 left, uint256 right) external pure;
1385
1386    /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure.
1387    #[cheatcode(group = Testing, safety = Safe)]
1388    function assertNotEq(uint256 left, uint256 right, string calldata error) external pure;
1389
1390    /// Asserts that two `int256` values are not equal.
1391    #[cheatcode(group = Testing, safety = Safe)]
1392    function assertNotEq(int256 left, int256 right) external pure;
1393
1394    /// Asserts that two `int256` values are not equal and includes error message into revert string on failure.
1395    #[cheatcode(group = Testing, safety = Safe)]
1396    function assertNotEq(int256 left, int256 right, string calldata error) external pure;
1397
1398    /// Asserts that two `address` values are not equal.
1399    #[cheatcode(group = Testing, safety = Safe)]
1400    function assertNotEq(address left, address right) external pure;
1401
1402    /// Asserts that two `address` values are not equal and includes error message into revert string on failure.
1403    #[cheatcode(group = Testing, safety = Safe)]
1404    function assertNotEq(address left, address right, string calldata error) external pure;
1405
1406    /// Asserts that two `bytes32` values are not equal.
1407    #[cheatcode(group = Testing, safety = Safe)]
1408    function assertNotEq(bytes32 left, bytes32 right) external pure;
1409
1410    /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure.
1411    #[cheatcode(group = Testing, safety = Safe)]
1412    function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure;
1413
1414    /// Asserts that two `string` values are not equal.
1415    #[cheatcode(group = Testing, safety = Safe)]
1416    function assertNotEq(string calldata left, string calldata right) external pure;
1417
1418    /// Asserts that two `string` values are not equal and includes error message into revert string on failure.
1419    #[cheatcode(group = Testing, safety = Safe)]
1420    function assertNotEq(string calldata left, string calldata right, string calldata error) external pure;
1421
1422    /// Asserts that two `bytes` values are not equal.
1423    #[cheatcode(group = Testing, safety = Safe)]
1424    function assertNotEq(bytes calldata left, bytes calldata right) external pure;
1425
1426    /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure.
1427    #[cheatcode(group = Testing, safety = Safe)]
1428    function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure;
1429
1430    /// Asserts that two arrays of `bool` values are not equal.
1431    #[cheatcode(group = Testing, safety = Safe)]
1432    function assertNotEq(bool[] calldata left, bool[] calldata right) external pure;
1433
1434    /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure.
1435    #[cheatcode(group = Testing, safety = Safe)]
1436    function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure;
1437
1438    /// Asserts that two arrays of `uint256` values are not equal.
1439    #[cheatcode(group = Testing, safety = Safe)]
1440    function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure;
1441
1442    /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure.
1443    #[cheatcode(group = Testing, safety = Safe)]
1444    function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure;
1445
1446    /// Asserts that two arrays of `int256` values are not equal.
1447    #[cheatcode(group = Testing, safety = Safe)]
1448    function assertNotEq(int256[] calldata left, int256[] calldata right) external pure;
1449
1450    /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure.
1451    #[cheatcode(group = Testing, safety = Safe)]
1452    function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure;
1453
1454    /// Asserts that two arrays of `address` values are not equal.
1455    #[cheatcode(group = Testing, safety = Safe)]
1456    function assertNotEq(address[] calldata left, address[] calldata right) external pure;
1457
1458    /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure.
1459    #[cheatcode(group = Testing, safety = Safe)]
1460    function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure;
1461
1462    /// Asserts that two arrays of `bytes32` values are not equal.
1463    #[cheatcode(group = Testing, safety = Safe)]
1464    function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure;
1465
1466    /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure.
1467    #[cheatcode(group = Testing, safety = Safe)]
1468    function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure;
1469
1470    /// Asserts that two arrays of `string` values are not equal.
1471    #[cheatcode(group = Testing, safety = Safe)]
1472    function assertNotEq(string[] calldata left, string[] calldata right) external pure;
1473
1474    /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure.
1475    #[cheatcode(group = Testing, safety = Safe)]
1476    function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure;
1477
1478    /// Asserts that two arrays of `bytes` values are not equal.
1479    #[cheatcode(group = Testing, safety = Safe)]
1480    function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure;
1481
1482    /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure.
1483    #[cheatcode(group = Testing, safety = Safe)]
1484    function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure;
1485
1486    /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
1487    #[cheatcode(group = Testing, safety = Safe)]
1488    function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
1489
1490    /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message.
1491    /// Includes error message into revert string on failure.
1492    #[cheatcode(group = Testing, safety = Safe)]
1493    function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
1494
1495    /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
1496    #[cheatcode(group = Testing, safety = Safe)]
1497    function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure;
1498
1499    /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message.
1500    /// Includes error message into revert string on failure.
1501    #[cheatcode(group = Testing, safety = Safe)]
1502    function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
1503
1504    /// Compares two `uint256` values. Expects first value to be greater than second.
1505    #[cheatcode(group = Testing, safety = Safe)]
1506    function assertGt(uint256 left, uint256 right) external pure;
1507
1508    /// Compares two `uint256` values. Expects first value to be greater than second.
1509    /// Includes error message into revert string on failure.
1510    #[cheatcode(group = Testing, safety = Safe)]
1511    function assertGt(uint256 left, uint256 right, string calldata error) external pure;
1512
1513    /// Compares two `int256` values. Expects first value to be greater than second.
1514    #[cheatcode(group = Testing, safety = Safe)]
1515    function assertGt(int256 left, int256 right) external pure;
1516
1517    /// Compares two `int256` values. Expects first value to be greater than second.
1518    /// Includes error message into revert string on failure.
1519    #[cheatcode(group = Testing, safety = Safe)]
1520    function assertGt(int256 left, int256 right, string calldata error) external pure;
1521
1522    /// Compares two `uint256` values. Expects first value to be greater than second.
1523    /// Formats values with decimals in failure message.
1524    #[cheatcode(group = Testing, safety = Safe)]
1525    function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
1526
1527    /// Compares two `uint256` values. Expects first value to be greater than second.
1528    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1529    #[cheatcode(group = Testing, safety = Safe)]
1530    function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
1531
1532    /// Compares two `int256` values. Expects first value to be greater than second.
1533    /// Formats values with decimals in failure message.
1534    #[cheatcode(group = Testing, safety = Safe)]
1535    function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure;
1536
1537    /// Compares two `int256` values. Expects first value to be greater than second.
1538    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1539    #[cheatcode(group = Testing, safety = Safe)]
1540    function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
1541
1542    /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
1543    #[cheatcode(group = Testing, safety = Safe)]
1544    function assertGe(uint256 left, uint256 right) external pure;
1545
1546    /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
1547    /// Includes error message into revert string on failure.
1548    #[cheatcode(group = Testing, safety = Safe)]
1549    function assertGe(uint256 left, uint256 right, string calldata error) external pure;
1550
1551    /// Compares two `int256` values. Expects first value to be greater than or equal to second.
1552    #[cheatcode(group = Testing, safety = Safe)]
1553    function assertGe(int256 left, int256 right) external pure;
1554
1555    /// Compares two `int256` values. Expects first value to be greater than or equal to second.
1556    /// Includes error message into revert string on failure.
1557    #[cheatcode(group = Testing, safety = Safe)]
1558    function assertGe(int256 left, int256 right, string calldata error) external pure;
1559
1560    /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
1561    /// Formats values with decimals in failure message.
1562    #[cheatcode(group = Testing, safety = Safe)]
1563    function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
1564
1565    /// Compares two `uint256` values. Expects first value to be greater than or equal to second.
1566    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1567    #[cheatcode(group = Testing, safety = Safe)]
1568    function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
1569
1570    /// Compares two `int256` values. Expects first value to be greater than or equal to second.
1571    /// Formats values with decimals in failure message.
1572    #[cheatcode(group = Testing, safety = Safe)]
1573    function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure;
1574
1575    /// Compares two `int256` values. Expects first value to be greater than or equal to second.
1576    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1577    #[cheatcode(group = Testing, safety = Safe)]
1578    function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
1579
1580    /// Compares two `uint256` values. Expects first value to be less than second.
1581    #[cheatcode(group = Testing, safety = Safe)]
1582    function assertLt(uint256 left, uint256 right) external pure;
1583
1584    /// Compares two `uint256` values. Expects first value to be less than second.
1585    /// Includes error message into revert string on failure.
1586    #[cheatcode(group = Testing, safety = Safe)]
1587    function assertLt(uint256 left, uint256 right, string calldata error) external pure;
1588
1589    /// Compares two `int256` values. Expects first value to be less than second.
1590    #[cheatcode(group = Testing, safety = Safe)]
1591    function assertLt(int256 left, int256 right) external pure;
1592
1593    /// Compares two `int256` values. Expects first value to be less than second.
1594    /// Includes error message into revert string on failure.
1595    #[cheatcode(group = Testing, safety = Safe)]
1596    function assertLt(int256 left, int256 right, string calldata error) external pure;
1597
1598    /// Compares two `uint256` values. Expects first value to be less than second.
1599    /// Formats values with decimals in failure message.
1600    #[cheatcode(group = Testing, safety = Safe)]
1601    function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
1602
1603    /// Compares two `uint256` values. Expects first value to be less than second.
1604    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1605    #[cheatcode(group = Testing, safety = Safe)]
1606    function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
1607
1608    /// Compares two `int256` values. Expects first value to be less than second.
1609    /// Formats values with decimals in failure message.
1610    #[cheatcode(group = Testing, safety = Safe)]
1611    function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure;
1612
1613    /// Compares two `int256` values. Expects first value to be less than second.
1614    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1615    #[cheatcode(group = Testing, safety = Safe)]
1616    function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
1617
1618    /// Compares two `uint256` values. Expects first value to be less than or equal to second.
1619    #[cheatcode(group = Testing, safety = Safe)]
1620    function assertLe(uint256 left, uint256 right) external pure;
1621
1622    /// Compares two `uint256` values. Expects first value to be less than or equal to second.
1623    /// Includes error message into revert string on failure.
1624    #[cheatcode(group = Testing, safety = Safe)]
1625    function assertLe(uint256 left, uint256 right, string calldata error) external pure;
1626
1627    /// Compares two `int256` values. Expects first value to be less than or equal to second.
1628    #[cheatcode(group = Testing, safety = Safe)]
1629    function assertLe(int256 left, int256 right) external pure;
1630
1631    /// Compares two `int256` values. Expects first value to be less than or equal to second.
1632    /// Includes error message into revert string on failure.
1633    #[cheatcode(group = Testing, safety = Safe)]
1634    function assertLe(int256 left, int256 right, string calldata error) external pure;
1635
1636    /// Compares two `uint256` values. Expects first value to be less than or equal to second.
1637    /// Formats values with decimals in failure message.
1638    #[cheatcode(group = Testing, safety = Safe)]
1639    function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure;
1640
1641    /// Compares two `uint256` values. Expects first value to be less than or equal to second.
1642    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1643    #[cheatcode(group = Testing, safety = Safe)]
1644    function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure;
1645
1646    /// Compares two `int256` values. Expects first value to be less than or equal to second.
1647    /// Formats values with decimals in failure message.
1648    #[cheatcode(group = Testing, safety = Safe)]
1649    function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure;
1650
1651    /// Compares two `int256` values. Expects first value to be less than or equal to second.
1652    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1653    #[cheatcode(group = Testing, safety = Safe)]
1654    function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure;
1655
1656    /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
1657    #[cheatcode(group = Testing, safety = Safe)]
1658    function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure;
1659
1660    /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
1661    /// Includes error message into revert string on failure.
1662    #[cheatcode(group = Testing, safety = Safe)]
1663    function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure;
1664
1665    /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
1666    #[cheatcode(group = Testing, safety = Safe)]
1667    function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure;
1668
1669    /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
1670    /// Includes error message into revert string on failure.
1671    #[cheatcode(group = Testing, safety = Safe)]
1672    function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure;
1673
1674    /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
1675    /// Formats values with decimals in failure message.
1676    #[cheatcode(group = Testing, safety = Safe)]
1677    function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure;
1678
1679    /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`.
1680    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1681    #[cheatcode(group = Testing, safety = Safe)]
1682    function assertApproxEqAbsDecimal(
1683        uint256 left,
1684        uint256 right,
1685        uint256 maxDelta,
1686        uint256 decimals,
1687        string calldata error
1688    ) external pure;
1689
1690    /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
1691    /// Formats values with decimals in failure message.
1692    #[cheatcode(group = Testing, safety = Safe)]
1693    function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure;
1694
1695    /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`.
1696    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1697    #[cheatcode(group = Testing, safety = Safe)]
1698    function assertApproxEqAbsDecimal(
1699        int256 left,
1700        int256 right,
1701        uint256 maxDelta,
1702        uint256 decimals,
1703        string calldata error
1704    ) external pure;
1705
1706    /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1707    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1708    #[cheatcode(group = Testing, safety = Safe)]
1709    function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure;
1710
1711    /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1712    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1713    /// Includes error message into revert string on failure.
1714    #[cheatcode(group = Testing, safety = Safe)]
1715    function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) external pure;
1716
1717    /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1718    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1719    #[cheatcode(group = Testing, safety = Safe)]
1720    function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure;
1721
1722    /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1723    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1724    /// Includes error message into revert string on failure.
1725    #[cheatcode(group = Testing, safety = Safe)]
1726    function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) external pure;
1727
1728    /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1729    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1730    /// Formats values with decimals in failure message.
1731    #[cheatcode(group = Testing, safety = Safe)]
1732    function assertApproxEqRelDecimal(
1733        uint256 left,
1734        uint256 right,
1735        uint256 maxPercentDelta,
1736        uint256 decimals
1737    ) external pure;
1738
1739    /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1740    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1741    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1742    #[cheatcode(group = Testing, safety = Safe)]
1743    function assertApproxEqRelDecimal(
1744        uint256 left,
1745        uint256 right,
1746        uint256 maxPercentDelta,
1747        uint256 decimals,
1748        string calldata error
1749    ) external pure;
1750
1751    /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1752    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1753    /// Formats values with decimals in failure message.
1754    #[cheatcode(group = Testing, safety = Safe)]
1755    function assertApproxEqRelDecimal(
1756        int256 left,
1757        int256 right,
1758        uint256 maxPercentDelta,
1759        uint256 decimals
1760    ) external pure;
1761
1762    /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`.
1763    /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100%
1764    /// Formats values with decimals in failure message. Includes error message into revert string on failure.
1765    #[cheatcode(group = Testing, safety = Safe)]
1766    function assertApproxEqRelDecimal(
1767        int256 left,
1768        int256 right,
1769        uint256 maxPercentDelta,
1770        uint256 decimals,
1771        string calldata error
1772    ) external pure;
1773
1774    /// Returns true if the current Foundry version is greater than or equal to the given version.
1775    /// The given version string must be in the format `major.minor.patch`.
1776    ///
1777    /// This is equivalent to `foundryVersionCmp(version) >= 0`.
1778    #[cheatcode(group = Testing, safety = Safe)]
1779    function foundryVersionAtLeast(string calldata version) external view returns (bool);
1780
1781    /// Compares the current Foundry version with the given version string.
1782    /// The given version string must be in the format `major.minor.patch`.
1783    ///
1784    /// Returns:
1785    /// -1 if current Foundry version is less than the given version
1786    /// 0 if current Foundry version equals the given version
1787    /// 1 if current Foundry version is greater than the given version
1788    ///
1789    /// This result can then be used with a comparison operator against `0`.
1790    /// For example, to check if the current Foundry version is greater than or equal to `1.0.0`:
1791    /// `if (foundryVersionCmp("1.0.0") >= 0) { ... }`
1792    #[cheatcode(group = Testing, safety = Safe)]
1793    function foundryVersionCmp(string calldata version) external view returns (int256);
1794
1795    // ======== OS and Filesystem ========
1796
1797    // -------- Metadata --------
1798
1799    /// Returns true if the given path points to an existing entity, else returns false.
1800    #[cheatcode(group = Filesystem)]
1801    function exists(string calldata path) external view returns (bool result);
1802
1803    /// Given a path, query the file system to get information about a file, directory, etc.
1804    #[cheatcode(group = Filesystem)]
1805    function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata);
1806
1807    /// Returns true if the path exists on disk and is pointing at a directory, else returns false.
1808    #[cheatcode(group = Filesystem)]
1809    function isDir(string calldata path) external view returns (bool result);
1810
1811    /// Returns true if the path exists on disk and is pointing at a regular file, else returns false.
1812    #[cheatcode(group = Filesystem)]
1813    function isFile(string calldata path) external view returns (bool result);
1814
1815    /// Get the path of the current project root.
1816    #[cheatcode(group = Filesystem)]
1817    function projectRoot() external view returns (string memory path);
1818
1819    /// Returns the time since unix epoch in milliseconds.
1820    #[cheatcode(group = Filesystem)]
1821    function unixTime() external view returns (uint256 milliseconds);
1822
1823    // -------- Reading and writing --------
1824
1825    /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine.
1826    /// `path` is relative to the project root.
1827    #[cheatcode(group = Filesystem)]
1828    function closeFile(string calldata path) external;
1829
1830    /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`.
1831    /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`.
1832    /// Both `from` and `to` are relative to the project root.
1833    #[cheatcode(group = Filesystem)]
1834    function copyFile(string calldata from, string calldata to) external returns (uint64 copied);
1835
1836    /// Creates a new, empty directory at the provided path.
1837    /// This cheatcode will revert in the following situations, but is not limited to just these cases:
1838    /// - User lacks permissions to modify `path`.
1839    /// - A parent of the given path doesn't exist and `recursive` is false.
1840    /// - `path` already exists and `recursive` is false.
1841    /// `path` is relative to the project root.
1842    #[cheatcode(group = Filesystem)]
1843    function createDir(string calldata path, bool recursive) external;
1844
1845    /// Reads the directory at the given path recursively, up to `maxDepth`.
1846    /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned.
1847    /// Follows symbolic links if `followLinks` is true.
1848    #[cheatcode(group = Filesystem)]
1849    function readDir(string calldata path) external view returns (DirEntry[] memory entries);
1850    /// See `readDir(string)`.
1851    #[cheatcode(group = Filesystem)]
1852    function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries);
1853    /// See `readDir(string)`.
1854    #[cheatcode(group = Filesystem)]
1855    function readDir(string calldata path, uint64 maxDepth, bool followLinks)
1856        external
1857        view
1858        returns (DirEntry[] memory entries);
1859
1860    /// Reads the entire content of file to string. `path` is relative to the project root.
1861    #[cheatcode(group = Filesystem)]
1862    function readFile(string calldata path) external view returns (string memory data);
1863
1864    /// Reads the entire content of file as binary. `path` is relative to the project root.
1865    #[cheatcode(group = Filesystem)]
1866    function readFileBinary(string calldata path) external view returns (bytes memory data);
1867
1868    /// Reads next line of file to string.
1869    #[cheatcode(group = Filesystem)]
1870    function readLine(string calldata path) external view returns (string memory line);
1871
1872    /// Reads a symbolic link, returning the path that the link points to.
1873    /// This cheatcode will revert in the following situations, but is not limited to just these cases:
1874    /// - `path` is not a symbolic link.
1875    /// - `path` does not exist.
1876    #[cheatcode(group = Filesystem)]
1877    function readLink(string calldata linkPath) external view returns (string memory targetPath);
1878
1879    /// Removes a directory at the provided path.
1880    /// This cheatcode will revert in the following situations, but is not limited to just these cases:
1881    /// - `path` doesn't exist.
1882    /// - `path` isn't a directory.
1883    /// - User lacks permissions to modify `path`.
1884    /// - The directory is not empty and `recursive` is false.
1885    /// `path` is relative to the project root.
1886    #[cheatcode(group = Filesystem)]
1887    function removeDir(string calldata path, bool recursive) external;
1888
1889    /// Removes a file from the filesystem.
1890    /// This cheatcode will revert in the following situations, but is not limited to just these cases:
1891    /// - `path` points to a directory.
1892    /// - The file doesn't exist.
1893    /// - The user lacks permissions to remove the file.
1894    /// `path` is relative to the project root.
1895    #[cheatcode(group = Filesystem)]
1896    function removeFile(string calldata path) external;
1897
1898    /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does.
1899    /// `path` is relative to the project root.
1900    #[cheatcode(group = Filesystem)]
1901    function writeFile(string calldata path, string calldata data) external;
1902
1903    /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does.
1904    /// `path` is relative to the project root.
1905    #[cheatcode(group = Filesystem)]
1906    function writeFileBinary(string calldata path, bytes calldata data) external;
1907
1908    /// Writes line to file, creating a file if it does not exist.
1909    /// `path` is relative to the project root.
1910    #[cheatcode(group = Filesystem)]
1911    function writeLine(string calldata path, string calldata data) external;
1912
1913    /// Gets the artifact path from code (aka. creation code).
1914    #[cheatcode(group = Filesystem)]
1915    function getArtifactPathByCode(bytes calldata code) external view returns (string memory path);
1916
1917    /// Gets the artifact path from deployed code (aka. runtime code).
1918    #[cheatcode(group = Filesystem)]
1919    function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path);
1920
1921    /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the
1922    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1923    #[cheatcode(group = Filesystem)]
1924    function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode);
1925
1926    /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
1927    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1928    #[cheatcode(group = Filesystem)]
1929    function deployCode(string calldata artifactPath) external returns (address deployedAddress);
1930
1931    /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
1932    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1933    ///
1934    /// Additionally accepts abi-encoded constructor arguments.
1935    #[cheatcode(group = Filesystem)]
1936    function deployCode(string calldata artifactPath, bytes calldata constructorArgs) external returns (address deployedAddress);
1937
1938    /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
1939    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1940    ///
1941    /// Additionally accepts `msg.value`.
1942    #[cheatcode(group = Filesystem)]
1943    function deployCode(string calldata artifactPath, uint256 value) external returns (address deployedAddress);
1944
1945    /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the
1946    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1947    ///
1948    /// Additionally accepts abi-encoded constructor arguments and `msg.value`.
1949    #[cheatcode(group = Filesystem)]
1950    function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value) external returns (address deployedAddress);
1951
1952    /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
1953    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1954    #[cheatcode(group = Filesystem)]
1955    function deployCode(string calldata artifactPath, bytes32 salt) external returns (address deployedAddress);
1956
1957    /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
1958    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1959    ///
1960    /// Additionally accepts abi-encoded constructor arguments.
1961    #[cheatcode(group = Filesystem)]
1962    function deployCode(string calldata artifactPath, bytes calldata constructorArgs, bytes32 salt) external returns (address deployedAddress);
1963
1964    /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
1965    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1966    ///
1967    /// Additionally accepts `msg.value`.
1968    #[cheatcode(group = Filesystem)]
1969    function deployCode(string calldata artifactPath, uint256 value, bytes32 salt) external returns (address deployedAddress);
1970
1971    /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the
1972    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1973    ///
1974    /// Additionally accepts abi-encoded constructor arguments and `msg.value`.
1975    #[cheatcode(group = Filesystem)]
1976    function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value, bytes32 salt) external returns (address deployedAddress);
1977
1978    /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the
1979    /// artifact in the form of <path>:<contract>:<version> where <contract> and <version> parts are optional.
1980    #[cheatcode(group = Filesystem)]
1981    function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode);
1982
1983    /// Returns the most recent broadcast for the given contract on `chainId` matching `txType`.
1984    ///
1985    /// For example:
1986    ///
1987    /// The most recent deployment can be fetched by passing `txType` as `CREATE` or `CREATE2`.
1988    ///
1989    /// The most recent call can be fetched by passing `txType` as `CALL`.
1990    #[cheatcode(group = Filesystem)]
1991    function getBroadcast(string calldata contractName, uint64 chainId, BroadcastTxType txType) external view returns (BroadcastTxSummary memory);
1992
1993    /// Returns all broadcasts for the given contract on `chainId` with the specified `txType`.
1994    ///
1995    /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber.
1996    #[cheatcode(group = Filesystem)]
1997    function getBroadcasts(string calldata contractName, uint64 chainId, BroadcastTxType txType) external view returns (BroadcastTxSummary[] memory);
1998
1999    /// Returns all broadcasts for the given contract on `chainId`.
2000    ///
2001    /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber.
2002    #[cheatcode(group = Filesystem)]
2003    function getBroadcasts(string calldata contractName, uint64 chainId) external view returns (BroadcastTxSummary[] memory);
2004
2005    /// Returns the most recent deployment for the current `chainId`.
2006    #[cheatcode(group = Filesystem)]
2007    function getDeployment(string calldata contractName) external view returns (address deployedAddress);
2008
2009    /// Returns the most recent deployment for the given contract on `chainId`
2010    #[cheatcode(group = Filesystem)]
2011    function getDeployment(string calldata contractName, uint64 chainId) external view returns (address deployedAddress);
2012
2013    /// Returns all deployments for the given contract on `chainId`
2014    ///
2015    /// Sorted in descending order of deployment time i.e descending order of BroadcastTxSummary.blockNumber.
2016    ///
2017    /// The most recent deployment is the first element, and the oldest is the last.
2018    #[cheatcode(group = Filesystem)]
2019    function getDeployments(string calldata contractName, uint64 chainId) external view returns (address[] memory deployedAddresses);
2020
2021    // -------- Foreign Function Interface --------
2022
2023    /// Performs a foreign function call via the terminal.
2024    #[cheatcode(group = Filesystem)]
2025    function ffi(string[] calldata commandInput) external returns (bytes memory result);
2026
2027    /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr.
2028    #[cheatcode(group = Filesystem)]
2029    function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result);
2030
2031    // -------- User Interaction --------
2032
2033    /// Prompts the user for a string value in the terminal.
2034    #[cheatcode(group = Filesystem)]
2035    function prompt(string calldata promptText) external returns (string memory input);
2036
2037    /// Prompts the user for a hidden string value in the terminal.
2038    #[cheatcode(group = Filesystem)]
2039    function promptSecret(string calldata promptText) external returns (string memory input);
2040
2041    /// Prompts the user for hidden uint256 in the terminal (usually pk).
2042    #[cheatcode(group = Filesystem)]
2043    function promptSecretUint(string calldata promptText) external returns (uint256);
2044
2045    /// Prompts the user for an address in the terminal.
2046    #[cheatcode(group = Filesystem)]
2047    function promptAddress(string calldata promptText) external returns (address);
2048
2049    /// Prompts the user for uint256 in the terminal.
2050    #[cheatcode(group = Filesystem)]
2051    function promptUint(string calldata promptText) external returns (uint256);
2052
2053    // ======== Environment Variables ========
2054
2055    /// Resolves the env variable placeholders of a given input string.
2056    #[cheatcode(group = Environment)]
2057    function resolveEnv(string calldata input) external returns (string memory);
2058
2059    /// Sets environment variables.
2060    #[cheatcode(group = Environment)]
2061    function setEnv(string calldata name, string calldata value) external;
2062
2063    /// Gets the environment variable `name` and returns true if it exists, else returns false.
2064    #[cheatcode(group = Environment)]
2065    function envExists(string calldata name) external view returns (bool result);
2066
2067    /// Gets the environment variable `name` and parses it as `bool`.
2068    /// Reverts if the variable was not found or could not be parsed.
2069    #[cheatcode(group = Environment)]
2070    function envBool(string calldata name) external view returns (bool value);
2071    /// Gets the environment variable `name` and parses it as `uint256`.
2072    /// Reverts if the variable was not found or could not be parsed.
2073    #[cheatcode(group = Environment)]
2074    function envUint(string calldata name) external view returns (uint256 value);
2075    /// Gets the environment variable `name` and parses it as `int256`.
2076    /// Reverts if the variable was not found or could not be parsed.
2077    #[cheatcode(group = Environment)]
2078    function envInt(string calldata name) external view returns (int256 value);
2079    /// Gets the environment variable `name` and parses it as `address`.
2080    /// Reverts if the variable was not found or could not be parsed.
2081    #[cheatcode(group = Environment)]
2082    function envAddress(string calldata name) external view returns (address value);
2083    /// Gets the environment variable `name` and parses it as `bytes32`.
2084    /// Reverts if the variable was not found or could not be parsed.
2085    #[cheatcode(group = Environment)]
2086    function envBytes32(string calldata name) external view returns (bytes32 value);
2087    /// Gets the environment variable `name` and parses it as `string`.
2088    /// Reverts if the variable was not found or could not be parsed.
2089    #[cheatcode(group = Environment)]
2090    function envString(string calldata name) external view returns (string memory value);
2091    /// Gets the environment variable `name` and parses it as `bytes`.
2092    /// Reverts if the variable was not found or could not be parsed.
2093    #[cheatcode(group = Environment)]
2094    function envBytes(string calldata name) external view returns (bytes memory value);
2095
2096    /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
2097    /// Reverts if the variable was not found or could not be parsed.
2098    #[cheatcode(group = Environment)]
2099    function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value);
2100    /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
2101    /// Reverts if the variable was not found or could not be parsed.
2102    #[cheatcode(group = Environment)]
2103    function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value);
2104    /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
2105    /// Reverts if the variable was not found or could not be parsed.
2106    #[cheatcode(group = Environment)]
2107    function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value);
2108    /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
2109    /// Reverts if the variable was not found or could not be parsed.
2110    #[cheatcode(group = Environment)]
2111    function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value);
2112    /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
2113    /// Reverts if the variable was not found or could not be parsed.
2114    #[cheatcode(group = Environment)]
2115    function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value);
2116    /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
2117    /// Reverts if the variable was not found or could not be parsed.
2118    #[cheatcode(group = Environment)]
2119    function envString(string calldata name, string calldata delim) external view returns (string[] memory value);
2120    /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
2121    /// Reverts if the variable was not found or could not be parsed.
2122    #[cheatcode(group = Environment)]
2123    function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value);
2124
2125    /// Gets the environment variable `name` and parses it as `bool`.
2126    /// Reverts if the variable could not be parsed.
2127    /// Returns `defaultValue` if the variable was not found.
2128    #[cheatcode(group = Environment)]
2129    function envOr(string calldata name, bool defaultValue) external view returns (bool value);
2130    /// Gets the environment variable `name` and parses it as `uint256`.
2131    /// Reverts if the variable could not be parsed.
2132    /// Returns `defaultValue` if the variable was not found.
2133    #[cheatcode(group = Environment)]
2134    function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value);
2135    /// Gets the environment variable `name` and parses it as `int256`.
2136    /// Reverts if the variable could not be parsed.
2137    /// Returns `defaultValue` if the variable was not found.
2138    #[cheatcode(group = Environment)]
2139    function envOr(string calldata name, int256 defaultValue) external view returns (int256 value);
2140    /// Gets the environment variable `name` and parses it as `address`.
2141    /// Reverts if the variable could not be parsed.
2142    /// Returns `defaultValue` if the variable was not found.
2143    #[cheatcode(group = Environment)]
2144    function envOr(string calldata name, address defaultValue) external view returns (address value);
2145    /// Gets the environment variable `name` and parses it as `bytes32`.
2146    /// Reverts if the variable could not be parsed.
2147    /// Returns `defaultValue` if the variable was not found.
2148    #[cheatcode(group = Environment)]
2149    function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value);
2150    /// Gets the environment variable `name` and parses it as `string`.
2151    /// Reverts if the variable could not be parsed.
2152    /// Returns `defaultValue` if the variable was not found.
2153    #[cheatcode(group = Environment)]
2154    function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value);
2155    /// Gets the environment variable `name` and parses it as `bytes`.
2156    /// Reverts if the variable could not be parsed.
2157    /// Returns `defaultValue` if the variable was not found.
2158    #[cheatcode(group = Environment)]
2159    function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value);
2160
2161    /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`.
2162    /// Reverts if the variable could not be parsed.
2163    /// Returns `defaultValue` if the variable was not found.
2164    #[cheatcode(group = Environment)]
2165    function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue)
2166        external view
2167        returns (bool[] memory value);
2168    /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`.
2169    /// Reverts if the variable could not be parsed.
2170    /// Returns `defaultValue` if the variable was not found.
2171    #[cheatcode(group = Environment)]
2172    function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue)
2173        external view
2174        returns (uint256[] memory value);
2175    /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`.
2176    /// Reverts if the variable could not be parsed.
2177    /// Returns `defaultValue` if the variable was not found.
2178    #[cheatcode(group = Environment)]
2179    function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue)
2180        external view
2181        returns (int256[] memory value);
2182    /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`.
2183    /// Reverts if the variable could not be parsed.
2184    /// Returns `defaultValue` if the variable was not found.
2185    #[cheatcode(group = Environment)]
2186    function envOr(string calldata name, string calldata delim, address[] calldata defaultValue)
2187        external view
2188        returns (address[] memory value);
2189    /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`.
2190    /// Reverts if the variable could not be parsed.
2191    /// Returns `defaultValue` if the variable was not found.
2192    #[cheatcode(group = Environment)]
2193    function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue)
2194        external view
2195        returns (bytes32[] memory value);
2196    /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`.
2197    /// Reverts if the variable could not be parsed.
2198    /// Returns `defaultValue` if the variable was not found.
2199    #[cheatcode(group = Environment)]
2200    function envOr(string calldata name, string calldata delim, string[] calldata defaultValue)
2201        external view
2202        returns (string[] memory value);
2203    /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`.
2204    /// Reverts if the variable could not be parsed.
2205    /// Returns `defaultValue` if the variable was not found.
2206    #[cheatcode(group = Environment)]
2207    function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue)
2208        external view
2209        returns (bytes[] memory value);
2210
2211    /// Returns true if `forge` command was executed in given context.
2212    #[cheatcode(group = Environment)]
2213    function isContext(ForgeContext context) external view returns (bool result);
2214
2215    // ======== Scripts ========
2216    // -------- Broadcasting Transactions --------
2217
2218    /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain.
2219    ///
2220    /// Broadcasting address is determined by checking the following in order:
2221    /// 1. If `--sender` argument was provided, that address is used.
2222    /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
2223    /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
2224    #[cheatcode(group = Scripting)]
2225    function broadcast() external;
2226
2227    /// Has the next call (at this call depth only) create a transaction with the address provided
2228    /// as the sender that can later be signed and sent onchain.
2229    #[cheatcode(group = Scripting)]
2230    function broadcast(address signer) external;
2231
2232    /// Has the next call (at this call depth only) create a transaction with the private key
2233    /// provided as the sender that can later be signed and sent onchain.
2234    #[cheatcode(group = Scripting)]
2235    function broadcast(uint256 privateKey) external;
2236
2237    /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain.
2238    ///
2239    /// Broadcasting address is determined by checking the following in order:
2240    /// 1. If `--sender` argument was provided, that address is used.
2241    /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used.
2242    /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used.
2243    #[cheatcode(group = Scripting)]
2244    function startBroadcast() external;
2245
2246    /// Has all subsequent calls (at this call depth only) create transactions with the address
2247    /// provided that can later be signed and sent onchain.
2248    #[cheatcode(group = Scripting)]
2249    function startBroadcast(address signer) external;
2250
2251    /// Has all subsequent calls (at this call depth only) create transactions with the private key
2252    /// provided that can later be signed and sent onchain.
2253    #[cheatcode(group = Scripting)]
2254    function startBroadcast(uint256 privateKey) external;
2255
2256    /// Stops collecting onchain transactions.
2257    #[cheatcode(group = Scripting)]
2258    function stopBroadcast() external;
2259
2260    /// Takes a signed transaction and broadcasts it to the network.
2261    #[cheatcode(group = Scripting)]
2262    function broadcastRawTransaction(bytes calldata data) external;
2263
2264    /// Sign an EIP-7702 authorization for delegation
2265    #[cheatcode(group = Scripting)]
2266    function signDelegation(address implementation, uint256 privateKey) external returns (SignedDelegation memory signedDelegation);
2267
2268    /// Sign an EIP-7702 authorization for delegation for specific nonce
2269    #[cheatcode(group = Scripting)]
2270    function signDelegation(address implementation, uint256 privateKey, uint64 nonce) external returns (SignedDelegation memory signedDelegation);
2271
2272    /// Sign an EIP-7702 authorization for delegation, with optional cross-chain validity.
2273    #[cheatcode(group = Scripting)]
2274    function signDelegation(address implementation, uint256 privateKey, bool crossChain) external returns (SignedDelegation memory signedDelegation);
2275
2276    /// Designate the next call as an EIP-7702 transaction
2277    #[cheatcode(group = Scripting)]
2278    function attachDelegation(SignedDelegation calldata signedDelegation) external;
2279
2280    /// Designate the next call as an EIP-7702 transaction, with optional cross-chain validity.
2281    #[cheatcode(group = Scripting)]
2282    function attachDelegation(SignedDelegation calldata signedDelegation, bool crossChain) external;
2283
2284    /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction
2285    #[cheatcode(group = Scripting)]
2286    function signAndAttachDelegation(address implementation, uint256 privateKey) external returns (SignedDelegation memory signedDelegation);
2287
2288    /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction for specific nonce
2289    #[cheatcode(group = Scripting)]
2290    function signAndAttachDelegation(address implementation, uint256 privateKey, uint64 nonce) external returns (SignedDelegation memory signedDelegation);
2291
2292    /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction, with optional cross-chain validity.
2293    #[cheatcode(group = Scripting)]
2294    function signAndAttachDelegation(address implementation, uint256 privateKey, bool crossChain) external returns (SignedDelegation memory signedDelegation);
2295
2296    /// Attach an EIP-4844 blob to the next call
2297    #[cheatcode(group = Scripting)]
2298    function attachBlob(bytes calldata blob) external;
2299
2300    /// Returns addresses of available unlocked wallets in the script environment.
2301    #[cheatcode(group = Scripting)]
2302    function getWallets() external view returns (address[] memory wallets);
2303
2304    // ======== Utilities ========
2305
2306    // -------- Strings --------
2307
2308    /// Converts the given value to a `string`.
2309    #[cheatcode(group = String)]
2310    function toString(address value) external pure returns (string memory stringifiedValue);
2311    /// Converts the given value to a `string`.
2312    #[cheatcode(group = String)]
2313    function toString(bytes calldata value) external pure returns (string memory stringifiedValue);
2314    /// Converts the given value to a `string`.
2315    #[cheatcode(group = String)]
2316    function toString(bytes32 value) external pure returns (string memory stringifiedValue);
2317    /// Converts the given value to a `string`.
2318    #[cheatcode(group = String)]
2319    function toString(bool value) external pure returns (string memory stringifiedValue);
2320    /// Converts the given value to a `string`.
2321    #[cheatcode(group = String)]
2322    function toString(uint256 value) external pure returns (string memory stringifiedValue);
2323    /// Converts the given value to a `string`.
2324    #[cheatcode(group = String)]
2325    function toString(int256 value) external pure returns (string memory stringifiedValue);
2326
2327    /// Parses the given `string` into `bytes`.
2328    #[cheatcode(group = String)]
2329    function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue);
2330    /// Parses the given `string` into an `address`.
2331    #[cheatcode(group = String)]
2332    function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue);
2333    /// Parses the given `string` into a `uint256`.
2334    #[cheatcode(group = String)]
2335    function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue);
2336    /// Parses the given `string` into a `int256`.
2337    #[cheatcode(group = String)]
2338    function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue);
2339    /// Parses the given `string` into a `bytes32`.
2340    #[cheatcode(group = String)]
2341    function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue);
2342    /// Parses the given `string` into a `bool`.
2343    #[cheatcode(group = String)]
2344    function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue);
2345
2346    /// Converts the given `string` value to Lowercase.
2347    #[cheatcode(group = String)]
2348    function toLowercase(string calldata input) external pure returns (string memory output);
2349    /// Converts the given `string` value to Uppercase.
2350    #[cheatcode(group = String)]
2351    function toUppercase(string calldata input) external pure returns (string memory output);
2352    /// Trims leading and trailing whitespace from the given `string` value.
2353    #[cheatcode(group = String)]
2354    function trim(string calldata input) external pure returns (string memory output);
2355    /// Replaces occurrences of `from` in the given `string` with `to`.
2356    #[cheatcode(group = String)]
2357    function replace(string calldata input, string calldata from, string calldata to) external pure returns (string memory output);
2358    /// Splits the given `string` into an array of strings divided by the `delimiter`.
2359    #[cheatcode(group = String)]
2360    function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs);
2361    /// Returns the index of the first occurrence of a `key` in an `input` string.
2362    /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found.
2363    /// Returns 0 in case of an empty `key`.
2364    #[cheatcode(group = String)]
2365    function indexOf(string calldata input, string calldata key) external pure returns (uint256);
2366    /// Returns true if `search` is found in `subject`, false otherwise.
2367    #[cheatcode(group = String)]
2368    function contains(string calldata subject, string calldata search) external pure returns (bool result);
2369
2370    // ======== JSON Parsing and Manipulation ========
2371
2372    // -------- Reading --------
2373
2374    // NOTE: Please read https://book.getfoundry.sh/cheatcodes/parse-json to understand the
2375    // limitations and caveats of the JSON parsing cheats.
2376
2377    /// Checks if `key` exists in a JSON object
2378    /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions.
2379    #[cheatcode(group = Json, status = Deprecated(Some("replaced by `keyExistsJson`")))]
2380    function keyExists(string calldata json, string calldata key) external view returns (bool);
2381    /// Checks if `key` exists in a JSON object.
2382    #[cheatcode(group = Json)]
2383    function keyExistsJson(string calldata json, string calldata key) external view returns (bool);
2384
2385    /// ABI-encodes a JSON object.
2386    #[cheatcode(group = Json)]
2387    function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData);
2388    /// ABI-encodes a JSON object at `key`.
2389    #[cheatcode(group = Json)]
2390    function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData);
2391
2392    // The following parseJson cheatcodes will do type coercion, for the type that they indicate.
2393    // For example, parseJsonUint will coerce all values to a uint256. That includes stringified numbers '12.'
2394    // and hex numbers '0xEF.'.
2395    // Type coercion works ONLY for discrete values or arrays. That means that the key must return a value or array, not
2396    // a JSON object.
2397
2398    /// Parses a string of JSON data at `key` and coerces it to `uint256`.
2399    #[cheatcode(group = Json)]
2400    function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256);
2401    /// Parses a string of JSON data at `key` and coerces it to `uint256[]`.
2402    #[cheatcode(group = Json)]
2403    function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory);
2404    /// Parses a string of JSON data at `key` and coerces it to `int256`.
2405    #[cheatcode(group = Json)]
2406    function parseJsonInt(string calldata json, string calldata key) external pure returns (int256);
2407    /// Parses a string of JSON data at `key` and coerces it to `int256[]`.
2408    #[cheatcode(group = Json)]
2409    function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory);
2410    /// Parses a string of JSON data at `key` and coerces it to `bool`.
2411    #[cheatcode(group = Json)]
2412    function parseJsonBool(string calldata json, string calldata key) external pure returns (bool);
2413    /// Parses a string of JSON data at `key` and coerces it to `bool[]`.
2414    #[cheatcode(group = Json)]
2415    function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory);
2416    /// Parses a string of JSON data at `key` and coerces it to `address`.
2417    #[cheatcode(group = Json)]
2418    function parseJsonAddress(string calldata json, string calldata key) external pure returns (address);
2419    /// Parses a string of JSON data at `key` and coerces it to `address[]`.
2420    #[cheatcode(group = Json)]
2421    function parseJsonAddressArray(string calldata json, string calldata key)
2422        external
2423        pure
2424        returns (address[] memory);
2425    /// Parses a string of JSON data at `key` and coerces it to `string`.
2426    #[cheatcode(group = Json)]
2427    function parseJsonString(string calldata json, string calldata key) external pure returns (string memory);
2428    /// Parses a string of JSON data at `key` and coerces it to `string[]`.
2429    #[cheatcode(group = Json)]
2430    function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory);
2431    /// Parses a string of JSON data at `key` and coerces it to `bytes`.
2432    #[cheatcode(group = Json)]
2433    function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory);
2434    /// Parses a string of JSON data at `key` and coerces it to `bytes[]`.
2435    #[cheatcode(group = Json)]
2436    function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory);
2437    /// Parses a string of JSON data at `key` and coerces it to `bytes32`.
2438    #[cheatcode(group = Json)]
2439    function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32);
2440    /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`.
2441    #[cheatcode(group = Json)]
2442    function parseJsonBytes32Array(string calldata json, string calldata key)
2443        external
2444        pure
2445        returns (bytes32[] memory);
2446
2447    /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`.
2448    #[cheatcode(group = Json)]
2449    function parseJsonType(string calldata json, string calldata typeDescription) external pure returns (bytes memory);
2450    /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`.
2451    #[cheatcode(group = Json)]
2452    function parseJsonType(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory);
2453    /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`.
2454    #[cheatcode(group = Json)]
2455    function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription)
2456        external
2457        pure
2458        returns (bytes memory);
2459
2460    /// Returns an array of all the keys in a JSON object.
2461    #[cheatcode(group = Json)]
2462    function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys);
2463
2464    // -------- Writing --------
2465
2466    // NOTE: Please read https://book.getfoundry.sh/cheatcodes/serialize-json to understand how
2467    // to use the serialization cheats.
2468
2469    /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file.
2470    /// Returns the stringified version of the specific JSON file up to that moment.
2471    #[cheatcode(group = Json)]
2472    function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json);
2473
2474    /// See `serializeJson`.
2475    #[cheatcode(group = Json)]
2476    function serializeBool(string calldata objectKey, string calldata valueKey, bool value)
2477        external
2478        returns (string memory json);
2479    /// See `serializeJson`.
2480    #[cheatcode(group = Json)]
2481    function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value)
2482        external
2483        returns (string memory json);
2484    /// See `serializeJson`.
2485    #[cheatcode(group = Json)]
2486    function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value)
2487        external
2488        returns (string memory json);
2489    /// See `serializeJson`.
2490    #[cheatcode(group = Json)]
2491    function serializeInt(string calldata objectKey, string calldata valueKey, int256 value)
2492        external
2493        returns (string memory json);
2494    /// See `serializeJson`.
2495    #[cheatcode(group = Json)]
2496    function serializeAddress(string calldata objectKey, string calldata valueKey, address value)
2497        external
2498        returns (string memory json);
2499    /// See `serializeJson`.
2500    #[cheatcode(group = Json)]
2501    function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value)
2502        external
2503        returns (string memory json);
2504    /// See `serializeJson`.
2505    #[cheatcode(group = Json)]
2506    function serializeString(string calldata objectKey, string calldata valueKey, string calldata value)
2507        external
2508        returns (string memory json);
2509    /// See `serializeJson`.
2510    #[cheatcode(group = Json)]
2511    function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value)
2512        external
2513        returns (string memory json);
2514
2515    /// See `serializeJson`.
2516    #[cheatcode(group = Json)]
2517    function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values)
2518        external
2519        returns (string memory json);
2520    /// See `serializeJson`.
2521    #[cheatcode(group = Json)]
2522    function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values)
2523        external
2524        returns (string memory json);
2525    /// See `serializeJson`.
2526    #[cheatcode(group = Json)]
2527    function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values)
2528        external
2529        returns (string memory json);
2530    /// See `serializeJson`.
2531    #[cheatcode(group = Json)]
2532    function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values)
2533        external
2534        returns (string memory json);
2535    /// See `serializeJson`.
2536    #[cheatcode(group = Json)]
2537    function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values)
2538        external
2539        returns (string memory json);
2540    /// See `serializeJson`.
2541    #[cheatcode(group = Json)]
2542    function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values)
2543        external
2544        returns (string memory json);
2545    /// See `serializeJson`.
2546    #[cheatcode(group = Json)]
2547    function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values)
2548        external
2549        returns (string memory json);
2550    /// See `serializeJson`.
2551    #[cheatcode(group = Json)]
2552    function serializeJsonType(string calldata typeDescription, bytes calldata value)
2553        external
2554        pure
2555        returns (string memory json);
2556    /// See `serializeJson`.
2557    #[cheatcode(group = Json)]
2558    function serializeJsonType(string calldata objectKey, string calldata valueKey, string calldata typeDescription, bytes calldata value)
2559        external
2560        returns (string memory json);
2561
2562    // NOTE: Please read https://book.getfoundry.sh/cheatcodes/write-json to understand how
2563    // to use the JSON writing cheats.
2564
2565    /// Write a serialized JSON object to a file. If the file exists, it will be overwritten.
2566    #[cheatcode(group = Json)]
2567    function writeJson(string calldata json, string calldata path) external;
2568
2569    /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = <value_key.>
2570    /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing.
2571    /// This cheatcode will create new keys if they didn't previously exist.
2572    #[cheatcode(group = Json)]
2573    function writeJson(string calldata json, string calldata path, string calldata valueKey) external;
2574
2575    // ======== TOML Parsing and Manipulation ========
2576
2577    // -------- Reading --------
2578
2579    // NOTE: Please read https://book.getfoundry.sh/cheatcodes/parse-toml to understand the
2580    // limitations and caveats of the TOML parsing cheat.
2581
2582    /// Checks if `key` exists in a TOML table.
2583    #[cheatcode(group = Toml)]
2584    function keyExistsToml(string calldata toml, string calldata key) external view returns (bool);
2585
2586    /// ABI-encodes a TOML table.
2587    #[cheatcode(group = Toml)]
2588    function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData);
2589
2590    /// ABI-encodes a TOML table at `key`.
2591    #[cheatcode(group = Toml)]
2592    function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData);
2593
2594    // The following parseToml cheatcodes will do type coercion, for the type that they indicate.
2595    // For example, parseTomlUint will coerce all values to a uint256. That includes stringified numbers '12.'
2596    // and hex numbers '0xEF.'.
2597    // Type coercion works ONLY for discrete values or arrays. That means that the key must return a value or array, not
2598    // a TOML table.
2599
2600    /// Parses a string of TOML data at `key` and coerces it to `uint256`.
2601    #[cheatcode(group = Toml)]
2602    function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256);
2603    /// Parses a string of TOML data at `key` and coerces it to `uint256[]`.
2604    #[cheatcode(group = Toml)]
2605    function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory);
2606    /// Parses a string of TOML data at `key` and coerces it to `int256`.
2607    #[cheatcode(group = Toml)]
2608    function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256);
2609    /// Parses a string of TOML data at `key` and coerces it to `int256[]`.
2610    #[cheatcode(group = Toml)]
2611    function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory);
2612    /// Parses a string of TOML data at `key` and coerces it to `bool`.
2613    #[cheatcode(group = Toml)]
2614    function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool);
2615    /// Parses a string of TOML data at `key` and coerces it to `bool[]`.
2616    #[cheatcode(group = Toml)]
2617    function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory);
2618    /// Parses a string of TOML data at `key` and coerces it to `address`.
2619    #[cheatcode(group = Toml)]
2620    function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address);
2621    /// Parses a string of TOML data at `key` and coerces it to `address[]`.
2622    #[cheatcode(group = Toml)]
2623    function parseTomlAddressArray(string calldata toml, string calldata key)
2624        external
2625        pure
2626        returns (address[] memory);
2627    /// Parses a string of TOML data at `key` and coerces it to `string`.
2628    #[cheatcode(group = Toml)]
2629    function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory);
2630    /// Parses a string of TOML data at `key` and coerces it to `string[]`.
2631    #[cheatcode(group = Toml)]
2632    function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory);
2633    /// Parses a string of TOML data at `key` and coerces it to `bytes`.
2634    #[cheatcode(group = Toml)]
2635    function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory);
2636    /// Parses a string of TOML data at `key` and coerces it to `bytes[]`.
2637    #[cheatcode(group = Toml)]
2638    function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory);
2639    /// Parses a string of TOML data at `key` and coerces it to `bytes32`.
2640    #[cheatcode(group = Toml)]
2641    function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32);
2642    /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`.
2643    #[cheatcode(group = Toml)]
2644    function parseTomlBytes32Array(string calldata toml, string calldata key)
2645        external
2646        pure
2647        returns (bytes32[] memory);
2648
2649    /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`.
2650    #[cheatcode(group = Toml)]
2651    function parseTomlType(string calldata toml, string calldata typeDescription) external pure returns (bytes memory);
2652    /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`.
2653    #[cheatcode(group = Toml)]
2654    function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription) external pure returns (bytes memory);
2655    /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`.
2656    #[cheatcode(group = Toml)]
2657    function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription)
2658        external
2659        pure
2660        returns (bytes memory);
2661
2662    /// Returns an array of all the keys in a TOML table.
2663    #[cheatcode(group = Toml)]
2664    function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys);
2665
2666    // -------- Writing --------
2667
2668    // NOTE: Please read https://book.getfoundry.sh/cheatcodes/write-toml to understand how
2669    // to use the TOML writing cheat.
2670
2671    /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file.
2672    #[cheatcode(group = Toml)]
2673    function writeToml(string calldata json, string calldata path) external;
2674
2675    /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = <value_key.>
2676    /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing.
2677    /// This cheatcode will create new keys if they didn't previously exist.
2678    #[cheatcode(group = Toml)]
2679    function writeToml(string calldata json, string calldata path, string calldata valueKey) external;
2680
2681    // ======== Cryptography ========
2682
2683    // -------- Key Management --------
2684
2685    /// Derives a private key from the name, labels the account with that name, and returns the wallet.
2686    #[cheatcode(group = Crypto)]
2687    function createWallet(string calldata walletLabel) external returns (Wallet memory wallet);
2688
2689    /// Generates a wallet from the private key and returns the wallet.
2690    #[cheatcode(group = Crypto)]
2691    function createWallet(uint256 privateKey) external returns (Wallet memory wallet);
2692
2693    /// Generates a wallet from the private key, labels the account with that name, and returns the wallet.
2694    #[cheatcode(group = Crypto)]
2695    function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet);
2696
2697    /// Signs data with a `Wallet`.
2698    #[cheatcode(group = Crypto)]
2699    function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s);
2700
2701    /// Signs data with a `Wallet`.
2702    ///
2703    /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
2704    /// signature's `s` value, and the recovery id `v` in a single bytes32.
2705    /// This format reduces the signature size from 65 to 64 bytes.
2706    #[cheatcode(group = Crypto)]
2707    function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs);
2708
2709    /// Signs `digest` with `privateKey` using the secp256k1 curve.
2710    #[cheatcode(group = Crypto)]
2711    function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
2712
2713    /// Signs `digest` with `privateKey` on the secp256k1 curve, using the given `nonce`
2714    /// as the raw ephemeral k value in ECDSA (instead of deriving it deterministically).
2715    #[cheatcode(group = Crypto)]
2716    function signWithNonceUnsafe(uint256 privateKey, bytes32 digest, uint256 nonce) external pure returns (uint8 v, bytes32 r, bytes32 s);
2717
2718    /// Signs `digest` with `privateKey` using the secp256k1 curve.
2719    ///
2720    /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
2721    /// signature's `s` value, and the recovery id `v` in a single bytes32.
2722    /// This format reduces the signature size from 65 to 64 bytes.
2723    #[cheatcode(group = Crypto)]
2724    function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
2725
2726    /// Signs `digest` with signer provided to script using the secp256k1 curve.
2727    ///
2728    /// If `--sender` is provided, the signer with provided address is used, otherwise,
2729    /// if exactly one signer is provided to the script, that signer is used.
2730    ///
2731    /// Raises error if signer passed through `--sender` does not match any unlocked signers or
2732    /// if `--sender` is not provided and not exactly one signer is passed to the script.
2733    #[cheatcode(group = Crypto)]
2734    function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
2735
2736    /// Signs `digest` with signer provided to script using the secp256k1 curve.
2737    ///
2738    /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
2739    /// signature's `s` value, and the recovery id `v` in a single bytes32.
2740    /// This format reduces the signature size from 65 to 64 bytes.
2741    ///
2742    /// If `--sender` is provided, the signer with provided address is used, otherwise,
2743    /// if exactly one signer is provided to the script, that signer is used.
2744    ///
2745    /// Raises error if signer passed through `--sender` does not match any unlocked signers or
2746    /// if `--sender` is not provided and not exactly one signer is passed to the script.
2747    #[cheatcode(group = Crypto)]
2748    function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
2749
2750    /// Signs `digest` with signer provided to script using the secp256k1 curve.
2751    ///
2752    /// Raises error if none of the signers passed into the script have provided address.
2753    #[cheatcode(group = Crypto)]
2754    function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s);
2755
2756    /// Signs `digest` with signer provided to script using the secp256k1 curve.
2757    ///
2758    /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the
2759    /// signature's `s` value, and the recovery id `v` in a single bytes32.
2760    /// This format reduces the signature size from 65 to 64 bytes.
2761    ///
2762    /// Raises error if none of the signers passed into the script have provided address.
2763    #[cheatcode(group = Crypto)]
2764    function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs);
2765
2766    /// Signs `digest` with `privateKey` using the secp256r1 curve.
2767    #[cheatcode(group = Crypto)]
2768    function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s);
2769
2770    /// Derives secp256r1 public key from the provided `privateKey`.
2771    #[cheatcode(group = Crypto)]
2772    function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY);
2773
2774    /// Derive a private key from a provided mnemonic string (or mnemonic file path)
2775    /// at the derivation path `m/44'/60'/0'/0/{index}`.
2776    #[cheatcode(group = Crypto)]
2777    function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey);
2778    /// Derive a private key from a provided mnemonic string (or mnemonic file path)
2779    /// at `{derivationPath}{index}`.
2780    #[cheatcode(group = Crypto)]
2781    function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index)
2782        external
2783        pure
2784        returns (uint256 privateKey);
2785    /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language
2786    /// at the derivation path `m/44'/60'/0'/0/{index}`.
2787    #[cheatcode(group = Crypto)]
2788    function deriveKey(string calldata mnemonic, uint32 index, string calldata language)
2789        external
2790        pure
2791        returns (uint256 privateKey);
2792    /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language
2793    /// at `{derivationPath}{index}`.
2794    #[cheatcode(group = Crypto)]
2795    function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language)
2796        external
2797        pure
2798        returns (uint256 privateKey);
2799
2800    /// Adds a private key to the local forge wallet and returns the address.
2801    #[cheatcode(group = Crypto)]
2802    function rememberKey(uint256 privateKey) external returns (address keyAddr);
2803
2804    /// Derive a set number of wallets from a mnemonic at the derivation path `m/44'/60'/0'/0/{0..count}`.
2805    ///
2806    /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned.
2807    #[cheatcode(group = Crypto)]
2808    function rememberKeys(string calldata mnemonic, string calldata derivationPath, uint32 count) external returns (address[] memory keyAddrs);
2809
2810    /// Derive a set number of wallets from a mnemonic in the specified language at the derivation path `m/44'/60'/0'/0/{0..count}`.
2811    ///
2812    /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned.
2813    #[cheatcode(group = Crypto)]
2814    function rememberKeys(string calldata mnemonic, string calldata derivationPath, string calldata language, uint32 count)
2815        external
2816        returns (address[] memory keyAddrs);
2817
2818    // -------- Uncategorized Utilities --------
2819
2820    /// Labels an address in call traces.
2821    #[cheatcode(group = Utilities)]
2822    function label(address account, string calldata newLabel) external;
2823
2824    /// Gets the label for the specified address.
2825    #[cheatcode(group = Utilities)]
2826    function getLabel(address account) external view returns (string memory currentLabel);
2827
2828    /// Compute the address a contract will be deployed at for a given deployer address and nonce.
2829    #[cheatcode(group = Utilities)]
2830    function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address);
2831
2832    /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer.
2833    #[cheatcode(group = Utilities)]
2834    function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer) external pure returns (address);
2835
2836    /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer.
2837    #[cheatcode(group = Utilities)]
2838    function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address);
2839
2840    /// Encodes a `bytes` value to a base64 string.
2841    #[cheatcode(group = Utilities)]
2842    function toBase64(bytes calldata data) external pure returns (string memory);
2843
2844    /// Encodes a `string` value to a base64 string.
2845    #[cheatcode(group = Utilities)]
2846    function toBase64(string calldata data) external pure returns (string memory);
2847
2848    /// Encodes a `bytes` value to a base64url string.
2849    #[cheatcode(group = Utilities)]
2850    function toBase64URL(bytes calldata data) external pure returns (string memory);
2851
2852    /// Encodes a `string` value to a base64url string.
2853    #[cheatcode(group = Utilities)]
2854    function toBase64URL(string calldata data) external pure returns (string memory);
2855
2856    /// Returns ENS namehash for provided string.
2857    #[cheatcode(group = Utilities)]
2858    function ensNamehash(string calldata name) external pure returns (bytes32);
2859
2860    /// Returns an uint256 value bounded in given range and different from the current one.
2861    #[cheatcode(group = Utilities)]
2862    function bound(uint256 current, uint256 min, uint256 max) external view returns (uint256);
2863
2864    /// Returns a random uint256 value.
2865    #[cheatcode(group = Utilities)]
2866    function randomUint() external view returns (uint256);
2867
2868    /// Returns random uint256 value between the provided range (=min..=max).
2869    #[cheatcode(group = Utilities)]
2870    function randomUint(uint256 min, uint256 max) external view returns (uint256);
2871
2872    /// Returns a random `uint256` value of given bits.
2873    #[cheatcode(group = Utilities)]
2874    function randomUint(uint256 bits) external view returns (uint256);
2875
2876    /// Returns a random `address`.
2877    #[cheatcode(group = Utilities)]
2878    function randomAddress() external view returns (address);
2879
2880    /// Returns an int256 value bounded in given range and different from the current one.
2881    #[cheatcode(group = Utilities)]
2882    function bound(int256 current, int256 min, int256 max) external view returns (int256);
2883
2884    /// Returns a random `int256` value.
2885    #[cheatcode(group = Utilities)]
2886    function randomInt() external view returns (int256);
2887
2888    /// Returns a random `int256` value of given bits.
2889    #[cheatcode(group = Utilities)]
2890    function randomInt(uint256 bits) external view returns (int256);
2891
2892    /// Returns a random `bool`.
2893    #[cheatcode(group = Utilities)]
2894    function randomBool() external view returns (bool);
2895
2896    /// Returns a random byte array value of the given length.
2897    #[cheatcode(group = Utilities)]
2898    function randomBytes(uint256 len) external view returns (bytes memory);
2899
2900    /// Returns a random fixed-size byte array of length 4.
2901    #[cheatcode(group = Utilities)]
2902    function randomBytes4() external view returns (bytes4);
2903
2904    /// Returns a random fixed-size byte array of length 8.
2905    #[cheatcode(group = Utilities)]
2906    function randomBytes8() external view returns (bytes8);
2907
2908    /// Pauses collection of call traces. Useful in cases when you want to skip tracing of
2909    /// complex calls which are not useful for debugging.
2910    #[cheatcode(group = Utilities)]
2911    function pauseTracing() external view;
2912
2913    /// Unpauses collection of call traces.
2914    #[cheatcode(group = Utilities)]
2915    function resumeTracing() external view;
2916
2917    /// Utility cheatcode to copy storage of `from` contract to another `to` contract.
2918    #[cheatcode(group = Utilities)]
2919    function copyStorage(address from, address to) external;
2920
2921    /// Utility cheatcode to set arbitrary storage for given target address.
2922    #[cheatcode(group = Utilities)]
2923    function setArbitraryStorage(address target) external;
2924
2925    /// Utility cheatcode to set arbitrary storage for given target address and overwrite
2926    /// any storage slots that have been previously set.
2927    #[cheatcode(group = Utilities)]
2928    function setArbitraryStorage(address target, bool overwrite) external;
2929
2930    /// Sorts an array in ascending order.
2931    #[cheatcode(group = Utilities)]
2932    function sort(uint256[] calldata array) external returns (uint256[] memory);
2933
2934    /// Randomly shuffles an array.
2935    #[cheatcode(group = Utilities)]
2936    function shuffle(uint256[] calldata array) external returns (uint256[] memory);
2937
2938    /// Set RNG seed.
2939    #[cheatcode(group = Utilities)]
2940    function setSeed(uint256 seed) external;
2941
2942    /// Causes the next contract creation (via new) to fail and return its initcode in the returndata buffer.
2943    /// This allows type-safe access to the initcode payload that would be used for contract creation.
2944    /// Example usage:
2945    /// vm.interceptInitcode();
2946    /// bytes memory initcode;
2947    /// try new MyContract(param1, param2) { assert(false); }
2948    /// catch (bytes memory interceptedInitcode) { initcode = interceptedInitcode; }
2949    #[cheatcode(group = Utilities, safety = Unsafe)]
2950    function interceptInitcode() external;
2951
2952    /// Generates the hash of the canonical EIP-712 type representation.
2953    ///
2954    /// Supports 2 different inputs:
2955    ///  1. Name of the type (i.e. "Transaction"):
2956    ///     * requires previous binding generation with `forge bind-json`.
2957    ///     * bindings will be retrieved from the path configured in `foundry.toml`.
2958    ///
2959    ///  2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)").
2960    ///     * Note: the cheatcode will output the canonical type even if the input is malformated
2961    ///             with the wrong order of elements or with extra whitespaces.
2962    #[cheatcode(group = Utilities)]
2963    function eip712HashType(string calldata typeNameOrDefinition) external pure returns (bytes32 typeHash);
2964
2965    /// Generates the hash of the canonical EIP-712 type representation.
2966    /// Requires previous binding generation with `forge bind-json`.
2967    ///
2968    /// Params:
2969    ///  * `bindingsPath`: path where the output of `forge bind-json` is stored.
2970    ///  * `typeName`: Name of the type (i.e. "Transaction").
2971    #[cheatcode(group = Utilities)]
2972    function eip712HashType(string calldata bindingsPath, string calldata typeName) external pure returns (bytes32 typeHash);
2973
2974    /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data.
2975    ///
2976    /// Supports 2 different inputs:
2977    ///  1. Name of the type (i.e. "PermitSingle"):
2978    ///     * requires previous binding generation with `forge bind-json`.
2979    ///     * bindings will be retrieved from the path configured in `foundry.toml`.
2980    ///
2981    ///  2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)").
2982    ///     * Note: the cheatcode will use the canonical type even if the input is malformated
2983    ///             with the wrong order of elements or with extra whitespaces.
2984    #[cheatcode(group = Utilities)]
2985    function eip712HashStruct(string calldata typeNameOrDefinition, bytes calldata abiEncodedData) external pure returns (bytes32 typeHash);
2986
2987    /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data.
2988    /// Requires previous binding generation with `forge bind-json`.
2989    ///
2990    /// Params:
2991    ///  * `bindingsPath`: path where the output of `forge bind-json` is stored.
2992    ///  * `typeName`: Name of the type (i.e. "PermitSingle").
2993    ///  * `abiEncodedData`: ABI-encoded data for the struct that is being hashed.
2994    #[cheatcode(group = Utilities)]
2995    function eip712HashStruct(string calldata bindingsPath, string calldata typeName, bytes calldata abiEncodedData) external pure returns (bytes32 typeHash);
2996
2997    /// Generates a ready-to-sign digest of human-readable typed data following the EIP-712 standard.
2998    #[cheatcode(group = Utilities)]
2999    function eip712HashTypedData(string calldata jsonData) external pure returns (bytes32 digest);
3000}
3001}
3002
3003impl PartialEq for ForgeContext {
3004    // Handles test group case (any of test, coverage or snapshot)
3005    // and script group case (any of dry run, broadcast or resume).
3006    fn eq(&self, other: &Self) -> bool {
3007        match (self, other) {
3008            (_, Self::TestGroup) => {
3009                matches!(self, Self::Test | Self::Snapshot | Self::Coverage)
3010            }
3011            (_, Self::ScriptGroup) => {
3012                matches!(self, Self::ScriptDryRun | Self::ScriptBroadcast | Self::ScriptResume)
3013            }
3014            (Self::Test, Self::Test)
3015            | (Self::Snapshot, Self::Snapshot)
3016            | (Self::Coverage, Self::Coverage)
3017            | (Self::ScriptDryRun, Self::ScriptDryRun)
3018            | (Self::ScriptBroadcast, Self::ScriptBroadcast)
3019            | (Self::ScriptResume, Self::ScriptResume)
3020            | (Self::Unknown, Self::Unknown) => true,
3021            _ => false,
3022        }
3023    }
3024}
3025
3026impl fmt::Display for Vm::CheatcodeError {
3027    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3028        self.message.fmt(f)
3029    }
3030}
3031
3032impl fmt::Display for Vm::VmErrors {
3033    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3034        match self {
3035            Self::CheatcodeError(err) => err.fmt(f),
3036        }
3037    }
3038}
3039
3040#[track_caller]
3041const fn panic_unknown_safety() -> ! {
3042    panic!("cannot determine safety from the group, add a `#[cheatcode(safety = ...)]` attribute")
3043}