新增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 产生, 执行和执行结果。 需要相应的统计服务来通知和报警了。