# readCallers

Description: readCallers cheatcode documentation

Note: This document was authored using MDX

  Source: https://github.com/NomicFoundation/hardhat-website/tree/main/src/content/docs/docs/reference/cheatcodes/Environment/read-callers.mdx

  Components used in this page:
    - :::note: An informational callout block. Supports custom title `:::note[Title]` and icon `:::note{icon="name"}` syntax.

{/* This document contains content copied/adapted from the Foundry Book (MIT licensed). See LICENSE in the parent directory. */}

### Signature

```solidity
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);
```

### Description

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`](/docs/reference/cheatcodes/environment/prank).
    - `CallerMode.RecurrentPrank` if the prank has been set with [`startPrank`](/docs/reference/cheatcodes/environment/start-prank).

- If no caller modification is active:
  - `callerMode` will be equal to `CallerMode.None`.

:::note
`readCallers` never returns `CallerMode.Broadcast` or `CallerMode.RecurrentBroadcast`, as `broadcast` and `startBroadcast` are unsupported. These variants are present in the enum for forge-std ABI compatibility.
:::

### Examples

```solidity
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);
```

### SEE ALSO

- [prank](/docs/reference/cheatcodes/environment/prank)
- [startPrank](/docs/reference/cheatcodes/environment/start-prank)
