Skip to content

Commit 27d5587

Browse files
Fix: events from v0.13.3
1 parent 592465a commit 27d5587

File tree

3 files changed

+148
-2
lines changed

3 files changed

+148
-2
lines changed

pkg/abi/data.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package abi
22

3+
import "github.com/goccy/go-json"
4+
35
// abi types
46
const (
57
FunctionType = "function"
@@ -60,6 +62,7 @@ type Abi struct {
6062
type Type struct {
6163
Type string `json:"type"`
6264
Name string `json:"name"`
65+
Kind string `json:"kind,omitempty"`
6366
}
6467

6568
// FunctionItem -
@@ -79,6 +82,34 @@ type EventItem struct {
7982
Inputs []Type `json:"inputs"`
8083
}
8184

85+
type members struct {
86+
Members []Type `json:"members"`
87+
}
88+
89+
func (item *EventItem) UnmarshalJSON(data []byte) error {
90+
type buf EventItem
91+
if err := json.Unmarshal(data, (*buf)(item)); err != nil {
92+
return err
93+
}
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+
}
99+
item.Data = make([]Type, 0)
100+
item.Keys = make([]Type, 0)
101+
for i := range m.Members {
102+
switch m.Members[i].Kind {
103+
case "data":
104+
item.Data = append(item.Data, m.Members[i])
105+
case "keys":
106+
item.Keys = append(item.Keys, m.Members[i])
107+
}
108+
}
109+
}
110+
return nil
111+
}
112+
82113
// StructItem -
83114
type StructItem struct {
84115
Type

pkg/abi/data_test.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package abi
2+
3+
import (
4+
"testing"
5+
6+
"github.com/goccy/go-json"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestEventItem_UnmarshalJSON(t *testing.T) {
11+
tests := []struct {
12+
name string
13+
want EventItem
14+
data []byte
15+
}{
16+
{
17+
name: "new Transfer",
18+
data: []byte(`{
19+
"kind": "struct",
20+
"name": "openzeppelin::token::erc20_v070::erc20::ERC20::Transfer",
21+
"type": "event",
22+
"members": [
23+
{
24+
"kind": "data",
25+
"name": "from",
26+
"type": "core::starknet::contract_address::ContractAddress"
27+
},
28+
{
29+
"kind": "data",
30+
"name": "to",
31+
"type": "core::starknet::contract_address::ContractAddress"
32+
},
33+
{
34+
"kind": "data",
35+
"name": "value",
36+
"type": "core::integer::u256"
37+
}
38+
]
39+
}`),
40+
want: EventItem{
41+
Type: Type{
42+
Name: "openzeppelin::token::erc20_v070::erc20::ERC20::Transfer",
43+
Type: "event",
44+
Kind: "struct",
45+
},
46+
Data: []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+
},
61+
Keys: []Type{},
62+
},
63+
}, {
64+
name: "old Transfer",
65+
data: []byte(`{
66+
"name": "transfer",
67+
"type": "event",
68+
"data": [
69+
{
70+
"name": "from",
71+
"type": "core::starknet::contract_address::ContractAddress"
72+
},
73+
{
74+
"name": "to",
75+
"type": "core::starknet::contract_address::ContractAddress"
76+
},
77+
{
78+
"name": "value",
79+
"type": "core::integer::u256"
80+
}
81+
],
82+
"keys":[]
83+
}`),
84+
want: EventItem{
85+
Type: Type{
86+
Name: "transfer",
87+
Type: "event",
88+
},
89+
Data: []Type{
90+
{
91+
Name: "from",
92+
Type: "core::starknet::contract_address::ContractAddress",
93+
}, {
94+
Name: "to",
95+
Type: "core::starknet::contract_address::ContractAddress",
96+
}, {
97+
Name: "value",
98+
Type: "core::integer::u256",
99+
},
100+
},
101+
Keys: []Type{},
102+
},
103+
},
104+
}
105+
for _, tt := range tests {
106+
t.Run(tt.name, func(t *testing.T) {
107+
var item EventItem
108+
err := json.Unmarshal(tt.data, &item)
109+
require.NoError(t, err)
110+
require.Equal(t, tt.want, item)
111+
})
112+
}
113+
}

pkg/abi/decode.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,12 @@ func DecodeEventData(data []string, typ EventItem, structs map[string]*StructIte
111111
result = make(map[string]any, 0)
112112
tail = data
113113
err error
114+
115+
eventData = append(typ.Keys, typ.Data...)
114116
)
115117

116-
for _, input := range typ.Data {
117-
tail, err = decodeItem(tail, input, structs, enums, result)
118+
for i := range eventData {
119+
tail, err = decodeItem(tail, eventData[i], structs, enums, result)
118120
if err != nil {
119121
return nil, err
120122
}

0 commit comments

Comments
 (0)