1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use brontes_macros::action_impl;
use brontes_types::{
    normalized_actions::{NormalizedFlashLoan, NormalizedLiquidation},
    structured_trace::CallInfo,
    utils::ToScaledRational,
    Protocol,
};
use malachite::{num::basic::traits::Zero, Rational};

action_impl!(
    Protocol::AaveV2,
    crate::AaveV2::liquidationCallCall,
    Liquidation,
    [],
    call_data: true,
    |
    info: CallInfo,
    call_data: liquidationCallCall,
    db_tx: &DB| {
        let debt_info = db_tx.try_fetch_token_info(call_data.debtAsset)?;
        let collateral_info = db_tx.try_fetch_token_info(call_data.collateralAsset)?;

        let covered_debt = call_data.debtToCover.to_scaled_rational(debt_info.decimals);

        return Ok(NormalizedLiquidation {
            protocol: Protocol::AaveV2,
            trace_index: info.trace_idx,
            pool: info.from_address,
            liquidator: info.msg_sender,
            debtor: call_data.user,
            collateral_asset: collateral_info,
            debt_asset: debt_info,
            covered_debt,
            // filled in later
            liquidated_collateral: Rational::ZERO,
            msg_value: info.msg_value,
        })
    }
);

action_impl!(
    Protocol::AaveV2,
    crate::AaveV2::flashLoanCall,
    FlashLoan,
    [],
    call_data: true,
    |
    info: CallInfo,
    call_data: flashLoanCall,
    db_tx: &DB| {
        let (amounts, assets): (Vec<_>, Vec<_>) = call_data.assets
            .iter()
            .zip(call_data.amounts.iter())
            .filter_map(|(asset, amount)| {
                let token_info = db_tx.try_fetch_token_info(*asset).ok()?;
                Some((amount.to_scaled_rational(token_info.decimals),token_info))
        }).unzip();

        return Ok(NormalizedFlashLoan {
            protocol: Protocol::AaveV2,
            trace_index: info.trace_idx,
            from: info.msg_sender,
            pool: info.target_address,
            receiver_contract: call_data.receiverAddress,
            assets ,
            amounts,
            aave_mode: Some((call_data.modes, call_data.onBehalfOf)),
            // Set to zero at this stage, will be calculated upon finalized classification
            child_actions: vec![],
            repayments: vec![],
            fees_paid: vec![],
            msg_value: info.msg_value,
        })

    }
);