1
1
use cosmwasm_std:: {
2
2
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 ,
5
5
} ;
6
6
7
- use crate :: msg:: QueryMsg ;
7
+ use crate :: msg:: { IbcPayload , QueryMsg } ;
8
8
use crate :: state:: { State , STATE_KEY } ;
9
9
10
10
#[ entry_point]
@@ -18,6 +18,8 @@ pub fn instantiate(
18
18
STATE_KEY ,
19
19
& to_json_vec ( & State {
20
20
ibc2_packet_receive_counter : 0 ,
21
+ last_channel_id : "" . to_owned ( ) ,
22
+ last_packet_seq : 0 ,
21
23
} ) ?,
22
24
) ;
23
25
@@ -43,15 +45,21 @@ pub fn ibc2_packet_receive(
43
45
_env : Env ,
44
46
msg : Ibc2PacketReceiveMsg ,
45
47
) -> StdResult < IbcReceiveResponse > {
48
+ let binary_payload = & msg. payload . value ;
49
+ let json_payload: IbcPayload = from_json ( binary_payload) ?;
50
+
46
51
let data = deps
47
52
. storage
48
53
. get ( STATE_KEY )
49
54
. ok_or_else ( || StdError :: generic_err ( "State not found." ) ) ?;
50
55
let state: State = from_json ( data) ?;
56
+
51
57
deps. storage . set (
52
58
STATE_KEY ,
53
59
& to_json_vec ( & State {
54
60
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 ,
55
63
} ) ?,
56
64
) ;
57
65
// Workaround for now.
@@ -71,7 +79,23 @@ pub fn ibc2_packet_receive(
71
79
// timeout: _env.block.time.plus_seconds(5_u64),
72
80
} ;
73
81
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
+ }
77
101
}
0 commit comments