---
# System prepended metadata

title: Untitled

---

而我们想要的版本，是能从最早的时间从污染源头开始扩散。

一开始 有 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的归集地址），这些地址虽然被污染， 但我们不可能回退掉了。 

  
  






