From b403079b28054659d66944a44e6d7bae1fb662dc Mon Sep 17 00:00:00 2001 From: Justin Kaseman Date: Sat, 14 Dec 2024 07:58:18 -0800 Subject: [PATCH] (fix): Allow pointers to bytes in PreCodec modifier (#975) --- pkg/codec/precodec.go | 2 +- pkg/codec/precodec_test.go | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/pkg/codec/precodec.go b/pkg/codec/precodec.go index 447f97dcb..de5dec055 100644 --- a/pkg/codec/precodec.go +++ b/pkg/codec/precodec.go @@ -30,7 +30,7 @@ func NewPreCodec(fields map[string]string, codecs map[string]types.RemoteCodec) } m.modifyFieldForInput = func(_ string, field *reflect.StructField, _ string, typeDef string) error { - if field.Type != reflect.SliceOf(reflect.TypeFor[uint8]()) { + if field.Type != reflect.SliceOf(reflect.TypeFor[uint8]()) && field.Type != reflect.PointerTo(reflect.SliceOf(reflect.TypeFor[uint8]())) { return fmt.Errorf("can only decode []byte from on-chain: %s", field.Type) } diff --git a/pkg/codec/precodec_test.go b/pkg/codec/precodec_test.go index 9911ee877..e7835bd16 100644 --- a/pkg/codec/precodec_test.go +++ b/pkg/codec/precodec_test.go @@ -61,6 +61,11 @@ type testStructOn struct { Bid int } +type testStructOnPointer struct { + Ask *[]byte + Bid int +} + type nestedTestStructOn struct { Report []byte FeedID [32]byte @@ -84,6 +89,12 @@ func TestPreCodec(t *testing.T) { ) require.NoError(t, err) + pointerPreCodec, err := codec.NewPreCodec( + map[string]string{"Ask": "uint256"}, + map[string]types.RemoteCodec{"uint256": ExampleCodec{offChainType: int(0)}}, + ) + require.NoError(t, err) + nestedPreCodec, err := codec.NewPreCodec( map[string]string{"Report": TestStructOffDef}, map[string]types.RemoteCodec{TestStructOffDef: ExampleCodec{offChainType: testStructOff{}}}, @@ -122,7 +133,7 @@ func TestPreCodec(t *testing.T) { assert.Equal(t, reflect.TypeOf(int(0)), field1.Type) }) - t.Run("RetypeToOffChain works on pointers", func(t *testing.T) { + t.Run("RetypeToOffChain works on pointers to type", func(t *testing.T) { offChainType, err := preCodec.RetypeToOffChain(reflect.PointerTo(reflect.TypeOf(testStructOn{})), "") require.NoError(t, err) assert.Equal(t, reflect.Ptr, offChainType.Kind()) @@ -136,6 +147,20 @@ func TestPreCodec(t *testing.T) { assert.Equal(t, reflect.TypeOf(int(0)), field1.Type) }) + t.Run("RetypeToOffChain works on pointers", func(t *testing.T) { + offChainType, err := pointerPreCodec.RetypeToOffChain(reflect.PointerTo(reflect.TypeOf(testStructOnPointer{})), "") + require.NoError(t, err) + assert.Equal(t, reflect.Ptr, offChainType.Kind()) + elem := offChainType.Elem() + require.Equal(t, 2, elem.NumField()) + field0 := elem.Field(0) + assert.Equal(t, "Ask", field0.Name) + assert.Equal(t, reflect.TypeOf(int(0)), field0.Type) + field1 := elem.Field(1) + assert.Equal(t, "Bid", field1.Name) + assert.Equal(t, reflect.TypeOf(int(0)), field1.Type) + }) + t.Run("RetypeToOffChain works on slices", func(t *testing.T) { offChainType, err := preCodec.RetypeToOffChain(reflect.SliceOf(reflect.TypeOf(testStructOn{})), "") require.NoError(t, err)