Skip to content

Commit 93544c0

Browse files
committed
add retry logic for IsOperatorRegistered
1 parent 62f1fff commit 93544c0

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

core/chainio/avs_reader.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,11 @@ func (r *AvsReader) GetErc20Mock(tokenAddr ethcommon.Address) (*contractERC20Moc
6767
return erc20Mock, nil
6868
}
6969

70+
/*
7071
func (r *AvsReader) IsOperatorRegistered(address ethcommon.Address) (bool, error) {
7172
return r.ChainReader.IsOperatorRegistered(&bind.CallOpts{}, address)
7273
}
74+
*/
7375

7476
func (r *AvsReader) DisabledVerifiers() (*big.Int, error) {
7577
return r.AvsContractBindings.ServiceManager.ContractAlignedLayerServiceManagerCaller.DisabledVerifiers(&bind.CallOpts{})

core/chainio/retryable.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/ethereum/go-ethereum"
88
"github.com/ethereum/go-ethereum/accounts/abi/bind"
99
"github.com/ethereum/go-ethereum/common"
10+
ethcommon "github.com/ethereum/go-ethereum/common"
1011
"github.com/ethereum/go-ethereum/core/types"
1112
"github.com/ethereum/go-ethereum/event"
1213
servicemanager "github.com/yetanotherco/aligned_layer/contracts/bindings/AlignedLayerServiceManager"
@@ -287,3 +288,21 @@ func SubscribeToNewTasksV3Retryable(
287288
) (event.Subscription, error) {
288289
return retry.RetryWithData(SubscribeToNewTasksV3(opts, serviceManager, newTaskCreatedChan, batchMerkleRoot), retry.DefaultRetryConfig())
289290
}
291+
292+
func IsOperatorRegistered(r *AvsReader, address ethcommon.Address, opts *bind.CallOpts) func() (bool, error) {
293+
op_registered_func := func() (bool, error) {
294+
return r.ChainReader.IsOperatorRegistered(opts, address)
295+
}
296+
return op_registered_func
297+
}
298+
299+
/*
300+
IsOperatorRegistered
301+
Queries the Eigenlayer Contracts and verifies the Operator is registered on Aligned.
302+
- All errors are considered Transient Errors
303+
- Retry times (3 retries): 12 sec (1 Blocks), 24 sec (2 Blocks), 48 sec (4 Blocks)
304+
- NOTE: Contract call reverts are not considered `PermanentError`'s as block reorg's may lead to contract call revert in which case the aggregator should retry.
305+
*/
306+
func (r *AvsReader) IsOperatorRegisteredRetryable(address ethcommon.Address, opts *bind.CallOpts) (bool, error) {
307+
return retry.RetryWithData(IsOperatorRegistered(r, address, opts), retry.DefaultRetryConfig())
308+
}

core/retry_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,3 +923,51 @@ func TestBatchersBalances(t *testing.T) {
923923
return
924924
}
925925
}
926+
func TestIsOperatorRegistered(t *testing.T) {
927+
cmd, _, err := SetupAnvil(8545)
928+
if err != nil {
929+
t.Errorf("Error setting up Anvil: %s\n", err)
930+
}
931+
932+
aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml")
933+
avsReader, err := chainio.NewAvsReaderFromConfig(aggregatorConfig.BaseConfig, aggregatorConfig.EcdsaConfig)
934+
if err != nil {
935+
return
936+
}
937+
senderAddress := common.HexToAddress("0x0")
938+
939+
is_registered_func := chainio.IsOperatorRegistered(avsReader, senderAddress, &bind.CallOpts{})
940+
_, err = is_registered_func()
941+
assert.Nil(t, err)
942+
943+
if err := cmd.Process.Kill(); err != nil {
944+
t.Errorf("Error killing process: %v\n", err)
945+
return
946+
}
947+
948+
is_registered_func = chainio.IsOperatorRegistered(avsReader, senderAddress, &bind.CallOpts{})
949+
_, err = is_registered_func()
950+
assert.NotNil(t, err)
951+
if _, ok := err.(retry.PermanentError); ok {
952+
t.Errorf("BatchersBalances Emitted non-Transient error: %s\n", err)
953+
return
954+
}
955+
if !strings.Contains(err.Error(), "connection reset") {
956+
t.Errorf("BatchersBalances did not return expected error: %s\n", err)
957+
return
958+
}
959+
960+
cmd, _, err = SetupAnvil(8545)
961+
if err != nil {
962+
t.Errorf("Error setting up Anvil: %s\n", err)
963+
}
964+
965+
is_registered_func = chainio.IsOperatorRegistered(avsReader, senderAddress, &bind.CallOpts{})
966+
_, err = is_registered_func()
967+
assert.Nil(t, err)
968+
969+
if err := cmd.Process.Kill(); err != nil {
970+
t.Errorf("Error killing process: %v\n", err)
971+
return
972+
}
973+
}

operator/pkg/operator.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"sync"
1616
"time"
1717

18+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
1819
"github.com/ethereum/go-ethereum/crypto"
1920
"github.com/urfave/cli/v2"
2021
"github.com/yetanotherco/aligned_layer/operator/risc_zero"
@@ -80,7 +81,7 @@ func NewOperatorFromConfig(configuration config.OperatorConfig) (*Operator, erro
8081
log.Fatalf("Could not create AVS reader")
8182
}
8283

83-
registered, err := avsReader.IsOperatorRegistered(configuration.Operator.Address)
84+
registered, err := avsReader.IsOperatorRegisteredRetryable(configuration.Operator.Address, &bind.CallOpts{})
8485
if err != nil {
8586
log.Fatalf("Could not check if operator is registered")
8687
}

0 commit comments

Comments
 (0)