Skip to content

Commit 18bede5

Browse files
authored
Merge pull request crypto-com#912 from crypto-com/fix/packet-data-parsing
Fix: panic on IBC packet data parsing
2 parents 13b51e2 + be8ecc1 commit 18bede5

File tree

4 files changed

+85
-12
lines changed

4 files changed

+85
-12
lines changed

appinterface/projection/rdbprojectionbase/store.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func (impl *Store) UpdateLastHandledEventHeight(rdbHandle *rdb.Handle, projectio
4040

4141
execResult, sqlErr := rdbHandle.Exec(sql, args...)
4242
if sqlErr != nil {
43-
return fmt.Errorf("error exectuing last handled event height insertion SQL: %v", sqlErr)
43+
return fmt.Errorf("error executing last handled event height insertion SQL: %v", sqlErr)
4444
}
4545
if execResult.RowsAffected() == 0 {
4646
return errors.New("error executing last handled event height insertion SQL: no rows inserted")

usecase/parser/block_results_txs_results.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package parser
22

33
import (
4+
"encoding/hex"
45
"fmt"
56
"strings"
67

@@ -11,6 +12,7 @@ import (
1112
"github.com/crypto-com/chain-indexing/usecase/command"
1213
"github.com/crypto-com/chain-indexing/usecase/model"
1314
"github.com/crypto-com/chain-indexing/usecase/parser/utils"
15+
jsoniter "github.com/json-iterator/go"
1416
)
1517

1618
func ParseBlockResultsTxsResults(
@@ -73,8 +75,6 @@ func parseCronosSendToIBC(
7375
params := model.RawCronosSendToIBCParams{
7476
PacketChannelOrdering: maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_channel_ordering"),
7577
PacketConnection: maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_connection"),
76-
PacketData: maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_data"),
77-
PacketDataHex: maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_data_hex"),
7878
PacketDstChannel: maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_dst_channel"),
7979
PacketDstPort: maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_dst_port"),
8080
PacketSequence: maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_sequence"),
@@ -85,7 +85,26 @@ func parseCronosSendToIBC(
8585
}
8686

8787
var fungibleTokenPacketData model.FungibleTokenPacketData
88-
json.MustUnmarshalFromString(params.PacketData, &fungibleTokenPacketData)
88+
if maybeIBCSendPacketEvent.HasAttribute("packet_data") {
89+
packetData := maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_data")
90+
params.PacketData = packetData
91+
if unmarshalErr := jsoniter.Unmarshal([]byte(packetData), &fungibleTokenPacketData); unmarshalErr != nil {
92+
panic("unable to parse `send_packet` event, key `packet_data`")
93+
}
94+
}
95+
96+
if maybeIBCSendPacketEvent.HasAttribute("packet_data_hex") {
97+
packetDataHex := maybeIBCSendPacketEvent.MustGetAttributeByKey("packet_data_hex")
98+
params.PacketDataHex = packetDataHex
99+
100+
var packetData []byte
101+
packetData, err := hex.DecodeString(packetDataHex)
102+
if err == nil {
103+
if err = json.Unmarshal(packetData, &fungibleTokenPacketData); err != nil {
104+
panic("unable to parse `send_packet` event, key `packet_data_hex`")
105+
}
106+
}
107+
}
89108

90109
timeoutHeight := mustParseCosmosSendToIBCTimeoutHeight(params.PacketTimeoutHeight)
91110

usecase/parser/ibc/msg.go

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -951,11 +951,21 @@ func ParseMsgTransfer(
951951
events := log.GetEventsByType("send_packet")
952952
for _, event := range events {
953953
// Transfer application, MsgTransfer
954-
packetData := event.MustGetAttributeByKey("packet_data")
955-
956954
var fungiblePacketData *ibc_model.FungibleTokenPacketData
957-
if unmarshalErr := jsoniter.Unmarshal([]byte(packetData), &fungiblePacketData); unmarshalErr != nil {
958-
panic("unable to parse `send_packet` event, key `packet_data`")
955+
if event.HasAttribute("packet_data") {
956+
packetData := event.MustGetAttributeByKey("packet_data")
957+
if unmarshalErr := jsoniter.Unmarshal([]byte(packetData), &fungiblePacketData); unmarshalErr != nil {
958+
panic("unable to parse `send_packet` event, key `packet_data`")
959+
}
960+
} else if event.HasAttribute("packet_data_hex") {
961+
packetDataHex := event.MustGetAttributeByKey("packet_data_hex")
962+
var packetData []byte
963+
packetData, err := hex.DecodeString(packetDataHex)
964+
if err == nil {
965+
if err = json.Unmarshal(packetData, &fungiblePacketData); err != nil {
966+
parserParams.Logger.Warnf("error unmarshalling packet data hex")
967+
}
968+
}
959969
}
960970

961971
if fungiblePacketData != nil {
@@ -999,10 +1009,21 @@ func ParseMsgTransfer(
9991009
panic("missing `send_packet` event in TxsResult log")
10001010
}
10011011

1002-
packetData := event.MustGetAttributeByKey("packet_data")
10031012
var fungiblePacketData ibc_model.FungibleTokenPacketData
1004-
if unmarshalErr := jsoniter.Unmarshal([]byte(packetData), &fungiblePacketData); unmarshalErr != nil {
1005-
panic("unable to parse `send_packet` event, key `packet_data`")
1013+
if event.HasAttribute("packet_data") {
1014+
packetData := event.MustGetAttributeByKey("packet_data")
1015+
if unmarshalErr := jsoniter.Unmarshal([]byte(packetData), &fungiblePacketData); unmarshalErr != nil {
1016+
panic("unable to parse `send_packet` event, key `packet_data`")
1017+
}
1018+
} else if event.HasAttribute("packet_data_hex") {
1019+
packetDataHex := event.MustGetAttributeByKey("packet_data_hex")
1020+
var packetData []byte
1021+
packetData, err := hex.DecodeString(packetDataHex)
1022+
if err == nil {
1023+
if err = json.Unmarshal(packetData, &fungiblePacketData); err != nil {
1024+
parserParams.Logger.Warnf("error unmarshalling packet data hex")
1025+
}
1026+
}
10061027
}
10071028

10081029
msgTransferParams := ibc_model.MsgTransferParams{
@@ -1172,7 +1193,21 @@ func ParseMsgRecvPacket(
11721193
writeAckEvent := log.GetEventByType("write_acknowledgement")
11731194
var packetAck ibc_model.MsgRecvPacketPacketAck
11741195
if writeAckEvent != nil {
1175-
json.MustUnmarshalFromString(writeAckEvent.MustGetAttributeByKey("packet_ack"), &packetAck)
1196+
if writeAckEvent.HasAttribute("packet_ack") {
1197+
json.MustUnmarshalFromString(writeAckEvent.MustGetAttributeByKey("packet_ack"), &packetAck)
1198+
}
1199+
1200+
if writeAckEvent.HasAttribute("packet_ack_hex") {
1201+
packetAckHex := writeAckEvent.MustGetAttributeByKey("packet_ack_hex")
1202+
1203+
var packetData []byte
1204+
packetData, err = hex.DecodeString(packetAckHex)
1205+
if err == nil {
1206+
if err = json.Unmarshal(packetData, &packetAck); err != nil {
1207+
panic("unable to parse `write_acknowledgement` event, key `packet_ack_hex`")
1208+
}
1209+
}
1210+
}
11761211
}
11771212

11781213
msgRecvPacketParams := ibc_model.MsgRecvPacketParams{

usecase/parser/icaauth/msg.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package icaauth
22

33
import (
4+
"encoding/hex"
45
"encoding/json"
56
"fmt"
67

@@ -66,6 +67,15 @@ func ParseChainmainMsgSubmitTx(
6667
if sendPacketEvent.HasAttribute("packet_data") {
6768
packetData = sendPacketEvent.MustGetAttributeByKey("packet_data")
6869
}
70+
if sendPacketEvent.HasAttribute("packet_data_hex") {
71+
packetDataHex := sendPacketEvent.MustGetAttributeByKey("packet_data_hex")
72+
73+
var packetDataBytes []byte
74+
packetDataBytes, err := hex.DecodeString(packetDataHex)
75+
if err == nil {
76+
packetData = string(packetDataBytes)
77+
}
78+
}
6979
if sendPacketEvent.HasAttribute("packet_timeout_height") {
7080
packetTimeoutHeight = sendPacketEvent.MustGetAttributeByKey("packet_timeout_height")
7181
}
@@ -227,6 +237,15 @@ func ParseMsgSubmitTx(
227237
if sendPacketEvent.HasAttribute("packet_data") {
228238
packetData = sendPacketEvent.MustGetAttributeByKey("packet_data")
229239
}
240+
if sendPacketEvent.HasAttribute("packet_data_hex") {
241+
packetDataHex := sendPacketEvent.MustGetAttributeByKey("packet_data_hex")
242+
243+
var packetDataBytes []byte
244+
packetDataBytes, err := hex.DecodeString(packetDataHex)
245+
if err == nil {
246+
packetData = string(packetDataBytes)
247+
}
248+
}
230249
if sendPacketEvent.HasAttribute("packet_timeout_height") {
231250
packetTimeoutHeight = sendPacketEvent.MustGetAttributeByKey("packet_timeout_height")
232251
}

0 commit comments

Comments
 (0)