1
1
package emitter
2
2
3
3
import (
4
- sdk "github.com/cosmos/cosmos-sdk/types"
5
-
6
4
"github.com/bandprotocol/chain/hooks/common"
5
+ sdk "github.com/cosmos/cosmos-sdk/types"
6
+ ibcxfertypes "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types"
7
7
"github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types"
8
8
channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types"
9
9
10
10
oracletypes "github.com/bandprotocol/chain/x/oracle/types"
11
11
)
12
12
13
- // handleMsgRequestData implements emitter handler for MsgRequestData.
14
- func (h * Hook ) handleMsgRecvPacket (
15
- ctx sdk.Context , txHash []byte , msg * types.MsgRecvPacket , evMap common.EvMap , extra common.JsDict ,
16
- ) {
17
- packet := common.JsDict {
18
- "is_incoming" : true ,
13
+ // TODO: update transfer acknowledgement for fungible token packet
14
+
15
+ func newPacket (ctx sdk.Context , srcPort string , srcChannel string , sequence uint64 , dstPort string , dstChannel string , isIncoming bool ) common.JsDict {
16
+ return common.JsDict {
17
+ "is_incoming" : isIncoming ,
19
18
"block_height" : ctx .BlockHeight (),
20
- "src_channel" : msg . Packet . SourceChannel ,
21
- "src_port" : msg . Packet . SourcePort ,
22
- "sequence" : msg . Packet . Sequence ,
23
- "dst_channel" : msg . Packet . DestinationChannel ,
24
- "dst_port" : msg . Packet . DestinationPort ,
19
+ "src_channel" : srcChannel ,
20
+ "src_port" : srcPort ,
21
+ "sequence" : sequence ,
22
+ "dst_channel" : dstChannel ,
23
+ "dst_port" : dstPort ,
25
24
}
25
+ }
26
+
27
+ func (h * Hook ) extractFungibleTokenPacket (
28
+ ctx sdk.Context , dataOfPacket []byte , evMap common.EvMap , packet common.JsDict ,
29
+ ) bool {
30
+ var data ibcxfertypes.FungibleTokenPacketData
31
+ err := ibcxfertypes .ModuleCdc .UnmarshalJSON (dataOfPacket , & data )
32
+ if err == nil {
33
+ packet ["type" ] = "fungible token"
34
+ packet ["data" ] = common.JsDict {
35
+ "denom" : data .Denom ,
36
+ "amount" : data .Amount ,
37
+ "sender" : data .Sender ,
38
+ "receiver" : data .Receiver ,
39
+ }
40
+ if events , ok := evMap [ibcxfertypes .EventTypePacket + "." + ibcxfertypes .AttributeKeyAckSuccess ]; ok {
41
+ // TODO: patch this line when cosmos-sdk fix AttributeKeyAckSuccess value
42
+ if events [0 ] == "false" {
43
+ packet ["acknowledgement" ] = common.JsDict {
44
+ "success" : true ,
45
+ }
46
+ } else {
47
+ packet ["acknowledgement" ] = common.JsDict {
48
+ "success" : false ,
49
+ }
50
+ }
51
+ }
52
+ return true
53
+ }
54
+ return false
55
+ }
26
56
27
- // TODO: Check on other packet
57
+ func (h * Hook ) extractOracleRequestPacket (
58
+ ctx sdk.Context , txHash []byte , signer string , dataOfPacket []byte , evMap common.EvMap , extra common.JsDict , packet common.JsDict ,
59
+ ) bool {
28
60
var data oracletypes.OracleRequestPacketData
29
- err := oracletypes .ModuleCdc .UnmarshalJSON (msg . Packet . Data , & data )
61
+ err := oracletypes .ModuleCdc .UnmarshalJSON (dataOfPacket , & data )
30
62
if err == nil {
31
63
if events , ok := evMap [oracletypes .EventTypeRequest + "." + oracletypes .AttributeKeyID ]; ok {
32
64
id := oracletypes .RequestID (common .Atoi (events [0 ]))
@@ -38,7 +70,7 @@ func (h *Hook) handleMsgRecvPacket(
38
70
"calldata" : parseBytes (data .Calldata ),
39
71
"ask_count" : data .AskCount ,
40
72
"min_count" : data .MinCount ,
41
- "sender" : msg . Signer ,
73
+ "sender" : signer ,
42
74
"client_id" : data .ClientID ,
43
75
"resolve_status" : oracletypes .RESOLVE_STATUS_OPEN ,
44
76
"timestamp" : ctx .BlockTime ().UnixNano (),
@@ -89,26 +121,38 @@ func (h *Hook) handleMsgRecvPacket(
89
121
"reason" : evMap [channeltypes .EventTypeWriteAck + "." + channeltypes .AttributeKeyAck ][0 ],
90
122
}
91
123
}
92
- h . Write ( "NEW_PACKET" , packet )
124
+ return true
93
125
}
94
-
126
+ return false
95
127
}
96
128
97
- func (h * Hook ) handleEventSendPacket (
98
- ctx sdk.Context , evMap common.EvMap ,
129
+ // handleMsgRequestData implements emitter handler for MsgRequestData.
130
+ func (h * Hook ) handleMsgRecvPacket (
131
+ ctx sdk.Context , txHash []byte , msg * types.MsgRecvPacket , evMap common.EvMap , extra common.JsDict ,
99
132
) {
100
- packet := common.JsDict {
101
- "is_incoming" : false ,
102
- "block_height" : ctx .BlockHeight (),
103
- "src_channel" : evMap [types .EventTypeSendPacket + "." + types .AttributeKeySrcChannel ][0 ],
104
- "src_port" : evMap [types .EventTypeSendPacket + "." + types .AttributeKeySrcPort ][0 ],
105
- "sequence" : common .Atoui (evMap [types .EventTypeSendPacket + "." + types .AttributeKeySequence ][0 ]),
106
- "dst_channel" : evMap [types .EventTypeSendPacket + "." + types .AttributeKeyDstChannel ][0 ],
107
- "dst_port" : evMap [types .EventTypeSendPacket + "." + types .AttributeKeyDstPort ][0 ],
133
+ packet := newPacket (
134
+ ctx ,
135
+ msg .Packet .SourcePort ,
136
+ msg .Packet .SourceChannel ,
137
+ msg .Packet .Sequence ,
138
+ msg .Packet .DestinationPort ,
139
+ msg .Packet .DestinationChannel ,
140
+ true ,
141
+ )
142
+ h .Write ("NEW_PACKET" , packet )
143
+ if ok := h .extractOracleRequestPacket (ctx , txHash , msg .Signer , msg .Packet .Data , evMap , extra , packet ); ok {
144
+ return
108
145
}
109
- // TODO: Check on other packet
146
+ if ok := h .extractFungibleTokenPacket (ctx , msg .Packet .Data , evMap , packet ); ok {
147
+ return
148
+ }
149
+ }
150
+
151
+ func (h * Hook ) extractOracleResponsePacket (
152
+ ctx sdk.Context , packet common.JsDict , evMap common.EvMap ,
153
+ ) bool {
110
154
var data oracletypes.OracleResponsePacketData
111
- err := h . cdc .UnmarshalJSON ([]byte (evMap [types .EventTypeSendPacket + "." + types .AttributeKeyData ][0 ]), & data )
155
+ err := oracletypes . ModuleCdc .UnmarshalJSON ([]byte (evMap [types .EventTypeSendPacket + "." + types .AttributeKeyData ][0 ]), & data )
112
156
if err == nil {
113
157
req := h .oracleKeeper .MustGetRequest (ctx , data .RequestID )
114
158
os := h .oracleKeeper .MustGetOracleScript (ctx , req .OracleScriptID )
@@ -121,7 +165,25 @@ func (h *Hook) handleEventSendPacket(
121
165
"resolve_status" : data .ResolveStatus ,
122
166
"result" : parseBytes (data .Result ),
123
167
}
168
+ return true
124
169
}
170
+ return false
171
+ }
125
172
173
+ func (h * Hook ) handleEventSendPacket (
174
+ ctx sdk.Context , evMap common.EvMap ,
175
+ ) {
176
+ packet := newPacket (
177
+ ctx ,
178
+ evMap [types .EventTypeSendPacket + "." + types .AttributeKeySrcPort ][0 ],
179
+ evMap [types .EventTypeSendPacket + "." + types .AttributeKeySrcChannel ][0 ],
180
+ common .Atoui (evMap [types .EventTypeSendPacket + "." + types .AttributeKeySequence ][0 ]),
181
+ evMap [types .EventTypeSendPacket + "." + types .AttributeKeyDstPort ][0 ],
182
+ evMap [types .EventTypeSendPacket + "." + types .AttributeKeyDstChannel ][0 ],
183
+ false ,
184
+ )
126
185
h .Write ("NEW_PACKET" , packet )
186
+ if ok := h .extractOracleResponsePacket (ctx , packet , evMap ); ok {
187
+ return
188
+ }
127
189
}
0 commit comments