Skip to main content

drive/state_transition_action/shielded/shield_from_identity/
mod.rs

1/// transformer
2pub mod transformer;
3/// v0
4pub mod v0;
5
6use crate::state_transition_action::shielded::shield_from_identity::v0::ShieldFromIdentityTransitionActionV0;
7use crate::state_transition_action::shielded::ShieldedActionNote;
8use derive_more::From;
9use dpp::fee::Credits;
10use dpp::platform_value::Identifier;
11use dpp::prelude::{IdentityNonce, UserFeeIncrease};
12
13/// Shield from identity transition action
14#[derive(Debug, Clone, From)]
15pub enum ShieldFromIdentityTransitionAction {
16    /// v0
17    V0(ShieldFromIdentityTransitionActionV0),
18}
19
20impl ShieldFromIdentityTransitionAction {
21    /// The identity whose balance funds the shield
22    pub fn identity_id(&self) -> Identifier {
23        match self {
24            ShieldFromIdentityTransitionAction::V0(transition) => transition.identity_id,
25        }
26    }
27    /// The identity nonce
28    pub fn nonce(&self) -> IdentityNonce {
29        match self {
30            ShieldFromIdentityTransitionAction::V0(transition) => transition.nonce,
31        }
32    }
33    /// Get the shield amount
34    pub fn shield_amount(&self) -> Credits {
35        match self {
36            ShieldFromIdentityTransitionAction::V0(transition) => transition.shield_amount,
37        }
38    }
39    /// Get notes
40    pub fn notes(&self) -> &[ShieldedActionNote] {
41        match self {
42            ShieldFromIdentityTransitionAction::V0(transition) => &transition.notes,
43        }
44    }
45    /// fee multiplier
46    pub fn user_fee_increase(&self) -> UserFeeIncrease {
47        match self {
48            ShieldFromIdentityTransitionAction::V0(transition) => transition.user_fee_increase,
49        }
50    }
51    /// The pool total balance read at transform time
52    pub fn current_total_balance(&self) -> Credits {
53        match self {
54            ShieldFromIdentityTransitionAction::V0(transition) => transition.current_total_balance,
55        }
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    fn make_note() -> ShieldedActionNote {
64        ShieldedActionNote {
65            nullifier: [0x11; 32],
66            cmx: [0x22; 32],
67            cv_net: [0x33; 32],
68            encrypted_note: vec![0xAB, 0xCD, 0xEF],
69        }
70    }
71
72    fn make_action() -> ShieldFromIdentityTransitionAction {
73        ShieldFromIdentityTransitionAction::from(ShieldFromIdentityTransitionActionV0 {
74            identity_id: Identifier::from([0xAA; 32]),
75            nonce: 3,
76            shield_amount: 5000,
77            notes: vec![make_note(), make_note()],
78            user_fee_increase: 2,
79            current_total_balance: 50000,
80        })
81    }
82
83    #[test]
84    fn test_accessors() {
85        let action = make_action();
86        assert!(matches!(action, ShieldFromIdentityTransitionAction::V0(_)));
87        assert_eq!(action.identity_id(), Identifier::from([0xAA; 32]));
88        assert_eq!(action.nonce(), 3);
89        assert_eq!(action.shield_amount(), 5000);
90        assert_eq!(action.notes().len(), 2);
91        assert_eq!(action.notes()[0].cmx, [0x22; 32]);
92        assert_eq!(action.user_fee_increase(), 2);
93        assert_eq!(action.current_total_balance(), 50000);
94    }
95}