@@ -341,13 +341,7 @@ where
341341 let ok = result. map_err ( |err| {
342342 tracing:: debug!( "Tx WASM failed with {}" , err) ;
343343
344- match * sentinel. borrow ( ) {
345- TxSentinel :: None => Error :: RuntimeError ( err) ,
346- TxSentinel :: OutOfGas => Error :: GasError ( err. to_string ( ) ) ,
347- TxSentinel :: InvalidCommitment => {
348- Error :: MissingSection ( err. to_string ( ) )
349- }
350- }
344+ extract_tx_error ( & mut yielded_value, & sentinel, Some ( err) )
351345 } ) ?;
352346
353347 // NB: early drop this data to avoid memory errors
@@ -359,20 +353,47 @@ where
359353 let _store = RefCell :: into_inner ( store) ;
360354 Ok ( verifiers)
361355 } else {
362- let err = yielded_value. take ( ) . map_or_else (
363- || Ok ( "Execution ended abruptly with an unknown error" . to_owned ( ) ) ,
364- |borsh_encoded_err| {
365- let tx_err = TxError :: try_from_slice ( & borsh_encoded_err)
366- . map_err ( |e| Error :: ConversionError ( e. to_string ( ) ) ) ?;
367- Ok ( tx_err)
368- } ,
369- ) ?;
356+ Err ( extract_tx_error ( & mut yielded_value, & sentinel, None ) )
357+ }
358+ }
370359
371- Err ( match * sentinel. borrow ( ) {
372- TxSentinel :: None => Error :: TxError ( err) ,
373- TxSentinel :: OutOfGas => Error :: GasError ( err) ,
374- TxSentinel :: InvalidCommitment => Error :: MissingSection ( err) ,
375- } )
360+ fn extract_tx_error (
361+ yielded_value : & mut Option < Vec < u8 > > ,
362+ sentinel : & RefCell < TxSentinel > ,
363+ runtime_err : Option < wasmer:: RuntimeError > ,
364+ ) -> Error {
365+ #[ inline]
366+ fn take (
367+ yielded_value : & mut Option < Vec < u8 > > ,
368+ runtime_err : Option < wasmer:: RuntimeError > ,
369+ ) -> Error {
370+ const UNKNOWN : & str = "Runtime panic caused execution to end abruptly" ;
371+
372+ let yielded_err = yielded_value. take ( ) . map ( |borsh_encoded_err| {
373+ TxError :: try_from_slice ( & borsh_encoded_err) . map_err ( |err| {
374+ Error :: ConversionError ( format ! (
375+ "Failed to extract yielded tx error: {err}"
376+ ) )
377+ } )
378+ } ) ;
379+
380+ if let Some ( result) = yielded_err {
381+ result. map_or_else ( |err| err, Error :: TxError )
382+ } else if let Some ( err) = runtime_err {
383+ Error :: RuntimeError ( err)
384+ } else {
385+ Error :: TxError ( UNKNOWN . to_owned ( ) )
386+ }
387+ }
388+
389+ match * sentinel. borrow ( ) {
390+ TxSentinel :: OutOfGas => {
391+ Error :: GasError ( take ( yielded_value, runtime_err) . to_string ( ) )
392+ }
393+ TxSentinel :: InvalidCommitment => {
394+ Error :: MissingSection ( take ( yielded_value, runtime_err) . to_string ( ) )
395+ }
396+ TxSentinel :: None => take ( yielded_value, runtime_err) ,
376397 }
377398}
378399
0 commit comments