diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aa50f827a..38b5010900 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,19 @@ ## Unreleased +### BUG FIXES + +- [ibc-relayer-cli] + - Prevent sending `ft-transfer` MsgTransfer on a non-Open channel. ([#960]) + ### FEATURES - [release] - - Official hermes image on Docker Hub. + - Official hermes image on Docker Hub. ([#894]) + + +[#960]: https://github.com/informalsystems/ibc-rs/issues/960 +[#894]: https://github.com/informalsystems/ibc-rs/pull/894 ## v0.3.1 *May 14h, 2021* diff --git a/e2e/run.py b/e2e/run.py index 8ab0bd19b0..f5b84f96ac 100755 --- a/e2e/run.py +++ b/e2e/run.py @@ -102,25 +102,25 @@ def loop(c: Config): unreceived = packet.query_unreceived_packets( c, chain=IBC_1, port=TRANSFER, channel=IBC_1_CHANNEL) - assert (len(unreceived) == 0), (unreceived, "unreceived packet mismatch") + assert (len(unreceived) == 0), (unreceived, "unreceived packets mismatch (expected 0)") # hermes query packet unreceived-acks ibc-1 transfer channel-1 unreceived = packet.query_unreceived_acks( c, chain=IBC_1, port=TRANSFER, channel=IBC_1_CHANNEL) - assert (len(unreceived) == 0), (unreceived, "unreceived packet mismatch") + assert (len(unreceived) == 0), (unreceived, "unreceived acks mismatch (expected 0)") # hermes query packet unreceived-packets ibc-0 transfer channel-0 unreceived = packet.query_unreceived_packets( c, chain=IBC_0, port=TRANSFER, channel=IBC_0_CHANNEL) - assert (len(unreceived) == 0), (unreceived, "unreceived packet mismatch") + assert (len(unreceived) == 0), (unreceived, "unreceived packets mismatch (expected 0)") # hermes query packet unreceived-acks ibc-0 transfer channel-0 unreceived = packet.query_unreceived_acks( c, chain=IBC_0, port=TRANSFER, channel=IBC_0_CHANNEL) - assert (len(unreceived) == 0), (unreceived, "unreceived packet mismatch") + assert (len(unreceived) == 0), (unreceived, "unreceived acks mismatch (expected 0)") # 6. All good, stop the relayer proc.kill() diff --git a/relayer-cli/src/commands/tx/transfer.rs b/relayer-cli/src/commands/tx/transfer.rs index cd07c91842..6a3527bf87 100644 --- a/relayer-cli/src/commands/tx/transfer.rs +++ b/relayer-cli/src/commands/tx/transfer.rs @@ -142,6 +142,16 @@ impl Runnable for TxIcs20MsgTransferCmd { Height::zero(), ) .unwrap_or_else(exit_with_unrecoverable_error); + if !channel_end.is_open() { + return Output::error(format!( + "the requested port/channel ('{}'/'{}') on chain id '{}' is in state '{}'; expected 'open' state", + opts.packet_src_port_id, + opts.packet_src_channel_id, + self.src_chain_id, + channel_end.state + )) + .exit(); + } let conn_id = match channel_end.connection_hops.first() { None => { @@ -166,7 +176,7 @@ impl Runnable for TxIcs20MsgTransferCmd { ); if src_chain_client_state.chain_id != self.dst_chain_id { return Output::error( - format!("the requested port/channel ({}/{}) provides a path from chain '{}' to \ + format!("the requested port/channel ('{}'/'{}') provides a path from chain '{}' to \ chain '{}' (not to the destination chain '{}'). Bailing due to mismatching arguments.", opts.packet_src_port_id, opts.packet_src_channel_id, self.src_chain_id,