Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ fmt-check:
taplo:
taplo fmt

test:
cargo +{{ RUST_STABLE }} test
test *ADDITIONAL_ARGS:
cargo +{{ RUST_STABLE }} test {{ ADDITIONAL_ARGS }}

clippy:
cargo +{{ RUST_STABLE }} clippy
Expand Down
3 changes: 2 additions & 1 deletion orm/src/transactions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ impl From<TransactionKind> for TransactionKindDb {
TransactionKind::ShieldingTransfer(_) => Self::ShieldingTransfer,
TransactionKind::MixedTransfer(_) => Self::MixedTransfer,
TransactionKind::IbcMsg(_) => Self::IbcMsgTransfer,
TransactionKind::IbcTrasparentTransfer(_) => {
TransactionKind::IbcSendTrasparentTransfer(_)
| TransactionKind::IbcRecvTrasparentTransfer(_) => {
Self::IbcTransparentTransfer
}
TransactionKind::IbcShieldingTransfer(_) => {
Expand Down
12 changes: 9 additions & 3 deletions shared/src/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,8 @@ impl Block {
vec![]
}
}
TransactionKind::IbcTrasparentTransfer((_, transfer))
TransactionKind::IbcSendTrasparentTransfer((_, transfer))
| TransactionKind::IbcRecvTrasparentTransfer((_, transfer))
| TransactionKind::IbcShieldingTransfer((_, transfer))
| TransactionKind::IbcUnshieldingTransfer((_, transfer)) => {
let sources = transfer
Expand Down Expand Up @@ -678,7 +679,11 @@ impl Block {
})
.iter()
.filter_map(|tx| match &tx.kind {
TransactionKind::IbcTrasparentTransfer((
TransactionKind::IbcSendTrasparentTransfer((
Token::Ibc(ibc_token),
_,
))
| TransactionKind::IbcRecvTrasparentTransfer((
Token::Ibc(ibc_token),
_,
))
Expand Down Expand Up @@ -830,7 +835,8 @@ impl Block {
})
.collect()
}
TransactionKind::IbcTrasparentTransfer((token, data)) => {
TransactionKind::IbcSendTrasparentTransfer((token, data))
| TransactionKind::IbcRecvTrasparentTransfer((token, data)) => {
[&data.sources, &data.targets]
.iter()
.flat_map(|transfer_changes| {
Expand Down
74 changes: 57 additions & 17 deletions shared/src/block_result.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use std::str::FromStr;
use bigdecimal::BigDecimal;
use namada_core::masp::MaspTxId;
use namada_core::token::Amount as NamadaAmount;
use namada_events::extend::ReadFromEventAttributes;
use namada_events::extend::{InnerTxHash, ReadFromEventAttributes};
use namada_ibc::IbcTxDataHash;
use namada_ibc::apps::transfer::types::packet::PacketData as Ics20PacketData;
use namada_tx::IndexedTx;
Expand Down Expand Up @@ -60,6 +60,7 @@ pub struct BlockResult {
#[derive(Debug, Clone)]
pub struct Event {
pub kind: EventKind,
pub inner_tx_hash: Option<Id>,
pub attributes: Option<TxAttributesType>,
}

Expand Down Expand Up @@ -197,6 +198,34 @@ pub struct IbcPacket {
pub data: String,
}

impl IbcPacket {
pub fn as_fungible_token_packet(&self) -> Option<FungibleTokenPacket> {
let packet_data: Ics20PacketData =
serde_json::from_str(&self.data).ok()?;
let ibc_amount: NamadaAmount =
packet_data.token.amount.try_into().ok()?;

Some(FungibleTokenPacket {
memo: packet_data.memo.to_string(),
sender: packet_data.sender.to_string(),
receiver: packet_data.receiver.to_string(),
denom: packet_data.token.denom.to_string(),
amount: Amount::from(ibc_amount).into(),
})
}

pub fn id(&self) -> String {
format!(
"{}/{}/{}/{}/{}",
self.dest_port,
self.dest_channel,
self.source_port,
self.source_channel,
self.sequence
)
}
}

#[derive(Debug, Clone, Default)]
pub struct FungibleTokenPacket {
pub sender: String,
Expand Down Expand Up @@ -393,20 +422,11 @@ impl TxAttributesType {
_ => return None,
};

let packet_data: Ics20PacketData =
serde_json::from_str(&packet.data).ok()?;
let ibc_amount: NamadaAmount =
packet_data.token.amount.try_into().ok()?;

let ics20_packet = FungibleTokenPacket {
memo: packet_data.memo.to_string(),
sender: packet_data.sender.to_string(),
receiver: packet_data.receiver.to_string(),
denom: packet_data.token.denom.to_string(),
amount: Amount::from(ibc_amount).into(),
};

Some((action, Some(packet), Cow::Owned(ics20_packet)))
Some((
action,
Some(packet),
Cow::Owned(packet.as_fungible_token_packet()?),
))
}
}

Expand All @@ -430,7 +450,12 @@ impl From<TendermintBlockResultResponse> for BlockResult {
);
let attributes =
TxAttributesType::deserialize(&kind, &raw_attributes);
Event { kind, attributes }
let inner_tx_hash = try_parse_inner_tx_hash(&raw_attributes);
Event {
kind,
attributes,
inner_tx_hash,
}
})
.collect::<Vec<Event>>();
let end_events = value
Expand All @@ -451,7 +476,12 @@ impl From<TendermintBlockResultResponse> for BlockResult {
);
let attributes =
TxAttributesType::deserialize(&kind, &raw_attributes);
Event { kind, attributes }
let inner_tx_hash = try_parse_inner_tx_hash(&raw_attributes);
Event {
kind,
attributes,
inner_tx_hash,
}
})
.collect::<Vec<Event>>();
Self {
Expand Down Expand Up @@ -561,6 +591,14 @@ impl BlockResult {
}
}

fn try_parse_inner_tx_hash(
raw_attributes: &BTreeMap<String, String>,
) -> Option<Id> {
InnerTxHash::read_opt_from_event_attributes(raw_attributes)
.expect("parsing the inner tx hash shouldn't fail")
.map(|hash| Id::Hash(hash.to_string().to_lowercase()))
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down Expand Up @@ -594,6 +632,7 @@ mod tests {

Some(Event {
kind,
inner_tx_hash: None,
attributes: parsed_attributes,
})
})
Expand All @@ -604,6 +643,7 @@ mod tests {
events.remove(0),
Event {
kind: EventKind::FungibleTokenPacket,
inner_tx_hash: None,
attributes: Some(
TxAttributesType::FungibleTokenPacket {
is_ack: true,
Expand Down
18 changes: 14 additions & 4 deletions shared/src/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ pub enum TransactionKind {
MixedTransfer(Option<TransferData>),
/// Generic, non-transfer, IBC messages
IbcMsg(Option<IbcMessage<Transfer>>),
IbcTrasparentTransfer((crate::token::Token, TransferData)),
IbcRecvTrasparentTransfer((crate::token::Token, TransferData)),
IbcSendTrasparentTransfer((crate::token::Token, TransferData)),
IbcShieldingTransfer((crate::token::Token, TransferData)),
IbcUnshieldingTransfer((crate::token::Token, TransferData)),
Bond(Option<Bond>),
Expand Down Expand Up @@ -376,18 +377,27 @@ impl InnerTransaction {
&& (wrapper_tx_succeeded || masp_fee_payment || !atomic_batch)
}

pub fn is_sent_ibc(&self) -> bool {
matches!(
self.kind,
TransactionKind::IbcSendTrasparentTransfer(_)
| TransactionKind::IbcUnshieldingTransfer(_)
)
}

pub fn is_ibc(&self) -> bool {
matches!(
self.kind,
TransactionKind::IbcMsg(_)
| TransactionKind::IbcTrasparentTransfer(_)
| TransactionKind::IbcRecvTrasparentTransfer(_)
| TransactionKind::IbcSendTrasparentTransfer(_)
| TransactionKind::IbcUnshieldingTransfer(_)
| TransactionKind::IbcShieldingTransfer(_)
)
}
}

#[derive(Debug, Clone)]
#[derive(Debug, Clone, Default)]
pub struct Fee {
pub gas: String,
pub gas_used: Option<u64>,
Expand Down Expand Up @@ -649,7 +659,7 @@ fn extract_masp_transaction(
}
}

#[derive(Debug, Clone)]
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct IbcSequence {
pub sequence_number: String,
pub source_port: String,
Expand Down
4 changes: 2 additions & 2 deletions shared/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ pub fn transfer_to_ibc_tx_kind(
transfer_data,
)))
} else {
Ok(TransactionKind::IbcTrasparentTransfer((
Ok(TransactionKind::IbcRecvTrasparentTransfer((
token_id,
transfer_data,
)))
Expand Down Expand Up @@ -311,7 +311,7 @@ pub fn transfer_to_ibc_tx_kind(
transfer_data,
)))
} else {
Ok(TransactionKind::IbcTrasparentTransfer((
Ok(TransactionKind::IbcSendTrasparentTransfer((
token_id,
transfer_data,
)))
Expand Down
Loading
Loading