Skip to content

Commit a8fe613

Browse files
Benzbeebntchjb
authored andcommitted
Merge pull request #78 from bandprotocol/emitter-ibc-transfer
Emitter: handle packet send fungible token
1 parent 6b3d643 commit a8fe613

File tree

3 files changed

+121
-30
lines changed

3 files changed

+121
-30
lines changed

hooks/emitter/channel.go

Lines changed: 92 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,64 @@
11
package emitter
22

33
import (
4-
sdk "github.com/cosmos/cosmos-sdk/types"
5-
64
"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"
77
"github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types"
88
channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types"
99

1010
oracletypes "github.com/bandprotocol/chain/x/oracle/types"
1111
)
1212

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,
1918
"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,
2524
}
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+
}
2656

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 {
2860
var data oracletypes.OracleRequestPacketData
29-
err := oracletypes.ModuleCdc.UnmarshalJSON(msg.Packet.Data, &data)
61+
err := oracletypes.ModuleCdc.UnmarshalJSON(dataOfPacket, &data)
3062
if err == nil {
3163
if events, ok := evMap[oracletypes.EventTypeRequest+"."+oracletypes.AttributeKeyID]; ok {
3264
id := oracletypes.RequestID(common.Atoi(events[0]))
@@ -38,7 +70,7 @@ func (h *Hook) handleMsgRecvPacket(
3870
"calldata": parseBytes(data.Calldata),
3971
"ask_count": data.AskCount,
4072
"min_count": data.MinCount,
41-
"sender": msg.Signer,
73+
"sender": signer,
4274
"client_id": data.ClientID,
4375
"resolve_status": oracletypes.RESOLVE_STATUS_OPEN,
4476
"timestamp": ctx.BlockTime().UnixNano(),
@@ -89,26 +121,38 @@ func (h *Hook) handleMsgRecvPacket(
89121
"reason": evMap[channeltypes.EventTypeWriteAck+"."+channeltypes.AttributeKeyAck][0],
90122
}
91123
}
92-
h.Write("NEW_PACKET", packet)
124+
return true
93125
}
94-
126+
return false
95127
}
96128

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,
99132
) {
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
108145
}
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 {
110154
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)
112156
if err == nil {
113157
req := h.oracleKeeper.MustGetRequest(ctx, data.RequestID)
114158
os := h.oracleKeeper.MustGetOracleScript(ctx, req.OracleScriptID)
@@ -121,7 +165,25 @@ func (h *Hook) handleEventSendPacket(
121165
"resolve_status": data.ResolveStatus,
122166
"result": parseBytes(data.Result),
123167
}
168+
return true
124169
}
170+
return false
171+
}
125172

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+
)
126185
h.Write("NEW_PACKET", packet)
186+
if ok := h.extractOracleResponsePacket(ctx, packet, evMap); ok {
187+
return
188+
}
127189
}

hooks/emitter/handler.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
66
distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
77
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
8+
transfertypes "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types"
89
channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types"
910
slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
1011
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
@@ -78,6 +79,8 @@ func (h *Hook) handleMsg(ctx sdk.Context, txHash []byte, msg sdk.Msg, log sdk.AB
7879
h.handleMsgDeposit(ctx, txHash, msg, extra)
7980
case *channeltypes.MsgRecvPacket:
8081
h.handleMsgRecvPacket(ctx, txHash, msg, evMap, extra)
82+
case *transfertypes.MsgTransfer:
83+
h.handleMsgTransfer(ctx, msg, evMap)
8184
}
8285
}
8386

hooks/emitter/transfer.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package emitter
2+
3+
import (
4+
sdk "github.com/cosmos/cosmos-sdk/types"
5+
"github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types"
6+
channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types"
7+
8+
"github.com/bandprotocol/chain/hooks/common"
9+
)
10+
11+
// handleMsgTransfer implements emitter handler for msgTransfer.
12+
func (h *Hook) handleMsgTransfer(ctx sdk.Context, msg *types.MsgTransfer, evMap common.EvMap) {
13+
if events, ok := evMap[channeltypes.EventTypeSendPacket+"."+channeltypes.AttributeKeyData]; ok {
14+
packet := newPacket(
15+
ctx,
16+
evMap[channeltypes.EventTypeSendPacket+"."+channeltypes.AttributeKeySrcPort][0],
17+
evMap[channeltypes.EventTypeSendPacket+"."+channeltypes.AttributeKeySrcChannel][0],
18+
common.Atoui(evMap[channeltypes.EventTypeSendPacket+"."+channeltypes.AttributeKeySequence][0]),
19+
evMap[channeltypes.EventTypeSendPacket+"."+channeltypes.AttributeKeyDstPort][0],
20+
evMap[channeltypes.EventTypeSendPacket+"."+channeltypes.AttributeKeyDstChannel][0],
21+
false,
22+
)
23+
h.extractFungibleTokenPacket(ctx, []byte(events[0]), evMap, packet)
24+
h.Write("NEW_PACKET", packet)
25+
}
26+
}

0 commit comments

Comments
 (0)