Skip to content

Commit 749ce31

Browse files
authored
fix: normalize OCR3 transmitter encoding in LocalRegistry (#22062)
* fix: normalize OCR3 transmitters in local registry * test: make OCR3 config assertion explicit
1 parent 2cd92cd commit 749ce31

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

core/services/registrysyncer/local_registry.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package registrysyncer
22

33
import (
44
"context"
5+
"encoding/hex"
56
"errors"
67
"fmt"
78
"math"
@@ -116,7 +117,10 @@ func (c CapabilityConfiguration) Unmarshal() (capabilities.CapabilityConfigurati
116117
}
117118
transmitters := make([]ocrtypes.Account, len(pbCfg.Transmitters))
118119
for i, t := range pbCfg.Transmitters {
119-
transmitters[i] = ocrtypes.Account(t)
120+
// OCR3 transmitter accounts cross the loop boundary as hex-encoded text.
121+
// Keep LocalRegistry aligned with the external OCR config service so the
122+
// imported registry path and the direct registry path serialize the same way.
123+
transmitters[i] = ocrtypes.Account(hex.EncodeToString(t))
120124
}
121125
if pbCfg.F > math.MaxUint8 {
122126
return capabilities.CapabilityConfiguration{}, fmt.Errorf("OCR3Config %q: F value %d exceeds uint8 max", name, pbCfg.F)

core/services/registrysyncer/local_registry_test.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func TestCapabilityConfiguration_Unmarshal(t *testing.T) {
186186

187187
t.Run("Ocr3Configs", func(t *testing.T) {
188188
signer := []byte{0x01, 0x02, 0x03}
189-
transmitter := []byte("0xabc")
189+
transmitter := []byte{0xde, 0xad, 0xbe, 0xef}
190190

191191
raw := mustMarshalProto(t, &capabilitiespb.CapabilityConfig{
192192
Ocr3Configs: map[string]*capabilitiespb.OCR3Config{
@@ -209,14 +209,41 @@ func TestCapabilityConfiguration_Unmarshal(t *testing.T) {
209209
require.Contains(t, got.Ocr3Configs, "__default__")
210210
cfg := got.Ocr3Configs["__default__"]
211211
assert.Equal(t, []ocrtypes.OnchainPublicKey{signer}, cfg.Signers)
212-
assert.Equal(t, []ocrtypes.Account{ocrtypes.Account(transmitter)}, cfg.Transmitters)
212+
assert.Equal(t, []ocrtypes.Account{ocrtypes.Account("deadbeef")}, cfg.Transmitters)
213213
assert.Equal(t, uint8(2), cfg.F)
214214
assert.Equal(t, []byte("onchain"), cfg.OnchainConfig)
215215
assert.Equal(t, uint64(5), cfg.OffchainConfigVersion)
216216
assert.Equal(t, []byte("offchain"), cfg.OffchainConfig)
217217
assert.Equal(t, uint64(3), cfg.ConfigCount)
218218
})
219219

220+
t.Run("Ocr3Configs normalizes transmitters to hex text", func(t *testing.T) {
221+
raw := mustMarshalProto(t, &capabilitiespb.CapabilityConfig{
222+
Ocr3Configs: map[string]*capabilitiespb.OCR3Config{
223+
"aptos": {
224+
Transmitters: [][]byte{
225+
{0x00, 0xff},
226+
[]byte("ascii-bytes"),
227+
},
228+
},
229+
},
230+
})
231+
cc := CapabilityConfiguration{Config: raw}
232+
233+
got, err := cc.Unmarshal()
234+
require.NoError(t, err)
235+
236+
require.Contains(t, got.Ocr3Configs, "aptos")
237+
cfg := got.Ocr3Configs["aptos"]
238+
assert.Equal(t,
239+
[]ocrtypes.Account{
240+
ocrtypes.Account("00ff"),
241+
ocrtypes.Account("61736369692d6279746573"),
242+
},
243+
cfg.Transmitters,
244+
)
245+
})
246+
220247
t.Run("OracleFactoryConfigs", func(t *testing.T) {
221248
raw := mustMarshalProto(t, &capabilitiespb.CapabilityConfig{
222249
OracleFactoryConfigs: map[string]*valuespb.Map{

0 commit comments

Comments
 (0)