snarkvm_debug/package/
run.rs1use super::*;
16
17impl<N: Network> Package<N> {
18 pub fn run<A: crate::circuit::Aleo<Network = N, BaseField = N::Field>, R: Rng + CryptoRng>(
20 &self,
21 private_key: &PrivateKey<N>,
22 function_name: Identifier<N>,
23 inputs: &[Value<N>],
24 rng: &mut R,
25 ) -> Result<(Response<N>, Vec<CallMetrics<N>>)> {
26 let program = self.program();
28 let program_id = program.id();
30 if !program.contains_function(&function_name) {
32 bail!("Function '{function_name}' does not exist.")
33 }
34
35 let _locator = Locator::<N>::from_str(&format!("{program_id}/{function_name}"))?;
37
38 #[cfg(feature = "aleo-cli")]
39 println!("🚀 Running '{}'...\n", _locator.to_string().bold());
40
41 let process = self.get_process()?;
43 let authorization = process.authorize::<A, R>(private_key, program_id, function_name, inputs.iter(), rng)?;
45
46 let request = authorization.next()?;
49 let stack = process.get_stack(program_id)?;
51 let assignments = Assignments::<N>::default();
53 let call_stack = CallStack::PackageRun(vec![request], *private_key, assignments.clone());
55 let response = stack.execute_function::<A, R>(call_stack, None, rng)?;
57 let call_metrics = assignments.read().iter().map(|(_, metrics)| *metrics).collect::<Vec<_>>();
59 Ok((response, call_metrics))
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67 use snarkvm_utilities::TestRng;
68
69 type CurrentAleo = snarkvm_circuit::network::AleoV0;
70
71 #[test]
72 fn test_run() {
73 let (directory, package) = crate::package::test_helpers::sample_token_package();
75
76 assert!(!package.build_directory().exists());
78 package.build::<CurrentAleo>(None).unwrap();
80 assert!(package.build_directory().exists());
82
83 let rng = &mut TestRng::default();
85 let (private_key, function_name, inputs) =
87 crate::package::test_helpers::sample_package_run(package.program_id());
88 let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
90
91 std::fs::remove_dir_all(directory).unwrap();
93 }
94
95 #[test]
96 fn test_run_with_import() {
97 let (directory, package) = crate::package::test_helpers::sample_wallet_package();
99
100 assert!(!package.build_directory().exists());
102 package.build::<CurrentAleo>(None).unwrap();
104 assert!(package.build_directory().exists());
106
107 let rng = &mut TestRng::default();
109 let (private_key, function_name, inputs) =
111 crate::package::test_helpers::sample_package_run(package.program_id());
112 let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
114
115 std::fs::remove_dir_all(directory).unwrap();
117 }
118
119 #[test]
120 fn test_run_with_nested_imports() {
121 let (directory, package) = crate::package::test_helpers::sample_nested_package();
123
124 assert!(!package.build_directory().exists());
126 package.build::<CurrentAleo>(None).unwrap();
128 assert!(package.build_directory().exists());
130
131 let rng = &mut TestRng::default();
133 let (private_key, function_name, inputs) =
135 crate::package::test_helpers::sample_package_run(package.program_id());
136 let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
138
139 std::fs::remove_dir_all(directory).unwrap();
141 }
142
143 #[ignore]
145 #[test]
146 fn test_profiler() -> Result<()> {
147 let (directory, package) = crate::package::test_helpers::sample_token_package();
149
150 assert!(!package.build_directory().exists());
152 package.build::<CurrentAleo>(None).unwrap();
154 assert!(package.build_directory().exists());
156
157 let rng = &mut TestRng::default();
159 let (private_key, function_name, inputs) =
161 crate::package::test_helpers::sample_package_run(package.program_id());
162 let (_response, _metrics) = package.run::<CurrentAleo, _>(&private_key, function_name, &inputs, rng).unwrap();
164
165 std::fs::remove_dir_all(directory).unwrap();
167
168 bail!("\n\nRemember to #[ignore] this test!\n\n")
169 }
170}