Skip to content

Commit 405e888

Browse files
justinkasemanhendoxc
authored andcommitted
(fix): Allow pointers to bytes in PreCodec modifier (#975)
1 parent 0b12d46 commit 405e888

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

pkg/codec/precodec.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func NewPreCodec(fields map[string]string, codecs map[string]types.RemoteCodec)
3030
}
3131

3232
m.modifyFieldForInput = func(_ string, field *reflect.StructField, _ string, typeDef string) error {
33-
if field.Type != reflect.SliceOf(reflect.TypeFor[uint8]()) {
33+
if field.Type != reflect.SliceOf(reflect.TypeFor[uint8]()) && field.Type != reflect.PointerTo(reflect.SliceOf(reflect.TypeFor[uint8]())) {
3434
return fmt.Errorf("can only decode []byte from on-chain: %s", field.Type)
3535
}
3636

pkg/codec/precodec_test.go

+26-1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ type testStructOn struct {
6161
Bid int
6262
}
6363

64+
type testStructOnPointer struct {
65+
Ask *[]byte
66+
Bid int
67+
}
68+
6469
type nestedTestStructOn struct {
6570
Report []byte
6671
FeedID [32]byte
@@ -84,6 +89,12 @@ func TestPreCodec(t *testing.T) {
8489
)
8590
require.NoError(t, err)
8691

92+
pointerPreCodec, err := codec.NewPreCodec(
93+
map[string]string{"Ask": "uint256"},
94+
map[string]types.RemoteCodec{"uint256": ExampleCodec{offChainType: int(0)}},
95+
)
96+
require.NoError(t, err)
97+
8798
nestedPreCodec, err := codec.NewPreCodec(
8899
map[string]string{"Report": TestStructOffDef},
89100
map[string]types.RemoteCodec{TestStructOffDef: ExampleCodec{offChainType: testStructOff{}}},
@@ -122,7 +133,7 @@ func TestPreCodec(t *testing.T) {
122133
assert.Equal(t, reflect.TypeOf(int(0)), field1.Type)
123134
})
124135

125-
t.Run("RetypeToOffChain works on pointers", func(t *testing.T) {
136+
t.Run("RetypeToOffChain works on pointers to type", func(t *testing.T) {
126137
offChainType, err := preCodec.RetypeToOffChain(reflect.PointerTo(reflect.TypeOf(testStructOn{})), "")
127138
require.NoError(t, err)
128139
assert.Equal(t, reflect.Ptr, offChainType.Kind())
@@ -136,6 +147,20 @@ func TestPreCodec(t *testing.T) {
136147
assert.Equal(t, reflect.TypeOf(int(0)), field1.Type)
137148
})
138149

150+
t.Run("RetypeToOffChain works on pointers", func(t *testing.T) {
151+
offChainType, err := pointerPreCodec.RetypeToOffChain(reflect.PointerTo(reflect.TypeOf(testStructOnPointer{})), "")
152+
require.NoError(t, err)
153+
assert.Equal(t, reflect.Ptr, offChainType.Kind())
154+
elem := offChainType.Elem()
155+
require.Equal(t, 2, elem.NumField())
156+
field0 := elem.Field(0)
157+
assert.Equal(t, "Ask", field0.Name)
158+
assert.Equal(t, reflect.TypeOf(int(0)), field0.Type)
159+
field1 := elem.Field(1)
160+
assert.Equal(t, "Bid", field1.Name)
161+
assert.Equal(t, reflect.TypeOf(int(0)), field1.Type)
162+
})
163+
139164
t.Run("RetypeToOffChain works on slices", func(t *testing.T) {
140165
offChainType, err := preCodec.RetypeToOffChain(reflect.SliceOf(reflect.TypeOf(testStructOn{})), "")
141166
require.NoError(t, err)

0 commit comments

Comments
 (0)