diff --git a/chain_capabilities/solana/trigger/trigger.go b/chain_capabilities/solana/trigger/trigger.go index 60f11ff2c..8e5147ae6 100644 --- a/chain_capabilities/solana/trigger/trigger.go +++ b/chain_capabilities/solana/trigger/trigger.go @@ -36,6 +36,8 @@ const ( SuffixLogTriggerFilterID = "-solana-log-trigger" defaultQueryLimit = 1000 defaultMaxPagesPerPoll = 5 + maxSubkeysPerTrigger = 4 + maxComparersPerSubkey = 10 ) func publicKeyFromBytes(fieldName string, raw []byte) (solana.PublicKey, error) { @@ -64,11 +66,16 @@ func validateFilterConfig(config *solanacappb.FilterLogTriggerRequest) error { return fmt.Errorf("event idl json cannot be empty") } + if len(config.Subkeys) > maxSubkeysPerTrigger { + return fmt.Errorf("too many subkeys: maximum supported is %d, got %d", maxSubkeysPerTrigger, len(config.Subkeys)) + } + if config.CpiFilterConfig != nil { if _, err := publicKeyFromBytes("cpi filter destination address", config.CpiFilterConfig.DestAddress); err != nil { return err } } + return validateSubkeyComparers(config.Subkeys) } @@ -77,6 +84,9 @@ func validateSubkeyComparers(subkeys []*solanacappb.SubkeyConfig) error { if subkey == nil || len(subkey.Comparers) < 2 { continue } + if len(subkey.Comparers) > maxComparersPerSubkey { + return fmt.Errorf("subkey %d has too many comparers: %d limit: %d", i, len(subkey.Comparers), maxComparersPerSubkey) + } eqValues := make(map[string]struct{}) for _, comp := range subkey.Comparers { diff --git a/chain_capabilities/solana/trigger/trigger_test.go b/chain_capabilities/solana/trigger/trigger_test.go index da79c7735..420c3fbb9 100644 --- a/chain_capabilities/solana/trigger/trigger_test.go +++ b/chain_capabilities/solana/trigger/trigger_test.go @@ -197,6 +197,24 @@ func TestRegisterLogTrigger(t *testing.T) { mockSolana.AssertExpectations(t) }) + t.Run("too many subkeys", func(t *testing.T) { + service, mockSolana := setupTest(t) + request := createTestRequest() + request.Subkeys = []*solanacappb.SubkeyConfig{ + {Path: []string{"f1"}}, + {Path: []string{"f2"}}, + {Path: []string{"f3"}}, + {Path: []string{"f4"}}, + {Path: []string{"f5"}}, + } + + _, err := service.RegisterLogTrigger(ctx, testTriggerID, testRequestMetadata(), request) + + require.NotNil(t, err) + assert.Contains(t, err.Error(), "maximum supported is 4") + mockSolana.AssertExpectations(t) + }) + t.Run("register log tracking fails", func(t *testing.T) { service, mockSolana := setupTest(t) request := createTestRequest()