ffi
Description
The ffi
cheatcode is used to call an arbitrary command on your host OS. Note that ffi
must be enabled via the project
configuration file by setting fuzzing.chainConfig.cheatCodes.enableFFI
to true
.
Note that enabling ffi
allows anyone to execute arbitrary commands on devices that run the fuzz tests which may
become a security risk.
Please review Foundry's documentation on the ffi
cheatcode for general tips.
Example with ABI-encoded hex
// Obtain our cheat code contract reference.
IStdCheats cheats = CheatCodes(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
// Create command
string[] memory inputs = new string[](3);
inputs[0] = "echo";
inputs[1] = "-n";
// Encoded "hello"
inputs[2] = "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000568656C6C6F000000000000000000000000000000000000000000000000000000";
// Call cheats.ffi
bytes memory res = cheats.ffi(inputs);
// ABI decode
string memory output = abi.decode(res, (string));
assert(keccak256(abi.encodePacked(output)) == keccak256(abi.encodePacked("hello")));
Example with UTF8 encoding
// Obtain our cheat code contract reference.
IStdCheats cheats = CheatCodes(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
// Create command
string[] memory inputs = new string[](3);
inputs[0] = "echo";
inputs[1] = "-n";
inputs[2] = "hello";
// Call cheats.ffi
bytes memory res = cheats.ffi(inputs);
// Convert to UTF-8 string
string memory output = string(res);
assert(keccak256(abi.encodePacked(output)) == keccak256(abi.encodePacked("hello")));
Function Signature
function ffi(string[] calldata) external returns (bytes memory);