Skip to content

Commit 632b8c2

Browse files
authored
Merge pull request #1892 from CosmWasm/1649-ibc-receive-response
Allow creating `IbcReceiveResponse` without ack
2 parents 0aab099 + ca05c45 commit 632b8c2

File tree

5 files changed

+31
-12
lines changed

5 files changed

+31
-12
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,15 @@ and this project adheres to
6666
([#1967])
6767
- cosmwasm-std: Replace `MockApi` with bech32 implementation. ([#1914])
6868
- cosmwasm-vm: Replace `MockApi` with bech32 implementation. ([#1914])
69+
- cosmwasm-std: Make `IbcReceiveResponse::acknowledgement` optional and add
70+
`IbcReceiveResponse::without_ack` constructor. ([#1892])
6971

7072
[#1874]: https://github.com/CosmWasm/cosmwasm/pull/1874
7173
[#1876]: https://github.com/CosmWasm/cosmwasm/pull/1876
7274
[#1879]: https://github.com/CosmWasm/cosmwasm/pull/1879
7375
[#1883]: https://github.com/CosmWasm/cosmwasm/pull/1883
7476
[#1884]: https://github.com/CosmWasm/cosmwasm/pull/1884
77+
[#1892]: https://github.com/CosmWasm/cosmwasm/pull/1892
7578
[#1898]: https://github.com/CosmWasm/cosmwasm/pull/1898
7679
[#1902]: https://github.com/CosmWasm/cosmwasm/pull/1902
7780
[#1914]: https://github.com/CosmWasm/cosmwasm/pull/1914

contracts/ibc-reflect-send/src/ibc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use cosmwasm_std::{
2-
entry_point, from_json, to_json_binary, DepsMut, Env, Ibc3ChannelOpenResponse,
2+
entry_point, from_json, to_json_binary, Binary, DepsMut, Env, Ibc3ChannelOpenResponse,
33
IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg,
44
IbcChannelOpenResponse, IbcMsg, IbcOrder, IbcPacketAckMsg, IbcPacketReceiveMsg,
55
IbcPacketTimeoutMsg, IbcReceiveResponse, Never, StdError, StdResult,
@@ -101,7 +101,7 @@ pub fn ibc_packet_receive(
101101
_env: Env,
102102
_packet: IbcPacketReceiveMsg,
103103
) -> Result<IbcReceiveResponse, Never> {
104-
Ok(IbcReceiveResponse::new(b"{}").add_attribute("action", "ibc_packet_ack"))
104+
Ok(IbcReceiveResponse::new(Binary::from(b"{}")).add_attribute("action", "ibc_packet_ack"))
105105
}
106106

107107
#[entry_point]

contracts/ibc-reflect/src/contract.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,8 @@ mod tests {
546546
res.events[0]
547547
);
548548
// acknowledgement is an error
549-
let ack: AcknowledgementMsg<DispatchResponse> = from_json(res.acknowledgement).unwrap();
549+
let ack: AcknowledgementMsg<DispatchResponse> =
550+
from_json(res.acknowledgement.unwrap()).unwrap();
550551
assert_eq!(
551552
ack.unwrap_err(),
552553
"invalid packet: account channel-123 not found"
@@ -560,7 +561,7 @@ mod tests {
560561
let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap();
561562

562563
// assert app-level success
563-
let ack: AcknowledgementMsg<()> = from_json(res.acknowledgement).unwrap();
564+
let ack: AcknowledgementMsg<()> = from_json(res.acknowledgement.unwrap()).unwrap();
564565
ack.unwrap();
565566

566567
// and we dispatch the BankMsg via submessage
@@ -597,7 +598,8 @@ mod tests {
597598
// we didn't dispatch anything
598599
assert_eq!(0, res.messages.len());
599600
// acknowledgement is an error
600-
let ack: AcknowledgementMsg<DispatchResponse> = from_json(res.acknowledgement).unwrap();
601+
let ack: AcknowledgementMsg<DispatchResponse> =
602+
from_json(res.acknowledgement.unwrap()).unwrap();
601603
assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`");
602604
}
603605

contracts/ibc-reflect/tests/integration.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ fn handle_dispatch_packet() {
240240
);
241241
// acknowledgement is an error
242242
let ack: AcknowledgementMsg<DispatchResponse> =
243-
from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap();
243+
from_slice(&res.acknowledgement.unwrap(), DESERIALIZATION_LIMIT).unwrap();
244244
assert_eq!(
245245
ack.unwrap_err(),
246246
"invalid packet: account channel-123 not found"
@@ -255,7 +255,7 @@ fn handle_dispatch_packet() {
255255

256256
// assert app-level success
257257
let ack: AcknowledgementMsg<DispatchResponse> =
258-
from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap();
258+
from_slice(&res.acknowledgement.unwrap(), DESERIALIZATION_LIMIT).unwrap();
259259
ack.unwrap();
260260

261261
// and we dispatch the BankMsg
@@ -293,6 +293,6 @@ fn handle_dispatch_packet() {
293293
assert_eq!(0, res.messages.len());
294294
// acknowledgement is an error
295295
let ack: AcknowledgementMsg<DispatchResponse> =
296-
from_slice(&res.acknowledgement, DESERIALIZATION_LIMIT).unwrap();
296+
from_slice(&res.acknowledgement.unwrap(), DESERIALIZATION_LIMIT).unwrap();
297297
assert_eq!(ack.unwrap_err(), "invalid packet: Error parsing into type ibc_reflect::msg::PacketMsg: unknown variant `reflect_code_id`, expected one of `dispatch`, `who_am_i`, `balances`, `panic`, `return_err`, `return_msgs`");
298298
}

packages/std/src/ibc.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -601,8 +601,9 @@ impl<T> IbcBasicResponse<T> {
601601
#[non_exhaustive]
602602
pub struct IbcReceiveResponse<T = Empty> {
603603
/// The bytes we return to the contract that sent the packet.
604-
/// This may represent a success or error of execution
605-
pub acknowledgement: Binary,
604+
/// This may represent a success or error of execution.
605+
/// In case of `None`, no acknowledgement is written.
606+
pub acknowledgement: Option<Binary>,
606607
/// Optional list of messages to pass. These will be executed in order.
607608
/// If the ReplyOn member is set, they will invoke this contract's `reply` entry point
608609
/// after execution. Otherwise, they act like "fire and forget".
@@ -633,11 +634,24 @@ impl<T> IbcReceiveResponse<T> {
633634
///
634635
/// // 0x01 is a FungibleTokenPacketSuccess from ICS-20.
635636
/// let resp: IbcReceiveResponse = IbcReceiveResponse::new(StdAck::success(b"\x01"));
636-
/// assert_eq!(resp.acknowledgement, b"{\"result\":\"AQ==\"}");
637+
/// assert_eq!(resp.acknowledgement.unwrap(), b"{\"result\":\"AQ==\"}");
637638
/// ```
638639
pub fn new(ack: impl Into<Binary>) -> Self {
639640
Self {
640-
acknowledgement: ack.into(),
641+
acknowledgement: Some(ack.into()),
642+
messages: vec![],
643+
attributes: vec![],
644+
events: vec![],
645+
}
646+
}
647+
648+
/// Creates a new response without an acknowledgement.
649+
///
650+
/// This allows you to send the acknowledgement asynchronously later using [`IbcMsg::WriteAcknowledgement`].
651+
/// If you want to send the acknowledgement immediately, use [`IbcReceiveResponse::new`].
652+
pub fn without_ack() -> Self {
653+
Self {
654+
acknowledgement: None,
641655
messages: vec![],
642656
attributes: vec![],
643657
events: vec![],

0 commit comments

Comments
 (0)