Skip to main content

start_prank

def start_prank(caller_address: int, target_contract_address: Optional[int] = None) -> Callable: ...

Changes a caller address returned by get_caller_address() until the returned callable is called. If target_contract_address is specified, start_prank affects only the contract with the specified address. Otherwise, start_prank affects the current contract.

In unit tests

Local assert passes
@external
func test_remote_prank{syscall_ptr: felt*, range_check_ptr}() {
%{ stop_prank_callable = start_prank(123) %}

let (caller_addr) = get_caller_address();
// Does not raise error
assert caller_addr = 123;

%{ stop_prank_callable() %}
return ();
}

In integration tests

./pranked_contract.cairo
%lang starknet

from starkware.starknet.common.syscalls import get_caller_address

@external
func assert_pranked{syscall_ptr: felt*}() {
let (caller_addr) = get_caller_address();
with_attr error_message("Not pranked!") {
assert caller_addr = 123;
}
return ();
}
Remote assert passes
@contract_interface
namespace Pranked {
func assert_pranked() -> () {
}
}

@external
func test_remote_prank{syscall_ptr: felt*, range_check_ptr}() {
alloc_locals;
local contract_address: felt;
%{
ids.contract_address = deploy_contract("./pranked_contract.cairo").contract_address
stop_prank_callable = start_prank(123, target_contract_address=ids.contract_address)
%}
// Does not raise error
Pranked.assert_pranked(contract_address=contract_address);
%{ stop_prank_callable() %}
return ();
}