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
2 changes: 2 additions & 0 deletions .changelog/unreleased/bug-fixes/4822-fix-timeout-unlimited.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Fix refund when timeout on unlimited channel
([\#4822](https://github.com/namada-net/namada/issues/4822))
15 changes: 10 additions & 5 deletions crates/ibc/src/vp/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -400,13 +400,18 @@ where
IbcMessage::NftTransfer(msg_nft_transfer) => {
Some(&msg_nft_transfer.message.chan_id_on_a)
}
IbcMessage::Envelope(boxed) => {
if let MsgEnvelope::Packet(PacketMsg::Recv(msg)) = &**boxed {
IbcMessage::Envelope(boxed) => match &**boxed {
MsgEnvelope::Packet(PacketMsg::Recv(msg)) => {
Some(&msg.packet.chan_id_on_b)
} else {
None
}
}
MsgEnvelope::Packet(PacketMsg::Ack(msg)) => {
Some(&msg.packet.chan_id_on_a)
}
MsgEnvelope::Packet(PacketMsg::Timeout(msg)) => {
Some(&msg.packet.chan_id_on_a)
}
_ => None,
},
};
if let Some(channel) = transfer_channel {
let unlimited_channel_key = unlimited_channel_key(channel);
Expand Down
65 changes: 64 additions & 1 deletion crates/tests/src/e2e/ibc_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1258,7 +1258,7 @@ fn ibc_unlimited_channel() -> Result<()> {

// Start relaying
let hermes = run_hermes(&hermes_dir)?;
let _bg_hermes = hermes.background();
let bg_hermes = hermes.background();

let ibc_denom_on_namada =
format!("{port_id_namada}/{channel_id_namada}/{COSMOS_COIN}");
Expand Down Expand Up @@ -1378,6 +1378,69 @@ fn ibc_unlimited_channel() -> Result<()> {
1_000_000,
)?;

// Transfer to an invalid address from Namada
transfer(
&test,
ALBERT,
"invalid_receiver",
&ibc_denom_on_namada,
1,
Some(ALBERT_KEY),
&port_id_namada,
&channel_id_namada,
None,
None,
None,
None,
false,
)?;
wait_for_packet_relay(
&hermes_dir,
&port_id_namada,
&channel_id_namada,
&test,
)?;

// Check if the token has been refunded by an ack with an error
check_balance(&test, ALBERT, &ibc_denom_on_namada, 1)?;

// Stop Hermes for timeout test
let mut hermes = bg_hermes.foreground();
hermes.interrupt()?;

// Timeout transfer from Namada
transfer(
&test,
ALBERT,
&gaia_receiver,
&ibc_denom_on_namada,
1,
Some(ALBERT_KEY),
&port_id_namada,
&channel_id_namada,
Some(Duration::new(10, 0)),
None,
None,
None,
false,
)?;
// wait for the timeout
sleep(10);

// Restart relaying
let hermes = run_hermes(&hermes_dir)?;
let _bg_hermes = hermes.background();

wait_for_packet_relay(
&hermes_dir,
&port_id_namada,
&channel_id_namada,
&test,
)?;

// Check if the token has been refunded
check_balance(&test, ALBERT, &ibc_denom_on_namada, 1)?;

Ok(())
}

Expand Down
Loading