Skip to content

Commit c9773cc

Browse files
committed
refactor: use class_locality
1 parent f28f800 commit c9773cc

File tree

2 files changed

+30
-25
lines changed

2 files changed

+30
-25
lines changed

modules/xnft/src/impl_transactor.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
// You should have received a copy of the GNU General Public License
1717
// along with this program. If not, see <https://www.gnu.org/licenses/>.
1818

19-
use crate::*;
19+
use crate::{xcm_helpers::ClassLocality, *};
2020

2121
const LOG_TARGET: &str = "xcm::module_xnft::transactor";
2222

@@ -62,17 +62,14 @@ where
6262
return Err(XcmExecutorError::AssetNotHandled.into());
6363
};
6464

65-
let (class_id, is_foreign_asset) = Self::asset_to_collection(&what.id)?;
65+
let class_locality = Self::asset_to_collection(&what.id)?;
6666

6767
let to = <ConverterOf<T>>::convert_location(who).ok_or(XcmExecutorError::AccountIdConversionFailed)?;
6868

69-
let deposit_handler = if is_foreign_asset {
70-
Self::deposit_foreign_asset
71-
} else {
72-
Self::deposit_local_asset
73-
};
74-
75-
deposit_handler(&to, class_id, &asset_instance)
69+
match class_locality {
70+
ClassLocality::Foreign(class_id) => Self::deposit_foreign_asset(&to, class_id, &asset_instance),
71+
ClassLocality::Local(class_id) => Self::deposit_local_asset(&to, class_id, &asset_instance),
72+
}
7673
}
7774

7875
fn withdraw_asset(
@@ -92,14 +89,14 @@ where
9289
return Err(XcmExecutorError::AssetNotHandled.into());
9390
};
9491

95-
let (class_id, is_foreign_asset) = Self::asset_to_collection(&what.id)?;
92+
let class_locality = Self::asset_to_collection(&what.id)?;
9693

9794
let from = <ConverterOf<T>>::convert_location(who).ok_or(XcmExecutorError::AccountIdConversionFailed)?;
9895

99-
let token_id = Self::asset_instance_to_token_id(class_id, is_foreign_asset, &asset_instance)
96+
let token = Self::asset_instance_to_token(class_locality, &asset_instance)
10097
.ok_or(XcmExecutorError::InstanceConversionFailed)?;
10198

102-
<ModuleNftPallet<T>>::do_transfer(&from, &Self::account_id(), (class_id, token_id))
99+
<ModuleNftPallet<T>>::do_transfer(&from, &Self::account_id(), token)
103100
.map(|_| what.clone().into())
104101
.map_err(|_| XcmError::FailedToTransactAsset("non-fungible item withdraw failed"))
105102
}
@@ -123,15 +120,15 @@ where
123120
return Err(XcmExecutorError::AssetNotHandled.into());
124121
};
125122

126-
let (class_id, is_foreign_asset) = Self::asset_to_collection(&asset.id)?;
123+
let class_locality = Self::asset_to_collection(&asset.id)?;
127124

128125
let from = <ConverterOf<T>>::convert_location(from).ok_or(XcmExecutorError::AccountIdConversionFailed)?;
129126
let to = <ConverterOf<T>>::convert_location(to).ok_or(XcmExecutorError::AccountIdConversionFailed)?;
130127

131-
let token_id = Self::asset_instance_to_token_id(class_id, is_foreign_asset, &asset_instance)
128+
let token = Self::asset_instance_to_token(class_locality, &asset_instance)
132129
.ok_or(XcmExecutorError::InstanceConversionFailed)?;
133130

134-
<ModuleNftPallet<T>>::do_transfer(&from, &to, (class_id, token_id))
131+
<ModuleNftPallet<T>>::do_transfer(&from, &to, token)
135132
.map(|_| asset.clone().into())
136133
.map_err(|_| XcmError::FailedToTransactAsset("non-fungible item internal transfer failed"))
137134
}

modules/xnft/src/xcm_helpers.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,20 @@ use primitives::nft::Attributes;
2222
use xcm::v3::AssetId::Concrete;
2323
use xcm_executor::traits::Error as MatchError;
2424

25+
pub enum ClassLocality<T: Config> {
26+
Local(ClassIdOf<T>),
27+
Foreign(ClassIdOf<T>),
28+
}
29+
2530
impl<T: Config> Pallet<T>
2631
where
2732
TokenIdOf<T>: TryFrom<u128>,
2833
ClassIdOf<T>: TryFrom<u128>,
2934
{
30-
pub fn asset_to_collection(asset: &AssetId) -> Result<(ClassIdOf<T>, bool), MatchError> {
35+
pub fn asset_to_collection(asset: &AssetId) -> Result<ClassLocality<T>, MatchError> {
3136
Self::foreign_asset_to_class(asset)
32-
.map(|a| (a, true))
33-
.or_else(|| Self::local_asset_to_class(asset).map(|a| (a, false)))
37+
.map(ClassLocality::Foreign)
38+
.or_else(|| Self::local_asset_to_class(asset).map(ClassLocality::Local))
3439
.ok_or(MatchError::AssetIdConversionFailed)
3540
}
3641

@@ -88,14 +93,17 @@ where
8893
.map_err(|_| XcmError::FailedToTransactAsset("non-fungible local item deposit failed"))
8994
}
9095

91-
pub fn asset_instance_to_token_id(
92-
class_id: ClassIdOf<T>,
93-
is_foreign_asset: bool,
96+
pub fn asset_instance_to_token(
97+
class_locality: ClassLocality<T>,
9498
asset_instance: &AssetInstance,
95-
) -> Option<TokenIdOf<T>> {
96-
match is_foreign_asset {
97-
true => Self::asset_instance_to_item(class_id, asset_instance),
98-
false => Self::convert_asset_instance(asset_instance).ok(),
99+
) -> Option<(ClassIdOf<T>, TokenIdOf<T>)> {
100+
match class_locality {
101+
ClassLocality::Foreign(class_id) => {
102+
Self::asset_instance_to_item(class_id, asset_instance).map(|token_id| (class_id, token_id))
103+
}
104+
ClassLocality::Local(class_id) => Self::convert_asset_instance(asset_instance)
105+
.map(|token_id| (class_id, token_id))
106+
.ok(),
99107
}
100108
}
101109

0 commit comments

Comments
 (0)