@@ -8,12 +8,14 @@ import (
88
99 "github.com/ethereum/go-ethereum/accounts/abi/bind"
1010 ethcommon "github.com/ethereum/go-ethereum/common"
11+ "github.com/ethereum/go-ethereum/event"
1112
1213 "github.com/ethereum/go-ethereum/core/types"
1314 servicemanager "github.com/yetanotherco/aligned_layer/contracts/bindings/AlignedLayerServiceManager"
1415 retry "github.com/yetanotherco/aligned_layer/core"
1516 "github.com/yetanotherco/aligned_layer/core/config"
1617
18+ "fmt"
1719 sdklogging "github.com/Layr-Labs/eigensdk-go/logging"
1820 "github.com/ethereum/go-ethereum/crypto"
1921)
@@ -43,6 +45,11 @@ type AvsSubscriber struct {
4345 logger sdklogging.Logger
4446}
4547
48+ type ErrorPair struct {
49+ ErrorMainRPC error
50+ ErrorFallbackRPC error
51+ }
52+
4653func NewAvsSubscriberFromConfig (baseConfig * config.BaseConfig ) (* AvsSubscriber , error ) {
4754 avsContractBindings , err := NewAvsServiceBindings (
4855 baseConfig .AlignedLayerDeploymentConfig .AlignedLayerServiceManagerAddr ,
@@ -61,26 +68,27 @@ func NewAvsSubscriberFromConfig(baseConfig *config.BaseConfig) (*AvsSubscriber,
6168 }, nil
6269}
6370
64- func (s * AvsSubscriber ) SubscribeToNewTasksV2 (newTaskCreatedChan chan * servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 ) ( chan error , error ) {
71+ func (s * AvsSubscriber ) SubscribeToNewTasksV2 (newTaskCreatedChan chan * servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 , errorPairChannel chan ErrorPair ) * ErrorPair {
6572 // Create a new channel to receive new tasks
6673 internalChannel := make (chan * servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 )
6774
6875 // Subscribe to new tasks
69- sub , err := SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
70- if err != nil {
71- s .logger .Error ("Primary failed to subscribe to new AlignedLayer V2 tasks after %d retries" , retry .NetworkNumRetries , "err" , err )
72- return nil , err
76+ sub , errMain := SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
77+ if errMain != nil {
78+ s .logger .Error (fmt .Sprintf ("Fallback failed to subscribe to new AlignedLayer V3 tasks after %d retries" , MaxRetries ), "errMain" , fmt .Sprintf ("%v" , errMain ))
7379 }
7480
75- subFallback , err := SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
76- if err != nil {
77- s .logger .Error ("Fallback failed to subscribe to new AlignedLayer V2 tasks after %d retries" , retry .NetworkNumRetries , "err" , err )
78- return nil , err
81+ subFallback , errFallback := SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
82+ if errFallback != nil {
83+ s .logger .Error (fmt .Sprintf ("Fallback failed to subscribe to new AlignedLayer V3 tasks after %d retries" , MaxRetries ), "errFallback" , fmt .Sprintf ("%v" , errFallback ))
7984 }
80- s .logger .Info ("Subscribed to new AlignedLayer V2 tasks" )
8185
82- // create a new channel to foward errors
83- errorChannel := make (chan error )
86+ if errMain != nil && errFallback != nil {
87+ s .logger .Error ("Failed to subscribe to new AlignedLayer V2 tasks with both RPCs" , "errMain" , errMain , "errFallback" , errFallback )
88+ return & ErrorPair {ErrorMainRPC : errMain , ErrorFallbackRPC : errFallback }
89+ }
90+
91+ s .logger .Info ("Subscribed to new AlignedLayer V2 tasks" )
8492
8593 pollLatestBatchTicker := time .NewTicker (PollLatestBatchInterval )
8694
@@ -109,49 +117,56 @@ func (s *AvsSubscriber) SubscribeToNewTasksV2(newTaskCreatedChan chan *servicema
109117
110118 // Handle errors and resubscribe
111119 go func () {
112- for {
120+ var errMain , errFallback error
121+ var auxSub , auxSubFallback event.Subscription
122+ for errMain == nil || errFallback == nil { //while one is active
113123 select {
114124 case err := <- sub .Err ():
115- s .logger .Warn ("Error in new task subscription" , "err" , err )
116- sub .Unsubscribe ()
117- sub , err = SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
118- if err != nil {
119- errorChannel <- err
125+ s .logger .Warn ("Error in new task subscription of main connection" , "err" , err )
126+
127+ auxSub , errMain = SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
128+ if errMain == nil {
129+ sub = auxSub // update the subscription only if it was successful
130+ s .logger .Info ("Main connection resubscribed to new task subscription" )
120131 }
121132 case err := <- subFallback .Err ():
122- s .logger .Warn ("Error in fallback new task subscription" , "err" , err )
123- subFallback .Unsubscribe ()
124- subFallback , err = SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
125- if err != nil {
126- errorChannel <- err
133+ s .logger .Warn ("Error in new task subscription of fallback connection" , "err" , err )
134+
135+ auxSubFallback , errFallback = SubscribeToNewTasksV2Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
136+ if errFallback == nil {
137+ subFallback = auxSubFallback // update the subscription only if it was successful
138+ s .logger .Info ("Resubscribed to fallback new task subscription" )
127139 }
128140 }
129141 }
142+ errorPairChannel <- ErrorPair {ErrorMainRPC : errMain , ErrorFallbackRPC : errFallback }
130143 }()
131144
132- return errorChannel , nil
145+ return nil
133146}
134147
135- func (s * AvsSubscriber ) SubscribeToNewTasksV3 (newTaskCreatedChan chan * servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 ) ( chan error , error ) {
148+ func (s * AvsSubscriber ) SubscribeToNewTasksV3 (newTaskCreatedChan chan * servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 , errorPairChannel chan ErrorPair ) * ErrorPair {
136149 // Create a new channel to receive new tasks
137150 internalChannel := make (chan * servicemanager.ContractAlignedLayerServiceManagerNewBatchV3 )
138151
152+ s .logger .Info ("Starting subscription to new AlignedLayer V3 tasks" )
139153 // Subscribe to new tasks
140- sub , err := SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
141- if err != nil {
142- s .logger .Error ("Primary failed to subscribe to new AlignedLayer V3 tasks after %d retries" , MaxRetries , "err" , err )
143- return nil , err
154+ sub , errMain := SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
155+ if errMain != nil {
156+ s .logger .Error (fmt .Sprintf ("Fallback failed to subscribe to new AlignedLayer V3 tasks after %d retries" , MaxRetries ), "err" , fmt .Sprintf ("%v" , errMain ))
144157 }
145158
146- subFallback , err := SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
147- if err != nil {
148- s .logger .Error ("Fallback failed to subscribe to new AlignedLayer V3 tasks after %d retries" , MaxRetries , "err" , err )
149- return nil , err
159+ subFallback , errFallback := SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
160+ if errFallback != nil {
161+ s .logger .Error (fmt .Sprintf ("Fallback failed to subscribe to new AlignedLayer V3 tasks after %d retries" , MaxRetries ), "err" , fmt .Sprintf ("%v" , errFallback ))
150162 }
151- s .logger .Info ("Subscribed to new AlignedLayer V3 tasks" )
152163
153- // create a new channel to foward errors
154- errorChannel := make (chan error )
164+ if errMain != nil && errFallback != nil {
165+ s .logger .Error ("Failed to subscribe to new AlignedLayer V3 tasks with both RPCs" , "errMain" , errMain , "errFallback" , errFallback )
166+ return & ErrorPair {ErrorMainRPC : errMain , ErrorFallbackRPC : errFallback }
167+ }
168+
169+ s .logger .Info ("Subscribed to new AlignedLayer V3 tasks" )
155170
156171 pollLatestBatchTicker := time .NewTicker (PollLatestBatchInterval )
157172
@@ -180,27 +195,33 @@ func (s *AvsSubscriber) SubscribeToNewTasksV3(newTaskCreatedChan chan *servicema
180195
181196 // Handle errors and resubscribe
182197 go func () {
183- for {
198+ s .logger .Info ("Starting error handling goroutine" )
199+ var errMain , errFallback error
200+ var auxSub , auxSubFallback event.Subscription
201+ for errMain == nil || errFallback == nil { //while one is active
184202 select {
185203 case err := <- sub .Err ():
186- s .logger .Warn ("Error in new task subscription" , "err" , err )
187- sub .Unsubscribe ()
188- sub , err = SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
189- if err != nil {
190- errorChannel <- err
204+ s .logger .Warn ("Error in new task subscription of main connection" , "err" , err )
205+
206+ auxSub , errMain = SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManager , internalChannel , nil , retry .NetworkRetryParams ())
207+ if errMain == nil {
208+ sub = auxSub // update the subscription only if it was successful
209+ s .logger .Info ("Resubscribed to fallback new task subscription" )
191210 }
192211 case err := <- subFallback .Err ():
193- s .logger .Warn ("Error in fallback new task subscription" , "err" , err )
194- subFallback .Unsubscribe ()
195- subFallback , err = SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
196- if err != nil {
197- errorChannel <- err
212+ s .logger .Warn ("Error in new task subscription of fallback connection" , "err" , err )
213+
214+ auxSubFallback , errFallback = SubscribeToNewTasksV3Retryable (& bind.WatchOpts {}, s .AvsContractBindings .ServiceManagerFallback , internalChannel , nil , retry .NetworkRetryParams ())
215+ if errFallback == nil {
216+ subFallback = auxSubFallback // update the subscription only if it was successful
217+ s .logger .Info ("Resubscribed to fallback new task subscription" )
198218 }
199219 }
200220 }
221+ errorPairChannel <- ErrorPair {ErrorMainRPC : errMain , ErrorFallbackRPC : errFallback }
201222 }()
202223
203- return errorChannel , nil
224+ return nil
204225}
205226
206227func (s * AvsSubscriber ) processNewBatchV2 (batch * servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 , batchesSet map [[32 ]byte ]struct {}, newBatchMutex * sync.Mutex , newTaskCreatedChan chan <- * servicemanager.ContractAlignedLayerServiceManagerNewBatchV2 ) {
0 commit comments