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,35 @@ 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
339+ . get_function ( IdentifierNative :: from_str ( function) . map_err ( |e| e. to_string ( ) ) ?)
340+ . map_err ( |e| e. to_string ( ) ) ?;
341+
342+ let mut inputs: Vec < Value < CurrentNetwork > > = vec ! [ ] ;
343+ for input_type in function_native. input_types ( ) {
344+ match input_type {
345+ ValueType :: ExternalRecord ( locator) => {
346+ let stack = process. get_stack ( locator. program_id ( ) ) . map_err ( |e| e. to_string ( ) ) ?;
347+ inputs. push (
348+ stack
349+ . sample_value ( & burner_address, & ValueType :: Record ( * locator. resource ( ) ) . into ( ) , rng)
350+ . map_err ( |e| e. to_string ( ) ) ?,
351+ ) ;
352+ }
353+ _ => {
354+ let stack = process. get_stack ( program_native. id ( ) ) . map_err ( |e| e. to_string ( ) ) ?;
355+ inputs
356+ . push ( stack. sample_value ( & burner_address, & input_type. into ( ) , rng) . map_err ( |e| e. to_string ( ) ) ?) ;
357+ }
358+ }
359+ }
360+
330361 let program_id = program_native. id ( ) ;
331362 let edition = edition. unwrap_or ( 1 ) ;
332363
@@ -338,30 +369,16 @@ impl ProgramManager {
338369 }
339370
340371 ProgramManager :: resolve_imports ( process, & program_native, imports) ?;
341- let rng = & mut StdRng :: from_entropy ( ) ;
342372
343373 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- )
374+ . authorize :: < CurrentAleo , StdRng > ( & burner_private_key, program_id, function, inputs. iter ( ) , rng)
351375 . map_err ( |e| e. to_string ( ) ) ?;
352376
353377 let node_url = url. as_deref ( ) . unwrap_or ( DEFAULT_URL ) ;
354378 let latest_height = if let Some ( offline_query) = offline_query. as_ref ( ) {
355379 offline_query. current_block_height ( ) . map_err ( |e| e. to_string ( ) ) ?
356380 } else {
357- let function_name = IdentifierNative :: from_str ( function) . map_err ( |err| err. to_string ( ) ) ?;
358- 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 ( ) ) ?;
364- query. current_block_height ( ) . map_err ( |e| e. to_string ( ) ) ?
381+ latest_block_height ( node_url) . await . map_err ( |err| err. to_string ( ) ) ?
365382 } ;
366383
367384 let consensus_version =
0 commit comments