@@ -91,6 +91,7 @@ pub const LOG_TARGET: &str = "runtime::bridge-messages";
91
91
#[ frame_support:: pallet]
92
92
pub mod pallet {
93
93
use super :: * ;
94
+ use bp_messages:: { NotDispatchedReason , ReceivedMessageResult , ReceivedMessages } ;
94
95
use frame_support:: pallet_prelude:: * ;
95
96
use frame_system:: pallet_prelude:: * ;
96
97
@@ -298,6 +299,7 @@ pub mod pallet {
298
299
// dispatch messages and (optionally) update lane(s) state(s)
299
300
let mut total_messages = 0 ;
300
301
let mut valid_messages = 0 ;
302
+ let mut messages_received_status = Vec :: with_capacity ( messages. len ( ) ) ;
301
303
let mut dispatch_weight_left = dispatch_weight;
302
304
for ( lane_id, lane_data) in messages {
303
305
let mut lane = inbound_lane :: < T , I > ( lane_id) ;
@@ -314,24 +316,41 @@ pub mod pallet {
314
316
}
315
317
}
316
318
319
+ let mut lane_messages_received_status =
320
+ Vec :: with_capacity ( lane_data. messages . len ( ) ) ;
321
+ let mut is_lane_processing_stopped_no_weight_left = false ;
322
+
317
323
for mut message in lane_data. messages {
318
324
debug_assert_eq ! ( message. key. lane_id, lane_id) ;
325
+ total_messages += 1 ;
326
+
327
+ if is_lane_processing_stopped_no_weight_left {
328
+ lane_messages_received_status. push ( (
329
+ message. key . nonce ,
330
+ NotDispatchedReason :: NotEnoughWeightForLane . into ( ) ,
331
+ ) ) ;
332
+ continue
333
+ }
319
334
320
335
// ensure that relayer has declared enough weight for dispatching next message
321
336
// on this lane. We can't dispatch lane messages out-of-order, so if declared
322
337
// weight is not enough, let's move to next lane
323
- let dispatch_weight = T :: MessageDispatch :: dispatch_weight ( & mut message) ;
324
- if dispatch_weight . any_gt ( dispatch_weight_left) {
338
+ let message_dispatch_weight = T :: MessageDispatch :: dispatch_weight ( & mut message) ;
339
+ if message_dispatch_weight . any_gt ( dispatch_weight_left) {
325
340
log:: trace!(
326
341
target: LOG_TARGET ,
327
342
"Cannot dispatch any more messages on lane {:?}. Weight: declared={}, left={}" ,
328
343
lane_id,
329
- dispatch_weight ,
344
+ message_dispatch_weight ,
330
345
dispatch_weight_left,
331
346
) ;
332
- break
347
+ lane_messages_received_status. push ( (
348
+ message. key . nonce ,
349
+ NotDispatchedReason :: NotEnoughWeightForLane . into ( ) ,
350
+ ) ) ;
351
+ is_lane_processing_stopped_no_weight_left = true ;
352
+ continue
333
353
}
334
- total_messages += 1 ;
335
354
336
355
let receival_result = lane. receive_message :: < T :: MessageDispatch , T :: AccountId > (
337
356
& relayer_id_at_bridged_chain,
@@ -349,18 +368,38 @@ pub mod pallet {
349
368
let ( unspent_weight, refund_pay_dispatch_fee) = match receival_result {
350
369
ReceivalResult :: Dispatched ( dispatch_result) => {
351
370
valid_messages += 1 ;
371
+ lane_messages_received_status
372
+ . push ( ( message. key . nonce , ReceivedMessageResult :: Dispatched ) ) ;
352
373
(
353
374
dispatch_result. unspent_weight ,
354
375
!dispatch_result. dispatch_fee_paid_during_dispatch ,
355
376
)
356
377
} ,
357
- ReceivalResult :: InvalidNonce |
358
- ReceivalResult :: TooManyUnrewardedRelayers |
359
- ReceivalResult :: TooManyUnconfirmedMessages => ( dispatch_weight, true ) ,
378
+ ReceivalResult :: InvalidNonce => {
379
+ lane_messages_received_status. push ( (
380
+ message. key . nonce ,
381
+ NotDispatchedReason :: InvalidNonce . into ( ) ,
382
+ ) ) ;
383
+ ( message_dispatch_weight, true )
384
+ } ,
385
+ ReceivalResult :: TooManyUnrewardedRelayers => {
386
+ lane_messages_received_status. push ( (
387
+ message. key . nonce ,
388
+ NotDispatchedReason :: TooManyUnrewardedRelayers . into ( ) ,
389
+ ) ) ;
390
+ ( message_dispatch_weight, true )
391
+ } ,
392
+ ReceivalResult :: TooManyUnconfirmedMessages => {
393
+ lane_messages_received_status. push ( (
394
+ message. key . nonce ,
395
+ NotDispatchedReason :: TooManyUnconfirmedMessages . into ( ) ,
396
+ ) ) ;
397
+ ( message_dispatch_weight, true )
398
+ } ,
360
399
} ;
361
400
362
- let unspent_weight = unspent_weight. min ( dispatch_weight ) ;
363
- dispatch_weight_left -= dispatch_weight - unspent_weight;
401
+ let unspent_weight = unspent_weight. min ( message_dispatch_weight ) ;
402
+ dispatch_weight_left -= message_dispatch_weight - unspent_weight;
364
403
actual_weight = actual_weight. saturating_sub ( unspent_weight) . saturating_sub (
365
404
// delivery call weight formula assumes that the fee is paid at
366
405
// this (target) chain. If the message is prepaid at the source
@@ -372,9 +411,12 @@ pub mod pallet {
372
411
} ,
373
412
) ;
374
413
}
414
+
415
+ messages_received_status
416
+ . push ( ReceivedMessages :: new ( lane_id, lane_messages_received_status) ) ;
375
417
}
376
418
377
- log:: trace !(
419
+ log:: debug !(
378
420
target: LOG_TARGET ,
379
421
"Received messages: total={}, valid={}. Weight used: {}/{}" ,
380
422
total_messages,
@@ -383,6 +425,8 @@ pub mod pallet {
383
425
declared_weight,
384
426
) ;
385
427
428
+ Self :: deposit_event ( Event :: MessagesReceived ( messages_received_status) ) ;
429
+
386
430
Ok ( PostDispatchInfo { actual_weight : Some ( actual_weight) , pays_fee : Pays :: Yes } )
387
431
}
388
432
@@ -494,6 +538,8 @@ pub mod pallet {
494
538
pub enum Event < T : Config < I > , I : ' static = ( ) > {
495
539
/// Message has been accepted and is waiting to be delivered.
496
540
MessageAccepted { lane_id : LaneId , nonce : MessageNonce } ,
541
+ /// Messages have been received from the bridged chain.
542
+ MessagesReceived ( Vec < ReceivedMessages < ReceivedMessageResult > > ) ,
497
543
/// Messages in the inclusive range have been delivered to the bridged chain.
498
544
MessagesDelivered { lane_id : LaneId , messages : DeliveredMessages } ,
499
545
}
0 commit comments