12 个版本 (1 个稳定版本)
1.0.0 | 2024年8月1日 |
---|---|
0.13.0 | 2024年6月26日 |
0.12.0 | 2024年6月3日 |
0.8.0 | 2024年3月18日 |
0.0.0 |
|
#4 在 #parachain 中
每月下载量 387
230KB
6K SLoC
xtokens 模块
概述
xtokens
模块通过跨共识消息(XCM)提供跨链代币转账功能。
xtokens
模块提供了以下功能:
- 从 parachain 转账到中继链的代币。
- parachain 之间的代币转账,包括中继链代币(如 DOT、KSM)和 parachain 代币(如 ACA、aUSD、USDT)。
注意
集成测试
在将 xtokens
集成到运行时后,可以进行手动集成测试。为了覆盖所有功能,至少需要设置 4 个中继链验证者和 3 个不同 parachain 的收集者,并使用可调度调用包括所有这些场景。
- 将中继链代币转账到中继链。
- 将 parachain A 发行的代币从 parachain A 转账到 parachain B。
- 从 parachain A 发送交易。
- 设置目标为 Parachain B。
- 设置货币 ID 为 parachain A 代币。
- 将 parachain B 发行的代币从 parachain A 转账到 parachain B。
- 从 parachain A 发送交易。
- 设置目标为 Parachain B。
- 设置货币 ID 为 parachain B 代币。
- 将 parachain C 发行的代币从 parachain A 转账到 parachain B。
- 从 parachain A 发送交易。
- 设置目标为 Parachain B。
- 设置货币 ID 为 parachain C 代币。
转账多种货币
- 将中继链代币转账到中继链,并使用中继链代币作为费用。
- 将中继链代币转账到 parachain,并使用中继链代币作为费用。
- 将 parachain A 发行的代币从 parachain A 转账到 parachain B,并使用 parachain A 代币作为费用。
- 将 parachain B 发行的代币从 parachain A 转账到 parachain B,并使用 parachain B 代币作为费用。
- 将 parachain C 发行的代币从 parachain A 转账到 parachain B,并使用 parachain C 代币作为费用。
- 将 parachain B 发行的代币从 parachain A 转账到 parachain B,并使用中继链代币作为费用。
注意,在A parachain向B parachain转账B parachain代币并使用中继链代币作为手续费的情况下。因为手续费资产是中继链代币,而非手续费资产是B parachain代币,这是两个不同的链。我们称手续费资产的链为fee_reserve
,非手续费资产的链为non_fee_reserve
。在这种情况下,fee_reserve
的位置也指的是目标parachain。
当前实现从发送方parachain发送两个XCM。第一个XCM发送到手续费储备链,该链会将XCM消息路由到目标parachain。第二个XCM直接发送到目标parachain。
手续费资产中的手续费金额分为两部分
- 发送到手续费储备链的手续费资产 = 手续费金额 - 最小XCM手续费
- 发送到目标储备链的手续费资产 = 最小XCM手续费
parachain应在xtokens
模块配置中实现MinXcmFee
配置
parameter_type_with_key! {
pub MinXcmReserveFee: |location: Location| -> Option<u128> {
#[allow(clippy::match_ref_pats)] // false positive
match (location.parents, location.first_interior()) {
(1, Some(Parachain(parachains::statemine::ID))) => Some(4_000_000_000),
_ => None,
}
};
}
如果parachain不希望出现这种情况,可以简单地返回None。在xcm-support
中提供了由DisabledParachainFee
提供的默认实现。
parameter_type_with_key! {
pub ParachainMinFee: |_location: Location| -> Option<u128> {
None
};
}
注意,当前的实现也依赖于已在xtokens
配置中的SelfLocation
。可以将SelfLocation
设置为绝对视图(1, Parachain(THIS_PARACHAIN_ID))
,它指向发送方parachain。另一种选择是将SelfLocation
设置为相对视图(0, Here)
,以遵守Polkadot指南。
我们使用SelfLocation
为发送方在目标parachain的主权账户上提供资金,该资产源自发送方在发送方parachain的账户。这意味着如果用户设置的手续费过多,手续费将不会退还给用户,而是存入目标parachain的兄弟parachain主权账户。
依赖项
~22–36MB
~627K SLoC