tycho_executor/phase/
credit.rs1use anyhow::Result;
2use tycho_types::models::CreditPhase;
3
4use crate::ExecutorState;
5use crate::phase::receive::ReceivedMessage;
6
7impl ExecutorState<'_> {
8 pub fn credit_phase(&mut self, received: &ReceivedMessage) -> Result<CreditPhase> {
24 self.balance.try_add_assign(&received.balance_remaining)?;
26
27 Ok(CreditPhase {
28 due_fees_collected: None,
32 credit: received.balance_remaining.clone(),
33 })
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use tycho_types::cell::Cell;
40 use tycho_types::models::CurrencyCollection;
41 use tycho_types::num::Tokens;
42
43 use super::*;
44 use crate::tests::{make_default_config, make_default_params};
45
46 #[test]
47 fn credit_phase_works() {
48 let params = make_default_params();
49 let config = make_default_config();
50
51 let mut state = ExecutorState::new_uninit(
52 ¶ms,
53 &config,
54 &Default::default(),
55 Tokens::new(1_000_000_000),
56 );
57 let prev_balance = state.balance.clone();
58 let prev_total_fees = state.total_fees;
59
60 let msg_balance = CurrencyCollection::from(Tokens::new(123_000_000_000));
61 let credit_phase = state
62 .credit_phase(&ReceivedMessage {
63 root: Cell::default(),
64 init: None,
65 body: Default::default(),
66 is_external: false,
67 bounce_enabled: false,
68 balance_remaining: msg_balance.clone(),
69 })
70 .unwrap();
71
72 assert!(credit_phase.due_fees_collected.is_none());
74 assert_eq!(credit_phase.credit, msg_balance);
76 assert_eq!(
78 state.balance,
79 prev_balance.checked_add(&msg_balance).unwrap()
80 );
81 assert_eq!(state.total_fees, prev_total_fees);
83 }
84}