From 27d5587efb8614559e9bfc740c9fbea912503b49 Mon Sep 17 00:00:00 2001 From: Artem Date: Thu, 12 Sep 2024 11:30:38 +0300 Subject: [PATCH] Fix: events from v0.13.3 --- pkg/abi/data.go | 31 ++++++++++++ pkg/abi/data_test.go | 113 +++++++++++++++++++++++++++++++++++++++++++ pkg/abi/decode.go | 6 ++- 3 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 pkg/abi/data_test.go diff --git a/pkg/abi/data.go b/pkg/abi/data.go index d1bd528..1a105ee 100644 --- a/pkg/abi/data.go +++ b/pkg/abi/data.go @@ -1,5 +1,7 @@ package abi +import "github.com/goccy/go-json" + // abi types const ( FunctionType = "function" @@ -60,6 +62,7 @@ type Abi struct { type Type struct { Type string `json:"type"` Name string `json:"name"` + Kind string `json:"kind,omitempty"` } // FunctionItem - @@ -79,6 +82,34 @@ type EventItem struct { Inputs []Type `json:"inputs"` } +type members struct { + Members []Type `json:"members"` +} + +func (item *EventItem) UnmarshalJSON(data []byte) error { + type buf EventItem + if err := json.Unmarshal(data, (*buf)(item)); err != nil { + return err + } + if item.Data == nil && item.Keys == nil { + var m members + if err := json.Unmarshal(data, &m); err != nil { + return err + } + item.Data = make([]Type, 0) + item.Keys = make([]Type, 0) + for i := range m.Members { + switch m.Members[i].Kind { + case "data": + item.Data = append(item.Data, m.Members[i]) + case "keys": + item.Keys = append(item.Keys, m.Members[i]) + } + } + } + return nil +} + // StructItem - type StructItem struct { Type diff --git a/pkg/abi/data_test.go b/pkg/abi/data_test.go new file mode 100644 index 0000000..fb48d25 --- /dev/null +++ b/pkg/abi/data_test.go @@ -0,0 +1,113 @@ +package abi + +import ( + "testing" + + "github.com/goccy/go-json" + "github.com/stretchr/testify/require" +) + +func TestEventItem_UnmarshalJSON(t *testing.T) { + tests := []struct { + name string + want EventItem + data []byte + }{ + { + name: "new Transfer", + data: []byte(`{ + "kind": "struct", + "name": "openzeppelin::token::erc20_v070::erc20::ERC20::Transfer", + "type": "event", + "members": [ + { + "kind": "data", + "name": "from", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "to", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "kind": "data", + "name": "value", + "type": "core::integer::u256" + } + ] + }`), + want: EventItem{ + Type: Type{ + Name: "openzeppelin::token::erc20_v070::erc20::ERC20::Transfer", + Type: "event", + Kind: "struct", + }, + Data: []Type{ + { + Kind: "data", + Name: "from", + Type: "core::starknet::contract_address::ContractAddress", + }, { + Kind: "data", + Name: "to", + Type: "core::starknet::contract_address::ContractAddress", + }, { + Kind: "data", + Name: "value", + Type: "core::integer::u256", + }, + }, + Keys: []Type{}, + }, + }, { + name: "old Transfer", + data: []byte(`{ + "name": "transfer", + "type": "event", + "data": [ + { + "name": "from", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "to", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "value", + "type": "core::integer::u256" + } + ], + "keys":[] + }`), + want: EventItem{ + Type: Type{ + Name: "transfer", + Type: "event", + }, + Data: []Type{ + { + Name: "from", + Type: "core::starknet::contract_address::ContractAddress", + }, { + Name: "to", + Type: "core::starknet::contract_address::ContractAddress", + }, { + Name: "value", + Type: "core::integer::u256", + }, + }, + Keys: []Type{}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var item EventItem + err := json.Unmarshal(tt.data, &item) + require.NoError(t, err) + require.Equal(t, tt.want, item) + }) + } +} diff --git a/pkg/abi/decode.go b/pkg/abi/decode.go index b69a8da..a442f26 100644 --- a/pkg/abi/decode.go +++ b/pkg/abi/decode.go @@ -111,10 +111,12 @@ func DecodeEventData(data []string, typ EventItem, structs map[string]*StructIte result = make(map[string]any, 0) tail = data err error + + eventData = append(typ.Keys, typ.Data...) ) - for _, input := range typ.Data { - tail, err = decodeItem(tail, input, structs, enums, result) + for i := range eventData { + tail, err = decodeItem(tail, eventData[i], structs, enums, result) if err != nil { return nil, err }