Skip to content

readCallers

enum CallerMode {
/// No caller modification is currently active.
None,
/// Unsupported. Present for forge-std ABI compatibility.
Broadcast,
/// Unsupported. Present for forge-std ABI compatibility.
RecurrentBroadcast,
/// A one time prank triggered by a `vm.prank()` call is currently active.
Prank,
/// A recurrent prank triggered by a `vm.startPrank()` call is currently active.
RecurrentPrank,
}
function readCallers()
external
returns (CallerMode callerMode, address msgSender, address txOrigin);

Reads the current msg.sender and tx.origin from state and reports if there is any active caller modification.

The CallerMode enum indicates if there is an active caller modification and the type.

  • If there is an active prank:

    • callerMode will be equal to:
      • CallerMode.Prank if the prank has been set with prank.
      • CallerMode.RecurrentPrank if the prank has been set with startPrank.
  • If no caller modification is active:

    • callerMode will be equal to CallerMode.None.
CallerMode callerMode;
address msgSender;
address txOrigin;
// Example 1
(callerMode, msgSender, txOrigin) = vm.readCallers();
assertEq(callerMode, CallerMode.None);
assertEq(msgSender, defaultSenderAddress);
assertEq(txOrigin, defaultOriginAddress);
// Example 2
vm.prank(senderPrankAddress);
(callerMode, msgSender, txOrigin) = vm.readCallers();
assertEq(callerMode, CallerMode.Prank);
assertEq(msgSender, senderPrankAddress);
assertEq(txOrigin, defaultOriginAddress);
// Example 3
vm.prank(senderPrankAddress, originPrankAddress);
(callerMode, msgSender, txOrigin) = vm.readCallers();
assertEq(callerMode, CallerMode.Prank);
assertEq(msgSender, senderPrankAddress);
assertEq(txOrigin, originPrankAddress);