diff --git a/bridges/snowbridge/pallets/inbound-queue-v2/src/lib.rs b/bridges/snowbridge/pallets/inbound-queue-v2/src/lib.rs index 03ab4f6dcc08b..6a9b3c4529523 100644 --- a/bridges/snowbridge/pallets/inbound-queue-v2/src/lib.rs +++ b/bridges/snowbridge/pallets/inbound-queue-v2/src/lib.rs @@ -264,7 +264,13 @@ pub mod pallet { })?; // Pay relayer reward - T::RewardPayment::register_reward(&relayer, T::DefaultRewardKind::get(), relayer_fee); + if !relayer_fee.is_zero() { + T::RewardPayment::register_reward( + &relayer, + T::DefaultRewardKind::get(), + relayer_fee, + ); + } // Mark message as received Nonce::::set(nonce.into()); diff --git a/bridges/snowbridge/pallets/inbound-queue-v2/src/mock.rs b/bridges/snowbridge/pallets/inbound-queue-v2/src/mock.rs index 05666a3dcb63b..9f842c95d2236 100644 --- a/bridges/snowbridge/pallets/inbound-queue-v2/src/mock.rs +++ b/bridges/snowbridge/pallets/inbound-queue-v2/src/mock.rs @@ -161,12 +161,22 @@ pub enum BridgeReward { Snowbridge, } +use std::cell::Cell; + +thread_local! { + pub static REWARD_ALLOCATED: Cell = Cell::new(0); +} + impl RewardLedger<::AccountId, BridgeReward, u128> for () { fn register_reward( _relayer: &::AccountId, _reward: BridgeReward, _reward_balance: u128, ) { + REWARD_ALLOCATED.with(|counter| { + let current = counter.get(); + counter.set(current + 1); + }); } } diff --git a/bridges/snowbridge/pallets/inbound-queue-v2/src/test.rs b/bridges/snowbridge/pallets/inbound-queue-v2/src/test.rs index 267485c319521..f90427605a90c 100644 --- a/bridges/snowbridge/pallets/inbound-queue-v2/src/test.rs +++ b/bridges/snowbridge/pallets/inbound-queue-v2/src/test.rs @@ -5,7 +5,7 @@ use super::*; use crate::{mock::*, Error}; use codec::Encode; use frame_support::{assert_noop, assert_ok}; -use snowbridge_inbound_queue_primitives::{EventProof, Proof}; +use snowbridge_inbound_queue_primitives::{v2::XcmPayload, EventProof, Proof}; use snowbridge_test_utils::mock_xcm::{set_charge_fees_override, set_sender_override}; use sp_keyring::sr25519::Keyring; use sp_runtime::DispatchError; @@ -44,6 +44,9 @@ fn test_submit_happy_path() { )), "no fees paid event emitted." ); + + let final_value = REWARD_ALLOCATED.with(|counter| counter.get()); + assert_eq!(final_value, 1, "Relayer reward should have been registered"); }); } @@ -325,3 +328,28 @@ fn test_switch_operating_mode() { assert_ok!(InboundQueue::submit(origin, Box::new(event))); }); } + +#[test] +fn zero_reward_does_not_register_reward() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let origin = H160::random(); + assert_ok!(InboundQueue::process_message( + relayer, + Message { + nonce: 0, + assets: vec![], + xcm: XcmPayload::Raw(vec![]), + claimer: None, + execution_fee: 1_000_000_000, + relayer_fee: 0, + gateway: GatewayAddress::get(), + origin, + value: 3_000_000_000, + } + )); + + let final_value = REWARD_ALLOCATED.with(|counter| counter.get()); + assert_eq!(final_value, 0, "Zero relayer reward should not be registered"); + }); +}