#token #transfer #parachain #chain #relay #module #xtokens

无 std orml-xtokens

跨链代币转账

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 2022年11月22日

#4#parachain

Download history 2/week @ 2024-05-04 24/week @ 2024-05-11 41/week @ 2024-05-18 107/week @ 2024-05-25 469/week @ 2024-06-01 127/week @ 2024-06-08 188/week @ 2024-06-15 397/week @ 2024-06-22 48/week @ 2024-06-29 149/week @ 2024-07-06 58/week @ 2024-07-13 3/week @ 2024-07-20 247/week @ 2024-07-27 27/week @ 2024-08-03 59/week @ 2024-08-10 54/week @ 2024-08-17

每月下载量 387

Apache-2.0GPL-3.0-only

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。

手续费资产中的手续费金额分为两部分

  1. 发送到手续费储备链的手续费资产 = 手续费金额 - 最小XCM手续费
  2. 发送到目标储备链的手续费资产 = 最小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