Skip to content

Commit afd603d

Browse files
authored
Solana LogTrigger: Support Anchor 0.3 and CPI Events (#1872)
* Solana LogTrigger: Change eventIdlJson to contractIdlJson * Added CPIFilterConfig to generated code and proto helpers (#1875) * Added CPIFilterConfig to generated code and proto helpers * Added CPIFilterConfig to generated code and proto helpers
1 parent c51b9c4 commit afd603d

8 files changed

Lines changed: 409 additions & 170 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ require (
4343
github.com/smartcontractkit/chain-selectors v1.0.89
4444
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10
4545
github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4
46-
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260409211238-5b99921cbc7c
46+
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260420204255-a3f3bdd56877
4747
github.com/smartcontractkit/chainlink-protos/linking-service/go v0.0.0-20251002192024-d2ad9222409b
4848
github.com/smartcontractkit/chainlink-protos/node-platform v0.0.0-20260205130626-db2a2aab956b
4949
github.com/smartcontractkit/chainlink-protos/storage-service v0.3.0

go.sum

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/capabilities/v2/chain-capabilities/solana/client.pb.go

Lines changed: 137 additions & 68 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/chains/solana/proto_helpers.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,11 @@ func ConvertLPFilterQueryFromProto(p *LPFilterQuery) (*solana.LPFilterQuery, err
15401540
}
15411541
}
15421542

1543+
cpiFilterConfig, err := ConvertCPIFilterConfigToProto(p.CpiFilterConfig)
1544+
if err != nil {
1545+
return nil, fmt.Errorf("convert cpi filter config err: %w", err)
1546+
}
1547+
15431548
return &solana.LPFilterQuery{
15441549
Name: p.Name,
15451550
Address: addr,
@@ -1551,6 +1556,21 @@ func ConvertLPFilterQueryFromProto(p *LPFilterQuery) (*solana.LPFilterQuery, err
15511556
Retention: time.Duration(p.Retention),
15521557
MaxLogsKept: p.MaxLogsKept,
15531558
IncludeReverted: p.IncludeReverted,
1559+
CPIFilterConfig: cpiFilterConfig,
1560+
}, nil
1561+
}
1562+
1563+
func ConvertCPIFilterConfigToProto(c *CPIFilterConfig) (*solana.CPIFilterConfig, error) {
1564+
if c == nil {
1565+
return nil, nil
1566+
}
1567+
addr, err := ConvertPublicKeyFromProto(c.DestAddress)
1568+
if err != nil {
1569+
return nil, fmt.Errorf("convert address err: %w", err)
1570+
}
1571+
return &solana.CPIFilterConfig{
1572+
DestAddress: addr,
1573+
MethodName: string(c.MethodName),
15541574
}, nil
15551575
}
15561576

@@ -1596,6 +1616,17 @@ func ConvertLPFilterQueryToProto(f *solana.LPFilterQuery) *LPFilterQuery {
15961616
Retention: int64(f.Retention),
15971617
MaxLogsKept: f.MaxLogsKept,
15981618
IncludeReverted: f.IncludeReverted,
1619+
CpiFilterConfig: convertCPIFilterConfigGoToProto(f.CPIFilterConfig),
1620+
}
1621+
}
1622+
1623+
func convertCPIFilterConfigGoToProto(c *solana.CPIFilterConfig) *CPIFilterConfig {
1624+
if c == nil {
1625+
return nil
1626+
}
1627+
return &CPIFilterConfig{
1628+
DestAddress: c.DestAddress[:],
1629+
MethodName: []byte(c.MethodName),
15991630
}
16001631
}
16011632

pkg/chains/solana/proto_helpers_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,3 +401,61 @@ func TestErrorJoinBehavior_PublicKeys(t *testing.T) {
401401
// Ensure errors.Is behaves reasonably (not super strict here)
402402
require.True(t, errors.Is(err, err))
403403
}
404+
405+
func TestConvertCPIFilterConfigToProto(t *testing.T) {
406+
t.Run("nil input returns nil", func(t *testing.T) {
407+
got, err := conv.ConvertCPIFilterConfigToProto(nil)
408+
require.NoError(t, err)
409+
require.Nil(t, got)
410+
})
411+
412+
t.Run("valid config converts successfully", func(t *testing.T) {
413+
addr := mkBytes(typesolana.PublicKeyLength, 0xAB)
414+
methodName := []byte("someMethod")
415+
in := &conv.CPIFilterConfig{
416+
DestAddress: addr,
417+
MethodName: methodName,
418+
}
419+
got, err := conv.ConvertCPIFilterConfigToProto(in)
420+
require.NoError(t, err)
421+
require.NotNil(t, got)
422+
require.Equal(t, addr, got.DestAddress[:])
423+
require.Equal(t, "someMethod", got.MethodName)
424+
})
425+
426+
t.Run("nil address returns error", func(t *testing.T) {
427+
in := &conv.CPIFilterConfig{
428+
DestAddress: nil,
429+
MethodName: []byte("method"),
430+
}
431+
got, err := conv.ConvertCPIFilterConfigToProto(in)
432+
require.Error(t, err)
433+
require.Nil(t, got)
434+
require.Contains(t, err.Error(), "convert address err")
435+
require.Contains(t, err.Error(), "address can't be nil")
436+
})
437+
438+
t.Run("invalid address length returns error", func(t *testing.T) {
439+
in := &conv.CPIFilterConfig{
440+
DestAddress: mkBytes(typesolana.PublicKeyLength-1, 0x01),
441+
MethodName: []byte("method"),
442+
}
443+
got, err := conv.ConvertCPIFilterConfigToProto(in)
444+
require.Error(t, err)
445+
require.Nil(t, got)
446+
require.Contains(t, err.Error(), "convert address err")
447+
require.Contains(t, err.Error(), "invalid public key")
448+
})
449+
450+
t.Run("empty method name is allowed", func(t *testing.T) {
451+
addr := mkBytes(typesolana.PublicKeyLength, 0x11)
452+
in := &conv.CPIFilterConfig{
453+
DestAddress: addr,
454+
MethodName: nil,
455+
}
456+
got, err := conv.ConvertCPIFilterConfigToProto(in)
457+
require.NoError(t, err)
458+
require.NotNil(t, got)
459+
require.Equal(t, "", got.MethodName)
460+
})
461+
}

0 commit comments

Comments
 (0)