diff --git a/core/capabilities/mocks/executable_and_trigger_capability.go b/core/capabilities/mocks/executable_and_trigger_capability.go index 18735abe278..40355049579 100644 --- a/core/capabilities/mocks/executable_and_trigger_capability.go +++ b/core/capabilities/mocks/executable_and_trigger_capability.go @@ -23,6 +23,53 @@ func (_m *ExecutableAndTriggerCapability) EXPECT() *ExecutableAndTriggerCapabili return &ExecutableAndTriggerCapability_Expecter{mock: &_m.Mock} } +// AckEvent provides a mock function with given fields: ctx, eventId +func (_m *ExecutableAndTriggerCapability) AckEvent(ctx context.Context, eventId string) error { + ret := _m.Called(ctx, eventId) + + if len(ret) == 0 { + panic("no return value specified for AckEvent") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { + r0 = rf(ctx, eventId) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ExecutableAndTriggerCapability_AckEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AckEvent' +type ExecutableAndTriggerCapability_AckEvent_Call struct { + *mock.Call +} + +// AckEvent is a helper method to define mock.On call +// - ctx context.Context +// - eventId string +func (_e *ExecutableAndTriggerCapability_Expecter) AckEvent(ctx interface{}, eventId interface{}) *ExecutableAndTriggerCapability_AckEvent_Call { + return &ExecutableAndTriggerCapability_AckEvent_Call{Call: _e.mock.On("AckEvent", ctx, eventId)} +} + +func (_c *ExecutableAndTriggerCapability_AckEvent_Call) Run(run func(ctx context.Context, eventId string)) *ExecutableAndTriggerCapability_AckEvent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *ExecutableAndTriggerCapability_AckEvent_Call) Return(_a0 error) *ExecutableAndTriggerCapability_AckEvent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ExecutableAndTriggerCapability_AckEvent_Call) RunAndReturn(run func(context.Context, string) error) *ExecutableAndTriggerCapability_AckEvent_Call { + _c.Call.Return(run) + return _c +} + // Execute provides a mock function with given fields: ctx, request func (_m *ExecutableAndTriggerCapability) Execute(ctx context.Context, request capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) { ret := _m.Called(ctx, request) diff --git a/core/capabilities/mocks/trigger_capability.go b/core/capabilities/mocks/trigger_capability.go index 5386e9d394e..d29b3e5f4f1 100644 --- a/core/capabilities/mocks/trigger_capability.go +++ b/core/capabilities/mocks/trigger_capability.go @@ -23,6 +23,53 @@ func (_m *TriggerCapability) EXPECT() *TriggerCapability_Expecter { return &TriggerCapability_Expecter{mock: &_m.Mock} } +// AckEvent provides a mock function with given fields: ctx, eventId +func (_m *TriggerCapability) AckEvent(ctx context.Context, eventId string) error { + ret := _m.Called(ctx, eventId) + + if len(ret) == 0 { + panic("no return value specified for AckEvent") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { + r0 = rf(ctx, eventId) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// TriggerCapability_AckEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AckEvent' +type TriggerCapability_AckEvent_Call struct { + *mock.Call +} + +// AckEvent is a helper method to define mock.On call +// - ctx context.Context +// - eventId string +func (_e *TriggerCapability_Expecter) AckEvent(ctx interface{}, eventId interface{}) *TriggerCapability_AckEvent_Call { + return &TriggerCapability_AckEvent_Call{Call: _e.mock.On("AckEvent", ctx, eventId)} +} + +func (_c *TriggerCapability_AckEvent_Call) Run(run func(ctx context.Context, eventId string)) *TriggerCapability_AckEvent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *TriggerCapability_AckEvent_Call) Return(_a0 error) *TriggerCapability_AckEvent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TriggerCapability_AckEvent_Call) RunAndReturn(run func(context.Context, string) error) *TriggerCapability_AckEvent_Call { + _c.Call.Return(run) + return _c +} + // Info provides a mock function with given fields: ctx func (_m *TriggerCapability) Info(ctx context.Context) (capabilities.CapabilityInfo, error) { ret := _m.Called(ctx) diff --git a/core/capabilities/mocks/trigger_executable.go b/core/capabilities/mocks/trigger_executable.go index eb4e25fed83..d3d76023490 100644 --- a/core/capabilities/mocks/trigger_executable.go +++ b/core/capabilities/mocks/trigger_executable.go @@ -23,6 +23,53 @@ func (_m *TriggerExecutable) EXPECT() *TriggerExecutable_Expecter { return &TriggerExecutable_Expecter{mock: &_m.Mock} } +// AckEvent provides a mock function with given fields: ctx, eventId +func (_m *TriggerExecutable) AckEvent(ctx context.Context, eventId string) error { + ret := _m.Called(ctx, eventId) + + if len(ret) == 0 { + panic("no return value specified for AckEvent") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { + r0 = rf(ctx, eventId) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// TriggerExecutable_AckEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AckEvent' +type TriggerExecutable_AckEvent_Call struct { + *mock.Call +} + +// AckEvent is a helper method to define mock.On call +// - ctx context.Context +// - eventId string +func (_e *TriggerExecutable_Expecter) AckEvent(ctx interface{}, eventId interface{}) *TriggerExecutable_AckEvent_Call { + return &TriggerExecutable_AckEvent_Call{Call: _e.mock.On("AckEvent", ctx, eventId)} +} + +func (_c *TriggerExecutable_AckEvent_Call) Run(run func(ctx context.Context, eventId string)) *TriggerExecutable_AckEvent_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *TriggerExecutable_AckEvent_Call) Return(_a0 error) *TriggerExecutable_AckEvent_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TriggerExecutable_AckEvent_Call) RunAndReturn(run func(context.Context, string) error) *TriggerExecutable_AckEvent_Call { + _c.Call.Return(run) + return _c +} + // RegisterTrigger provides a mock function with given fields: ctx, request func (_m *TriggerExecutable) RegisterTrigger(ctx context.Context, request capabilities.TriggerRegistrationRequest) (<-chan capabilities.TriggerResponse, error) { ret := _m.Called(ctx, request) diff --git a/core/capabilities/remote/combined_client.go b/core/capabilities/remote/combined_client.go index 0080e61e257..b369732a753 100644 --- a/core/capabilities/remote/combined_client.go +++ b/core/capabilities/remote/combined_client.go @@ -35,6 +35,11 @@ func (c *combinedClient) Info(ctx context.Context) (capabilities.CapabilityInfo, return c.info, nil } +func (c *combinedClient) AckEvent(ctx context.Context, eventId string) error { + // TODO: Do we need triggerID to match the triggerSubscriber? And then call AckEvent on that? + return nil +} + func (c *combinedClient) RegisterTrigger(ctx context.Context, request capabilities.TriggerRegistrationRequest) (<-chan capabilities.TriggerResponse, error) { c.mu.RLock() subscriber, ok := c.triggerSubscribers[request.Method] diff --git a/core/capabilities/remote/trigger_publisher.go b/core/capabilities/remote/trigger_publisher.go index c12e88f0fc8..b5c22712cad 100644 --- a/core/capabilities/remote/trigger_publisher.go +++ b/core/capabilities/remote/trigger_publisher.go @@ -35,7 +35,9 @@ type triggerPublisher struct { messageCache *messagecache.MessageCache[registrationKey, p2ptypes.PeerID] registrations map[registrationKey]*pubRegState - mu sync.RWMutex // protects messageCache and registrations + ackCache *messagecache.MessageCache[ackKey, p2ptypes.PeerID] + mu sync.RWMutex // protects messageCache, ackCache, and registrations + batchingQueue map[[32]byte]*batchedResponse bqMu sync.Mutex // protects batchingQueue stopCh services.StopChan @@ -57,6 +59,11 @@ type registrationKey struct { workflowID string } +type ackKey struct { + callerDonID uint32 + triggerEventID string +} + type pubRegState struct { callback <-chan commoncap.TriggerResponse request commoncap.TriggerRegistrationRequest @@ -86,6 +93,7 @@ func NewTriggerPublisher(capabilityID string, capMethodName string, dispatcher t capMethodName: capMethodName, dispatcher: dispatcher, messageCache: messagecache.NewMessageCache[registrationKey, p2ptypes.PeerID](), + ackCache: messagecache.NewMessageCache[ackKey, p2ptypes.PeerID](), registrations: make(map[registrationKey]*pubRegState), batchingQueue: make(map[[32]byte]*batchedResponse), stopCh: make(services.StopChan), @@ -245,6 +253,43 @@ func (p *triggerPublisher) Receive(_ context.Context, msg *types.MessageBody) { case types.MethodTriggerEvent: p.lggr.Errorw("trigger request failed with error", "method", SanitizeLogString(msg.Method), "sender", sender, "errorMsg", SanitizeLogString(msg.ErrorMsg)) + case types.MethodTriggerEventAck: + triggerMetadata := msg.GetTriggerEventMetadata() + if triggerMetadata == nil { + p.lggr.Errorw("recieved empty trigger event ack metadata", "sender", sender) + break + } + triggerEventID := triggerMetadata.TriggerEventId + p.lggr.Debugw("received trigger event ACK", "sender", sender, "trigger event ID", triggerEventID) + + p.mu.Lock() + defer p.mu.Unlock() + callerDon, ok := cfg.workflowDONs[msg.CallerDonId] + if !ok { + p.lggr.Errorw("received a message from unsupported workflow DON", "callerDonId", msg.CallerDonId) + return + } + if !cfg.membersCache[msg.CallerDonId][sender] { + p.lggr.Errorw("sender not a member of its workflow DON", "callerDonId", msg.CallerDonId, "sender", sender) + return + } + + key := ackKey{msg.CallerDonId, triggerEventID} + nowMs := time.Now().UnixMilli() + p.ackCache.Insert(key, sender, nowMs, msg.Payload) // TODO: Payload is empty.. + minRequired := uint32(2*callerDon.F + 1) + ready, _ := p.ackCache.Ready(key, minRequired, nowMs-cfg.remoteConfig.EventTimeout.Milliseconds(), false) + if !ready { + p.lggr.Debugw("not ready to ACK trigger event yet", "triggerEventId", triggerEventID, "minRequired", minRequired) + return + } + + ctx, cancel := p.stopCh.NewCtx() + defer cancel() + err = cfg.underlying.AckEvent(ctx, triggerEventID) + if err != nil { + p.lggr.Errorw("failed to AckEvent on underlying trigger capability", "err", err) + } default: p.lggr.Errorw("received message with unknown method", "method", SanitizeLogString(msg.Method), "sender", sender) diff --git a/core/capabilities/remote/trigger_publisher_test.go b/core/capabilities/remote/trigger_publisher_test.go index bad3b4cd905..2abd27e4ca7 100644 --- a/core/capabilities/remote/trigger_publisher_test.go +++ b/core/capabilities/remote/trigger_publisher_test.go @@ -99,6 +99,20 @@ func TestTriggerPublisher_ReceiveTriggerEvents_BatchingEnabled(t *testing.T) { require.NoError(t, publisher.Close()) } +func TestTriggerPublisher_RecieveTriggerEventAcks(t *testing.T) { + ctx := testutils.Context(t) + capabilityDONID, workflowDONID := uint32(1), uint32(2) + underlyingTriggerCap, publisher, _, peers := newServices(t, capabilityDONID, workflowDONID, 2) + eventId := "123" + regEvent := newAckEventMessage(t, eventId, workflowDONID, peers[1]) + publisher.Receive(ctx, regEvent) + + require.True(t, underlyingTriggerCap.eventAckd) + require.NoError(t, publisher.Close()) + + // TODO: Increase event ACK test coverage +} + func TestTriggerPublisher_SetConfig_Basic(t *testing.T) { t.Parallel() lggr := logger.Test(t) @@ -266,10 +280,24 @@ func newRegisterTriggerMessage(t *testing.T, callerDonID uint32, sender p2ptypes } } +func newAckEventMessage(t *testing.T, eventId string, callerDonID uint32, sender p2ptypes.PeerID) *remotetypes.MessageBody { + return &remotetypes.MessageBody{ + Sender: sender[:], + Method: remotetypes.MethodTriggerEventAck, + CallerDonId: callerDonID, + Metadata: &remotetypes.MessageBody_TriggerEventMetadata{ + TriggerEventMetadata: &remotetypes.TriggerEventMetadata{ + TriggerEventId: eventId, + }, + }, + } +} + type testTrigger struct { info commoncap.CapabilityInfo registrationsCh chan commoncap.TriggerRegistrationRequest eventCh chan commoncap.TriggerResponse + eventAckd bool } func (tr *testTrigger) Info(_ context.Context) (commoncap.CapabilityInfo, error) { @@ -284,3 +312,8 @@ func (tr *testTrigger) RegisterTrigger(_ context.Context, request commoncap.Trig func (tr *testTrigger) UnregisterTrigger(_ context.Context, request commoncap.TriggerRegistrationRequest) error { return nil } + +func (tr *testTrigger) AckEvent(_ context.Context, eventId string) error { + tr.eventAckd = true + return nil +} diff --git a/core/capabilities/remote/trigger_subscriber.go b/core/capabilities/remote/trigger_subscriber.go index c0df1da9d44..071e6be2e85 100644 --- a/core/capabilities/remote/trigger_subscriber.go +++ b/core/capabilities/remote/trigger_subscriber.go @@ -129,6 +129,31 @@ func (s *triggerSubscriber) Info(ctx context.Context) (commoncap.CapabilityInfo, return cfg.capInfo, nil } +func (s *triggerSubscriber) AckEvent(ctx context.Context, eventId string) error { + s.mu.RLock() + cfg := s.cfg.Load() + for _, peerID := range cfg.capDonInfo.Members { + m := &types.MessageBody{ + CapabilityId: cfg.capInfo.ID, + CapabilityDonId: cfg.capDonInfo.ID, + CallerDonId: cfg.localDonID, + Method: types.MethodTriggerEventAck, + CapabilityMethod: s.capMethodName, + Metadata: &types.MessageBody_TriggerEventMetadata{ + TriggerEventMetadata: &types.TriggerEventMetadata{ + TriggerEventId: eventId, + }, + }, + } + err := s.dispatcher.Send(peerID, m) + if err != nil { + s.lggr.Errorw("failed to send message", "donId", cfg.capDonInfo.ID, "peerId", peerID, "err", err) + } + } + s.mu.RUnlock() + return nil +} + func (s *triggerSubscriber) RegisterTrigger(ctx context.Context, request commoncap.TriggerRegistrationRequest) (<-chan commoncap.TriggerResponse, error) { rawRequest, err := pb.MarshalTriggerRegistrationRequest(request) if err != nil { diff --git a/core/capabilities/remote/types/types.go b/core/capabilities/remote/types/types.go index 81a00e7152d..0b4d61df774 100644 --- a/core/capabilities/remote/types/types.go +++ b/core/capabilities/remote/types/types.go @@ -17,6 +17,7 @@ const ( MethodUnRegisterTrigger = "UnregisterTrigger" MethodTriggerEvent = "TriggerEvent" MethodExecute = "Execute" + MethodTriggerEventAck = "TriggerEventACK" ) type Dispatcher interface { diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 00011a11ac0..09e785f4d7c 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -47,7 +47,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 github.com/smartcontractkit/chainlink-data-streams v0.1.9 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 4dbdfbbc7de..157dcda299f 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1634,8 +1634,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a h1:GIy+bmMlABnWEvAIe7Jiae2UHk/FIN7hRYavZdm6+f8= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a/go.mod h1:2BhunX29Hx2aL31X7rSg5HT8nmmy5fvNsQaZ7wP3c/o= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 h1:K5uuKFGylvfxWEvaNcXHdXXNAjwhwz9+6FwTTX7ppGs= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 h1:S04uSTz2vy8lJJXN3+h0PKievspLWt1CU25OALKG8p8= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= diff --git a/core/services/llo/cre/transmitter.go b/core/services/llo/cre/transmitter.go index f8275e0f4d6..ddba60692bf 100644 --- a/core/services/llo/cre/transmitter.go +++ b/core/services/llo/cre/transmitter.go @@ -217,6 +217,11 @@ func (t *transmitter) processNewEvent(ctx context.Context, event *capabilities.O return nil } +func (t *transmitter) AckEvent(ctx context.Context, eventId string) error { + // TODO + return nil +} + func (t *transmitter) RegisterTrigger(ctx context.Context, req capabilities.TriggerRegistrationRequest) (<-chan capabilities.TriggerResponse, error) { t.mu.Lock() defer t.mu.Unlock() diff --git a/core/services/workflows/engine.go b/core/services/workflows/engine.go index bb595ca8746..76e103722e6 100644 --- a/core/services/workflows/engine.go +++ b/core/services/workflows/engine.go @@ -478,6 +478,21 @@ func (e *Engine) registerTrigger(ctx context.Context, t *triggerCapability, trig return nil } +func (e *Engine) ackTriggerEvent(ctx context.Context, te *capabilities.TriggerEvent) error { + triggerID := te.TriggerType + for _, trigger := range e.workflow.triggers { + info, err := trigger.trigger.Info(ctx) + if err != nil { + e.logger.Errorf("failed to get trigger info") + continue + } + if info.ID == triggerID { + return trigger.trigger.AckEvent(ctx, te.ID) + } + } + return fmt.Errorf("failed to find trigger %s", triggerID) +} + // stepUpdateLoop is a singleton goroutine per `Execution`, and it updates the `executionState` with the outcome of a `step`. // // Note: `executionState` is only mutated by this loop directly. @@ -768,6 +783,10 @@ func (e *Engine) worker(ctx context.Context) { } else { e.logger.With(platform.KeyWorkflowExecutionID, executionID).Debug("execution started") logCustMsg(ctx, cma, "execution started", e.logger) + err = e.ackTriggerEvent(ctx, &te) + if err != nil { + e.logger.With(platform.KeyTriggerID, te.ID).Errorf("failed to ACK trigger event: %v", err) + } } case <-ctx.Done(): return diff --git a/core/services/workflows/engine_test.go b/core/services/workflows/engine_test.go index be64af76063..f6eb76389d7 100644 --- a/core/services/workflows/engine_test.go +++ b/core/services/workflows/engine_test.go @@ -350,6 +350,10 @@ type mockTriggerCapability struct { var _ capabilities.TriggerCapability = (*mockTriggerCapability)(nil) +func (m *mockTriggerCapability) AckEvent(ctx context.Context, eventId string) error { + return nil +} + func (m *mockTriggerCapability) RegisterTrigger(ctx context.Context, req capabilities.TriggerRegistrationRequest) (<-chan capabilities.TriggerResponse, error) { m.registerTriggerCallCounter[req.TriggerID]++ if m.triggerEvent != nil { @@ -2570,6 +2574,10 @@ func (t mockRuntimeTrigger) Info(ctx context.Context) (capabilities.CapabilityIn return t.c.Info(ctx) } +func (t mockRuntimeTrigger) AckEvent(ctx context.Context, eventId string) error { + return t.c.AckEvent(ctx, eventId) +} + func (t mockRuntimeTrigger) RegisterTrigger(ctx context.Context, request capabilities.TriggerRegistrationRequest) (<-chan capabilities.TriggerResponse, error) { return t.c.RegisterTrigger(ctx, request) } diff --git a/deployment/go.mod b/deployment/go.mod index 0fe5ee536b6..52ac452bd11 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -42,7 +42,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251211123524-f0c4fe7cfc0a diff --git a/deployment/go.sum b/deployment/go.sum index 7118e0b3bac..2f3b26ad5a5 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1358,8 +1358,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a h1:GIy+bmMlABnWEvAIe7Jiae2UHk/FIN7hRYavZdm6+f8= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a/go.mod h1:2BhunX29Hx2aL31X7rSg5HT8nmmy5fvNsQaZ7wP3c/o= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 h1:K5uuKFGylvfxWEvaNcXHdXXNAjwhwz9+6FwTTX7ppGs= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 h1:S04uSTz2vy8lJJXN3+h0PKievspLWt1CU25OALKG8p8= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= diff --git a/go.mod b/go.mod index 90d5fe870c8..8365ae0ddf1 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 github.com/smartcontractkit/chainlink-data-streams v0.1.9 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec diff --git a/go.sum b/go.sum index dac445dfba7..7860c31ec5c 100644 --- a/go.sum +++ b/go.sum @@ -1166,8 +1166,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5/go.mod h1:xtZNi6pOKdC3sLvokDvXOhgHzT+cyBqH/gWwvxTxqrg= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a h1:GIy+bmMlABnWEvAIe7Jiae2UHk/FIN7hRYavZdm6+f8= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a/go.mod h1:2BhunX29Hx2aL31X7rSg5HT8nmmy5fvNsQaZ7wP3c/o= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 h1:K5uuKFGylvfxWEvaNcXHdXXNAjwhwz9+6FwTTX7ppGs= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 h1:S04uSTz2vy8lJJXN3+h0PKievspLWt1CU25OALKG8p8= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 3dfdc00b37e..d9b910ad828 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -51,7 +51,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251211123524-f0c4fe7cfc0a diff --git a/integration-tests/go.sum b/integration-tests/go.sum index e56180b32c6..5fd74d4a03b 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1601,8 +1601,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a h1:GIy+bmMlABnWEvAIe7Jiae2UHk/FIN7hRYavZdm6+f8= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a/go.mod h1:2BhunX29Hx2aL31X7rSg5HT8nmmy5fvNsQaZ7wP3c/o= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 h1:K5uuKFGylvfxWEvaNcXHdXXNAjwhwz9+6FwTTX7ppGs= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 h1:S04uSTz2vy8lJJXN3+h0PKievspLWt1CU25OALKG8p8= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 9327ff5fe3d..b2ca3bf0a4b 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -32,7 +32,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20251128020529-88d93b01d749 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251211123524-f0c4fe7cfc0a diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index f41be6e8973..e230a8d0b7b 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1580,8 +1580,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a h1:GIy+bmMlABnWEvAIe7Jiae2UHk/FIN7hRYavZdm6+f8= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a/go.mod h1:2BhunX29Hx2aL31X7rSg5HT8nmmy5fvNsQaZ7wP3c/o= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 h1:K5uuKFGylvfxWEvaNcXHdXXNAjwhwz9+6FwTTX7ppGs= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 h1:S04uSTz2vy8lJJXN3+h0PKievspLWt1CU25OALKG8p8= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index b0bc99245c5..0361a00f8a7 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -33,7 +33,7 @@ require ( github.com/sethvargo/go-retry v0.3.0 github.com/smartcontractkit/chain-selectors v1.0.85 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250912190424-fd2e35d7deb5 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20251210110629-10c56e8d2cec github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251211123524-f0c4fe7cfc0a diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 0fed8375b2c..292c29502f7 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1602,8 +1602,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a h1:GIy+bmMlABnWEvAIe7Jiae2UHk/FIN7hRYavZdm6+f8= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a/go.mod h1:2BhunX29Hx2aL31X7rSg5HT8nmmy5fvNsQaZ7wP3c/o= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 h1:K5uuKFGylvfxWEvaNcXHdXXNAjwhwz9+6FwTTX7ppGs= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 h1:S04uSTz2vy8lJJXN3+h0PKievspLWt1CU25OALKG8p8= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index 4a33b239aab..2167f5fdb87 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/rs/zerolog v1.34.0 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.85 - github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 + github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 github.com/smartcontractkit/chainlink-data-streams v0.1.9 github.com/smartcontractkit/chainlink-deployments-framework v0.70.0 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20251211123524-f0c4fe7cfc0a diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 3bf59cac32c..025c708ffa3 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1799,8 +1799,8 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20251027185542-babb09e5363e/go.mod h1:IaoLCQE1miX3iUlQNxOPcVrXrshcO/YsFpxnFuhG9DM= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a h1:GIy+bmMlABnWEvAIe7Jiae2UHk/FIN7hRYavZdm6+f8= github.com/smartcontractkit/chainlink-ccv v0.0.0-20251215155942-4daf59a09b5a/go.mod h1:2BhunX29Hx2aL31X7rSg5HT8nmmy5fvNsQaZ7wP3c/o= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761 h1:K5uuKFGylvfxWEvaNcXHdXXNAjwhwz9+6FwTTX7ppGs= -github.com/smartcontractkit/chainlink-common v0.9.6-0.20251219154553-3688afcb0761/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6 h1:S04uSTz2vy8lJJXN3+h0PKievspLWt1CU25OALKG8p8= +github.com/smartcontractkit/chainlink-common v0.9.6-0.20251224190747-4a1ca5d561d6/go.mod h1:ra9yvW8HbLgtXY0fHgnVdA5SjZ06v2/TNyTfPEJzsqo= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10 h1:FJAFgXS9oqASnkS03RE1HQwYQQxrO4l46O5JSzxqLgg= github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.10/go.mod h1:oiDa54M0FwxevWwyAX773lwdWvFYYlYHHQV1LQ5HpWY= github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20250415235644-8703639403c7 h1:9wh1G+WbXwPVqf0cfSRSgwIcaXTQgvYezylEAfwmrbw=