From 8312fdaa6905fbac17b4aacc6761f4c99cc968e2 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 16:12:48 -0300 Subject: [PATCH 01/11] add AvsRegistry ChainReader tests --- chainio/clients/avsregistry/reader_test.go | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 chainio/clients/avsregistry/reader_test.go diff --git a/chainio/clients/avsregistry/reader_test.go b/chainio/clients/avsregistry/reader_test.go new file mode 100644 index 00000000..e4785c9a --- /dev/null +++ b/chainio/clients/avsregistry/reader_test.go @@ -0,0 +1,113 @@ +package avsregistry + +import ( + "context" + "log/slog" + "os" + "testing" + + "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/testutils" + "github.com/Layr-Labs/eigensdk-go/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +func TestReaderMethods(t *testing.T) { + anvilStateFileName := "contracts-deployed-anvil-state.json" + anvilC, err := testutils.StartAnvilContainer(anvilStateFileName) + require.NoError(t, err) + + anvilHttpEndpoint, err := anvilC.Endpoint(context.Background(), "http") + require.NoError(t, err) + + contractAddrs := testutils.GetContractAddressesFromContractRegistry(anvilHttpEndpoint) + ethHttpClient, err := ethclient.Dial(anvilHttpEndpoint) + require.NoError(t, err) + + quorumNumbers := types.QuorumNums{0} + + logger := logging.NewTextSLogger(os.Stdout, &logging.SLoggerOptions{Level: slog.LevelDebug}) + + chainReader, err := NewReaderFromConfig(Config{ + RegistryCoordinatorAddress: contractAddrs.RegistryCoordinator, + OperatorStateRetrieverAddress: contractAddrs.OperatorStateRetriever, + }, ethHttpClient, logger) + require.NoError(t, err) + + t.Run("get quorum state", func(t *testing.T) { + count, err := chainReader.GetQuorumCount(&bind.CallOpts{}) + require.NoError(t, err) + require.NotNil(t, count) + }) + + t.Run("get operator stake in quorums at current block", func(t *testing.T) { + stake, err := chainReader.GetOperatorsStakeInQuorumsAtCurrentBlock(&bind.CallOpts{}, quorumNumbers) + require.NoError(t, err) + require.NotNil(t, stake) + }) + + t.Run("get operator stake in quorums at block", func(t *testing.T) { + stake, err := chainReader.GetOperatorsStakeInQuorumsAtBlock(&bind.CallOpts{}, quorumNumbers, 100) + require.NoError(t, err) + require.NotNil(t, stake) + }) + + t.Run("get operator address in quorums at current block", func(t *testing.T) { + addresses, err := chainReader.GetOperatorAddrsInQuorumsAtCurrentBlock(&bind.CallOpts{}, quorumNumbers) + require.NoError(t, err) + require.NotNil(t, addresses) + }) + + t.Run("get operators stake in quorums of operator at block returns error for non-registered operator", func(t *testing.T) { + operatorAddress := common.Address{0x1} + operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + + _, _, err = chainReader.GetOperatorsStakeInQuorumsOfOperatorAtBlock(&bind.CallOpts{}, operatorId, 100) + require.Error(t, err) + require.Contains(t, err.Error(), "Failed to get operators state") + }) + + t.Run("get single operator stake in quorums of operator at current block returns error for non-registered operator", func(t *testing.T) { + operatorAddress := common.Address{0x1} + operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + + stakes, err := chainReader.GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock(&bind.CallOpts{}, operatorId) + require.NoError(t, err) + require.Equal(t, 0, len(stakes)) + }) + + t.Run("get check signatures indices", func(t *testing.T) { + operatorAddress := common.Address{0x1} + operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + + checkSignaturesIndices, err := chainReader.GetCheckSignaturesIndices(&bind.CallOpts{}, 100, quorumNumbers, []types.OperatorId{operatorId}) + require.NoError(t, err) + require.Equal(t, 0, len(checkSignaturesIndices.NonSignerQuorumBitmapIndices)) + require.Equal(t, 0, len(checkSignaturesIndices.NonSignerStakeIndices)) + require.Equal(t, 0, len(checkSignaturesIndices.QuorumApkIndices)) + require.Equal(t, 0, len(checkSignaturesIndices.TotalStakeIndices)) + }) + + t.Run("get operator id", func(t *testing.T) { + operatorAddress := common.Address{0x1} + operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + require.NotNil(t, operatorId) + }) + + t.Run("get operator from id returns zero address for non-registered operator", func(t *testing.T) { + operatorAddress := common.HexToAddress("0x1234567890123456789012345678901234567890") + operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + + retrievedAddress, err := chainReader.GetOperatorFromId(&bind.CallOpts{}, operatorId) + require.NoError(t, err) + require.Equal(t, retrievedAddress, common.Address{0x0}) + }) +} From eb0eca884dfa06cf1648ec255ecc6ae4a8ca7f20 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 17:13:48 -0300 Subject: [PATCH 02/11] add AvsRegistry ChainReader tests --- chainio/clients/avsregistry/reader_test.go | 38 ++++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/chainio/clients/avsregistry/reader_test.go b/chainio/clients/avsregistry/reader_test.go index e4785c9a..bc914ed3 100644 --- a/chainio/clients/avsregistry/reader_test.go +++ b/chainio/clients/avsregistry/reader_test.go @@ -3,6 +3,7 @@ package avsregistry import ( "context" "log/slog" + "math/big" "os" "testing" @@ -81,17 +82,13 @@ func TestReaderMethods(t *testing.T) { require.Equal(t, 0, len(stakes)) }) - t.Run("get check signatures indices", func(t *testing.T) { + t.Run("get check signatures indices returns error for non-registered operator", func(t *testing.T) { operatorAddress := common.Address{0x1} operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) require.NoError(t, err) - checkSignaturesIndices, err := chainReader.GetCheckSignaturesIndices(&bind.CallOpts{}, 100, quorumNumbers, []types.OperatorId{operatorId}) - require.NoError(t, err) - require.Equal(t, 0, len(checkSignaturesIndices.NonSignerQuorumBitmapIndices)) - require.Equal(t, 0, len(checkSignaturesIndices.NonSignerStakeIndices)) - require.Equal(t, 0, len(checkSignaturesIndices.QuorumApkIndices)) - require.Equal(t, 0, len(checkSignaturesIndices.TotalStakeIndices)) + _, err = chainReader.GetCheckSignaturesIndices(&bind.CallOpts{}, 100, quorumNumbers, []types.OperatorId{operatorId}) + require.Contains(t, err.Error(), "Failed to get check signatures indices") }) t.Run("get operator id", func(t *testing.T) { @@ -110,4 +107,31 @@ func TestReaderMethods(t *testing.T) { require.NoError(t, err) require.Equal(t, retrievedAddress, common.Address{0x0}) }) + + t.Run("query registration detail", func(t *testing.T) { + operatorAddress := common.HexToAddress("0x1234567890123456789012345678901234567890") + quorums, err := chainReader.QueryRegistrationDetail(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + require.Equal(t, 1, len(quorums)) + }) + + t.Run("is operator registered", func(t *testing.T) { + operatorAddress := common.HexToAddress("0x1234567890123456789012345678901234567890") + isRegistered, err := chainReader.IsOperatorRegistered(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + require.False(t, isRegistered) + }) + + t.Run("query existing registered operator pub keys", func(t *testing.T) { + addresses, pubKeys, err := chainReader.QueryExistingRegisteredOperatorPubKeys(context.Background(), big.NewInt(0), nil, nil) + require.NoError(t, err) + require.Equal(t, 0, len(pubKeys)) + require.Equal(t, 0, len(addresses)) + }) + + t.Run("query existing registered operator sockets", func(t *testing.T) { + address_to_sockets, err := chainReader.QueryExistingRegisteredOperatorSockets(context.Background(), big.NewInt(0), nil, nil) + require.NoError(t, err) + require.Equal(t, 0, len(address_to_sockets)) + }) } From a2abe100f8cd4c5d34aee4de5ae04cf122ad0ce7 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Fri, 27 Sep 2024 18:32:44 -0300 Subject: [PATCH 03/11] create chainWriter in test --- chainio/clients/avsregistry/writer_test.go | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 chainio/clients/avsregistry/writer_test.go diff --git a/chainio/clients/avsregistry/writer_test.go b/chainio/clients/avsregistry/writer_test.go new file mode 100644 index 00000000..8f9367e5 --- /dev/null +++ b/chainio/clients/avsregistry/writer_test.go @@ -0,0 +1,52 @@ +package avsregistry + +import ( + "context" + "log/slog" + "os" + "testing" + "time" + + "github.com/Layr-Labs/eigensdk-go/chainio/clients/wallet" + "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + "github.com/Layr-Labs/eigensdk-go/logging" + "github.com/Layr-Labs/eigensdk-go/signerv2" + "github.com/Layr-Labs/eigensdk-go/testutils" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +func TestWriterMethods(t *testing.T) { + anvilStateFileName := "contracts-deployed-anvil-state.json" + anvilC, err := testutils.StartAnvilContainer(anvilStateFileName) + require.NoError(t, err) + anvilHttpEndpoint, err := anvilC.Endpoint(context.Background(), "http") + require.NoError(t, err) + + contractAddrs := testutils.GetContractAddressesFromContractRegistry(anvilHttpEndpoint) + ethHttpClient, err := ethclient.Dial(anvilHttpEndpoint) + require.NoError(t, err) + logger := logging.NewTextSLogger(os.Stdout, &logging.SLoggerOptions{Level: slog.LevelDebug}) + + ecdsaPrivateKey, err := crypto.HexToECDSA("0x0") + require.NoError(t, err) + + rpcCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + chainid, err := ethHttpClient.ChainID(rpcCtx) + require.NoError(t, err) + + signerV2, addr, err := signerv2.SignerFromConfig(signerv2.Config{PrivateKey: ecdsaPrivateKey}, chainid) + require.NoError(t, err) + + pkWallet, err := wallet.NewPrivateKeyWallet(ethHttpClient, signerV2, addr, logger) + require.NoError(t, err) + txMgr := txmgr.NewSimpleTxManager(pkWallet, ethHttpClient, logger, addr) + + chainWriter, err := NewWriterFromConfig(Config{ + RegistryCoordinatorAddress: contractAddrs.RegistryCoordinator, + OperatorStateRetrieverAddress: contractAddrs.OperatorStateRetriever, + }, ethHttpClient, txMgr, logger) + require.NoError(t, err) +} From 9ec2861732a81c45221faa61d0b36b1e782a929e Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Fri, 27 Sep 2024 18:57:31 -0300 Subject: [PATCH 04/11] add register operator test --- chainio/clients/avsregistry/writer_test.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/chainio/clients/avsregistry/writer_test.go b/chainio/clients/avsregistry/writer_test.go index 8f9367e5..57e538a4 100644 --- a/chainio/clients/avsregistry/writer_test.go +++ b/chainio/clients/avsregistry/writer_test.go @@ -9,9 +9,11 @@ import ( "github.com/Layr-Labs/eigensdk-go/chainio/clients/wallet" "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + "github.com/Layr-Labs/eigensdk-go/crypto/bls" "github.com/Layr-Labs/eigensdk-go/logging" "github.com/Layr-Labs/eigensdk-go/signerv2" "github.com/Layr-Labs/eigensdk-go/testutils" + "github.com/Layr-Labs/eigensdk-go/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" @@ -21,15 +23,18 @@ func TestWriterMethods(t *testing.T) { anvilStateFileName := "contracts-deployed-anvil-state.json" anvilC, err := testutils.StartAnvilContainer(anvilStateFileName) require.NoError(t, err) + anvilHttpEndpoint, err := anvilC.Endpoint(context.Background(), "http") require.NoError(t, err) contractAddrs := testutils.GetContractAddressesFromContractRegistry(anvilHttpEndpoint) ethHttpClient, err := ethclient.Dial(anvilHttpEndpoint) require.NoError(t, err) + logger := logging.NewTextSLogger(os.Stdout, &logging.SLoggerOptions{Level: slog.LevelDebug}) - ecdsaPrivateKey, err := crypto.HexToECDSA("0x0") + ecdsaPrivKeyHex := "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + ecdsaPrivateKey, err := crypto.HexToECDSA(ecdsaPrivKeyHex) require.NoError(t, err) rpcCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) @@ -49,4 +54,15 @@ func TestWriterMethods(t *testing.T) { OperatorStateRetrieverAddress: contractAddrs.OperatorStateRetriever, }, ethHttpClient, txMgr, logger) require.NoError(t, err) + + t.Run("register operator", func(t *testing.T) { + quorumNumbers := types.QuorumNums{0} + + keypair, err := bls.NewKeyPairFromString("0x01") + require.NoError(t, err) + + receipt, err := chainWriter.RegisterOperator(context.Background(), ecdsaPrivateKey, keypair, quorumNumbers, "", false) + require.NoError(t, err) + require.NotNil(t, receipt) + }) } From 8d4afedc4720f2e49f2bf2a0e87cb2a8a3ed0723 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 10:38:54 -0300 Subject: [PATCH 05/11] add update operator test --- chainio/clients/avsregistry/writer_test.go | 26 +++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/chainio/clients/avsregistry/writer_test.go b/chainio/clients/avsregistry/writer_test.go index 57e538a4..9306f2b4 100644 --- a/chainio/clients/avsregistry/writer_test.go +++ b/chainio/clients/avsregistry/writer_test.go @@ -14,6 +14,7 @@ import ( "github.com/Layr-Labs/eigensdk-go/signerv2" "github.com/Layr-Labs/eigensdk-go/testutils" "github.com/Layr-Labs/eigensdk-go/types" + gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" @@ -55,13 +56,32 @@ func TestWriterMethods(t *testing.T) { }, ethHttpClient, txMgr, logger) require.NoError(t, err) + keypair, err := bls.NewKeyPairFromString("0x01") + require.NoError(t, err) + + quorumNumbers := types.QuorumNums{0} + t.Run("register operator", func(t *testing.T) { - quorumNumbers := types.QuorumNums{0} + receipt, err := chainWriter.RegisterOperator( + context.Background(), + ecdsaPrivateKey, + keypair, + quorumNumbers, + "", + false, + ) + require.NoError(t, err) + require.NotNil(t, receipt) + }) - keypair, err := bls.NewKeyPairFromString("0x01") + t.Run("update stake of operator subset", func(t *testing.T) { + receipt, err := chainWriter.UpdateStakesOfOperatorSubsetForAllQuorums(context.Background(), []gethcommon.Address{addr}, true) require.NoError(t, err) + require.NotNil(t, receipt) + }) - receipt, err := chainWriter.RegisterOperator(context.Background(), ecdsaPrivateKey, keypair, quorumNumbers, "", false) + t.Run("update stake of entire operator set", func(t *testing.T) { + receipt, err := chainWriter.UpdateStakesOfEntireOperatorSetForQuorums(context.Background(), [][]gethcommon.Address{{addr}}, quorumNumbers, true) require.NoError(t, err) require.NotNil(t, receipt) }) From 785935ad4c214cea6d2fa20a9a247119fa193422 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 11:19:08 -0300 Subject: [PATCH 06/11] add deregister operator test --- chainio/clients/avsregistry/writer_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/chainio/clients/avsregistry/writer_test.go b/chainio/clients/avsregistry/writer_test.go index 9306f2b4..3db017ae 100644 --- a/chainio/clients/avsregistry/writer_test.go +++ b/chainio/clients/avsregistry/writer_test.go @@ -9,6 +9,7 @@ import ( "github.com/Layr-Labs/eigensdk-go/chainio/clients/wallet" "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" + chainioutils "github.com/Layr-Labs/eigensdk-go/chainio/utils" "github.com/Layr-Labs/eigensdk-go/crypto/bls" "github.com/Layr-Labs/eigensdk-go/logging" "github.com/Layr-Labs/eigensdk-go/signerv2" @@ -85,4 +86,10 @@ func TestWriterMethods(t *testing.T) { require.NoError(t, err) require.NotNil(t, receipt) }) + + t.Run("deregister operator", func(t *testing.T) { + receipt, err := chainWriter.DeregisterOperator(context.Background(), quorumNumbers, chainioutils.ConvertToBN254G1Point(keypair.PubKey), true) + require.NoError(t, err) + require.NotNil(t, receipt) + }) } From f4f96e8542233fc61b7afe706142d08d54d02b44 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 11:24:26 -0300 Subject: [PATCH 07/11] format --- chainio/clients/avsregistry/writer_test.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/chainio/clients/avsregistry/writer_test.go b/chainio/clients/avsregistry/writer_test.go index 3db017ae..77ca8acd 100644 --- a/chainio/clients/avsregistry/writer_test.go +++ b/chainio/clients/avsregistry/writer_test.go @@ -76,19 +76,33 @@ func TestWriterMethods(t *testing.T) { }) t.Run("update stake of operator subset", func(t *testing.T) { - receipt, err := chainWriter.UpdateStakesOfOperatorSubsetForAllQuorums(context.Background(), []gethcommon.Address{addr}, true) + receipt, err := chainWriter.UpdateStakesOfOperatorSubsetForAllQuorums( + context.Background(), + []gethcommon.Address{addr}, + true, + ) require.NoError(t, err) require.NotNil(t, receipt) }) t.Run("update stake of entire operator set", func(t *testing.T) { - receipt, err := chainWriter.UpdateStakesOfEntireOperatorSetForQuorums(context.Background(), [][]gethcommon.Address{{addr}}, quorumNumbers, true) + receipt, err := chainWriter.UpdateStakesOfEntireOperatorSetForQuorums( + context.Background(), + [][]gethcommon.Address{{addr}}, + quorumNumbers, + true, + ) require.NoError(t, err) require.NotNil(t, receipt) }) t.Run("deregister operator", func(t *testing.T) { - receipt, err := chainWriter.DeregisterOperator(context.Background(), quorumNumbers, chainioutils.ConvertToBN254G1Point(keypair.PubKey), true) + receipt, err := chainWriter.DeregisterOperator( + context.Background(), + quorumNumbers, + chainioutils.ConvertToBN254G1Point(keypair.PubKey), + true, + ) require.NoError(t, err) require.NotNil(t, receipt) }) From 09a9b60996df6f5b69938bec14ccea9e47f07c33 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 16:11:19 -0300 Subject: [PATCH 08/11] wait for register operator receipt --- chainio/clients/avsregistry/writer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chainio/clients/avsregistry/writer_test.go b/chainio/clients/avsregistry/writer_test.go index 77ca8acd..2704909e 100644 --- a/chainio/clients/avsregistry/writer_test.go +++ b/chainio/clients/avsregistry/writer_test.go @@ -69,7 +69,7 @@ func TestWriterMethods(t *testing.T) { keypair, quorumNumbers, "", - false, + true, ) require.NoError(t, err) require.NotNil(t, receipt) From 925a0f4c1003b6e778c461d634967cea242e0424 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 17:31:54 -0300 Subject: [PATCH 09/11] format --- chainio/clients/avsregistry/reader_test.go | 83 +++++++++++++--------- 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/chainio/clients/avsregistry/reader_test.go b/chainio/clients/avsregistry/reader_test.go index bc914ed3..e3715ad2 100644 --- a/chainio/clients/avsregistry/reader_test.go +++ b/chainio/clients/avsregistry/reader_test.go @@ -62,32 +62,39 @@ func TestReaderMethods(t *testing.T) { require.NotNil(t, addresses) }) - t.Run("get operators stake in quorums of operator at block returns error for non-registered operator", func(t *testing.T) { - operatorAddress := common.Address{0x1} - operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) - require.NoError(t, err) - - _, _, err = chainReader.GetOperatorsStakeInQuorumsOfOperatorAtBlock(&bind.CallOpts{}, operatorId, 100) - require.Error(t, err) - require.Contains(t, err.Error(), "Failed to get operators state") - }) - - t.Run("get single operator stake in quorums of operator at current block returns error for non-registered operator", func(t *testing.T) { - operatorAddress := common.Address{0x1} - operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) - require.NoError(t, err) - - stakes, err := chainReader.GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock(&bind.CallOpts{}, operatorId) - require.NoError(t, err) - require.Equal(t, 0, len(stakes)) - }) + t.Run( + "get operators stake in quorums of operator at block returns error for non-registered operator", func(t *testing.T) { + operatorAddress := common.Address{0x1} + operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + + _, _, err = chainReader.GetOperatorsStakeInQuorumsOfOperatorAtBlock(&bind.CallOpts{}, operatorId, 100) + require.Error(t, err) + require.Contains(t, err.Error(), "Failed to get operators state") + }) + + t.Run( + "get single operator stake in quorums of operator at current block returns error for non-registered operator", func(t *testing.T) { + operatorAddress := common.Address{0x1} + operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) + require.NoError(t, err) + + stakes, err := chainReader.GetOperatorStakeInQuorumsOfOperatorAtCurrentBlock(&bind.CallOpts{}, operatorId) + require.NoError(t, err) + require.Equal(t, 0, len(stakes)) + }) t.Run("get check signatures indices returns error for non-registered operator", func(t *testing.T) { operatorAddress := common.Address{0x1} operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) require.NoError(t, err) - _, err = chainReader.GetCheckSignaturesIndices(&bind.CallOpts{}, 100, quorumNumbers, []types.OperatorId{operatorId}) + _, err = chainReader.GetCheckSignaturesIndices( + &bind.CallOpts{}, + 100, + quorumNumbers, + []types.OperatorId{operatorId}, + ) require.Contains(t, err.Error(), "Failed to get check signatures indices") }) @@ -122,16 +129,28 @@ func TestReaderMethods(t *testing.T) { require.False(t, isRegistered) }) - t.Run("query existing registered operator pub keys", func(t *testing.T) { - addresses, pubKeys, err := chainReader.QueryExistingRegisteredOperatorPubKeys(context.Background(), big.NewInt(0), nil, nil) - require.NoError(t, err) - require.Equal(t, 0, len(pubKeys)) - require.Equal(t, 0, len(addresses)) - }) - - t.Run("query existing registered operator sockets", func(t *testing.T) { - address_to_sockets, err := chainReader.QueryExistingRegisteredOperatorSockets(context.Background(), big.NewInt(0), nil, nil) - require.NoError(t, err) - require.Equal(t, 0, len(address_to_sockets)) - }) + t.Run( + "query existing registered operator pub keys", func(t *testing.T) { + addresses, pubKeys, err := chainReader.QueryExistingRegisteredOperatorPubKeys( + context.Background(), + big.NewInt(0), + nil, + nil, + ) + require.NoError(t, err) + require.Equal(t, 0, len(pubKeys)) + require.Equal(t, 0, len(addresses)) + }) + + t.Run( + "query existing registered operator sockets", func(t *testing.T) { + address_to_sockets, err := chainReader.QueryExistingRegisteredOperatorSockets( + context.Background(), + big.NewInt(0), + nil, + nil, + ) + require.NoError(t, err) + require.Equal(t, 0, len(address_to_sockets)) + }) } From de8bcc318391da5b59291affdc6de397ecfb4836 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Mon, 30 Sep 2024 17:34:02 -0300 Subject: [PATCH 10/11] format --- chainio/clients/avsregistry/reader_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/chainio/clients/avsregistry/reader_test.go b/chainio/clients/avsregistry/reader_test.go index e3715ad2..1a00fa56 100644 --- a/chainio/clients/avsregistry/reader_test.go +++ b/chainio/clients/avsregistry/reader_test.go @@ -63,7 +63,8 @@ func TestReaderMethods(t *testing.T) { }) t.Run( - "get operators stake in quorums of operator at block returns error for non-registered operator", func(t *testing.T) { + "get operators stake in quorums of operator at block returns error for non-registered operator", + func(t *testing.T) { operatorAddress := common.Address{0x1} operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) require.NoError(t, err) @@ -74,7 +75,8 @@ func TestReaderMethods(t *testing.T) { }) t.Run( - "get single operator stake in quorums of operator at current block returns error for non-registered operator", func(t *testing.T) { + "get single operator stake in quorums of operator at current block returns error for non-registered operator", + func(t *testing.T) { operatorAddress := common.Address{0x1} operatorId, err := chainReader.GetOperatorId(&bind.CallOpts{}, operatorAddress) require.NoError(t, err) From 99afc9aa4d04ed584abf3f6dc5b5c5856bced851 Mon Sep 17 00:00:00 2001 From: tomasarrachea Date: Thu, 3 Oct 2024 16:45:33 -0300 Subject: [PATCH 11/11] refactor tests client setup --- chainio/clients/avsregistry/reader_test.go | 50 ++++++++++++++++------ chainio/clients/avsregistry/writer_test.go | 46 +++----------------- testutils/anvil.go | 13 ++++++ 3 files changed, 54 insertions(+), 55 deletions(-) diff --git a/chainio/clients/avsregistry/reader_test.go b/chainio/clients/avsregistry/reader_test.go index 1a00fa56..b311174d 100644 --- a/chainio/clients/avsregistry/reader_test.go +++ b/chainio/clients/avsregistry/reader_test.go @@ -1,42 +1,64 @@ -package avsregistry +package avsregistry_test import ( "context" - "log/slog" "math/big" "os" "testing" + "github.com/Layr-Labs/eigensdk-go/chainio/clients" "github.com/Layr-Labs/eigensdk-go/logging" "github.com/Layr-Labs/eigensdk-go/testutils" "github.com/Layr-Labs/eigensdk-go/types" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/require" ) -func TestReaderMethods(t *testing.T) { - anvilStateFileName := "contracts-deployed-anvil-state.json" - anvilC, err := testutils.StartAnvilContainer(anvilStateFileName) +// Starts an anvil container and builds the ChainIO Clients for testing. +func BuildTestClients(t *testing.T) *clients.Clients { + testConfig := testutils.GetDefaultTestConfig() + anvilC, err := testutils.StartAnvilContainer(testConfig.AnvilStateFileName) require.NoError(t, err) anvilHttpEndpoint, err := anvilC.Endpoint(context.Background(), "http") require.NoError(t, err) - contractAddrs := testutils.GetContractAddressesFromContractRegistry(anvilHttpEndpoint) - ethHttpClient, err := ethclient.Dial(anvilHttpEndpoint) + anvilWsEndpoint, err := anvilC.Endpoint(context.Background(), "ws") require.NoError(t, err) + logger := logging.NewTextSLogger(os.Stdout, &logging.SLoggerOptions{Level: testConfig.LogLevel}) - quorumNumbers := types.QuorumNums{0} + privateKeyHex := "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + ecdsaPrivateKey, err := crypto.HexToECDSA(privateKeyHex) + require.NoError(t, err) - logger := logging.NewTextSLogger(os.Stdout, &logging.SLoggerOptions{Level: slog.LevelDebug}) + contractAddrs := testutils.GetContractAddressesFromContractRegistry(anvilHttpEndpoint) + require.NoError(t, err) - chainReader, err := NewReaderFromConfig(Config{ - RegistryCoordinatorAddress: contractAddrs.RegistryCoordinator, - OperatorStateRetrieverAddress: contractAddrs.OperatorStateRetriever, - }, ethHttpClient, logger) + chainioConfig := clients.BuildAllConfig{ + EthHttpUrl: anvilHttpEndpoint, + EthWsUrl: anvilWsEndpoint, + RegistryCoordinatorAddr: contractAddrs.RegistryCoordinator.String(), + OperatorStateRetrieverAddr: contractAddrs.OperatorStateRetriever.String(), + AvsName: "exampleAvs", + PromMetricsIpPortAddress: ":9090", + } + + clients, err := clients.BuildAll( + chainioConfig, + ecdsaPrivateKey, + logger, + ) require.NoError(t, err) + return clients +} + +func TestReaderMethods(t *testing.T) { + clients := BuildTestClients(t) + chainReader := clients.ReadClients.AvsRegistryChainReader + + quorumNumbers := types.QuorumNums{0} t.Run("get quorum state", func(t *testing.T) { count, err := chainReader.GetQuorumCount(&bind.CallOpts{}) diff --git a/chainio/clients/avsregistry/writer_test.go b/chainio/clients/avsregistry/writer_test.go index 2704909e..1a21ef47 100644 --- a/chainio/clients/avsregistry/writer_test.go +++ b/chainio/clients/avsregistry/writer_test.go @@ -1,65 +1,29 @@ -package avsregistry +package avsregistry_test import ( "context" - "log/slog" - "os" "testing" - "time" - "github.com/Layr-Labs/eigensdk-go/chainio/clients/wallet" - "github.com/Layr-Labs/eigensdk-go/chainio/txmgr" chainioutils "github.com/Layr-Labs/eigensdk-go/chainio/utils" "github.com/Layr-Labs/eigensdk-go/crypto/bls" - "github.com/Layr-Labs/eigensdk-go/logging" - "github.com/Layr-Labs/eigensdk-go/signerv2" - "github.com/Layr-Labs/eigensdk-go/testutils" "github.com/Layr-Labs/eigensdk-go/types" gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" ) func TestWriterMethods(t *testing.T) { - anvilStateFileName := "contracts-deployed-anvil-state.json" - anvilC, err := testutils.StartAnvilContainer(anvilStateFileName) - require.NoError(t, err) - - anvilHttpEndpoint, err := anvilC.Endpoint(context.Background(), "http") - require.NoError(t, err) + clients := BuildTestClients(t) + chainWriter := clients.AvsRegistryChainWriter - contractAddrs := testutils.GetContractAddressesFromContractRegistry(anvilHttpEndpoint) - ethHttpClient, err := ethclient.Dial(anvilHttpEndpoint) + keypair, err := bls.NewKeyPairFromString("0x01") require.NoError(t, err) - logger := logging.NewTextSLogger(os.Stdout, &logging.SLoggerOptions{Level: slog.LevelDebug}) - + addr := gethcommon.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") ecdsaPrivKeyHex := "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" ecdsaPrivateKey, err := crypto.HexToECDSA(ecdsaPrivKeyHex) require.NoError(t, err) - rpcCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - chainid, err := ethHttpClient.ChainID(rpcCtx) - require.NoError(t, err) - - signerV2, addr, err := signerv2.SignerFromConfig(signerv2.Config{PrivateKey: ecdsaPrivateKey}, chainid) - require.NoError(t, err) - - pkWallet, err := wallet.NewPrivateKeyWallet(ethHttpClient, signerV2, addr, logger) - require.NoError(t, err) - txMgr := txmgr.NewSimpleTxManager(pkWallet, ethHttpClient, logger, addr) - - chainWriter, err := NewWriterFromConfig(Config{ - RegistryCoordinatorAddress: contractAddrs.RegistryCoordinator, - OperatorStateRetrieverAddress: contractAddrs.OperatorStateRetriever, - }, ethHttpClient, txMgr, logger) - require.NoError(t, err) - - keypair, err := bls.NewKeyPairFromString("0x01") - require.NoError(t, err) - quorumNumbers := types.QuorumNums{0} t.Run("register operator", func(t *testing.T) { diff --git a/testutils/anvil.go b/testutils/anvil.go index 3cec5400..ae5f0935 100644 --- a/testutils/anvil.go +++ b/testutils/anvil.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "log/slog" "os/exec" "path/filepath" "runtime" @@ -157,3 +158,15 @@ func AdvanceChainByNBlocksExecInContainer(ctx context.Context, n int, anvilC tes log.Fatalf("Unable to advance anvil chain by n blocks. Expected return code 0, got %v", c) } } + +type TestConfig struct { + AnvilStateFileName string + LogLevel slog.Level +} + +func GetDefaultTestConfig() TestConfig { + return TestConfig{ + AnvilStateFileName: "contracts-deployed-anvil-state.json", + LogLevel: slog.LevelDebug, + } +}