startPrank
Signature
function startPrank(address msgSender) external;
function startPrank(address msgSender, bool delegateCall) external;
function startPrank(address msgSender, address txOrigin) external;
function startPrank(address msgSender, address txOrigin, bool delegateCall) external;
Description
- startPrank(address msgSender): sets- msg.senderfor all subsequent calls until- stopPrankis called.
- startPrank(address msgSender, address txOrigin): sets- msg.senderand- tx.originfor all subsequent calls until- stopPrankis called.
- startPrank(address msgSender, bool delegateCall): if- delegateCallvalue is- truethen sets- msg.senderfor all subsequent delegate calls until- stopPrankis called.
- startPrank(address msgSender, address txOrigin, bool delegateCall): if- delegateCallvalue is- truethen sets- msg.senderand- tx.originfor all subsequent delegate calls until- stopPrankis called.
ℹ️ Note
The delegate calls cannot be pranked from an EOA.
Examples
- prank delegate call and record state diffs
contract ImplementationTest {
    uint public num;
    address public sender;
    function setNum(uint _num) public {
        num = _num;
    }
}
contract ProxyTest {
    uint public num;
    address public sender;
}
contract FoundryIssue is Script {
    function run() public {
        ProxyTest proxy = new ProxyTest();
        ImplementationTest impl = new ImplementationTest();
        vm.label(address(proxy), 'proxy');
        vm.label(address(impl), 'Impl');
        uint num = 42;
        vm.startPrank(address(proxy), true);
        vm.startStateDiffRecording();
        (bool successTwo,) = address(impl).delegatecall(abi.encodeWithSignature('setNum(uint256)', num));
        VmSafe.AccountAccess[] memory accountAccesses = vm.stopAndReturnStateDiff();
        console.log('accountAccesses.kind', uint8(accountAccesses[0].kind));
        console.log('accountAccesses.accessor', vm.getLabel(accountAccesses[0].accessor));
        console.log('accountAccesses.account', vm.getLabel(accountAccesses[0].account));
        console.logBytes(accountAccesses[0].data);
    }
}
== Logs ==
  accountAccesses.kind 1
  accountAccesses.accessor proxy
  accountAccesses.account Impl
  0xcd16ecbf000000000000000000000000000000000000000000000000000000000000002a
SEE ALSO
Forge Standard Library