1616
1717//! Implementation of `ProcessMessage` for an `ExecuteXcm` implementation.
1818
19- use frame_support:: {
20- ensure,
21- traits:: { ProcessMessage , ProcessMessageError } ,
22- } ;
19+ use frame_support:: traits:: { ProcessMessage , ProcessMessageError } ;
2320use parity_scale_codec:: { Decode , FullCodec , MaxEncodedLen } ;
2421use scale_info:: TypeInfo ;
2522use sp_std:: { fmt:: Debug , marker:: PhantomData } ;
2623use sp_weights:: { Weight , WeightMeter } ;
2724use xcm:: prelude:: * ;
2825
26+ const LOG_TARGET : & str = "xcm::process-message" ;
27+
2928/// A message processor that delegates execution to an `XcmExecutor`.
3029pub struct ProcessXcmMessage < MessageOrigin , XcmExecutor , Call > (
3130 PhantomData < ( MessageOrigin , XcmExecutor , Call ) > ,
@@ -45,21 +44,68 @@ impl<
4544 meter : & mut WeightMeter ,
4645 id : & mut XcmHash ,
4746 ) -> Result < bool , ProcessMessageError > {
48- let versioned_message = VersionedXcm :: < Call > :: decode ( & mut & message[ ..] )
49- . map_err ( |_| ProcessMessageError :: Corrupt ) ?;
50- let message = Xcm :: < Call > :: try_from ( versioned_message)
51- . map_err ( |_| ProcessMessageError :: Unsupported ) ?;
52- let pre = XcmExecutor :: prepare ( message) . map_err ( |_| ProcessMessageError :: Unsupported ) ?;
47+ let versioned_message = VersionedXcm :: < Call > :: decode ( & mut & message[ ..] ) . map_err ( |e| {
48+ log:: trace!(
49+ target: LOG_TARGET ,
50+ "`VersionedXcm` failed to decode: {e:?}" ,
51+ ) ;
52+
53+ ProcessMessageError :: Corrupt
54+ } ) ?;
55+ let message = Xcm :: < Call > :: try_from ( versioned_message) . map_err ( |_| {
56+ log:: trace!(
57+ target: LOG_TARGET ,
58+ "Failed to convert `VersionedXcm` into `XcmV3`." ,
59+ ) ;
60+
61+ ProcessMessageError :: Unsupported
62+ } ) ?;
63+ let pre = XcmExecutor :: prepare ( message) . map_err ( |_| {
64+ log:: trace!(
65+ target: LOG_TARGET ,
66+ "Failed to prepare message." ,
67+ ) ;
68+
69+ ProcessMessageError :: Unsupported
70+ } ) ?;
5371 // The worst-case weight:
5472 let required = pre. weight_of ( ) ;
55- ensure ! ( meter. can_consume( required) , ProcessMessageError :: Overweight ( required) ) ;
73+ if !meter. can_consume ( required) {
74+ log:: trace!(
75+ target: LOG_TARGET ,
76+ "Xcm required {required} more than remaining {}" ,
77+ meter. remaining( ) ,
78+ ) ;
79+
80+ return Err ( ProcessMessageError :: Overweight ( required) )
81+ }
5682
5783 let ( consumed, result) = match XcmExecutor :: execute ( origin. into ( ) , pre, id, Weight :: zero ( ) )
5884 {
59- Outcome :: Complete ( w) => ( w, Ok ( true ) ) ,
60- Outcome :: Incomplete ( w, _) => ( w, Ok ( false ) ) ,
85+ Outcome :: Complete ( w) => {
86+ log:: trace!(
87+ target: LOG_TARGET ,
88+ "XCM message execution complete, used weight: {w}" ,
89+ ) ;
90+ ( w, Ok ( true ) )
91+ } ,
92+ Outcome :: Incomplete ( w, e) => {
93+ log:: trace!(
94+ target: LOG_TARGET ,
95+ "XCM message execution incomplete, used weight: {w}, error: {e:?}" ,
96+ ) ;
97+
98+ ( w, Ok ( false ) )
99+ } ,
61100 // In the error-case we assume the worst case and consume all possible weight.
62- Outcome :: Error ( _) => ( required, Err ( ProcessMessageError :: Unsupported ) ) ,
101+ Outcome :: Error ( e) => {
102+ log:: trace!(
103+ target: LOG_TARGET ,
104+ "XCM message execution error: {e:?}" ,
105+ ) ;
106+
107+ ( required, Err ( ProcessMessageError :: Unsupported ) )
108+ } ,
63109 } ;
64110 meter. consume ( consumed) ;
65111 result
0 commit comments