m10_sdk/types/
transaction.rs1use 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 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 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}