Skip to content

Commit 6fcd76a

Browse files
committed
refactor
1 parent 4e3bad2 commit 6fcd76a

File tree

4 files changed

+128
-170
lines changed

4 files changed

+128
-170
lines changed

shared/src/gas.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ pub struct GasEstimation {
1313
pub transparent_transfer: u64,
1414
pub shielded_transfer: u64,
1515
pub shielding_transfer: u64,
16+
pub ibc_unshielding_transfer: u64,
17+
pub ibc_shielding_transfer: u64,
1618
pub unshielding_transfer: u64,
1719
pub ibc_msg_transfer: u64,
20+
pub mixed_transfer: u64,
1821
pub bond: u64,
1922
pub redelegation: u64,
2023
pub unbond: u64,
@@ -34,7 +37,10 @@ impl GasEstimation {
3437
shielded_transfer: 0,
3538
shielding_transfer: 0,
3639
unshielding_transfer: 0,
40+
ibc_shielding_transfer: 0,
41+
ibc_unshielding_transfer: 0,
3742
ibc_msg_transfer: 0,
43+
mixed_transfer: 0,
3844
bond: 0,
3945
redelegation: 0,
4046
unbond: 0,
@@ -63,6 +69,18 @@ impl GasEstimation {
6369
self.unshielding_transfer += 1
6470
}
6571

72+
pub fn increase_mixed_transfer(&mut self) {
73+
self.mixed_transfer += 1
74+
}
75+
76+
pub fn increase_ibc_shielding_transfer(&mut self) {
77+
self.ibc_shielding_transfer += 1
78+
}
79+
80+
pub fn increase_ibc_unshielding_transfer(&mut self) {
81+
self.ibc_unshielding_transfer += 1
82+
}
83+
6684
pub fn increase_ibc_msg_transfer(&mut self) {
6785
self.ibc_msg_transfer += 1
6886
}

shared/src/transaction.rs

Lines changed: 9 additions & 168 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use crate::block_result::{BlockResult, TxEventStatusCode};
2121
use crate::checksums::Checksums;
2222
use crate::id::Id;
2323
use crate::ser::{IbcMessage, TransferData};
24+
use crate::utils::{self, transfer_to_ibc_tx_kind};
2425

2526
// We wrap public key in a struct so we serialize data as object instead of
2627
// string
@@ -70,58 +71,12 @@ impl TransactionKind {
7071
) -> Self {
7172
match tx_kind_name {
7273
"tx_transfer" => {
73-
if let Ok(data) = Transfer::try_from_slice(data) {
74-
let has_shielded_section =
75-
data.shielded_section_hash.is_some();
76-
77-
let (all_sources_are_masp, any_sources_are_masp) = data
78-
.sources
79-
.iter()
80-
.fold((true, false), |(all, any), (acc, _)| {
81-
let is_masp = acc.owner.eq(masp_address);
82-
(all && is_masp, any || is_masp)
83-
});
84-
85-
let (all_targets_are_masp, any_targets_are_masp) = data
86-
.targets
87-
.iter()
88-
.fold((true, false), |(all, any), (acc, _)| {
89-
let is_masp = acc.owner.eq(masp_address);
90-
(all && is_masp, any || is_masp)
91-
});
92-
93-
match (
94-
all_sources_are_masp,
95-
any_sources_are_masp,
96-
all_targets_are_masp,
97-
any_targets_are_masp,
98-
has_shielded_section,
99-
) {
100-
(true, _, true, _, true) => {
101-
TransactionKind::ShieldedTransfer(Some(data.into()))
102-
}
103-
(true, _, _, false, true) => {
104-
TransactionKind::UnshieldingTransfer(Some(
105-
data.into(),
106-
))
107-
}
108-
(false, _, true, _, true) => {
109-
TransactionKind::ShieldingTransfer(Some(
110-
data.into(),
111-
))
112-
}
113-
(false, _, false, _, false) => {
114-
TransactionKind::TransparentTransfer(Some(
115-
data.into(),
116-
))
117-
}
118-
_ => TransactionKind::MixedTransfer(Some(data.into())),
119-
}
74+
if let Ok(transfer) = Transfer::try_from_slice(data) {
75+
utils::transfer_to_tx_kind(transfer, masp_address)
12076
} else {
12177
TransactionKind::Unknown
12278
}
12379
}
124-
12580
"tx_bond" => {
12681
let data = if let Ok(data) = Bond::try_from_slice(data) {
12782
Some(data)
@@ -236,132 +191,18 @@ impl TransactionKind {
236191
}
237192
namada_ibc::IbcMessage::Transfer(transfer) => {
238193
if let Some(data) = transfer.transfer {
239-
let has_shielded_section =
240-
data.shielded_section_hash.is_some();
241-
242-
let (
243-
all_sources_are_masp,
244-
any_sources_are_masp,
245-
) = data.sources.iter().fold(
246-
(true, false),
247-
|(all, any), (acc, _)| {
248-
let is_masp =
249-
acc.owner.eq(masp_address);
250-
(all && is_masp, any || is_masp)
251-
},
252-
);
253-
254-
let (
255-
all_targets_are_masp,
256-
any_targets_are_masp,
257-
) = data.targets.iter().fold(
258-
(true, false),
259-
|(all, any), (acc, _)| {
260-
let is_masp =
261-
acc.owner.eq(masp_address);
262-
(all && is_masp, any || is_masp)
263-
},
264-
);
265-
266-
match (
267-
all_sources_are_masp,
268-
any_sources_are_masp,
269-
all_targets_are_masp,
270-
any_targets_are_masp,
271-
has_shielded_section,
272-
) {
273-
(true, _, _, false, true) => {
274-
TransactionKind::IbcUnshieldingTransfer(
275-
(
276-
Some(IbcMessage(ibc_data)),
277-
data.into(),
278-
),
279-
)
280-
}
281-
(false, _, true, _, true) => {
282-
TransactionKind::IbcShieldingTransfer((
283-
Some(IbcMessage(ibc_data)),
284-
data.into(),
285-
))
286-
}
287-
(false, _, false, _, false) => {
288-
TransactionKind::IbcTrasparentTransfer(
289-
(
290-
Some(IbcMessage(ibc_data)),
291-
data.into(),
292-
),
293-
)
294-
}
295-
_ => TransactionKind::MixedTransfer(Some(
296-
data.into(),
297-
)),
298-
}
194+
utils::transfer_to_tx_kind(data, masp_address)
299195
} else {
300196
TransactionKind::IbcMsgTransfer(None)
301197
}
302198
}
303199
namada_ibc::IbcMessage::NftTransfer(transfer) => {
304200
if let Some(data) = transfer.transfer {
305-
let has_shielded_section =
306-
data.shielded_section_hash.is_some();
307-
308-
let (
309-
all_sources_are_masp,
310-
any_sources_are_masp,
311-
) = data.sources.iter().fold(
312-
(true, false),
313-
|(all, any), (acc, _)| {
314-
let is_masp =
315-
acc.owner.eq(masp_address);
316-
(all && is_masp, any || is_masp)
317-
},
318-
);
319-
320-
let (
321-
all_targets_are_masp,
322-
any_targets_are_masp,
323-
) = data.targets.iter().fold(
324-
(true, false),
325-
|(all, any), (acc, _)| {
326-
let is_masp =
327-
acc.owner.eq(masp_address);
328-
(all && is_masp, any || is_masp)
329-
},
330-
);
331-
332-
match (
333-
all_sources_are_masp,
334-
any_sources_are_masp,
335-
all_targets_are_masp,
336-
any_targets_are_masp,
337-
has_shielded_section,
338-
) {
339-
(true, _, _, false, true) => {
340-
TransactionKind::IbcUnshieldingTransfer(
341-
(
342-
Some(IbcMessage(ibc_data)),
343-
data.into(),
344-
),
345-
)
346-
}
347-
(false, _, true, _, true) => {
348-
TransactionKind::IbcShieldingTransfer((
349-
Some(IbcMessage(ibc_data)),
350-
data.into(),
351-
))
352-
}
353-
(false, _, false, _, false) => {
354-
TransactionKind::IbcTrasparentTransfer(
355-
(
356-
Some(IbcMessage(ibc_data)),
357-
data.into(),
358-
),
359-
)
360-
}
361-
_ => TransactionKind::MixedTransfer(Some(
362-
data.into(),
363-
)),
364-
}
201+
transfer_to_ibc_tx_kind(
202+
data,
203+
masp_address,
204+
ibc_data,
205+
)
365206
} else {
366207
TransactionKind::IbcMsgTransfer(None)
367208
}

shared/src/utils.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
use namada_ibc::IbcMessage;
2+
use namada_sdk::address::Address;
3+
use namada_sdk::token::Transfer;
4+
15
use crate::id::Id;
6+
use crate::ser;
27
use crate::token::Token;
8+
use crate::transaction::TransactionKind;
39

410
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
511
pub struct BalanceChange {
@@ -25,3 +31,93 @@ pub struct DelegationPair {
2531
pub validator_address: Id,
2632
pub delegator_address: Id,
2733
}
34+
35+
pub fn transfer_to_tx_kind(
36+
data: Transfer,
37+
masp_address: &Address,
38+
) -> TransactionKind {
39+
let has_shielded_section = data.shielded_section_hash.is_some();
40+
41+
let (all_sources_are_masp, any_sources_are_masp) = data
42+
.sources
43+
.iter()
44+
.fold((true, false), |(all, any), (acc, _)| {
45+
let is_masp = acc.owner.eq(masp_address);
46+
(all && is_masp, any || is_masp)
47+
});
48+
49+
let (all_targets_are_masp, any_targets_are_masp) = data
50+
.targets
51+
.iter()
52+
.fold((true, false), |(all, any), (acc, _)| {
53+
let is_masp = acc.owner.eq(masp_address);
54+
(all && is_masp, any || is_masp)
55+
});
56+
57+
match (
58+
all_sources_are_masp,
59+
any_sources_are_masp,
60+
all_targets_are_masp,
61+
any_targets_are_masp,
62+
has_shielded_section,
63+
) {
64+
(true, _, true, _, true) => {
65+
TransactionKind::ShieldedTransfer(Some(data.into()))
66+
}
67+
(true, _, _, false, true) => {
68+
TransactionKind::UnshieldingTransfer(Some(data.into()))
69+
}
70+
(false, _, true, _, true) => {
71+
TransactionKind::ShieldingTransfer(Some(data.into()))
72+
}
73+
(false, _, false, _, false) => {
74+
TransactionKind::TransparentTransfer(Some(data.into()))
75+
}
76+
_ => TransactionKind::MixedTransfer(Some(data.into())),
77+
}
78+
}
79+
80+
pub fn transfer_to_ibc_tx_kind(
81+
data: Transfer,
82+
masp_address: &Address,
83+
ibc_data: IbcMessage<Transfer>,
84+
) -> TransactionKind {
85+
let has_shielded_section = data.shielded_section_hash.is_some();
86+
87+
let (all_sources_are_masp, any_sources_are_masp) = data
88+
.sources
89+
.iter()
90+
.fold((true, false), |(all, any), (acc, _)| {
91+
let is_masp = acc.owner.eq(masp_address);
92+
(all && is_masp, any || is_masp)
93+
});
94+
95+
let (all_targets_are_masp, any_targets_are_masp) = data
96+
.targets
97+
.iter()
98+
.fold((true, false), |(all, any), (acc, _)| {
99+
let is_masp = acc.owner.eq(masp_address);
100+
(all && is_masp, any || is_masp)
101+
});
102+
103+
match (
104+
all_sources_are_masp,
105+
any_sources_are_masp,
106+
all_targets_are_masp,
107+
any_targets_are_masp,
108+
has_shielded_section,
109+
) {
110+
(true, _, _, false, true) => TransactionKind::IbcUnshieldingTransfer((
111+
Some(ser::IbcMessage(ibc_data)),
112+
data.into(),
113+
)),
114+
(false, _, true, _, true) => TransactionKind::IbcShieldingTransfer((
115+
Some(ser::IbcMessage(ibc_data)),
116+
data.into(),
117+
)),
118+
(false, _, false, _, false) => TransactionKind::IbcTrasparentTransfer(
119+
(Some(ser::IbcMessage(ibc_data)), data.into()),
120+
),
121+
_ => TransactionKind::MixedTransfer(Some(data.into())),
122+
}
123+
}

transactions/src/services/tx.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ pub fn get_gas_estimates(
135135
.for_each(|tx| match tx.kind {
136136
TransactionKind::TransparentTransfer(_)
137137
| TransactionKind::MixedTransfer(_) => {
138-
gas_estimate.increase_transparent_transfer()
138+
gas_estimate.increase_mixed_transfer()
139139
}
140140
TransactionKind::IbcMsgTransfer(_) => {
141141
gas_estimate.increase_ibc_msg_transfer()
@@ -166,7 +166,10 @@ pub fn get_gas_estimates(
166166
gas_estimate.increase_shielding_transfer()
167167
}
168168
TransactionKind::UnshieldingTransfer(_) => {
169-
gas_estimate.increase_unshielding_transfer()
169+
gas_estimate.increase_ibc_unshielding_transfer()
170+
}
171+
TransactionKind::IbcShieldingTransfer(_) => {
172+
gas_estimate.increase_ibc_shielding_transfer()
170173
}
171174
_ => (),
172175
});

0 commit comments

Comments
 (0)