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.sender
for all subsequent calls untilstopPrank
is called.startPrank(address msgSender, address txOrigin)
: setsmsg.sender
andtx.origin
for all subsequent calls untilstopPrank
is called.startPrank(address msgSender, bool delegateCall)
: ifdelegateCall
value istrue
then setsmsg.sender
for all subsequent delegate calls untilstopPrank
is called.startPrank(address msgSender, address txOrigin, bool delegateCall)
: ifdelegateCall
value istrue
then setsmsg.sender
andtx.origin
for all subsequent delegate calls untilstopPrank
is 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