From 3e9b8b47b39c1a6448a7c403c20462df1800e78f Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 5 Aug 2021 23:51:52 +0200 Subject: [PATCH] Introduce hard limit on XCM assets (#3579) --- polkadot/xcm/pallet-xcm/src/lib.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index 4540b22e4b..8187171bf8 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -81,6 +81,9 @@ pub mod pallet { type LocationInverter: InvertLocation; } + /// The maximum number of distinct assets allowed to be transferred in a single helper extrinsic. + const MAX_ASSETS_FOR_TRANSFER: usize = 2; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { @@ -100,6 +103,8 @@ pub mod pallet { Empty, /// Could not reanchor the assets to declare the fees for the destination chain. CannotReanchor, + /// Too many assets have been attempted for transfer. + TooManyAssets, } #[pallet::hooks] @@ -152,6 +157,7 @@ pub mod pallet { dest_weight: Weight, ) -> DispatchResult { let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + ensure!(assets.len() <= MAX_ASSETS_FOR_TRANSFER, Error::::TooManyAssets); let value = (origin_location, assets); ensure!(T::XcmTeleportFilter::contains(&value), Error::::Filtered); let (origin_location, assets) = value; @@ -214,6 +220,7 @@ pub mod pallet { dest_weight: Weight, ) -> DispatchResult { let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + ensure!(assets.len() <= MAX_ASSETS_FOR_TRANSFER, Error::::TooManyAssets); let value = (origin_location, assets); ensure!(T::XcmReserveTransferFilter::contains(&value), Error::::Filtered); let (origin_location, assets) = value;