use super::*;
impl<N: Network> Package<N> {
pub fn run<A: crate::circuit::Aleo<Network = N, BaseField = N::Field>, R: Rng + CryptoRng>(
&self,
private_key: &PrivateKey<N>,
function_name: Identifier<N>,
inputs: &[Value<N>],
rng: &mut R,
) -> Result<(Response<N>, Vec<CallMetrics<N>>)> {
let program = self.program();
let program_id = program.id();
if !program.contains_function(&function_name) {
bail!("Function '{function_name}' does not exist.")
}
let _locator = Locator::<N>::from_str(&format!("{program_id}/{function_name}"))?;
dev_println!("🚀 Running '{}'...\n", _locator.to_string());
let process = self.get_process()?;
let authorization = process.authorize::<A, R>(private_key, program_id, function_name, inputs.iter(), rng)?;
let request = authorization.next()?;
let stack = process.get_stack(program_id)?;
let assignments = Assignments::<N>::default();
let call_stack = CallStack::PackageRun(vec![request], *private_key, assignments.clone());
let response = stack.execute_function::<A, R>(call_stack, None, None, rng)?;
let call_metrics = assignments.read().iter().map(|(_, metrics)| *metrics).collect::<Vec<_>>();
Ok((response, call_metrics))
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_utilities::TestRng;
type CurrentAleo = snarkvm_circuit::network::AleoV0;
#[test]
fn test_run() {
let (directory, package) = crate::package::test_helpers::sample_token_package();
assert!(!package.build_directory().exists());
package.build::<CurrentAleo>().unwrap();
assert!(package.build_directory().exists());
let rng = &mut TestRng::default();
let (private_key, function_name, inputs) =
crate::package::test_helpers::sample_package_run(package.program_id());
let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
std::fs::remove_dir_all(directory).unwrap();
}
#[test]
fn test_run_with_import() {
let (directory, package) = crate::package::test_helpers::sample_wallet_package();
assert!(!package.build_directory().exists());
package.build::<CurrentAleo>().unwrap();
assert!(package.build_directory().exists());
let rng = &mut TestRng::default();
let (private_key, function_name, inputs) =
crate::package::test_helpers::sample_package_run(package.program_id());
let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
std::fs::remove_dir_all(directory).unwrap();
}
#[test]
fn test_run_with_nested_imports() {
let (directory, package) = crate::package::test_helpers::sample_nested_package();
assert!(!package.build_directory().exists());
package.build::<CurrentAleo>().unwrap();
assert!(package.build_directory().exists());
let rng = &mut TestRng::default();
let (private_key, function_name, inputs) =
crate::package::test_helpers::sample_package_run(package.program_id());
let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
std::fs::remove_dir_all(directory).unwrap();
}
#[ignore]
#[test]
fn test_profiler() -> Result<()> {
let (directory, package) = crate::package::test_helpers::sample_token_package();
assert!(!package.build_directory().exists());
package.build::<CurrentAleo>().unwrap();
assert!(package.build_directory().exists());
let rng = &mut TestRng::default();
let (private_key, function_name, inputs) =
crate::package::test_helpers::sample_package_run(package.program_id());
let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
std::fs::remove_dir_all(directory).unwrap();
bail!("\n\nRemember to #[ignore] this test!\n\n")
}
}