Skip to content

Commit c916632

Browse files
paritytech-release-backport-bot[bot]claravanstadenbkonturEgorPopelyaev
authored
[unstable2507] Backport #9746 (#9819)
Backport #9746 into `unstable2507` from claravanstaden. See the [documentation](https://github.com/paritytech/polkadot-sdk/blob/master/docs/BACKPORT.md) on how to use this bot. <!-- # To be used by other automation, do not modify: original-pr-number: #${pull_number} --> Co-authored-by: Clara van Staden <[email protected]> Co-authored-by: Branislav Kontur <[email protected]> Co-authored-by: Egor_P <[email protected]>
1 parent cf286f3 commit c916632

File tree

4 files changed

+159
-8
lines changed

4 files changed

+159
-8
lines changed

bridges/snowbridge/pallets/inbound-queue-v2/src/lib.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,10 @@ pub mod pallet {
257257
})?;
258258

259259
// Pay relayer reward
260-
if !relayer_fee.is_zero() {
261-
T::RewardPayment::register_reward(
262-
&relayer,
263-
T::DefaultRewardKind::get(),
264-
relayer_fee,
265-
);
260+
let tip = Tips::<T>::take(nonce).unwrap_or_default();
261+
let total_tip = relayer_fee.saturating_add(tip);
262+
if total_tip > 0 {
263+
T::RewardPayment::register_reward(&relayer, T::DefaultRewardKind::get(), total_tip);
266264
}
267265

268266
Self::deposit_event(Event::MessageReceived { nonce, message_id });

bridges/snowbridge/pallets/inbound-queue-v2/src/test.rs

Lines changed: 139 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use codec::Encode;
77
use frame_support::{assert_noop, assert_ok};
88
use snowbridge_inbound_queue_primitives::{v2::XcmPayload, EventProof, Proof};
99
use snowbridge_test_utils::{
10-
mock_rewards::RegisteredRewardsCount,
10+
mock_rewards::{RegisteredRewardAmount, RegisteredRewardsCount},
1111
mock_xcm::{set_charge_fees_override, set_sender_override},
1212
};
1313
use 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+
}

bridges/snowbridge/test-utils/src/mock_rewards.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ impl From<BridgeReward> for RewardsAccountParams<u64> {
5050

5151
parameter_types! {
5252
pub static RegisteredRewardsCount: u128 = 0;
53+
pub static RegisteredRewardAmount: u128 = 0;
5354
}
5455

5556
pub struct MockRewardLedger;
@@ -58,8 +59,9 @@ impl RewardLedger<sp_runtime::AccountId32, BridgeReward, u128> for MockRewardLed
5859
fn register_reward(
5960
_relayer: &sp_runtime::AccountId32,
6061
_reward: BridgeReward,
61-
_reward_balance: u128,
62+
reward_balance: u128,
6263
) {
6364
RegisteredRewardsCount::set(RegisteredRewardsCount::get().saturating_add(1));
65+
RegisteredRewardAmount::set(reward_balance);
6466
}
6567
}

prdoc/pr_9746.prdoc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
title: Snowbridge Inbound Queue V2 relayer tip payout fix
2+
3+
doc:
4+
- audience: Runtime Dev
5+
description: |
6+
Fixes a bug where relayer tips were not properly paid out, causing the tips to be lost since it had already been
7+
burnt.
8+
9+
crates:
10+
- name: snowbridge-pallet-inbound-queue-v2
11+
bump: patch
12+
- name: snowbridge-test-utils
13+
bump: minor

0 commit comments

Comments
 (0)