Skip to content

Conversation

@iurii-ssv
Copy link
Contributor

I've noticed we could simplify some things related to operator-id (and perhaps fix a bug while at it)

@iurii-ssv iurii-ssv requested review from a team as code owners October 1, 2025 17:55
Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Greptile Overview

Summary

This PR simplifies and clarifies operator ID handling throughout the codebase by making several key architectural changes. The most significant change is the renaming of `format.OperatorID()` to `format.OperatorPubKeyHash()`, which better describes its actual function of computing a SHA256 hash of the operator's public key rather than returning an operator ID. This semantic improvement prevents confusion between the numeric operator ID used for identification and the public key hash used for network identity.

The PR also removes the blocking AwaitOperatorID() method from the OperatorDataStore interface, eliminating potential deadlocks and simplifying the synchronization mechanism. Instead of blocking operations, the code now relies on polling with OperatorIDReady(), making the API more predictable and less prone to concurrency issues.

Additionally, the PR includes several code quality improvements: refactoring the committeeMemberFromShare method to use early returns and avoid unnecessary object creation, removing redundant logging fields, and converting a fatal error in CLI operations to a graceful early return. These changes collectively make the operator ID handling more robust, clearer, and easier to maintain.

Important Files Changed

Changed Files
Filename Score Overview
utils/format/operator_id.go 5/5 Renamed function from OperatorID to OperatorPubKeyHash for semantic clarity
operator/datastore/data_store.go 4/5 Removed blocking AwaitOperatorID method and condition variable synchronization
operator/validator/controller.go 4/5 Refactored committeeMemberFromShare method with early returns and reduced nesting
cli/operator/node.go 4/5 Updated function call and converted fatal error to graceful early return
network/p2p/testutils.go 4/5 Updated test utility to use new OperatorPubKeyHash function
operator/datastore/data_store_test.go 5/5 Removed TestAwaitOperatorID test for deleted method
eth/eventhandler/handlers.go 5/5 Removed redundant operator ID field from warning log message
operator/duties/scheduler.go 5/5 Removed potentially misleading comment about head event subscription timing
operator/node.go 5/5 Minor logging improvements and code formatting changes

Confidence score: 4/5

  • This PR is generally safe to merge with good architectural improvements that reduce complexity
  • Score reflects the removal of blocking operations and function renaming which could affect dependent code
  • Pay close attention to the OperatorDataStore changes and ensure all callers have been updated to use polling instead of blocking

Sequence Diagram

sequenceDiagram
    participant User
    participant StartNodeCmd as "StartNodeCmd (cli/operator/node.go)"
    participant Storage as "Node Storage"
    participant OperatorDataStore as "Operator Data Store"
    participant P2PNetwork as "P2P Network"
    participant ValidatorCtrl as "Validator Controller"

    User->>StartNodeCmd: "Execute start-node command"
    
    StartNodeCmd->>StartNodeCmd: "Load operator keys (SSVSigner/keystore/privkey)"
    StartNodeCmd->>Storage: "NewNodeStorage()"
    
    alt "Using SSV Signer"
        StartNodeCmd->>StartNodeCmd: "ensureOperatorPubKey()"
        StartNodeCmd->>Storage: "GetPublicKey() / SavePublicKey()"
    else "Using local keys"
        StartNodeCmd->>StartNodeCmd: "ensureOperatorPrivateKey()"
        StartNodeCmd->>Storage: "GetPrivateKeyHash() / SavePrivateKeyHash()"
    end
    
    StartNodeCmd->>StartNodeCmd: "setupOperatorDataStore()"
    StartNodeCmd->>Storage: "GetOperatorDataByPubKey()"
    StartNodeCmd->>OperatorDataStore: "New(operatorData)"
    
    StartNodeCmd->>P2PNetwork: "Setup with OperatorPubKeyHash"
    Note over StartNodeCmd,P2PNetwork: "Uses format.OperatorPubKeyHash(operatorData.PublicKey)"
    
    StartNodeCmd->>ValidatorCtrl: "NewController() with OperatorDataStore"
    
    StartNodeCmd->>StartNodeCmd: "syncContractEvents()"
    Note over StartNodeCmd: "Historical event sync may trigger OperatorAdded event"
    
    alt "OperatorAdded event received"
        StartNodeCmd->>OperatorDataStore: "SetOperatorData(operatorDataWithID)"
        Note over OperatorDataStore: "Marks operatorIDReady = true"
    end
    
    StartNodeCmd->>ValidatorCtrl: "InitValidators()"
    ValidatorCtrl->>OperatorDataStore: "GetOperatorID()"
    
    StartNodeCmd->>StartNodeCmd: "Start operator node"
Loading

Context used:

Rule - Prefer shorter, clearer names for methods and constants. If one condition implies another (e.g., attesting implies participating), use the more specific name rather than combining both concepts. (link)

9 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

@codecov
Copy link

codecov bot commented Oct 1, 2025

Codecov Report

❌ Patch coverage is 36.36364% with 14 lines in your changes missing coverage. Please review.
✅ Project coverage is 56.9%. Comparing base (6a8ecdd) to head (4a881a1).
⚠️ Report is 1 commits behind head on stage.

Files with missing lines Patch % Lines
operator/node.go 0.0% 5 Missing ⚠️
operator/validator/controller.go 54.5% 3 Missing and 2 partials ⚠️
cli/operator/node.go 0.0% 3 Missing ⚠️
utils/format/operator_id.go 0.0% 1 Missing ⚠️

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

y0sher
y0sher previously approved these changes Oct 19, 2025
Copy link
Contributor

@y0sher y0sher left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, due to different ordering of startup sequence in the past, operator ID would've had to change for some components after they started, this is where we introduced AwaitOperatorID which isn't used anymore after we fixed the ordering to make more sense.

@yoaz-ssvlabs
Copy link

/test

@ssv-test-bot
Copy link

ssv-test-bot bot commented Oct 20, 2025

🟢 Test run for PR #2553

Branch: operator-id-clarify-and-simplify
Commit: f891a9d

Status

2025-10-20T10:49:29Z Starting test run
2025-10-20T10:49:31Z Test run submitted successfully for commit f891a9d
2025-10-20T10:49:32Z container image for commit f891a9dc527446416c821a6db6e374d854a289fa is build and present in container registry
2025-10-20T10:49:33Z automatically allocated node range cluster=300,301,302,303 for test run on network=hoodi_stage
2025-10-20T10:49:35Z deploying commit f891a9dc527446416c821a6db6e374d854a289fa to ssv nodes 300,301,302,303
2025-10-20T10:50:22Z started test executor with tests=(sanity) and network=hoodi_stage

Click to expand executor logs
═══════════════════════════════════════════════════════════════════════════════════════════════════════
                🧪  WELCOME TO Executor - SSV's Distributed Test Automation Execution Layer  🧪            

                                  ___ __  __ ___  ___  _   _  _____  ___   ___ 
                                 | __|\\ \\/ /| __|/ __|| | | ||_   _|/ _ \\ | _ \\
                                 | _|  >  < | _|| (__ | |_| |  | | | (_) ||   /
                                 |___|/_/\\_\\|___|\\___| \\___/   |_|  \\___/ |_|_\\
                                        

═══════════════════════════════════════════════════════════════════════════════════════════════════════
{"time":"2025-10-20T10:50:24.2067728Z","level":"INFO","msg":"🐳 Docker mode: Using environment variables for config generation"}
{"time":"2025-10-20T10:50:24.258771168Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-10-20T10:50:24.25882557Z","level":"INFO","msg":"📝 Requesting configuration generation from orchestrator API","network":"hoodi_stage","clusters":[300,301,302,303],"tests":"(sanity)"}
{"time":"2025-10-20T10:50:24.301218635Z","level":"INFO","msg":"✅ Configuration generated successfully via API","resource_usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}
{"time":"2025-10-20T10:50:24.301634254Z","level":"INFO","msg":"🚀 EXECUTOR Initialized Successfully"}
{"time":"2025-10-20T10:50:24.301663245Z","level":"INFO","msg":"⚙️ Test configuration loaded","network":"hoodi_stage","nodes":[300,301,302,303],"test_type":{"Sanity":{"ShouldRun":true,"E2M":false,"BulkAmount":0},"Bulk":{"ShouldRun":false,"E2M":false,"BulkAmount":0},"Isolated":{"Tests":null}}}
{"time":"2025-10-20T10:50:29.19698238Z","level":"INFO","msg":"Generated operator pubkeys file","module":"scanner","path":"/app/shared/data/operators/operator-pubkeys-hoodi_stage.json"}
{"time":"2025-10-20T10:50:29.197236362Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"consensus"}
{"time":"2025-10-20T10:50:29.197336295Z","level":"INFO","msg":"Registered parser","module":"main","component":"parser-client","parser_type":"flow-emits"}
{"time":"2025-10-20T10:50:29.197413288Z","level":"INFO","msg":"Validation client initialized","module":"main","loki_enabled":true,"e2m_enabled":false}
{"time":"2025-10-20T10:50:29.19745246Z","level":"INFO","msg":"🔑 KEY STEP: Starting Isolated Tests Concurrently if exists...","module":"main"}
{"time":"2025-10-20T10:50:29.197504357Z","level":"INFO","msg":"🔑 KEY STEP: Starting Sanity Test Suite","module":"main"}
{"time":"2025-10-20T10:50:29.197536433Z","level":"INFO","msg":"No isolated tests configured, skipping","module":"main"}
{"time":"2025-10-20T10:50:29.255761106Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":300}
{"time":"2025-10-20T10:50:29.265284605Z","level":"INFO","msg":"Available slots","test":"sanity","node":300,"slots":3000}
{"time":"2025-10-20T10:50:29.265365659Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":301}
{"time":"2025-10-20T10:50:29.271030256Z","level":"INFO","msg":"Available slots","test":"sanity","node":301,"slots":756}
{"time":"2025-10-20T10:50:29.271130853Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":302}
{"time":"2025-10-20T10:50:29.277077855Z","level":"INFO","msg":"Available slots","test":"sanity","node":302,"slots":452}
{"time":"2025-10-20T10:50:29.277155076Z","level":"INFO","msg":"Getting available slots","test":"sanity","node":303}
{"time":"2025-10-20T10:50:29.282279446Z","level":"INFO","msg":"Available slots","test":"sanity","node":303,"slots":1073}
{"time":"2025-10-20T10:51:09.896447931Z","level":"INFO","msg":"Extracted keyshares path","test":"sanity","module":"keys","path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-10-20T10:51:09.896500435Z","level":"INFO","msg":"Key shares file generated successfully","test":"sanity","keyshare_path":"/app/shared/data/keyshares/0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d.json"}
{"time":"2025-10-20T10:51:11.873052944Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:51:11.873132949Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-20T10:51:11.8731555Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-20T10:51:11.883151257Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:51:11.88321336Z","level":"INFO","msg":"Allowance","test":"sanity","module":"contract","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:51:12.12780675Z","level":"INFO","msg":"Registering validator","test":"sanity","module":"contract","tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:12.132161837Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:22.140956686Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:42.162850716Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911"}
{"time":"2025-10-20T10:51:42.162999351Z","level":"INFO","msg":"✅ SUCCESS: Contract Register Successful","test":"sanity","txHash":"0x5f66a1d407adfa083059a4a20574d1e005d5a228e0c031614e16a09c4faf1911","block_hash":"0x67061a77648ce2741040945a7d67fad1e29b331636a8e6ff0e260fc1d48f3747"}
{"time":"2025-10-20T10:51:42.177529835Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":10,"attempt":1}
{"time":"2025-10-20T10:51:52.190084563Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":20,"attempt":2}
{"time":"2025-10-20T10:52:12.239916107Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":40,"attempt":3}
{"time":"2025-10-20T10:52:52.290053526Z","level":"INFO","msg":"Failed to get data for validator from exporter - retrying...","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d","timeToSleep":80,"attempt":4}
{"time":"2025-10-20T10:54:12.361461755Z","level":"INFO","msg":"Successfully retrieved validator index from exporter","test":"sanity","module":"helpers","pubkey":"0x88e97e72ea3a862b12b44028e65f2af490b8cc19d4b6f1915f1f80325cff9f02d8f5c6fd79f127c5fde7a90fcaa43b8d"}
{"time":"2025-10-20T10:54:12.754487096Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorAdded"}
{"time":"2025-10-20T10:54:12.754556355Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"registration"}
{"time":"2025-10-20T10:54:14.609143167Z","level":"INFO","msg":"Liquidating cluster","test":"sanity","module":"contract","tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:14.613269944Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:24.618144924Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:44.632249914Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:44.632367697Z","level":"INFO","msg":"✅ SUCCESS: Cluster Liquidation Successful","test":"sanity","txHash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166","block_hash":"0x58daf362ebb225e9cf781f680dd84142db670956550c5c61e574bf2dc57dd105"}
{"time":"2025-10-20T10:54:44.632463876Z","level":"INFO","msg":"Querying Loki for transaction hash validation","module":"main","module":"loki-validator","query":"{container=~\\"ssv-node-300|ssv-node-301|ssv-node-302|ssv-node-303\\"} |= \\"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166\\"","tx_hash":"0x27c8f760e931c94030926fa051d00fe626a0e3d5c4dffba1d0ba58a987d4f166"}
{"time":"2025-10-20T10:54:44.773557894Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":1,"max_retries":5,"delay_seconds":30,"start_unix":1760946884,"end_unix":1760957684}
{"time":"2025-10-20T10:55:14.845306721Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":2,"max_retries":5,"delay_seconds":60,"start_unix":1760946884,"end_unix":1760957714}
{"time":"2025-10-20T10:56:14.899250031Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterLiquidated"}
{"time":"2025-10-20T10:56:14.89932585Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"liquidation"}
{"time":"2025-10-20T10:56:17.076672615Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99276309999200282400000000"}
{"time":"2025-10-20T10:56:17.076804789Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-20T10:56:17.076872572Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-20T10:56:17.110932872Z","level":"INFO","msg":"Reactivating cluster","test":"sanity","module":"contract","tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:17.116090688Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:27.122504012Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:27.122585224Z","level":"INFO","msg":"✅ SUCCESS: Cluster Reactivation Successful","test":"sanity","txHash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36","block_hash":"0x8abb0f6c84dba5890cbfc3867e085b0a3a666c787bd464308ac8b5f5d0835271"}
{"time":"2025-10-20T10:56:27.122660054Z","level":"INFO","msg":"Querying Loki for transaction hash validation","module":"main","module":"loki-validator","query":"{container=~\\"ssv-node-300|ssv-node-301|ssv-node-302|ssv-node-303\\"} |= \\"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36\\"","tx_hash":"0x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36"}
{"time":"2025-10-20T10:56:27.277654093Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":1,"max_retries":5,"delay_seconds":30,"start_unix":1760946987,"end_unix":1760957787}
{"time":"2025-10-20T10:56:57.333920223Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":2,"max_retries":5,"delay_seconds":60,"start_unix":1760946987,"end_unix":1760957817}
{"time":"2025-10-20T10:57:57.336432568Z","level":"ERROR","msg":"request failed","module":"HTTPRequester","error":"Get \\"https://loki.ops.ssvlabsinternal.com/loki/api/v1/query_range?query=%7Bcontainer%3D~%22ssv-node-300%7Cssv-node-301%7Cssv-node-302%7Cssv-node-303%22%7D+%7C%3D+%220x9b3952fcfbc1691644f1df34d9f410bb10ca3642c1925ee00ea7245772b9ad36%22+%7C+json+%7C+line_format+%22%7B%7B.container%7D%7D%3A%7B%7B.msg%7D%7D%22&start=1760946987&end=1760957877&limit=1000\\": unexpected EOF","request attempt #":0}
{"time":"2025-10-20T10:57:57.458141452Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":3,"max_retries":5,"delay_seconds":90,"start_unix":1760946987,"end_unix":1760957877}
{"time":"2025-10-20T10:59:27.567904486Z","level":"INFO","msg":"Event validation successful","module":"main","module":"loki-validator","valid_entries":4,"event":"ClusterReactivated"}
{"time":"2025-10-20T10:59:27.568053683Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"reactivation"}
{"time":"2025-10-20T10:59:29.779459758Z","level":"INFO","msg":"Allowance fetched successfully","test":"sanity","module":"contract","account":"0x91e32efb8139cd88cae0df30d2bf471294c6ed27","allowance":"99267309999200282400000000"}
{"time":"2025-10-20T10:59:29.779545057Z","level":"INFO","msg":"Threshold value","test":"sanity","module":"contract","threshold":"9000000000000000000000"}
{"time":"2025-10-20T10:59:29.779571288Z","level":"INFO","msg":"Sufficient allowance","test":"sanity","module":"contract","allowance margin":"6561000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
{"time":"2025-10-20T10:59:29.830378564Z","level":"INFO","msg":"Removing validator","test":"sanity","module":"contract","tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:29.835135535Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":1,"sleep":10,"tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:39.841814192Z","level":"INFO","msg":"Waiting for transaction receipt, retrying...","test":"sanity","module":"contract","attempt":2,"sleep":20,"tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:59.873016604Z","level":"INFO","msg":"Transaction receipt received","test":"sanity","module":"contract","tx_hash":"0x342ac01ef8e72d66ea69f9b825dbbf7801cc266330a4aa12b41eab13894bb033"}
{"time":"2025-10-20T10:59:59.873161659Z","level":"INFO","msg":"✅ SUCCESS: Contract Removal Successful","test":"sanity","blockHash":"0x764837b0ba5eb518563aa4ffa7285481f0db24425a85700322ffaff64f82675d"}
{"time":"2025-10-20T11:00:00.058073893Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":1,"max_retries":5,"delay_seconds":30,"start_unix":1760947199,"end_unix":1760957999}
{"time":"2025-10-20T11:00:30.121154698Z","level":"INFO","msg":"No logs found, retrying after delay (nodes may still be processing)","module":"main","module":"loki-validator","attempt":2,"max_retries":5,"delay_seconds":60,"start_unix":1760947199,"end_unix":1760958030}
{"time":"2025-10-20T11:01:30.183477731Z","level":"INFO","msg":"Validator event validation successful","module":"main","module":"loki-validator","validated_validators":1,"event":"ValidatorRemoved"}
{"time":"2025-10-20T11:01:30.18356406Z","level":"INFO","msg":"SSV node log validation successful","test":"sanity","indices":["1092460"],"validators":1,"validate-type":"removal"}
{"time":"2025-10-20T11:01:30.183672872Z","level":"INFO","msg":"✅ SUCCESS: Sanity Test Suite Completed Successfully","module":"main","register":{"Contract":true,"E2M":false,"Loki":true},"liquidate":{"Contract":true,"E2M":false,"Loki":true},"reactivate":{"Contract":true,"E2M":false,"Loki":true},"remove":{"Contract":true,"E2M":false,"Loki":true}}
{"time":"2025-10-20T11:01:30.183702151Z","level":"INFO","msg":"⏳ PROGRESS: Waiting for all tests to finish","module":"main"}
{"time":"2025-10-20T11:01:30.183743095Z","level":"INFO","msg":"✅ SUCCESS: All Test Suites Completed Successfully","module":"main","passed_suites":["sanity"],"skipped_suites":["isolated"]}
{"time":"2025-10-20T11:01:30.183755826Z","level":"INFO","msg":"🔑 KEY STEP: Starting resource teardown...","module":"main","usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}
{"time":"2025-10-20T11:01:30.190548504Z","level":"INFO","msg":"🌐 Orchestrator API Client initialized","module":"main","endpoint":"http://aetheria-orchestrator.aetheria.svc:8080"}
{"time":"2025-10-20T11:01:30.190647875Z","level":"INFO","msg":"🧹 Requesting resource teardown","module":"main","usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}
{"time":"2025-10-20T11:01:30.22802591Z","level":"INFO","msg":"✅ SUCCESS: Completed resource teardown successfully","module":"main","usage_id":"11e113c6d50f87f6fd82b3278676ae8b"}

2025-10-20T11:01:34Z The test run finished successfully

Result - 🟢 Success

nkryuchkov
nkryuchkov previously approved these changes Oct 23, 2025
@iurii-ssv iurii-ssv dismissed stale reviews from nkryuchkov and y0sher via 4a881a1 October 23, 2025 14:08
@y0sher y0sher merged commit 74c4504 into stage Oct 23, 2025
6 of 7 checks passed
@y0sher y0sher deleted the operator-id-clarify-and-simplify branch October 23, 2025 15:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants