#![deny(warnings)]
use cairo_vm::felt::Felt252;
use starknet_in_rust::{
services::api::contract_classes::deprecated_contract_class::ContractClass,
testing::state::StarknetState,
utils::{calculate_sn_keccak, Address},
};
use std::path::Path;
fn main() {
let contract_path = "starknet_programs/factorial.json";
let entry_point: &str = "factorial";
let calldata: Vec<Felt252> = [1.into(), 1.into(), 10.into()].to_vec();
let retdata = test_contract(contract_path, entry_point, calldata);
let result_strs: Vec<String> = retdata.iter().map(Felt252::to_string).collect();
let joined_str = result_strs.join(", ");
println!("The returned values were: {joined_str}");
}
fn test_contract(
contract_path: impl AsRef<Path>,
entry_point: &str,
calldata: Vec<Felt252>,
) -> Vec<Felt252> {
let mut state = StarknetState::new(None);
let contract_class =
ContractClass::from_path(contract_path).expect("Could not load contract from JSON");
state
.declare(contract_class.clone())
.expect("Could not declare the contract class");
let (contract_address, _) = state
.deploy(contract_class, vec![], Default::default(), None, 0)
.expect("Could not deploy contract");
let entry_point_selector = Felt252::from_bytes_be(&calculate_sn_keccak(entry_point.as_bytes()));
let caller_address = Address::default();
let callinfo = state
.execute_entry_point_raw(
contract_address,
entry_point_selector,
calldata,
caller_address,
)
.expect("Could not execute entry point");
callinfo.retdata
}
#[test]
fn test_fibonacci() {
let retdata = test_contract(
"starknet_programs/fibonacci.json",
"fib",
[1.into(), 1.into(), 10.into()].to_vec(),
);
assert_eq!(retdata, vec![144.into()]);
}
#[test]
fn test_factorial() {
let retdata = test_contract(
"starknet_programs/factorial.json",
"factorial",
[10.into()].to_vec(),
);
assert_eq!(retdata, vec![3628800.into()]);
}