11use cosmwasm_std:: {
22 entry_point, from_json, to_json_vec, Binary , Deps , DepsMut , Empty , Env , Ibc2Msg ,
3- Ibc2PacketReceiveMsg , Ibc2Payload , IbcReceiveResponse , MessageInfo , QueryResponse , Response ,
4- StdAck , StdError , StdResult , Timestamp ,
3+ Ibc2PacketReceiveMsg , Ibc2Payload , IbcAcknowledgement , IbcReceiveResponse , MessageInfo ,
4+ QueryResponse , Response , StdAck , StdError , StdResult , Timestamp ,
55} ;
66
7- use crate :: msg:: QueryMsg ;
7+ use crate :: msg:: { IbcPayload , QueryMsg } ;
88use crate :: state:: { State , STATE_KEY } ;
99
1010#[ entry_point]
@@ -18,6 +18,8 @@ pub fn instantiate(
1818 STATE_KEY ,
1919 & to_json_vec ( & State {
2020 ibc2_packet_receive_counter : 0 ,
21+ last_channel_id : "" . to_owned ( ) ,
22+ last_packet_seq : 0 ,
2123 } ) ?,
2224 ) ;
2325
@@ -43,15 +45,21 @@ pub fn ibc2_packet_receive(
4345 _env : Env ,
4446 msg : Ibc2PacketReceiveMsg ,
4547) -> StdResult < IbcReceiveResponse > {
48+ let binary_payload = & msg. payload . value ;
49+ let json_payload: IbcPayload = from_json ( binary_payload) ?;
50+
4651 let data = deps
4752 . storage
4853 . get ( STATE_KEY )
4954 . ok_or_else ( || StdError :: generic_err ( "State not found." ) ) ?;
5055 let state: State = from_json ( data) ?;
56+
5157 deps. storage . set (
5258 STATE_KEY ,
5359 & to_json_vec ( & State {
5460 ibc2_packet_receive_counter : state. ibc2_packet_receive_counter + 1 ,
61+ last_channel_id : msg. source_client . clone ( ) ,
62+ last_packet_seq : msg. packet_sequence ,
5563 } ) ?,
5664 ) ;
5765 // Workaround for now.
@@ -71,7 +79,23 @@ pub fn ibc2_packet_receive(
7179 // timeout: _env.block.time.plus_seconds(5_u64),
7280 } ;
7381
74- Ok ( IbcReceiveResponse :: new ( StdAck :: success ( b"\x01 " ) )
75- . add_message ( new_msg)
76- . add_attribute ( "action" , "handle_increment" ) )
82+ let resp = if json_payload. response_without_ack {
83+ IbcReceiveResponse :: without_ack ( ) . add_attribute ( "action" , "handle_increment" )
84+ } else {
85+ IbcReceiveResponse :: new ( StdAck :: success ( b"\x01 " ) )
86+ . add_message ( new_msg)
87+ . add_attribute ( "action" , "handle_increment" )
88+ } ;
89+
90+ if json_payload. send_async_ack_for_prev_msg {
91+ Ok (
92+ resp. add_message ( cosmwasm_std:: Ibc2Msg :: WriteAcknowledgement {
93+ channel_id : state. last_channel_id ,
94+ packet_sequence : state. last_packet_seq ,
95+ ack : IbcAcknowledgement :: new ( [ 1 , 2 , 3 ] ) ,
96+ } ) ,
97+ )
98+ } else {
99+ Ok ( resp)
100+ }
77101}
0 commit comments