Skip to content

Commit 6af4d19

Browse files
authored
Merge pull request #441 from namada-net/tiago/fix-ibc-sent-packet-acks
fix ibc sent packet inner tx id hash parsing
2 parents d2e29fb + b93d88f commit 6af4d19

File tree

7 files changed

+266
-44
lines changed

7 files changed

+266
-44
lines changed

justfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ fmt-check:
2424
taplo:
2525
taplo fmt
2626

27-
test:
28-
cargo +{{ RUST_STABLE }} test
27+
test *ADDITIONAL_ARGS:
28+
cargo +{{ RUST_STABLE }} test {{ ADDITIONAL_ARGS }}
2929

3030
clippy:
3131
cargo +{{ RUST_STABLE }} clippy

orm/src/transactions.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ impl From<TransactionKind> for TransactionKindDb {
5555
TransactionKind::ShieldingTransfer(_) => Self::ShieldingTransfer,
5656
TransactionKind::MixedTransfer(_) => Self::MixedTransfer,
5757
TransactionKind::IbcMsg(_) => Self::IbcMsgTransfer,
58-
TransactionKind::IbcTrasparentTransfer(_) => {
58+
TransactionKind::IbcSendTrasparentTransfer(_)
59+
| TransactionKind::IbcRecvTrasparentTransfer(_) => {
5960
Self::IbcTransparentTransfer
6061
}
6162
TransactionKind::IbcShieldingTransfer(_) => {

shared/src/block.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ impl Block {
211211
vec![]
212212
}
213213
}
214-
TransactionKind::IbcTrasparentTransfer((_, transfer))
214+
TransactionKind::IbcSendTrasparentTransfer((_, transfer))
215+
| TransactionKind::IbcRecvTrasparentTransfer((_, transfer))
215216
| TransactionKind::IbcShieldingTransfer((_, transfer))
216217
| TransactionKind::IbcUnshieldingTransfer((_, transfer)) => {
217218
let sources = transfer
@@ -678,7 +679,11 @@ impl Block {
678679
})
679680
.iter()
680681
.filter_map(|tx| match &tx.kind {
681-
TransactionKind::IbcTrasparentTransfer((
682+
TransactionKind::IbcSendTrasparentTransfer((
683+
Token::Ibc(ibc_token),
684+
_,
685+
))
686+
| TransactionKind::IbcRecvTrasparentTransfer((
682687
Token::Ibc(ibc_token),
683688
_,
684689
))
@@ -830,7 +835,8 @@ impl Block {
830835
})
831836
.collect()
832837
}
833-
TransactionKind::IbcTrasparentTransfer((token, data)) => {
838+
TransactionKind::IbcSendTrasparentTransfer((token, data))
839+
| TransactionKind::IbcRecvTrasparentTransfer((token, data)) => {
834840
[&data.sources, &data.targets]
835841
.iter()
836842
.flat_map(|transfer_changes| {

shared/src/block_result.rs

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::str::FromStr;
66
use bigdecimal::BigDecimal;
77
use namada_core::masp::MaspTxId;
88
use namada_core::token::Amount as NamadaAmount;
9-
use namada_events::extend::ReadFromEventAttributes;
9+
use namada_events::extend::{InnerTxHash, ReadFromEventAttributes};
1010
use namada_ibc::IbcTxDataHash;
1111
use namada_ibc::apps::transfer::types::packet::PacketData as Ics20PacketData;
1212
use namada_tx::IndexedTx;
@@ -60,6 +60,7 @@ pub struct BlockResult {
6060
#[derive(Debug, Clone)]
6161
pub struct Event {
6262
pub kind: EventKind,
63+
pub inner_tx_hash: Option<Id>,
6364
pub attributes: Option<TxAttributesType>,
6465
}
6566

@@ -197,6 +198,34 @@ pub struct IbcPacket {
197198
pub data: String,
198199
}
199200

201+
impl IbcPacket {
202+
pub fn as_fungible_token_packet(&self) -> Option<FungibleTokenPacket> {
203+
let packet_data: Ics20PacketData =
204+
serde_json::from_str(&self.data).ok()?;
205+
let ibc_amount: NamadaAmount =
206+
packet_data.token.amount.try_into().ok()?;
207+
208+
Some(FungibleTokenPacket {
209+
memo: packet_data.memo.to_string(),
210+
sender: packet_data.sender.to_string(),
211+
receiver: packet_data.receiver.to_string(),
212+
denom: packet_data.token.denom.to_string(),
213+
amount: Amount::from(ibc_amount).into(),
214+
})
215+
}
216+
217+
pub fn id(&self) -> String {
218+
format!(
219+
"{}/{}/{}/{}/{}",
220+
self.dest_port,
221+
self.dest_channel,
222+
self.source_port,
223+
self.source_channel,
224+
self.sequence
225+
)
226+
}
227+
}
228+
200229
#[derive(Debug, Clone, Default)]
201230
pub struct FungibleTokenPacket {
202231
pub sender: String,
@@ -393,20 +422,11 @@ impl TxAttributesType {
393422
_ => return None,
394423
};
395424

396-
let packet_data: Ics20PacketData =
397-
serde_json::from_str(&packet.data).ok()?;
398-
let ibc_amount: NamadaAmount =
399-
packet_data.token.amount.try_into().ok()?;
400-
401-
let ics20_packet = FungibleTokenPacket {
402-
memo: packet_data.memo.to_string(),
403-
sender: packet_data.sender.to_string(),
404-
receiver: packet_data.receiver.to_string(),
405-
denom: packet_data.token.denom.to_string(),
406-
amount: Amount::from(ibc_amount).into(),
407-
};
408-
409-
Some((action, Some(packet), Cow::Owned(ics20_packet)))
425+
Some((
426+
action,
427+
Some(packet),
428+
Cow::Owned(packet.as_fungible_token_packet()?),
429+
))
410430
}
411431
}
412432

@@ -430,7 +450,12 @@ impl From<TendermintBlockResultResponse> for BlockResult {
430450
);
431451
let attributes =
432452
TxAttributesType::deserialize(&kind, &raw_attributes);
433-
Event { kind, attributes }
453+
let inner_tx_hash = try_parse_inner_tx_hash(&raw_attributes);
454+
Event {
455+
kind,
456+
attributes,
457+
inner_tx_hash,
458+
}
434459
})
435460
.collect::<Vec<Event>>();
436461
let end_events = value
@@ -451,7 +476,12 @@ impl From<TendermintBlockResultResponse> for BlockResult {
451476
);
452477
let attributes =
453478
TxAttributesType::deserialize(&kind, &raw_attributes);
454-
Event { kind, attributes }
479+
let inner_tx_hash = try_parse_inner_tx_hash(&raw_attributes);
480+
Event {
481+
kind,
482+
attributes,
483+
inner_tx_hash,
484+
}
455485
})
456486
.collect::<Vec<Event>>();
457487
Self {
@@ -561,6 +591,14 @@ impl BlockResult {
561591
}
562592
}
563593

594+
fn try_parse_inner_tx_hash(
595+
raw_attributes: &BTreeMap<String, String>,
596+
) -> Option<Id> {
597+
InnerTxHash::read_opt_from_event_attributes(raw_attributes)
598+
.expect("parsing the inner tx hash shouldn't fail")
599+
.map(|hash| Id::Hash(hash.to_string().to_lowercase()))
600+
}
601+
564602
#[cfg(test)]
565603
mod tests {
566604
use super::*;
@@ -594,6 +632,7 @@ mod tests {
594632

595633
Some(Event {
596634
kind,
635+
inner_tx_hash: None,
597636
attributes: parsed_attributes,
598637
})
599638
})
@@ -604,6 +643,7 @@ mod tests {
604643
events.remove(0),
605644
Event {
606645
kind: EventKind::FungibleTokenPacket,
646+
inner_tx_hash: None,
607647
attributes: Some(
608648
TxAttributesType::FungibleTokenPacket {
609649
is_ack: true,

shared/src/transaction.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ pub enum TransactionKind {
7777
MixedTransfer(Option<TransferData>),
7878
/// Generic, non-transfer, IBC messages
7979
IbcMsg(Option<IbcMessage<Transfer>>),
80-
IbcTrasparentTransfer((crate::token::Token, TransferData)),
80+
IbcRecvTrasparentTransfer((crate::token::Token, TransferData)),
81+
IbcSendTrasparentTransfer((crate::token::Token, TransferData)),
8182
IbcShieldingTransfer((crate::token::Token, TransferData)),
8283
IbcUnshieldingTransfer((crate::token::Token, TransferData)),
8384
Bond(Option<Bond>),
@@ -376,18 +377,27 @@ impl InnerTransaction {
376377
&& (wrapper_tx_succeeded || masp_fee_payment || !atomic_batch)
377378
}
378379

380+
pub fn is_sent_ibc(&self) -> bool {
381+
matches!(
382+
self.kind,
383+
TransactionKind::IbcSendTrasparentTransfer(_)
384+
| TransactionKind::IbcUnshieldingTransfer(_)
385+
)
386+
}
387+
379388
pub fn is_ibc(&self) -> bool {
380389
matches!(
381390
self.kind,
382391
TransactionKind::IbcMsg(_)
383-
| TransactionKind::IbcTrasparentTransfer(_)
392+
| TransactionKind::IbcRecvTrasparentTransfer(_)
393+
| TransactionKind::IbcSendTrasparentTransfer(_)
384394
| TransactionKind::IbcUnshieldingTransfer(_)
385395
| TransactionKind::IbcShieldingTransfer(_)
386396
)
387397
}
388398
}
389399

390-
#[derive(Debug, Clone)]
400+
#[derive(Debug, Clone, Default)]
391401
pub struct Fee {
392402
pub gas: String,
393403
pub gas_used: Option<u64>,
@@ -649,7 +659,7 @@ fn extract_masp_transaction(
649659
}
650660
}
651661

652-
#[derive(Debug, Clone)]
662+
#[derive(Debug, Clone, Eq, PartialEq)]
653663
pub struct IbcSequence {
654664
pub sequence_number: String,
655665
pub source_port: String,

shared/src/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ pub fn transfer_to_ibc_tx_kind(
252252
transfer_data,
253253
)))
254254
} else {
255-
Ok(TransactionKind::IbcTrasparentTransfer((
255+
Ok(TransactionKind::IbcRecvTrasparentTransfer((
256256
token_id,
257257
transfer_data,
258258
)))
@@ -311,7 +311,7 @@ pub fn transfer_to_ibc_tx_kind(
311311
transfer_data,
312312
)))
313313
} else {
314-
Ok(TransactionKind::IbcTrasparentTransfer((
314+
Ok(TransactionKind::IbcSendTrasparentTransfer((
315315
token_id,
316316
transfer_data,
317317
)))

0 commit comments

Comments
 (0)