diff --git a/batcher/aligned-batcher/src/retry/batcher_retryables.rs b/batcher/aligned-batcher/src/retry/batcher_retryables.rs index ca7bdff018..d63637abea 100644 --- a/batcher/aligned-batcher/src/retry/batcher_retryables.rs +++ b/batcher/aligned-batcher/src/retry/batcher_retryables.rs @@ -222,197 +222,3 @@ pub async fn cancel_create_new_task_retryable( "Receipt not found".to_string(), ))) } - -#[cfg(test)] -mod test { - use super::*; - use crate::{ - config::{ContractDeploymentOutput, ECDSAConfig}, - eth::{ - self, get_provider, payment_service::BatcherPaymentService, utils::get_batcher_signer, - }, - }; - use ethers::{ - contract::abigen, - types::{Address, U256}, - utils::{Anvil, AnvilInstance}, - }; - use std::str::FromStr; - - abigen!( - BatcherPaymentServiceContract, - "../aligned-sdk/abi/BatcherPaymentService.json" - ); - - async fn setup_anvil(port: u16) -> (AnvilInstance, BatcherPaymentService) { - let anvil = Anvil::new() - .port(port) - .arg("--load-state") - .arg("../../contracts/scripts/anvil/state/alignedlayer-deployed-anvil-state.json") - .spawn(); - - let eth_rpc_provider = eth::get_provider(format!("http://localhost:{}", port)) - .expect("Failed to get provider"); - - let deployment_output = ContractDeploymentOutput::new( - "../../contracts/script/output/devnet/alignedlayer_deployment_output.json".to_string(), - ); - - let payment_service_addr = deployment_output.addresses.batcher_payment_service.clone(); - - let batcher_signer = get_batcher_signer( - eth_rpc_provider, - ECDSAConfig { - private_key_store_path: "../../config-files/anvil.batcher.ecdsa.key.json" - .to_string(), - private_key_store_password: "".to_string(), - }, - ) - .await - .unwrap(); - - let payment_service = - eth::payment_service::get_batcher_payment_service(batcher_signer, payment_service_addr) - .await - .expect("Failed to get Batcher Payment Service contract"); - (anvil, payment_service) - } - - #[tokio::test] - async fn test_get_user_balance_retryable() { - let payment_service; - let dummy_user_addr = - Address::from_str("0x8969c5eD335650692Bc04293B07F5BF2e7A673C0").unwrap(); - { - let _anvil; - (_anvil, payment_service) = setup_anvil(8545u16).await; - - let balance = - get_user_balance_retryable(&payment_service, &payment_service, &dummy_user_addr) - .await - .unwrap(); - - assert_eq!(balance, U256::zero()); - // Anvil is killed when the scope is left - } - - let result = - get_user_balance_retryable(&payment_service, &payment_service, &dummy_user_addr).await; - assert!(matches!(result, Err(RetryError::Transient(_)))); - - // restart anvil - let (_anvil, _) = setup_anvil(8545u16).await; - let balance = - get_user_balance_retryable(&payment_service, &payment_service, &dummy_user_addr) - .await - .unwrap(); - - assert_eq!(balance, U256::zero()); - } - - #[tokio::test] - async fn test_user_balance_is_unlocked_retryable() { - let payment_service; - let dummy_user_addr = - Address::from_str("0x8969c5eD335650692Bc04293B07F5BF2e7A673C0").unwrap(); - - { - let _anvil; - (_anvil, payment_service) = setup_anvil(8546u16).await; - let unlocked = user_balance_is_unlocked_retryable( - &payment_service, - &payment_service, - &dummy_user_addr, - ) - .await - .unwrap(); - - assert_eq!(unlocked, false); - // Anvil is killed when the scope is left - } - - let result = user_balance_is_unlocked_retryable( - &payment_service, - &payment_service, - &dummy_user_addr, - ) - .await; - assert!(matches!(result, Err(RetryError::Transient(_)))); - - // restart Anvil - let (_anvil, _) = setup_anvil(8546u16).await; - let unlocked = user_balance_is_unlocked_retryable( - &payment_service, - &payment_service, - &dummy_user_addr, - ) - .await - .unwrap(); - - assert_eq!(unlocked, false); - } - - #[tokio::test] - async fn test_get_user_nonce_retryable() { - let payment_service; - let dummy_user_addr = - Address::from_str("0x8969c5eD335650692Bc04293B07F5BF2e7A673C0").unwrap(); - { - let _anvil; - (_anvil, payment_service) = setup_anvil(8547u16).await; - let nonce = get_user_nonce_from_ethereum_retryable( - &payment_service, - &payment_service, - dummy_user_addr, - ) - .await - .unwrap(); - - assert_eq!(nonce, U256::zero()); - // Anvil is killed when the scope is left - } - - let result = get_user_nonce_from_ethereum_retryable( - &payment_service, - &payment_service, - dummy_user_addr, - ) - .await; - assert!(matches!(result, Err(RetryError::Transient(_)))); - - // restart Anvil - let (_anvil, _) = setup_anvil(8547u16).await; - - let nonce = get_user_nonce_from_ethereum_retryable( - &payment_service, - &payment_service, - dummy_user_addr, - ) - .await - .unwrap(); - - assert_eq!(nonce, U256::zero()); - } - - #[tokio::test] - async fn test_get_gas_price_retryable() { - let eth_rpc_provider; - { - let (_anvil, _payment_service) = setup_anvil(8548u16).await; - eth_rpc_provider = get_provider("http://localhost:8548".to_string()) - .expect("Failed to get ethereum websocket provider"); - let result = get_gas_price_retryable(ð_rpc_provider, ð_rpc_provider).await; - - assert!(result.is_ok()); - // Anvil is killed when the scope is left - } - let result = get_gas_price_retryable(ð_rpc_provider, ð_rpc_provider).await; - assert!(matches!(result, Err(RetryError::Transient(_)))); - - // restart Anvil - let (_anvil, _) = setup_anvil(8548u16).await; - let result = get_gas_price_retryable(ð_rpc_provider, ð_rpc_provider).await; - - assert!(result.is_ok()); - } -} diff --git a/config-files/config-aggregator-test.yaml b/config-files/config-aggregator-test.yaml deleted file mode 100644 index ac0a122b72..0000000000 --- a/config-files/config-aggregator-test.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# Common variables for all the services -# 'production' only prints info and above. 'development' also prints debug -environment: "production" -aligned_layer_deployment_config_file_path: "../contracts/script/output/devnet/alignedlayer_deployment_output.json" -eigen_layer_deployment_config_file_path: "../contracts/script/output/devnet/eigenlayer_deployment_output.json" -eth_rpc_url: "http://localhost:8545" -eth_rpc_url_fallback: "http://localhost:8545" -eth_ws_url: "ws://localhost:8545" -eth_ws_url_fallback: "ws://localhost:8545" -eigen_metrics_ip_port_address: "localhost:9090" - -## ECDSA Configurations -ecdsa: - private_key_store_path: "../config-files/anvil.aggregator.ecdsa.key.json" - private_key_store_password: "" - -## BLS Configurations -bls: - private_key_store_path: "../config-files/anvil.aggregator.bls.key.json" - private_key_store_password: "" - -## Aggregator Configurations -aggregator: - server_ip_port_address: localhost:8090 - bls_public_key_compendium_address: 0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44 - avs_service_manager_address: 0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690 - enable_metrics: false - metrics_ip_port_address: localhost:9091 - telemetry_ip_port_address: localhost:4001 \ No newline at end of file diff --git a/core/retry_test.go b/core/retry_test.go index 5cb8b2d081..080d5b6235 100644 --- a/core/retry_test.go +++ b/core/retry_test.go @@ -1,31 +1,10 @@ package retry_test import ( - "context" "fmt" - "log" - "math/big" - "os" - "os/exec" - "strconv" - "strings" - "syscall" "testing" - "time" - "github.com/Layr-Labs/eigensdk-go/chainio/clients/eth" - rpccalls "github.com/Layr-Labs/eigensdk-go/metrics/collectors/rpc_calls" - backoff "github.com/cenkalti/backoff/v4" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/prometheus/client_golang/prometheus" - "github.com/stretchr/testify/assert" - servicemanager "github.com/yetanotherco/aligned_layer/contracts/bindings/AlignedLayerServiceManager" retry "github.com/yetanotherco/aligned_layer/core" - "github.com/yetanotherco/aligned_layer/core/chainio" - "github.com/yetanotherco/aligned_layer/core/config" - "github.com/yetanotherco/aligned_layer/core/utils" ) func DummyFunction(x uint64) (uint64, error) { @@ -74,689 +53,3 @@ func TestRetry(t *testing.T) { t.Errorf("Retry error!: %s", err) } } - -/* -Starts an anvil instance via the cli. -Assumes that anvil is installed but checks. -*/ -func SetupAnvil(port uint16) (*exec.Cmd, *eth.InstrumentedClient, error) { - - path, err := exec.LookPath("anvil") - if err != nil { - fmt.Printf("Could not find `anvil` executable in `%s`\n", path) - } - - port_str := strconv.Itoa(int(port)) - http_rpc_url := fmt.Sprintf("http://localhost:%d", port) - - // Create a command - cmd := exec.Command("anvil", "--port", port_str, "--load-state", "../contracts/scripts/anvil/state/alignedlayer-deployed-anvil-state.json", "--block-time", "3") - cmd.SysProcAttr = &syscall.SysProcAttr{ - Setpgid: true, - } - - // Run the command - err = cmd.Start() - if err != nil { - fmt.Printf("Error: %s\n", err) - } - - // Delay needed for anvil to start - time.Sleep(750 * time.Millisecond) - - reg := prometheus.NewRegistry() - rpcCallsCollector := rpccalls.NewCollector("ethRpc", reg) - ethRpcClient, err := eth.NewInstrumentedClient(http_rpc_url, rpcCallsCollector) - if err != nil { - log.Fatal("Error initializing eth rpc client: ", err) - } - - return cmd, ethRpcClient, nil -} - -func TestAnvilSetupKill(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - log.Fatal("Error setting up Anvil: ", err) - } - - // Get Anvil PID - pid := cmd.Process.Pid - p, err := os.FindProcess(pid) - if err != nil { - log.Fatal("Error finding Anvil Process: ", err) - } - err = p.Signal(syscall.Signal(0)) - assert.Nil(t, err, "Anvil Process Killed") - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - // Check that PID is not currently present in running processes. - // FindProcess always succeeds so on Unix systems we call it below. - p, err = os.FindProcess(pid) - if err != nil { - log.Fatal("Error finding Anvil Process: ", err) - } - // Ensure process has exited - err = p.Signal(syscall.Signal(0)) - - assert.Nil(t, err, "Anvil Process Killed") -} - -// |--Aggreagator Retry Tests--| - -func TestWaitForTransactionReceipt(t *testing.T) { - - to := common.BytesToAddress([]byte{0x11}) - tx := types.NewTx(&types.AccessListTx{ - ChainID: big.NewInt(1337), - Nonce: 1, - GasPrice: big.NewInt(11111), - Gas: 1111, - To: &to, - Value: big.NewInt(111), - Data: []byte{0x11, 0x11, 0x11}, - }) - - hash := tx.Hash() - - cmd, client, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - // Assert Call succeeds when Anvil running - _, err = utils.WaitForTransactionReceiptRetryable(*client, *client, hash, retry.SendToChainRetryParams()) - assert.NotNil(t, err, "Error Waiting for Transaction with Anvil Running: %s\n", err) - if !strings.Contains(err.Error(), "not found") { - t.Errorf("WaitForTransactionReceipt Emitted incorrect error: %s\n", err) - return - } - - if err = cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = utils.WaitForTransactionReceiptRetryable(*client, *client, hash, retry.SendToChainRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("WaitForTransactionReceipt Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("WaitForTransactionReceipt Emitted non Transient error: %s\n", err) - return - } - - cmd, client, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = utils.WaitForTransactionReceiptRetryable(*client, *client, hash, retry.SendToChainRetryParams()) - assert.NotNil(t, err) - if !strings.Contains(err.Error(), "not found") { - t.Errorf("WaitForTransactionReceipt Emitted incorrect error: %s\n", err) - return - } - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -// |--AVS-Subscriber Retry Tests--| - -func TestSubscribeToNewTasksV3(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - channel := make(chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV3) - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - baseConfig := aggregatorConfig.BaseConfig - s, err := chainio.NewAvsServiceBindings( - baseConfig.AlignedLayerDeploymentConfig.AlignedLayerServiceManagerAddr, - baseConfig.AlignedLayerDeploymentConfig.AlignedLayerOperatorStateRetrieverAddr, - baseConfig.EthWsClient, baseConfig.EthWsClientFallback, baseConfig.Logger) - if err != nil { - t.Errorf("Error setting up Avs Service Bindings: %s\n", err) - } - - _, err = chainio.SubscribeToNewTasksV3Retryable(&bind.WatchOpts{}, s.ServiceManager, channel, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = chainio.SubscribeToNewTasksV3Retryable(&bind.WatchOpts{}, s.ServiceManager, channel, nil, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("SubscribeToNewTasksV3 Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("SubscribeToNewTasksV3 Emitted non Transient error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = chainio.SubscribeToNewTasksV3Retryable(&bind.WatchOpts{}, s.ServiceManager, channel, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestSubscribeToNewTasksV2(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - channel := make(chan *servicemanager.ContractAlignedLayerServiceManagerNewBatchV2) - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - baseConfig := aggregatorConfig.BaseConfig - s, err := chainio.NewAvsServiceBindings( - baseConfig.AlignedLayerDeploymentConfig.AlignedLayerServiceManagerAddr, - baseConfig.AlignedLayerDeploymentConfig.AlignedLayerOperatorStateRetrieverAddr, - baseConfig.EthWsClient, baseConfig.EthWsClientFallback, baseConfig.Logger) - if err != nil { - t.Errorf("Error setting up Avs Service Bindings: %s\n", err) - } - - _, err = chainio.SubscribeToNewTasksV2Retryable(&bind.WatchOpts{}, s.ServiceManager, channel, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = chainio.SubscribeToNewTasksV2Retryable(&bind.WatchOpts{}, s.ServiceManager, channel, nil, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("SubscribeToNewTasksV2 Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("SubscribeToNewTasksV2 Emitted non Transient error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = chainio.SubscribeToNewTasksV2Retryable(&bind.WatchOpts{}, s.ServiceManager, channel, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestBlockNumber(t *testing.T) { - // Start anvil - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - sub, err := chainio.NewAvsSubscriberFromConfig(aggregatorConfig.BaseConfig) - if err != nil { - return - } - _, err = sub.BlockNumberRetryable(context.Background(), retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = sub.BlockNumberRetryable(context.Background(), retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("BlockNumber Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("BlockNumber Emitted non Transient error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = sub.BlockNumberRetryable(context.Background(), retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestFilterBatchV2(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - avsSubscriber, err := chainio.NewAvsSubscriberFromConfig(aggregatorConfig.BaseConfig) - if err != nil { - return - } - _, err = avsSubscriber.FilterBatchV2Retryable(&bind.FilterOpts{Start: 0, End: nil, Context: context.Background()}, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = avsSubscriber.FilterBatchV2Retryable(&bind.FilterOpts{Start: 0, End: nil, Context: context.Background()}, nil, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("FilterBatchV2 Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("FilterBatchV2 Emitted non Transient error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = avsSubscriber.FilterBatchV2Retryable(&bind.FilterOpts{Start: 0, End: nil, Context: context.Background()}, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestFilterBatchV3(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - avsSubscriber, err := chainio.NewAvsSubscriberFromConfig(aggregatorConfig.BaseConfig) - if err != nil { - return - } - _, err = avsSubscriber.FilterBatchV3Retryable(&bind.FilterOpts{Start: 0, End: nil, Context: context.Background()}, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = avsSubscriber.FilterBatchV3Retryable(&bind.FilterOpts{Start: 0, End: nil, Context: context.Background()}, nil, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("FilerBatchV3 Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("FilterBatchV3 Emitted non Transient error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = avsSubscriber.FilterBatchV3Retryable(&bind.FilterOpts{Start: 0, End: nil, Context: context.Background()}, nil, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestBatchesStateSubscriber(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - avsSubscriber, err := chainio.NewAvsSubscriberFromConfig(aggregatorConfig.BaseConfig) - if err != nil { - return - } - - zero_bytes := [32]byte{} - _, err = avsSubscriber.BatchesStateRetryable(nil, zero_bytes, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = avsSubscriber.BatchesStateRetryable(nil, zero_bytes, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("BatchesStateSubscriber Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("BatchesStateSubscriber Emitted non Transient error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = avsSubscriber.BatchesStateRetryable(nil, zero_bytes, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestSubscribeNewHead(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - c := make(chan *types.Header) - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - avsSubscriber, err := chainio.NewAvsSubscriberFromConfig(aggregatorConfig.BaseConfig) - if err != nil { - return - } - - _, err = avsSubscriber.SubscribeNewHeadRetryable(context.Background(), c, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = avsSubscriber.SubscribeNewHeadRetryable(context.Background(), c, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("SubscribeNewHead Emitted non Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("SubscribeNewHead Emitted non Transient error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = avsSubscriber.SubscribeNewHeadRetryable(context.Background(), c, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - } -} - -// |--AVS-Writer Retry Tests--| - -func TestRespondToTaskV2(t *testing.T) { - // Start anvil - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - g2Point := servicemanager.BN254G2Point{ - X: [2]*big.Int{big.NewInt(4), big.NewInt(3)}, - Y: [2]*big.Int{big.NewInt(2), big.NewInt(8)}, - } - - g1Point := servicemanager.BN254G1Point{ - X: big.NewInt(2), - Y: big.NewInt(1), - } - - g1Points := []servicemanager.BN254G1Point{ - g1Point, g1Point, g1Point, - } - - nonSignerStakesAndSignature := servicemanager.IBLSSignatureCheckerNonSignerStakesAndSignature{ - NonSignerPubkeys: g1Points, - QuorumApks: g1Points, - ApkG2: g2Point, - Sigma: g1Point, - NonSignerQuorumBitmapIndices: make([]uint32, 3), - QuorumApkIndices: make([]uint32, 3), - TotalStakeIndices: make([]uint32, 3), - NonSignerStakeIndices: make([][]uint32, 1, 3), - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - w, err := chainio.NewAvsWriterFromConfig(aggregatorConfig.BaseConfig, aggregatorConfig.EcdsaConfig, nil) - if err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - txOpts := *w.Signer.GetTxOpts() - aggregator_address := common.HexToAddress("0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690") - zero_bytes := [32]byte{} - - // NOTE: With zero bytes the tx reverts - _, err = w.RespondToTaskV2Retryable(&txOpts, zero_bytes, aggregator_address, nonSignerStakesAndSignature, retry.SendToChainRetryParams()) - assert.NotNil(t, err) - if !strings.Contains(err.Error(), "execution reverted") { - t.Errorf("RespondToTaskV2 did not emit the expected message: %q doesn't contain %q", err.Error(), "execution reverted: custom error 0x2396d34e:") - } - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - } - - _, err = w.RespondToTaskV2Retryable(&txOpts, zero_bytes, aggregator_address, nonSignerStakesAndSignature, retry.SendToChainRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(*backoff.PermanentError); ok { - t.Errorf("RespondToTaskV2 Emitted non-Transient error: %s\n", err) - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("RespondToTaskV2 did not return expected error: %s\n", err) - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - // NOTE: With zero bytes the tx reverts - _, err = w.RespondToTaskV2Retryable(&txOpts, zero_bytes, aggregator_address, nonSignerStakesAndSignature, retry.SendToChainRetryParams()) - assert.NotNil(t, err) - if !strings.Contains(err.Error(), "execution reverted") { - t.Errorf("RespondToTaskV2 did not emit the expected message: %q doesn't contain %q", err.Error(), "execution reverted: custom error 0x2396d34e:") - } - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - } -} - -func TestBatchesStateWriter(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - avsWriter, err := chainio.NewAvsWriterFromConfig(aggregatorConfig.BaseConfig, aggregatorConfig.EcdsaConfig, nil) - if err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - num := big.NewInt(6) - - var bytes [32]byte - num.FillBytes(bytes[:]) - - _, err = avsWriter.BatchesStateRetryable(&bind.CallOpts{}, bytes, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("error killing process: %v\n", err) - return - } - - _, err = avsWriter.BatchesStateRetryable(&bind.CallOpts{}, bytes, retry.NetworkRetryParams()) - - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("BatchesStateWriter Emitted non-Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("BatchesStateWriter did not contain expected error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = avsWriter.BatchesStateRetryable(&bind.CallOpts{}, bytes, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestBalanceAt(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - avsWriter, err := chainio.NewAvsWriterFromConfig(aggregatorConfig.BaseConfig, aggregatorConfig.EcdsaConfig, nil) - if err != nil { - return - } - aggregator_address := common.HexToAddress("0x0") - blockHeight := big.NewInt(22) - - _, err = avsWriter.BalanceAtRetryable(context.Background(), aggregator_address, blockHeight, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = avsWriter.BalanceAtRetryable(context.Background(), aggregator_address, blockHeight, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("BalanceAt Emitted non-Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("BalanceAt did not return expected error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = avsWriter.BalanceAtRetryable(context.Background(), aggregator_address, blockHeight, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -} - -func TestBatchersBalances(t *testing.T) { - cmd, _, err := SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - aggregatorConfig := config.NewAggregatorConfig("../config-files/config-aggregator-test.yaml") - avsWriter, err := chainio.NewAvsWriterFromConfig(aggregatorConfig.BaseConfig, aggregatorConfig.EcdsaConfig, nil) - if err != nil { - return - } - senderAddress := common.HexToAddress("0x0") - - _, err = avsWriter.BatcherBalancesRetryable(&bind.CallOpts{}, senderAddress, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } - - _, err = avsWriter.BatcherBalancesRetryable(&bind.CallOpts{}, senderAddress, retry.NetworkRetryParams()) - assert.NotNil(t, err) - if _, ok := err.(retry.PermanentError); ok { - t.Errorf("BatchersBalances Emitted non-Transient error: %s\n", err) - return - } - if !strings.Contains(err.Error(), "connect: connection refused") { - t.Errorf("BatchersBalances did not return expected error: %s\n", err) - return - } - - cmd, _, err = SetupAnvil(8545) - if err != nil { - t.Errorf("Error setting up Anvil: %s\n", err) - } - - _, err = avsWriter.BatcherBalancesRetryable(&bind.CallOpts{}, senderAddress, retry.NetworkRetryParams()) - assert.Nil(t, err) - - if err := cmd.Process.Kill(); err != nil { - t.Errorf("Error killing process: %v\n", err) - return - } -}