而我们想要的版本,是能从最早的时间从污染源头开始扩散。
一开始 有 Bite(B, C)的事件。 B 是from, 如果B不是感染源的话, 这条可以略过。
然后A 成为感染源, Bite (A->B), 这时B才会被感染, C只有在后面被其他感染源 Bite to 的时候,才会被感染
## 实际实现
### 特殊地址
先确定一些特殊地址, 特殊地址在下面的判断中起到不同的作用:
`DEX module account` : `23M5ttkmR6KcnxentoqchgBdUjzMDSzFoUyf5qMs7FsmRMvV
`
`stable asset pool` : `23M5ttkp2zdM8qa6LFak4BySWZDsAVByjepAfr7kt929S1U9`
`fee moudle account` : `23M5ttkmR6Kco2CnDJKTSdBmBnYpbezUpTMeBsewEsjdui9F`
`免疫地址`(这些特殊的地址属于不会感染的人,不可能成为point, 被僵尸咬就无事发生):
和
+ 在block#1639493 之前(不包含), 是除去 dex module account 和 stable asset pool之后的其他系统模块地址
+ 在block#1639493 之后(含), 是除去 dex module account 外的 所有 系统模块地址
`CEX归集地址` : (这些地址被传染后, 再去咬人不会传染人(插入point和direct), 再去咬僵尸也不会有咬的记录(direct)):
### 流程
从最早的区块#1638216开始取event, 按最早-》最近开始遍历
### 特殊行为
1.感染源出现
```
/// Claim rewards.
incentives.ClaimRewards {
who: T::AccountId,
pool: PoolId,
reward_currency_id: CurrencyId,
actual_amount: Balance,
deduction_amount: Balance,
}
```
如果 pool 是 aUSD-iBTC池子, reward_currency_id 是 aUSD, actual_amount > 大于 0!, 且 who 的 point 还不存在, 则 插入 who point, point 的数据域写入特殊标记 origin, 写入 感染的当前区块 (每个point 出现时都要写入 height)
2.1. 咬人
```
balances.Transfer {
from: T::AccountId,
to: T::AccountId,
amount: T::Balance
},
/// 或者, 两者都只是要 from, to
Transfer {
currency_id: T::CurrencyId,
from: T::AccountId,
to: T::AccountId,
amount: T::Balance,
},
```
咬人行为出现, 先判断 from 是不是僵尸 (有没有point)?
1. 如果 from point 虽然存在, 但 from 是在 CEX 归集地址 或者 安全地址中 (原本安全地址不有point的, 但stable asset pool 会成为point, 之后才免疫,所以依然会存在),也和2一样就跳过了。 再判断 to point 存不存在?
i. 存在, 如果没有 from potin -> to point 的direct, 就加一条
ii. 不存在,判断 to 如果不在 免疫地址中, to 感染, 插入 point 和 direct, 数据域里记录感染高度,
如果 to 是 CEX 归集地址, 额外在 数据域里标记一个 CEX
2. 没有的话 略过
2.2 咬人 特殊
```
cdpEngine.CloseCDPInDebitByDEX {
collateral_type: CurrencyId,
owner: T::AccountId,
sold_collateral_amount: Balance,
refund_collateral_amount: Balance,
debit_value: Balance,
},
```
视为特殊的transfer, from 是 dex module, to 是 owner, 如果transfer 如果产生direct, direct 的数据域可以特殊标志一下
2.3
```
dex.AddLiquidity {
who: T::AccountId,
currency_0: CurrencyId,
pool_0: Balance,
currency_1: CurrencyId,
pool_1: Balance,
share_increment: Balance,
},
```
添加流动性,who会 transfer tokens to Dex module, 获得 Lp token, 但 Lp token 是 deposit 给 who 的, 需要视为特殊的 transfer,
from 是 dex module, to 是 who
### 补充行为:
1. 最后 point 里会有 cex, stable asset pool, cex 统一标记 cex, stable asset pool 也标记一下,
2. 图里存在的所有point, 最后再排除掉, cex point , 且和 cex 1层相连的 point (cex的归集地址),这些地址虽然被污染, 但我们不可能回退掉了。