v0.2.4 declare, prepare, deploy
- added
declare
cheatcode - added
prepare
anddeploy
cheatcodes to allow using other cheatcodes to test constructors - improved
mock_call
anddeploy_contract
cheatcodes by integrating Starknet.py's data transformer - improved handling of compilation errors in test files during collecting phase
- improved
warp
androll
cheatcodes to be usable in the integration testing approach - changed
deploy_contract
to declare the contract before deploying - fixed
mock_call
not affecting calls in contracts deployed bydeploy_contract
- fixed SSL error when running
upgrade
command - minor fixes and improvements
How to upgrade Protostar
Run protostar upgrade
.
In case of issues, run the following script:
curl -L https://raw.githubusercontent.com/software-mansion/protostar/master/install.sh | bash
Example
# ...
%{
declared = declare("./src/main.cairo")
prepared = prepare(declared, {"initial_balance": 42})
start_prank(123, target_contract_address=prepared.contract_address)
deploy(prepared)
%}
# ...
src/main.cairo
%lang starknet
from starkware.cairo.common.math import assert_nn
from starkware.cairo.common.cairo_builtins import HashBuiltin
from starkware.starknet.common.syscalls import get_caller_address
@storage_var
func owner() -> (res : felt):
end
@storage_var
func balance() -> (res : felt):
end
@view
func get_owner{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (res : felt):
let (res) = owner.read()
return (res)
end
@view
func get_balance{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (
res : felt
):
let (res) = balance.read()
return (res)
end
@constructor
func constructor{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}(
initial_balance : felt
):
let (res) = get_caller_address()
balance.write(initial_balance)
owner.write(res)
return ()
end
tests/test_main.cairo
%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
@contract_interface
namespace MainContract:
func get_owner() -> (res : felt):
end
func get_balance() -> (res : felt):
end
end
@external
func test_owner{syscall_ptr : felt*, range_check_ptr, pedersen_ptr : HashBuiltin*}():
alloc_locals
local contract_address : felt
%{
declared = declare("./src/main.cairo")
prepared = prepare(declared, {"initial_balance": 42})
ids.contract_address = prepared.contract_address
start_prank(123, target_contract_address=prepared.contract_address)
deploy(prepared)
%}
let (owner) = MainContract.get_owner(contract_address)
let (balance) = MainContract.get_balance(contract_address)
assert owner = 123
assert balance = 42
return ()
end