m10_sdk/types/
transaction.rs

1use crate::account::AccountId;
2use crate::error::M10Error;
3use crate::transaction_ext::TransactionExt;
4use crate::{AccountUpdate, Action, Transfer, TxnFilter, DEFAULT_TXN_LIMIT};
5use m10_protos::sdk;
6
7#[derive(Debug, serde::Serialize)]
8pub enum Transaction {
9    Transfer(Transfer),
10    InitiateTransfer(Transfer),
11    CommitTransfer(Transfer),
12    AccountUpdate(AccountUpdate),
13    // TODO @sadroeck - fixme
14    DocumentOperations,
15    Action(Action),
16}
17
18impl Transaction {
19    pub fn context_id(&self) -> Vec<u8> {
20        match self {
21            Self::Transfer(t) | Self::InitiateTransfer(t) | Self::CommitTransfer(t) => {
22                t.context_id.to_vec()
23            }
24            Self::AccountUpdate(a) => a.context_id.to_vec(),
25            Self::DocumentOperations => vec![],
26            Self::Action(a) => a.context_id.to_vec(),
27        }
28    }
29
30    pub fn tx_id(&self) -> u64 {
31        match self {
32            Self::Transfer(t) | Self::InitiateTransfer(t) | Self::CommitTransfer(t) => t.tx_id,
33            Self::AccountUpdate(a) => a.tx_id,
34            Self::DocumentOperations => 0,
35            Self::Action(a) => a.tx_id,
36        }
37    }
38}
39
40impl TryFrom<sdk::FinalizedTransaction> for Transaction {
41    type Error = M10Error;
42
43    fn try_from(txn: sdk::FinalizedTransaction) -> Result<Self, Self::Error> {
44        use sdk::transaction_data::Data;
45        let tx = match txn.data().ok_or(M10Error::InvalidTransaction)? {
46            Data::Transfer(_) | Data::InitiateTransfer(_) | Data::CommitTransfer(_) => {
47                Transaction::Transfer(Transfer::try_from(txn)?)
48            }
49            Data::CreateLedgerAccount(_)
50            | Data::SetFreezeState(_)
51            | Data::SetInstrument(_)
52            | Data::SetBalanceLimit(_) => Transaction::AccountUpdate(AccountUpdate::try_from(txn)?),
53            Data::InvokeAction(_) => Transaction::Action(Action::try_from(txn)?),
54            // TODO @sadroeck - fixme
55            Data::DocumentOperations(_) => Transaction::DocumentOperations,
56            Data::CreateToken(_) | Data::RedeemToken(_) => {
57                Transaction::Transfer(Transfer::try_from(txn)?)
58            }
59        };
60        Ok(tx)
61    }
62}
63
64pub struct ContextFilter(pub Vec<u8>);
65
66impl TxnFilter<ContextFilter> {
67    pub fn context_id(id: Vec<u8>) -> Self {
68        Self {
69            filter: ContextFilter(id),
70            min: 0,
71            max: u64::MAX,
72            limit: DEFAULT_TXN_LIMIT,
73        }
74    }
75}
76
77impl From<TxnFilter<ContextFilter>> for sdk::ListTransactionsRequest {
78    fn from(filter: TxnFilter<ContextFilter>) -> Self {
79        sdk::ListTransactionsRequest {
80            context_id: filter.filter.0,
81            min_tx_id: filter.min,
82            max_tx_id: filter.max,
83            limit: filter.limit,
84        }
85    }
86}
87
88pub struct GroupingFilter {
89    account_id: AccountId,
90}
91
92impl GroupingFilter {
93    pub fn account(account_id: AccountId) -> Self {
94        Self { account_id }
95    }
96}
97
98impl From<TxnFilter<GroupingFilter>> for sdk::GroupTransactionsRequest {
99    fn from(filter: TxnFilter<GroupingFilter>) -> Self {
100        sdk::GroupTransactionsRequest {
101            account_id: filter.filter.account_id.to_vec(),
102            min_tx_id: filter.min,
103            max_tx_id: filter.max,
104            limit_groups: filter.limit,
105        }
106    }
107}
108
109impl TxnFilter<GroupingFilter> {
110    pub fn account(account_id: AccountId) -> Self {
111        Self {
112            filter: GroupingFilter { account_id },
113            min: 0,
114            max: u64::MAX,
115            limit: DEFAULT_TXN_LIMIT,
116        }
117    }
118}