1717use super :: * ;
1818
1919use crate :: {
20+ Address ,
2021 ExecutionResponse ,
2122 OfflineQuery ,
23+ Plaintext ,
2224 PrivateKey ,
2325 RecordPlaintext ,
2426 SnapshotQuery ,
@@ -42,10 +44,12 @@ use crate::{
4244use snarkvm_algorithms:: snark:: varuna:: VarunaVersion ;
4345use snarkvm_console:: {
4446 network:: { ConsensusVersion , Network } ,
45- program:: Value ,
47+ program:: { ArrayType , PlaintextType , Value , ValueType } ,
4648} ;
4749use snarkvm_ledger_query:: QueryTrait ;
4850use snarkvm_synthesizer:: prelude:: { InclusionVersion , execution_cost, execution_cost_for_authorization} ;
51+ use snarkvm_synthesizer_program:: FunctionCore ;
52+ use wasm_bindgen:: JsValue ;
4953
5054use crate :: types:: native:: { PrivateKeyNative , ViewKeyNative } ;
5155use core:: ops:: Add ;
@@ -307,10 +311,8 @@ impl ProgramManager {
307311 #[ wasm_bindgen( js_name = estimateExecutionFee) ]
308312 #[ allow( clippy:: too_many_arguments) ]
309313 pub async fn estimate_execution_fee (
310- private_key : & PrivateKey ,
311314 program : & str ,
312315 function : & str ,
313- inputs : Array ,
314316 url : Option < String > ,
315317 imports : Option < Object > ,
316318 offline_query : Option < OfflineQuery > ,
@@ -327,6 +329,32 @@ impl ProgramManager {
327329 log ( "Check program imports are valid and add them to the process" ) ;
328330 let program_native = ProgramNative :: from_str ( program) . map_err ( |e| e. to_string ( ) ) ?;
329331
332+ let rng = & mut StdRng :: from_entropy ( ) ;
333+ // Initialize a burner private key.
334+ let burner_private_key = PrivateKey :: new ( ) ;
335+ // Compute the burner address.
336+ let burner_address = Address :: from_private_key ( & burner_private_key) ;
337+
338+ let function_native = program_native. get_function ( function) . map_err ( |e| e. to_string ( ) ) ?;
339+
340+ let mut inputs: Vec < Value < CurrentNetwork > > = vec ! [ ] ;
341+ for input_type in function_native. input_types ( ) {
342+ match input_type {
343+ ValueType :: ExternalRecord ( locator) => {
344+ let stack = process. get_stack ( locator. program_id ( ) ) . map_err ( |e| e. to_string ( ) ) ?;
345+ inputs. push ( stack. sample_value (
346+ & burner_address,
347+ & ValueType :: Record ( * locator. resource ( ) ) . into ( ) ,
348+ rng,
349+ ) ) ;
350+ }
351+ _ => {
352+ let stack = process. get_stack ( program_native. id ( ) ) . map_err ( |e| e. to_string ( ) ) ?;
353+ inputs. push ( stack. sample_value ( & burner_address, & input_type. into ( ) , rng) ) ;
354+ }
355+ }
356+ }
357+
330358 let program_id = program_native. id ( ) ;
331359 let edition = edition. unwrap_or ( 1 ) ;
332360
@@ -338,16 +366,9 @@ impl ProgramManager {
338366 }
339367
340368 ProgramManager :: resolve_imports ( process, & program_native, imports) ?;
341- let rng = & mut StdRng :: from_entropy ( ) ;
342369
343370 let authorization = process
344- . authorize :: < CurrentAleo , StdRng > (
345- private_key,
346- program_id,
347- function,
348- inputs. iter ( ) . map ( |v| Value :: from_str ( & v. as_string ( ) . unwrap_or_default ( ) ) ) ,
349- rng,
350- )
371+ . authorize :: < CurrentAleo , StdRng > ( & burner_private_key, program_id, function, inputs, rng)
351372 . map_err ( |e| e. to_string ( ) ) ?;
352373
353374 let node_url = url. as_deref ( ) . unwrap_or ( DEFAULT_URL ) ;
@@ -356,11 +377,16 @@ impl ProgramManager {
356377 } else {
357378 let function_name = IdentifierNative :: from_str ( function) . map_err ( |err| err. to_string ( ) ) ?;
358379 let view_key =
359- ViewKeyNative :: try_from ( PrivateKeyNative :: from ( private_key) ) . map_err ( |err| err. to_string ( ) ) ?;
360- let query =
361- SnapshotQuery :: try_from_inputs ( node_url, & program_native, & function_name, & view_key, & inputs. to_vec ( ) )
362- . await
363- . map_err ( |err| err. to_string ( ) ) ?;
380+ ViewKeyNative :: try_from ( PrivateKeyNative :: from ( burner_private_key) ) . map_err ( |err| err. to_string ( ) ) ?;
381+ let query = SnapshotQuery :: try_from_inputs (
382+ node_url,
383+ & program_native,
384+ & function_name,
385+ & view_key,
386+ & inputs. iter ( ) . map ( |input| JsValue :: from_str ( & input. to_string ( ) ) ) . collect ( ) ,
387+ )
388+ . await
389+ . map_err ( |err| err. to_string ( ) ) ?;
364390 query. current_block_height ( ) . map_err ( |e| e. to_string ( ) ) ?
365391 } ;
366392
0 commit comments