Skip to content

Commit f563d17

Browse files
Fix: decoding event from members
1 parent 27d5587 commit f563d17

File tree

4 files changed

+123
-15
lines changed

4 files changed

+123
-15
lines changed

pkg/abi/data.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,33 +77,29 @@ type FunctionItem struct {
7777
type EventItem struct {
7878
Type
7979

80-
Data []Type `json:"data"`
81-
Keys []Type `json:"keys"`
82-
Inputs []Type `json:"inputs"`
80+
Members []Type `json:"members,omitempty"`
81+
Data []Type `json:"data"`
82+
Keys []Type `json:"keys"`
83+
Inputs []Type `json:"inputs"`
8384
}
8485

85-
type members struct {
86-
Members []Type `json:"members"`
86+
type Members struct {
8787
}
8888

8989
func (item *EventItem) UnmarshalJSON(data []byte) error {
9090
type buf EventItem
9191
if err := json.Unmarshal(data, (*buf)(item)); err != nil {
9292
return err
9393
}
94-
if item.Data == nil && item.Keys == nil {
95-
var m members
96-
if err := json.Unmarshal(data, &m); err != nil {
97-
return err
98-
}
94+
if item.Kind == StructType {
9995
item.Data = make([]Type, 0)
10096
item.Keys = make([]Type, 0)
101-
for i := range m.Members {
102-
switch m.Members[i].Kind {
97+
for i := range item.Members {
98+
switch item.Members[i].Kind {
10399
case "data":
104-
item.Data = append(item.Data, m.Members[i])
100+
item.Data = append(item.Data, item.Members[i])
105101
case "keys":
106-
item.Keys = append(item.Keys, m.Members[i])
102+
item.Keys = append(item.Keys, item.Members[i])
107103
}
108104
}
109105
}

pkg/abi/data_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,21 @@ func TestEventItem_UnmarshalJSON(t *testing.T) {
4343
Type: "event",
4444
Kind: "struct",
4545
},
46+
Members: []Type{
47+
{
48+
Kind: "data",
49+
Name: "from",
50+
Type: "core::starknet::contract_address::ContractAddress",
51+
}, {
52+
Kind: "data",
53+
Name: "to",
54+
Type: "core::starknet::contract_address::ContractAddress",
55+
}, {
56+
Kind: "data",
57+
Name: "value",
58+
Type: "core::integer::u256",
59+
},
60+
},
4661
Data: []Type{
4762
{
4863
Kind: "data",

pkg/abi/decode.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,15 @@ func DecodeEventData(data []string, typ EventItem, structs map[string]*StructIte
112112
tail = data
113113
err error
114114

115-
eventData = append(typ.Keys, typ.Data...)
115+
eventData []Type
116116
)
117117

118+
if len(typ.Members) > 0 {
119+
eventData = typ.Members
120+
} else {
121+
eventData = append(typ.Keys, typ.Data...)
122+
}
123+
118124
for i := range eventData {
119125
tail, err = decodeItem(tail, eventData[i], structs, enums, result)
120126
if err != nil {

pkg/abi/decode_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,3 +1070,94 @@ func TestDecodeFunctionCallData(t *testing.T) {
10701070
})
10711071
}
10721072
}
1073+
1074+
func TestDecodeEventData(t *testing.T) {
1075+
type args struct {
1076+
data []string
1077+
typ EventItem
1078+
structs map[string]*StructItem
1079+
enums map[string]*EnumItem
1080+
}
1081+
tests := []struct {
1082+
name string
1083+
args args
1084+
want map[string]any
1085+
wantErr bool
1086+
}{
1087+
{
1088+
name: "test 1",
1089+
args: args{
1090+
data: []string{
1091+
"0x2a",
1092+
"0x1a62446e05ee60540d94b2e731ed037a1798065f9b8e719e293180b493b91f7",
1093+
},
1094+
typ: EventItem{
1095+
Type: Type{
1096+
Name: "hello::HelloStarknet::BalanceIncreased",
1097+
Type: "event",
1098+
Kind: "struct",
1099+
},
1100+
Members: []Type{
1101+
{
1102+
Name: "amount",
1103+
Type: "core::felt252",
1104+
Kind: "data",
1105+
}, {
1106+
Name: "by",
1107+
Type: "core::starknet::contract_address::ContractAddress",
1108+
Kind: "key",
1109+
},
1110+
},
1111+
Data: []Type{
1112+
{
1113+
Name: "amount",
1114+
Type: "core::felt252",
1115+
Kind: "data",
1116+
},
1117+
},
1118+
Keys: []Type{
1119+
{
1120+
Name: "by",
1121+
Type: "core::starknet::contract_address::ContractAddress",
1122+
Kind: "key",
1123+
},
1124+
},
1125+
},
1126+
structs: map[string]*StructItem{
1127+
"hello::HelloStarknet::BalanceIncreased": {
1128+
Members: []Member{
1129+
{
1130+
Type: Type{
1131+
Name: "amount",
1132+
Type: "core::felt252",
1133+
Kind: "data",
1134+
},
1135+
}, {
1136+
Type: Type{
1137+
Name: "by",
1138+
Type: "core::starknet::contract_address::ContractAddress",
1139+
Kind: "key",
1140+
},
1141+
},
1142+
},
1143+
},
1144+
},
1145+
enums: map[string]*EnumItem{},
1146+
},
1147+
want: map[string]any{
1148+
"amount": "0x2a",
1149+
"by": "0x1a62446e05ee60540d94b2e731ed037a1798065f9b8e719e293180b493b91f7",
1150+
},
1151+
wantErr: false,
1152+
},
1153+
}
1154+
for _, tt := range tests {
1155+
t.Run(tt.name, func(t *testing.T) {
1156+
got, err := DecodeEventData(tt.args.data, tt.args.typ, tt.args.structs, tt.args.enums)
1157+
require.Equal(t, tt.wantErr, err != nil)
1158+
if !tt.wantErr {
1159+
require.Equal(t, tt.want, got)
1160+
}
1161+
})
1162+
}
1163+
}

0 commit comments

Comments
 (0)