Implement Proper XCM Fee Management

Severity: Medium

Description

The FeeManager trait is used to manage fees for executing XCM messages. When properly configured, it allows for fees to be distributed to specified accounts or components. However, if FeeManager is set to the empty tuple type (), all fees will be burned.

What should be avoided

Setting FeeManager to the unit type () should be done with caution. This setting will automatically burn all fees collected.

#![allow(unused)]
fn main() {
// Fees will be burned.
type FeeManager = ();
}

In this example:

  • FeeManager is set to (), meaning that there is no mechanism to process or allocate the collected fees, causing them to be automatically burned.

Best practice

Configure FeeManager to allow fees to be either deposited or distributed.

#![allow(unused)]
fn main() {
// Fees will be deposited into an account.
type FeeManager = XcmFeeManagerFromComponents<
    WaivedLocations,
    XcmFeeToAccountId20<Self::AssetTransactor, AccountId, StakingPot>,
>;
}

In this example, the FeeManager accepts WaivedLocations that are exempt from fees and transfers any charged fees to a StakingPot account.