Skip to content

Commit

Permalink
Add event with XCM executor outcome, which includes weight fee (#1286)
Browse files Browse the repository at this point in the history
* Add event with XCM executor outcome, which includes weight fee

* Show weight used in processed messages

* remove added event

* named events

* message_id for message_hash

* Update pallets/xcmp-queue/src/lib.rs

Co-authored-by: joe petrowski <[email protected]>
  • Loading branch information
girazoki and joepetrowski authored Jun 20, 2022
1 parent 9bb1a50 commit 17ca448
Showing 1 changed file with 26 additions and 15 deletions.
41 changes: 26 additions & 15 deletions pallets/xcmp-queue/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ pub mod pallet {
let used = Self::handle_xcm_message(sender, sent_at, xcm, weight_limit)
.map_err(|_| Error::<T>::WeightOverLimit)?;
Overweight::<T>::remove(index);
Self::deposit_event(Event::OverweightServiced(index, used));
Self::deposit_event(Event::OverweightServiced { index, used });
Ok(Some(used.saturating_add(1_000_000)).into())
}

Expand Down Expand Up @@ -263,21 +263,26 @@ pub mod pallet {
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
/// Some XCM was executed ok.
Success(Option<T::Hash>),
Success { message_hash: Option<T::Hash>, weight: Weight },
/// Some XCM failed.
Fail(Option<T::Hash>, XcmError),
Fail { message_hash: Option<T::Hash>, error: XcmError, weight: Weight },
/// Bad XCM version used.
BadVersion(Option<T::Hash>),
BadVersion { message_hash: Option<T::Hash> },
/// Bad XCM format used.
BadFormat(Option<T::Hash>),
BadFormat { message_hash: Option<T::Hash> },
/// An upward message was sent to the relay chain.
UpwardMessageSent(Option<T::Hash>),
UpwardMessageSent { message_hash: Option<T::Hash> },
/// An HRMP message was sent to a sibling parachain.
XcmpMessageSent(Option<T::Hash>),
XcmpMessageSent { message_hash: Option<T::Hash> },
/// An XCM exceeded the individual message weight budget.
OverweightEnqueued(ParaId, RelayBlockNumber, OverweightIndex, Weight),
OverweightEnqueued {
sender: ParaId,
sent_at: RelayBlockNumber,
index: OverweightIndex,
required: Weight,
},
/// An XCM from the overweight queue was executed with the given actual weight used.
OverweightServiced(OverweightIndex, Weight),
OverweightServiced { index: OverweightIndex, used: Weight },
}

#[pallet::error]
Expand Down Expand Up @@ -599,15 +604,20 @@ impl<T: Config> Pallet<T> {
let (result, event) = match Xcm::<T::Call>::try_from(xcm) {
Ok(xcm) => {
let location = (1, Parachain(sender.into()));

match T::XcmExecutor::execute_xcm(location, xcm, max_weight) {
Outcome::Error(e) => (Err(e), Event::Fail(Some(hash), e)),
Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))),
Outcome::Error(e) =>
(Err(e), Event::Fail { message_hash: Some(hash), error: e, weight: 0 }),
Outcome::Complete(w) =>
(Ok(w), Event::Success { message_hash: Some(hash), weight: w }),
// As far as the caller is concerned, this was dispatched without error, so
// we just report the weight used.
Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)),
Outcome::Incomplete(w, e) =>
(Ok(w), Event::Fail { message_hash: Some(hash), error: e, weight: w }),
}
},
Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion(Some(hash))),
Err(()) =>
(Err(XcmError::UnhandledXcmVersion), Event::BadVersion { message_hash: Some(hash) }),
};
Self::deposit_event(event);
result
Expand Down Expand Up @@ -644,7 +654,8 @@ impl<T: Config> Pallet<T> {
.saturating_sub(remaining_fragments.len());
let overweight_xcm = last_remaining_fragments[..msg_len].to_vec();
let index = Self::stash_overweight(sender, sent_at, overweight_xcm);
let e = Event::OverweightEnqueued(sender, sent_at, index, required);
let e =
Event::OverweightEnqueued { sender, sent_at, index, required };
Self::deposit_event(e);
},
Err(XcmError::WeightLimitReached(required))
Expand Down Expand Up @@ -1098,7 +1109,7 @@ impl<T: Config> SendXcm for Pallet<T> {
versioned_xcm,
)
.map_err(|e| SendError::Transport(<&'static str>::from(e)))?;
Self::deposit_event(Event::XcmpMessageSent(Some(hash)));
Self::deposit_event(Event::XcmpMessageSent { message_hash: Some(hash) });
Ok(())
},
// Anything else is unhandled. This includes a message this is meant for us.
Expand Down

0 comments on commit 17ca448

Please sign in to comment.