@@ -7,7 +7,7 @@ use codec::Encode;
77use frame_support:: { assert_noop, assert_ok} ;
88use snowbridge_inbound_queue_primitives:: { v2:: XcmPayload , EventProof , Proof } ;
99use snowbridge_test_utils:: {
10- mock_rewards:: RegisteredRewardsCount ,
10+ mock_rewards:: { RegisteredRewardAmount , RegisteredRewardsCount } ,
1111 mock_xcm:: { set_charge_fees_override, set_sender_override} ,
1212} ;
1313use sp_keyring:: sr25519:: Keyring ;
@@ -389,3 +389,141 @@ fn test_add_tip_amount_zero() {
389389 assert_eq ! ( Tips :: <Test >:: get( nonce) , None ) ;
390390 } ) ;
391391}
392+
393+ #[ test]
394+ fn inbound_tip_is_paid_out_to_relayer ( ) {
395+ new_tester ( ) . execute_with ( || {
396+ let nonce: u64 = 77 ;
397+ let tip: u128 = 12_345 ;
398+ let relayer_fee: u128 = 2_000 ;
399+
400+ // Add tip for nonce before message is processed
401+ assert_ok ! ( InboundQueue :: add_tip( nonce, tip) ) ;
402+ assert_eq ! ( Tips :: <Test >:: get( nonce) , Some ( tip) ) ;
403+
404+ // Process inbound message with relayer_fee
405+ let relayer: AccountId = Keyring :: Bob . into ( ) ;
406+ assert_ok ! ( InboundQueue :: process_message(
407+ relayer,
408+ Message {
409+ nonce,
410+ assets: vec![ ] ,
411+ xcm: XcmPayload :: Raw ( vec![ ] ) ,
412+ claimer: None ,
413+ execution_fee: 1_000_000_000 ,
414+ relayer_fee,
415+ gateway: mock:: GatewayAddress :: get( ) ,
416+ origin: H160 :: random( ) ,
417+ value: 3_000_000_000 ,
418+ } ,
419+ ) ) ;
420+
421+ // Reward should be registered from relayer_fee + tip
422+ assert_eq ! (
423+ RegisteredRewardsCount :: get( ) ,
424+ 1 ,
425+ "Reward should be registered from relayer_fee + tip"
426+ ) ;
427+
428+ // Check the actual reward amount paid out (should be relayer_fee + tip)
429+ assert_eq ! (
430+ RegisteredRewardAmount :: get( ) ,
431+ relayer_fee + tip,
432+ "Reward amount should equal relayer_fee + tip"
433+ ) ;
434+
435+ // Tip should be consumed from storage
436+ assert_eq ! ( Tips :: <Test >:: get( nonce) , None ) ;
437+ } ) ;
438+ }
439+
440+ #[ test]
441+ fn relayer_fee_paid_out_when_no_tip_exists ( ) {
442+ new_tester ( ) . execute_with ( || {
443+ let nonce: u64 = 88 ;
444+ let relayer_fee: u128 = 5_000 ;
445+
446+ // Ensure no tip exists for this nonce
447+ assert_eq ! ( Tips :: <Test >:: get( nonce) , None ) ;
448+
449+ // Process inbound message with relayer_fee but no tip
450+ let relayer: AccountId = Keyring :: Bob . into ( ) ;
451+ assert_ok ! ( InboundQueue :: process_message(
452+ relayer,
453+ Message {
454+ nonce,
455+ assets: vec![ ] ,
456+ xcm: XcmPayload :: Raw ( vec![ ] ) ,
457+ claimer: None ,
458+ execution_fee: 1_000_000_000 ,
459+ relayer_fee,
460+ gateway: mock:: GatewayAddress :: get( ) ,
461+ origin: H160 :: random( ) ,
462+ value: 3_000_000_000 ,
463+ } ,
464+ ) ) ;
465+
466+ // Relayer fee should be paid out even without tip
467+ assert_eq ! (
468+ RegisteredRewardsCount :: get( ) ,
469+ 1 ,
470+ "Relayer fee should be paid out even when no tip exists"
471+ ) ;
472+
473+ // Check the actual reward amount paid out
474+ assert_eq ! (
475+ RegisteredRewardAmount :: get( ) ,
476+ relayer_fee,
477+ "Reward amount should equal relayer_fee when no tip exists"
478+ ) ;
479+
480+ // Confirm no tip storage was affected
481+ assert_eq ! ( Tips :: <Test >:: get( nonce) , None ) ;
482+ } ) ;
483+ }
484+
485+ #[ test]
486+ fn tip_paid_out_when_no_relayer_fee ( ) {
487+ new_tester ( ) . execute_with ( || {
488+ let nonce: u64 = 99 ;
489+ let tip: u128 = 8_500 ;
490+
491+ // Add tip for nonce before message is processed
492+ assert_ok ! ( InboundQueue :: add_tip( nonce, tip) ) ;
493+ assert_eq ! ( Tips :: <Test >:: get( nonce) , Some ( tip) ) ;
494+
495+ // Process inbound message with zero relayer_fee but with tip
496+ let relayer: AccountId = Keyring :: Bob . into ( ) ;
497+ assert_ok ! ( InboundQueue :: process_message(
498+ relayer,
499+ Message {
500+ nonce,
501+ assets: vec![ ] ,
502+ xcm: XcmPayload :: Raw ( vec![ ] ) ,
503+ claimer: None ,
504+ execution_fee: 1_000_000_000 ,
505+ relayer_fee: 0 ,
506+ gateway: mock:: GatewayAddress :: get( ) ,
507+ origin: H160 :: random( ) ,
508+ value: 3_000_000_000 ,
509+ } ,
510+ ) ) ;
511+
512+ // Tip should be paid out even without relayer fee
513+ assert_eq ! (
514+ RegisteredRewardsCount :: get( ) ,
515+ 1 ,
516+ "Tip should be paid out even when relayer_fee is 0"
517+ ) ;
518+
519+ // Check the actual reward amount paid out (should be just the tip)
520+ assert_eq ! (
521+ RegisteredRewardAmount :: get( ) ,
522+ tip,
523+ "Reward amount should equal tip when relayer_fee is 0"
524+ ) ;
525+
526+ // Tip should be consumed from storage
527+ assert_eq ! ( Tips :: <Test >:: get( nonce) , None ) ;
528+ } ) ;
529+ }
0 commit comments