---
# System prepended metadata

title: Untitled

---

新增pallet xtokens-threshold作为 vault ， 实现delay的规则的判断和相关统计， 和类似auction模块那样的scheduler


## xtokens
xtokens新增钩子挂上 xtokens-threshold， 在用户外部调用 transfer 时， 执行内部实现的transfer函数之前， 通过钩子查询xtokens-threshold 给出是否delay的结果， 如果无需delay， 接着执行transfer函数

如果没有触达上限， 继续原本的流程， 成功执行的话通过钩子计入xtokens-threshold中的累积量

如果触达上限 ，通过钩子将后面的执行交给 xtokens-threshold 。 xtokens-threshold  会将sender 的 multiassets 转入 vault， 将跨链转账的参数和delay执行的block高度计入 waitlist 存储， xtokens-threshold 在每个区块开始阶段会执行 waitlist 到期的转账， 发送方作为vault，其余沿用原本的转账参数。
成功执行，转出就算完成。 执行失败， 将资产计入 xtokens-threshold 的 FailedTransferAssets 存储， 用户可以自行claim取出。 

其他系统模块在内部调用xtokens时， 会直接调用xtokens.transfer的内部函数， 并不会走上面的流程。
如果不集成 xtokens-threshold ， 会默认给 () 实现钩子， 保证 transfer/transfer_multiasset...这些call的执行流程和原来一致。 


```
// xtokens, call transfer/transfer_multiasset...
call transfer(who, other_params) {
	if hooks::is_delay() {
		hooks::delay_transfer(who, other_params)
	} else {
		xtokens.transfer(who, other_params)
		hooks::accumulate(other_params)
	}
}
```

## xtokens-threshold

1. 有白名单的配置，由白名单账户发起外部调用的跨链转账is_delay始终返回为false
2. 特殊权限可以配置白名单， 配置限额规则和参数， 可以 fast_track ， delay_extra， cancel waitlist 中的delayed_transfer
3. delay规则
	+ A. 对dest chain 配置限额（一些dest chain可能有多种token， 是加上key2 currency id给每种token都配置上限额数量， 还是针对一条dest chain配置限额价值？ 但后者取资产价值需要预言机做支持， 取不到价格的资产就按0计算， 相当于有配置也不会触发delay）
	+ B. 对 assets 配置限额， 不管是什么dest chain 了，全局针对某一种 currency_id 做数量的限额 
	+ A和B的规则配置定义类似于： 或者delay_block 为全局配置， 每项具体规则触发的delay
	 
	```
	struct{  
		period_cap_limit: Option<Balance>,
		larget_limit: Option<Balance>,
		delay_block: Block,
		cumulative_in_period: Balance,cumulative_in_period
	}
	```
4. xtokens-threshold 配置 PeriodBlock ，每个period 开始会重置规则里的 cumulative_in_period 为 0

5. waitlist里的item， 在到达执行高度时执行， 执行成功后， 不会将transfer 的数量 accumulate 到 规则配置 里的 cumulative_in_period. 执行不成功， 计入到 FailedTransferAssets, 用户可以claim取回。

6. 在判断is_delay时，传入的转账资产multiassets 可能会有多项 asset， 判断会将每一项asset都进行判断， 某项asset触发某个规则的delay， 整笔都会delay， 且delay按所触发规则里block 最大的去delay（不进行拆分的考量是拆分会让部分asset直接transfer， 部分走delay transfer， xtokens里会有更复杂的修改， 跨链fee的处理也不好进行， 且跨链转账不具备原子性, 建议整笔判断）。 

7. accumulate 用于记录直接transfer的量， 传入参数中有multiassets和dest， 如果 delay规则配置存在， 则将fungible amount 累加到对应项规则的 cumulative_in_period.



## 其他
1. delay规则， 是A, B选择一种， 还是两者皆要？
2. apps，polkawallet等前端肯定有大的修改了， 然后subscan对跨链转账的交易的展示，也会收影响。 直接transfer了的没问题， 走delay transfer 的就断了追踪了。 等waitlist触发时， transfer  的sender也变成了vault。 由于currencies对ERC20也做了reserve/unreserve的实现， 这里理论上可以改成 reserve/unreserve 的实现， 而不是 transfer tokens 给vault。 这里选用哪种呢？ 后者至少在显示，还有subscan上的展示上会好一些。
3. xtokens-threshold 里会有Events覆盖 delay_transfer 产生， 执行和执行结果。 需要相应的统计服务来通知和报警了。