@@ -13,20 +13,23 @@ use std::collections::HashMap;
13
13
use std:: convert:: { TryFrom , TryInto } ;
14
14
use tendermint:: block:: Height ;
15
15
16
+ use tendermint:: abci:: Event ;
16
17
use tracing:: warn;
17
18
18
19
/// Events types
19
20
#[ derive( Debug , Clone , Deserialize , Serialize ) ]
20
21
pub enum IBCEventType {
22
+ CreateClient ,
21
23
SendPacket ,
22
- RecvPacket ,
24
+ WriteAck ,
23
25
}
24
26
25
27
impl IBCEventType {
26
28
pub fn as_str ( & self ) -> & ' static str {
27
29
match * self {
30
+ IBCEventType :: CreateClient => "create_client" ,
28
31
IBCEventType :: SendPacket => "send_packet" ,
29
- _ => "unhandled " ,
32
+ IBCEventType :: WriteAck => "write_acknowledgement " ,
30
33
}
31
34
}
32
35
}
@@ -54,13 +57,32 @@ pub enum IBCEvent {
54
57
55
58
SendPacketChannel ( ChannelEvents :: SendPacket ) ,
56
59
ReceivePacketChannel ( ChannelEvents :: ReceivePacket ) ,
60
+ WriteAcknowledgementChannel ( ChannelEvents :: WriteAcknowledgement ) ,
57
61
AcknowledgePacketChannel ( ChannelEvents :: AcknowledgePacket ) ,
58
- CleanupPacketChannel ( ChannelEvents :: CleanupPacket ) ,
59
62
TimeoutPacketChannel ( ChannelEvents :: TimeoutPacket ) ,
60
63
61
64
TimeoutTransfer ( TransferEvents :: Timeout ) ,
62
65
PacketTransfer ( TransferEvents :: Packet ) ,
63
66
ChannelClosedTransfer ( TransferEvents :: ChannelClosed ) ,
67
+
68
+ Empty ( String ) , // Special event, signifying empty response
69
+ ChainError ( String ) , // Special event, signifying an error on CheckTx or DeliverTx
70
+ }
71
+
72
+ // This is tendermint specific
73
+ pub fn from_tx_response_event ( event : Event ) -> Option < IBCEvent > {
74
+ // Return the first hit we find
75
+ // Look for client event...
76
+ if let Some ( client_res) = ClientEvents :: try_from_tx ( event. clone ( ) ) {
77
+ return Some ( client_res) ;
78
+ // Look for connection event...
79
+ } else if let Some ( conn_res) = ConnectionEvents :: try_from_tx ( event. clone ( ) ) {
80
+ return Some ( conn_res) ;
81
+ } else if let Some ( chan_res) = ChannelEvents :: try_from_tx ( event) {
82
+ return Some ( chan_res) ;
83
+ }
84
+
85
+ None
64
86
}
65
87
66
88
impl IBCEvent {
@@ -70,9 +92,13 @@ impl IBCEvent {
70
92
pub fn height ( & self ) -> Height {
71
93
match self {
72
94
IBCEvent :: NewBlock ( bl) => bl. height ,
73
- IBCEvent :: UpdateClient ( uc) => uc. height ,
74
- IBCEvent :: SendPacketChannel ( ev) => ev. envelope . height ,
95
+ IBCEvent :: UpdateClient ( uc) => * uc. height ( ) ,
96
+ IBCEvent :: SendPacketChannel ( ev) => ev. height ,
75
97
IBCEvent :: ReceivePacketChannel ( ev) => ev. height ,
98
+ IBCEvent :: WriteAcknowledgementChannel ( ev) => ev. height ,
99
+ IBCEvent :: AcknowledgePacketChannel ( ev) => ev. height ,
100
+ IBCEvent :: TimeoutPacketChannel ( ev) => ev. height ,
101
+
76
102
_ => {
77
103
unimplemented ! ( )
78
104
}
@@ -81,7 +107,19 @@ impl IBCEvent {
81
107
pub fn set_height ( & mut self , height : ICSHeight ) {
82
108
match self {
83
109
IBCEvent :: SendPacketChannel ( ev) => {
84
- ev. envelope . height = Height :: try_from ( height. version_height ) . unwrap ( )
110
+ ev. height = Height :: try_from ( height. revision_height ) . unwrap ( )
111
+ }
112
+ IBCEvent :: ReceivePacketChannel ( ev) => {
113
+ ev. height = Height :: try_from ( height. revision_height ) . unwrap ( )
114
+ }
115
+ IBCEvent :: WriteAcknowledgementChannel ( ev) => {
116
+ ev. height = Height :: try_from ( height. revision_height ) . unwrap ( )
117
+ }
118
+ IBCEvent :: AcknowledgePacketChannel ( ev) => {
119
+ ev. height = Height :: try_from ( height. revision_height ) . unwrap ( )
120
+ }
121
+ IBCEvent :: TimeoutPacketChannel ( ev) => {
122
+ ev. height = Height :: try_from ( height. revision_height ) . unwrap ( )
85
123
}
86
124
_ => {
87
125
unimplemented ! ( )
@@ -200,15 +238,17 @@ pub fn get_all_events(result: RpcEvent) -> Result<Vec<(Height, IBCEvent)>, Strin
200
238
Ok ( vals)
201
239
}
202
240
203
- pub fn build_event ( object : RawObject ) -> Result < IBCEvent , BoxError > {
241
+ pub fn build_event ( mut object : RawObject ) -> Result < IBCEvent , BoxError > {
204
242
match object. action . as_str ( ) {
243
+ // Client events
205
244
"create_client" => Ok ( IBCEvent :: from ( ClientEvents :: CreateClient :: try_from (
206
245
object,
207
246
) ?) ) ,
208
247
"update_client" => Ok ( IBCEvent :: from ( ClientEvents :: UpdateClient :: try_from (
209
248
object,
210
249
) ?) ) ,
211
250
251
+ // Connection events
212
252
"connection_open_init" => Ok ( IBCEvent :: from ( ConnectionEvents :: OpenInit :: try_from (
213
253
object,
214
254
) ?) ) ,
@@ -218,6 +258,7 @@ pub fn build_event(object: RawObject) -> Result<IBCEvent, BoxError> {
218
258
object,
219
259
) ?) ) ,
220
260
261
+ // Channel events
221
262
"channel_open_init" => Ok ( IBCEvent :: from ( ChannelEvents :: OpenInit :: try_from ( object) ?) ) ,
222
263
"channel_open_try" => Ok ( IBCEvent :: from ( ChannelEvents :: OpenTry :: try_from ( object) ?) ) ,
223
264
"channel_open_ack" => Ok ( IBCEvent :: from ( ChannelEvents :: OpenAck :: try_from ( object) ?) ) ,
@@ -229,33 +270,30 @@ pub fn build_event(object: RawObject) -> Result<IBCEvent, BoxError> {
229
270
object,
230
271
) ?) ) ,
231
272
232
- // send_packet
233
- "transfer" => Ok ( IBCEvent :: from ( ChannelEvents :: SendPacket :: try_from ( object) ?) ) ,
234
- // recv_packet
235
- "ics04/opaque" => Ok ( IBCEvent :: from ( ChannelEvents :: ReceivePacket :: try_from (
236
- object,
237
- ) ?) ) ,
238
- // acknowledge_packet
239
- // needs these changes in cosmos-sdk
240
- // --- a/x/ibc/04-channel/types/msgs.go
241
- // +++ b/x/ibc/04-channel/types/msgs.go
242
- // @@ -511,5 +511,5 @@ func (msg MsgAcknowledgement) GetSigners() []sdk.AccAddress {
243
- //
244
- // // Type implements sdk.Msg
245
- // func (msg MsgAcknowledgement) Type() string {
246
- // - return "ics04/opaque"
247
- // + return "ics04/acknowledge"
248
- // }
249
- "ics04/acknowledge" => Ok ( IBCEvent :: from ( ChannelEvents :: AcknowledgePacket :: try_from (
250
- object,
251
- ) ?) ) ,
252
- //timeout_packet
253
- "ics04/timeout" => Ok ( IBCEvent :: from ( ChannelEvents :: TimeoutPacket :: try_from (
273
+ // Packet events
274
+ // Note: There is no message.action "send_packet", the only one we can hook into is the
275
+ // module's action, "transfer" being the only one in IBC1.0. However the attributes
276
+ // are all prefixed with "send_packet" therefore the overwrite here
277
+ // TODO: This need to be sorted out
278
+ "transfer" => {
279
+ object. action = "send_packet" . to_string ( ) ;
280
+ Ok ( IBCEvent :: from ( ChannelEvents :: SendPacket :: try_from ( object) ?) )
281
+ }
282
+ // Same here
283
+ // TODO: sort this out
284
+ "recv_packet" => {
285
+ object. action = "write_acknowledgement" . to_string ( ) ;
286
+ Ok ( IBCEvent :: from (
287
+ ChannelEvents :: WriteAcknowledgement :: try_from ( object) ?,
288
+ ) )
289
+ }
290
+ "write_acknowledgement" => Ok ( IBCEvent :: from (
291
+ ChannelEvents :: WriteAcknowledgement :: try_from ( object) ?,
292
+ ) ) ,
293
+ "acknowledge_packet" => Ok ( IBCEvent :: from ( ChannelEvents :: AcknowledgePacket :: try_from (
254
294
object,
255
295
) ?) ) ,
256
-
257
- // TODO not clear what the message.action for this is
258
- "cleanup_packet" => Ok ( IBCEvent :: from ( ChannelEvents :: CleanupPacket :: try_from (
296
+ "timeout_packet" => Ok ( IBCEvent :: from ( ChannelEvents :: TimeoutPacket :: try_from (
259
297
object,
260
298
) ?) ) ,
261
299
@@ -290,3 +328,10 @@ macro_rules! attribute {
290
328
$a. events. get( $b) . ok_or( $b) ?[ $a. idx] . parse( ) ?
291
329
} ;
292
330
}
331
+
332
+ #[ macro_export]
333
+ macro_rules! some_attribute {
334
+ ( $a: ident, $b: literal) => {
335
+ $a. events. get( $b) . ok_or( $b) ?[ $a. idx] . parse( ) . ok( )
336
+ } ;
337
+ }
0 commit comments