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): setsmsg.senderfor all subsequent calls untilstopPrankis called.startPrank(address msgSender, address txOrigin): setsmsg.senderandtx.originfor all subsequent calls untilstopPrankis called.startPrank(address msgSender, bool delegateCall): ifdelegateCallvalue istruethen setsmsg.senderfor all subsequent delegate calls untilstopPrankis called.startPrank(address msgSender, address txOrigin, bool delegateCall): ifdelegateCallvalue istruethen setsmsg.senderandtx.originfor all subsequent delegate calls untilstopPrankis 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
0xcd16ecbf000000000000000000000000000000000000000000000000000000000000002aSEE ALSO
Forge Standard Library
