浏览代码

Node: Generate readiness labels programmatically (#2540)

* Node: Generate readiness labels programmatically

Change-Id: Ica03a7cc314b92a0521afad053ffa20f03ff6529

* Move obsolete  labels into test code

Change-Id: I682ec4ca2ea36be1f53b3f6d39f2da4191e2805f

* Code review rework

Change-Id: Idc8f17265a0b6ef357ac98707d20cc2486001520

* Redesign based on feedback

* Near tests failing

* Fix panic in solana
bruce-riley 2 年之前
父节点
当前提交
a52acb52a3

+ 50 - 49
node/cmd/guardiand/node.go

@@ -1097,9 +1097,9 @@ func runNode(cmd *cobra.Command, args []string) {
 		var ethWatcher *evm.Watcher
 		var ethWatcher *evm.Watcher
 		if shouldStart(ethRPC) {
 		if shouldStart(ethRPC) {
 			logger.Info("Starting Ethereum watcher")
 			logger.Info("Starting Ethereum watcher")
-			readiness.RegisterComponent(common.ReadinessEthSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDEthereum)
 			chainObsvReqC[vaa.ChainIDEthereum] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDEthereum] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
-			ethWatcher = evm.NewEthWatcher(*ethRPC, ethContractAddr, "eth", common.ReadinessEthSyncing, vaa.ChainIDEthereum, chainMsgC[vaa.ChainIDEthereum], setWriteC, chainObsvReqC[vaa.ChainIDEthereum], *unsafeDevMode)
+			ethWatcher = evm.NewEthWatcher(*ethRPC, ethContractAddr, "eth", vaa.ChainIDEthereum, chainMsgC[vaa.ChainIDEthereum], setWriteC, chainObsvReqC[vaa.ChainIDEthereum], *unsafeDevMode)
 			if err := supervisor.Run(ctx, "ethwatch",
 			if err := supervisor.Run(ctx, "ethwatch",
 				common.WrapWithScissors(ethWatcher.Run, "ethwatch")); err != nil {
 				common.WrapWithScissors(ethWatcher.Run, "ethwatch")); err != nil {
 				return err
 				return err
@@ -1108,9 +1108,9 @@ func runNode(cmd *cobra.Command, args []string) {
 
 
 		if shouldStart(bscRPC) {
 		if shouldStart(bscRPC) {
 			logger.Info("Starting BSC watcher")
 			logger.Info("Starting BSC watcher")
-			readiness.RegisterComponent(common.ReadinessBSCSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDBSC)
 			chainObsvReqC[vaa.ChainIDBSC] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDBSC] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
-			bscWatcher := evm.NewEthWatcher(*bscRPC, bscContractAddr, "bsc", common.ReadinessBSCSyncing, vaa.ChainIDBSC, chainMsgC[vaa.ChainIDBSC], nil, chainObsvReqC[vaa.ChainIDBSC], *unsafeDevMode)
+			bscWatcher := evm.NewEthWatcher(*bscRPC, bscContractAddr, "bsc", vaa.ChainIDBSC, chainMsgC[vaa.ChainIDBSC], nil, chainObsvReqC[vaa.ChainIDBSC], *unsafeDevMode)
 			bscWatcher.SetWaitForConfirmations(true)
 			bscWatcher.SetWaitForConfirmations(true)
 			if err := supervisor.Run(ctx, "bscwatch", common.WrapWithScissors(bscWatcher.Run, "bscwatch")); err != nil {
 			if err := supervisor.Run(ctx, "bscwatch", common.WrapWithScissors(bscWatcher.Run, "bscwatch")); err != nil {
 				return err
 				return err
@@ -1124,9 +1124,9 @@ func runNode(cmd *cobra.Command, args []string) {
 				log.Fatal("Polygon checkpointing is required in mainnet")
 				log.Fatal("Polygon checkpointing is required in mainnet")
 			}
 			}
 			logger.Info("Starting Polygon watcher")
 			logger.Info("Starting Polygon watcher")
-			readiness.RegisterComponent(common.ReadinessPolygonSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDPolygon)
 			chainObsvReqC[vaa.ChainIDPolygon] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDPolygon] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
-			polygonWatcher := evm.NewEthWatcher(*polygonRPC, polygonContractAddr, "polygon", common.ReadinessPolygonSyncing, vaa.ChainIDPolygon, chainMsgC[vaa.ChainIDPolygon], nil, chainObsvReqC[vaa.ChainIDPolygon], *unsafeDevMode)
+			polygonWatcher := evm.NewEthWatcher(*polygonRPC, polygonContractAddr, "polygon", vaa.ChainIDPolygon, chainMsgC[vaa.ChainIDPolygon], nil, chainObsvReqC[vaa.ChainIDPolygon], *unsafeDevMode)
 			polygonWatcher.SetWaitForConfirmations(waitForConfirmations)
 			polygonWatcher.SetWaitForConfirmations(waitForConfirmations)
 			if err := polygonWatcher.SetRootChainParams(*polygonRootChainRpc, *polygonRootChainContractAddress); err != nil {
 			if err := polygonWatcher.SetRootChainParams(*polygonRootChainRpc, *polygonRootChainContractAddress); err != nil {
 				return err
 				return err
@@ -1137,81 +1137,82 @@ func runNode(cmd *cobra.Command, args []string) {
 		}
 		}
 		if shouldStart(avalancheRPC) {
 		if shouldStart(avalancheRPC) {
 			logger.Info("Starting Avalanche watcher")
 			logger.Info("Starting Avalanche watcher")
-			readiness.RegisterComponent(common.ReadinessAvalancheSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDAvalanche)
 			chainObsvReqC[vaa.ChainIDAvalanche] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDAvalanche] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "avalanchewatch",
 			if err := supervisor.Run(ctx, "avalanchewatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*avalancheRPC, avalancheContractAddr, "avalanche", common.ReadinessAvalancheSyncing, vaa.ChainIDAvalanche, chainMsgC[vaa.ChainIDAvalanche], nil, chainObsvReqC[vaa.ChainIDAvalanche], *unsafeDevMode).Run, "avalanchewatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*avalancheRPC, avalancheContractAddr, "avalanche", vaa.ChainIDAvalanche, chainMsgC[vaa.ChainIDAvalanche], nil, chainObsvReqC[vaa.ChainIDAvalanche], *unsafeDevMode).Run, "avalanchewatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(oasisRPC) {
 		if shouldStart(oasisRPC) {
 			logger.Info("Starting Oasis watcher")
 			logger.Info("Starting Oasis watcher")
+			common.MustRegisterReadinessSyncing(vaa.ChainIDOasis)
 			chainObsvReqC[vaa.ChainIDOasis] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDOasis] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "oasiswatch",
 			if err := supervisor.Run(ctx, "oasiswatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*oasisRPC, oasisContractAddr, "oasis", common.ReadinessOasisSyncing, vaa.ChainIDOasis, chainMsgC[vaa.ChainIDOasis], nil, chainObsvReqC[vaa.ChainIDOasis], *unsafeDevMode).Run, "oasiswatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*oasisRPC, oasisContractAddr, "oasis", vaa.ChainIDOasis, chainMsgC[vaa.ChainIDOasis], nil, chainObsvReqC[vaa.ChainIDOasis], *unsafeDevMode).Run, "oasiswatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(auroraRPC) {
 		if shouldStart(auroraRPC) {
 			logger.Info("Starting Aurora watcher")
 			logger.Info("Starting Aurora watcher")
-			readiness.RegisterComponent(common.ReadinessAuroraSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDAurora)
 			chainObsvReqC[vaa.ChainIDAurora] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDAurora] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "aurorawatch",
 			if err := supervisor.Run(ctx, "aurorawatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*auroraRPC, auroraContractAddr, "aurora", common.ReadinessAuroraSyncing, vaa.ChainIDAurora, chainMsgC[vaa.ChainIDAurora], nil, chainObsvReqC[vaa.ChainIDAurora], *unsafeDevMode).Run, "aurorawatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*auroraRPC, auroraContractAddr, "aurora", vaa.ChainIDAurora, chainMsgC[vaa.ChainIDAurora], nil, chainObsvReqC[vaa.ChainIDAurora], *unsafeDevMode).Run, "aurorawatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(fantomRPC) {
 		if shouldStart(fantomRPC) {
 			logger.Info("Starting Fantom watcher")
 			logger.Info("Starting Fantom watcher")
-			readiness.RegisterComponent(common.ReadinessFantomSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDFantom)
 			chainObsvReqC[vaa.ChainIDFantom] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDFantom] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "fantomwatch",
 			if err := supervisor.Run(ctx, "fantomwatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*fantomRPC, fantomContractAddr, "fantom", common.ReadinessFantomSyncing, vaa.ChainIDFantom, chainMsgC[vaa.ChainIDFantom], nil, chainObsvReqC[vaa.ChainIDFantom], *unsafeDevMode).Run, "fantomwatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*fantomRPC, fantomContractAddr, "fantom", vaa.ChainIDFantom, chainMsgC[vaa.ChainIDFantom], nil, chainObsvReqC[vaa.ChainIDFantom], *unsafeDevMode).Run, "fantomwatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(karuraRPC) {
 		if shouldStart(karuraRPC) {
 			logger.Info("Starting Karura watcher")
 			logger.Info("Starting Karura watcher")
-			readiness.RegisterComponent(common.ReadinessKaruraSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDKarura)
 			chainObsvReqC[vaa.ChainIDKarura] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDKarura] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "karurawatch",
 			if err := supervisor.Run(ctx, "karurawatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*karuraRPC, karuraContractAddr, "karura", common.ReadinessKaruraSyncing, vaa.ChainIDKarura, chainMsgC[vaa.ChainIDKarura], nil, chainObsvReqC[vaa.ChainIDKarura], *unsafeDevMode).Run, "karurawatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*karuraRPC, karuraContractAddr, "karura", vaa.ChainIDKarura, chainMsgC[vaa.ChainIDKarura], nil, chainObsvReqC[vaa.ChainIDKarura], *unsafeDevMode).Run, "karurawatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(acalaRPC) {
 		if shouldStart(acalaRPC) {
 			logger.Info("Starting Acala watcher")
 			logger.Info("Starting Acala watcher")
-			readiness.RegisterComponent(common.ReadinessAcalaSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDAcala)
 			chainObsvReqC[vaa.ChainIDAcala] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDAcala] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "acalawatch",
 			if err := supervisor.Run(ctx, "acalawatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*acalaRPC, acalaContractAddr, "acala", common.ReadinessAcalaSyncing, vaa.ChainIDAcala, chainMsgC[vaa.ChainIDAcala], nil, chainObsvReqC[vaa.ChainIDAcala], *unsafeDevMode).Run, "acalawatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*acalaRPC, acalaContractAddr, "acala", vaa.ChainIDAcala, chainMsgC[vaa.ChainIDAcala], nil, chainObsvReqC[vaa.ChainIDAcala], *unsafeDevMode).Run, "acalawatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(klaytnRPC) {
 		if shouldStart(klaytnRPC) {
 			logger.Info("Starting Klaytn watcher")
 			logger.Info("Starting Klaytn watcher")
-			readiness.RegisterComponent(common.ReadinessKlaytnSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDKlaytn)
 			chainObsvReqC[vaa.ChainIDKlaytn] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDKlaytn] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "klaytnwatch",
 			if err := supervisor.Run(ctx, "klaytnwatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*klaytnRPC, klaytnContractAddr, "klaytn", common.ReadinessKlaytnSyncing, vaa.ChainIDKlaytn, chainMsgC[vaa.ChainIDKlaytn], nil, chainObsvReqC[vaa.ChainIDKlaytn], *unsafeDevMode).Run, "klaytnwatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*klaytnRPC, klaytnContractAddr, "klaytn", vaa.ChainIDKlaytn, chainMsgC[vaa.ChainIDKlaytn], nil, chainObsvReqC[vaa.ChainIDKlaytn], *unsafeDevMode).Run, "klaytnwatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(celoRPC) {
 		if shouldStart(celoRPC) {
 			logger.Info("Starting Celo watcher")
 			logger.Info("Starting Celo watcher")
-			readiness.RegisterComponent(common.ReadinessCeloSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDCelo)
 			chainObsvReqC[vaa.ChainIDCelo] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDCelo] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "celowatch",
 			if err := supervisor.Run(ctx, "celowatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*celoRPC, celoContractAddr, "celo", common.ReadinessCeloSyncing, vaa.ChainIDCelo, chainMsgC[vaa.ChainIDCelo], nil, chainObsvReqC[vaa.ChainIDCelo], *unsafeDevMode).Run, "celowatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*celoRPC, celoContractAddr, "celo", vaa.ChainIDCelo, chainMsgC[vaa.ChainIDCelo], nil, chainObsvReqC[vaa.ChainIDCelo], *unsafeDevMode).Run, "celowatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 		if shouldStart(moonbeamRPC) {
 		if shouldStart(moonbeamRPC) {
 			logger.Info("Starting Moonbeam watcher")
 			logger.Info("Starting Moonbeam watcher")
-			readiness.RegisterComponent(common.ReadinessMoonbeamSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDMoonbeam)
 			chainObsvReqC[vaa.ChainIDMoonbeam] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDMoonbeam] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "moonbeamwatch",
 			if err := supervisor.Run(ctx, "moonbeamwatch",
-				common.WrapWithScissors(evm.NewEthWatcher(*moonbeamRPC, moonbeamContractAddr, "moonbeam", common.ReadinessMoonbeamSyncing, vaa.ChainIDMoonbeam, chainMsgC[vaa.ChainIDMoonbeam], nil, chainObsvReqC[vaa.ChainIDMoonbeam], *unsafeDevMode).Run, "moonbeamwatch")); err != nil {
+				common.WrapWithScissors(evm.NewEthWatcher(*moonbeamRPC, moonbeamContractAddr, "moonbeam", vaa.ChainIDMoonbeam, chainMsgC[vaa.ChainIDMoonbeam], nil, chainObsvReqC[vaa.ChainIDMoonbeam], *unsafeDevMode).Run, "moonbeamwatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
@@ -1220,9 +1221,9 @@ func runNode(cmd *cobra.Command, args []string) {
 				log.Fatalf("if arbitrum is enabled then ethereum must also be enabled.")
 				log.Fatalf("if arbitrum is enabled then ethereum must also be enabled.")
 			}
 			}
 			logger.Info("Starting Arbitrum watcher")
 			logger.Info("Starting Arbitrum watcher")
-			readiness.RegisterComponent(common.ReadinessArbitrumSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDArbitrum)
 			chainObsvReqC[vaa.ChainIDArbitrum] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDArbitrum] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
-			arbitrumWatcher := evm.NewEthWatcher(*arbitrumRPC, arbitrumContractAddr, "arbitrum", common.ReadinessArbitrumSyncing, vaa.ChainIDArbitrum, chainMsgC[vaa.ChainIDArbitrum], nil, chainObsvReqC[vaa.ChainIDArbitrum], *unsafeDevMode)
+			arbitrumWatcher := evm.NewEthWatcher(*arbitrumRPC, arbitrumContractAddr, "arbitrum", vaa.ChainIDArbitrum, chainMsgC[vaa.ChainIDArbitrum], nil, chainObsvReqC[vaa.ChainIDArbitrum], *unsafeDevMode)
 			arbitrumWatcher.SetL1Finalizer(ethWatcher)
 			arbitrumWatcher.SetL1Finalizer(ethWatcher)
 			if err := supervisor.Run(ctx, "arbitrumwatch", common.WrapWithScissors(arbitrumWatcher.Run, "arbitrumwatch")); err != nil {
 			if err := supervisor.Run(ctx, "arbitrumwatch", common.WrapWithScissors(arbitrumWatcher.Run, "arbitrumwatch")); err != nil {
 				return err
 				return err
@@ -1230,9 +1231,9 @@ func runNode(cmd *cobra.Command, args []string) {
 		}
 		}
 		if shouldStart(optimismRPC) {
 		if shouldStart(optimismRPC) {
 			logger.Info("Starting Optimism watcher")
 			logger.Info("Starting Optimism watcher")
-			readiness.RegisterComponent(common.ReadinessOptimismSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDOptimism)
 			chainObsvReqC[vaa.ChainIDOptimism] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDOptimism] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
-			optimismWatcher := evm.NewEthWatcher(*optimismRPC, optimismContractAddr, "optimism", common.ReadinessOptimismSyncing, vaa.ChainIDOptimism, chainMsgC[vaa.ChainIDOptimism], nil, chainObsvReqC[vaa.ChainIDOptimism], *unsafeDevMode)
+			optimismWatcher := evm.NewEthWatcher(*optimismRPC, optimismContractAddr, "optimism", vaa.ChainIDOptimism, chainMsgC[vaa.ChainIDOptimism], nil, chainObsvReqC[vaa.ChainIDOptimism], *unsafeDevMode)
 
 
 			// If rootChainParams are set, pass them in for pre-Bedrock mode
 			// If rootChainParams are set, pass them in for pre-Bedrock mode
 			if *optimismCtcRpc != "" || *optimismCtcContractAddress != "" {
 			if *optimismCtcRpc != "" || *optimismCtcContractAddress != "" {
@@ -1251,37 +1252,37 @@ func runNode(cmd *cobra.Command, args []string) {
 
 
 		if shouldStart(terraWS) {
 		if shouldStart(terraWS) {
 			logger.Info("Starting Terra watcher")
 			logger.Info("Starting Terra watcher")
-			readiness.RegisterComponent(common.ReadinessTerraSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDTerra)
 			chainObsvReqC[vaa.ChainIDTerra] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDTerra] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "terrawatch",
 			if err := supervisor.Run(ctx, "terrawatch",
-				common.WrapWithScissors(cosmwasm.NewWatcher(*terraWS, *terraLCD, *terraContract, chainMsgC[vaa.ChainIDTerra], chainObsvReqC[vaa.ChainIDTerra], common.ReadinessTerraSyncing, vaa.ChainIDTerra).Run, "terrawatch")); err != nil {
+				common.WrapWithScissors(cosmwasm.NewWatcher(*terraWS, *terraLCD, *terraContract, chainMsgC[vaa.ChainIDTerra], chainObsvReqC[vaa.ChainIDTerra], vaa.ChainIDTerra).Run, "terrawatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 
 
 		if shouldStart(terra2WS) {
 		if shouldStart(terra2WS) {
 			logger.Info("Starting Terra 2 watcher")
 			logger.Info("Starting Terra 2 watcher")
-			readiness.RegisterComponent(common.ReadinessTerra2Syncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDTerra2)
 			chainObsvReqC[vaa.ChainIDTerra2] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDTerra2] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "terra2watch",
 			if err := supervisor.Run(ctx, "terra2watch",
-				common.WrapWithScissors(cosmwasm.NewWatcher(*terra2WS, *terra2LCD, *terra2Contract, chainMsgC[vaa.ChainIDTerra2], chainObsvReqC[vaa.ChainIDTerra2], common.ReadinessTerra2Syncing, vaa.ChainIDTerra2).Run, "terra2watch")); err != nil {
+				common.WrapWithScissors(cosmwasm.NewWatcher(*terra2WS, *terra2LCD, *terra2Contract, chainMsgC[vaa.ChainIDTerra2], chainObsvReqC[vaa.ChainIDTerra2], vaa.ChainIDTerra2).Run, "terra2watch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 
 
 		if shouldStart(xplaWS) {
 		if shouldStart(xplaWS) {
 			logger.Info("Starting XPLA watcher")
 			logger.Info("Starting XPLA watcher")
-			readiness.RegisterComponent(common.ReadinessXplaSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDXpla)
 			chainObsvReqC[vaa.ChainIDXpla] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDXpla] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "xplawatch",
 			if err := supervisor.Run(ctx, "xplawatch",
-				common.WrapWithScissors(cosmwasm.NewWatcher(*xplaWS, *xplaLCD, *xplaContract, chainMsgC[vaa.ChainIDXpla], chainObsvReqC[vaa.ChainIDXpla], common.ReadinessXplaSyncing, vaa.ChainIDXpla).Run, "xplawatch")); err != nil {
+				common.WrapWithScissors(cosmwasm.NewWatcher(*xplaWS, *xplaLCD, *xplaContract, chainMsgC[vaa.ChainIDXpla], chainObsvReqC[vaa.ChainIDXpla], vaa.ChainIDXpla).Run, "xplawatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 
 
 		if shouldStart(algorandIndexerRPC) {
 		if shouldStart(algorandIndexerRPC) {
 			logger.Info("Starting Algorand watcher")
 			logger.Info("Starting Algorand watcher")
-			readiness.RegisterComponent(common.ReadinessAlgorandSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDAlgorand)
 			chainObsvReqC[vaa.ChainIDAlgorand] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDAlgorand] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "algorandwatch",
 			if err := supervisor.Run(ctx, "algorandwatch",
 				common.WrapWithScissors(algorand.NewWatcher(*algorandIndexerRPC, *algorandIndexerToken, *algorandAlgodRPC, *algorandAlgodToken, *algorandAppID, chainMsgC[vaa.ChainIDAlgorand], chainObsvReqC[vaa.ChainIDAlgorand]).Run, "algorandwatch")); err != nil {
 				common.WrapWithScissors(algorand.NewWatcher(*algorandIndexerRPC, *algorandIndexerToken, *algorandAlgodRPC, *algorandAlgodToken, *algorandAppID, chainMsgC[vaa.ChainIDAlgorand], chainObsvReqC[vaa.ChainIDAlgorand]).Run, "algorandwatch")); err != nil {
@@ -1290,7 +1291,7 @@ func runNode(cmd *cobra.Command, args []string) {
 		}
 		}
 		if shouldStart(nearRPC) {
 		if shouldStart(nearRPC) {
 			logger.Info("Starting Near watcher")
 			logger.Info("Starting Near watcher")
-			readiness.RegisterComponent(common.ReadinessNearSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDNear)
 			chainObsvReqC[vaa.ChainIDNear] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDNear] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "nearwatch",
 			if err := supervisor.Run(ctx, "nearwatch",
 				common.WrapWithScissors(near.NewWatcher(*nearRPC, *nearContract, chainMsgC[vaa.ChainIDNear], chainObsvReqC[vaa.ChainIDNear], !(*unsafeDevMode || *testnetMode)).Run, "nearwatch")); err != nil {
 				common.WrapWithScissors(near.NewWatcher(*nearRPC, *nearContract, chainMsgC[vaa.ChainIDNear], chainObsvReqC[vaa.ChainIDNear], !(*unsafeDevMode || *testnetMode)).Run, "nearwatch")); err != nil {
@@ -1301,7 +1302,7 @@ func runNode(cmd *cobra.Command, args []string) {
 		// Start Wormchain watcher only if configured
 		// Start Wormchain watcher only if configured
 		if shouldStart(wormchainWS) {
 		if shouldStart(wormchainWS) {
 			logger.Info("Starting Wormchain watcher")
 			logger.Info("Starting Wormchain watcher")
-			readiness.RegisterComponent(common.ReadinessWormchainSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDWormchain)
 			chainObsvReqC[vaa.ChainIDWormchain] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDWormchain] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "wormchainwatch",
 			if err := supervisor.Run(ctx, "wormchainwatch",
 				wormchain.NewWatcher(*wormchainWS, *wormchainLCD, chainMsgC[vaa.ChainIDWormchain], chainObsvReqC[vaa.ChainIDWormchain]).Run); err != nil {
 				wormchain.NewWatcher(*wormchainWS, *wormchainLCD, chainMsgC[vaa.ChainIDWormchain], chainObsvReqC[vaa.ChainIDWormchain]).Run); err != nil {
@@ -1310,7 +1311,7 @@ func runNode(cmd *cobra.Command, args []string) {
 		}
 		}
 		if shouldStart(aptosRPC) {
 		if shouldStart(aptosRPC) {
 			logger.Info("Starting Aptos watcher")
 			logger.Info("Starting Aptos watcher")
-			readiness.RegisterComponent(common.ReadinessAptosSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDAptos)
 			chainObsvReqC[vaa.ChainIDAptos] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDAptos] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "aptoswatch",
 			if err := supervisor.Run(ctx, "aptoswatch",
 				aptos.NewWatcher(*aptosRPC, *aptosAccount, *aptosHandle, chainMsgC[vaa.ChainIDAptos], chainObsvReqC[vaa.ChainIDAptos]).Run); err != nil {
 				aptos.NewWatcher(*aptosRPC, *aptosAccount, *aptosHandle, chainMsgC[vaa.ChainIDAptos], chainObsvReqC[vaa.ChainIDAptos]).Run); err != nil {
@@ -1320,7 +1321,7 @@ func runNode(cmd *cobra.Command, args []string) {
 
 
 		if shouldStart(suiRPC) {
 		if shouldStart(suiRPC) {
 			logger.Info("Starting Sui watcher")
 			logger.Info("Starting Sui watcher")
-			readiness.RegisterComponent(common.ReadinessSuiSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDSui)
 			chainObsvReqC[vaa.ChainIDSui] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDSui] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "suiwatch",
 			if err := supervisor.Run(ctx, "suiwatch",
 				sui.NewWatcher(*suiRPC, *suiWS, *suiAccount, *suiPackage, *unsafeDevMode, chainMsgC[vaa.ChainIDSui], chainObsvReqC[vaa.ChainIDSui]).Run); err != nil {
 				sui.NewWatcher(*suiRPC, *suiWS, *suiAccount, *suiPackage, *unsafeDevMode, chainMsgC[vaa.ChainIDSui], chainObsvReqC[vaa.ChainIDSui]).Run); err != nil {
@@ -1331,13 +1332,13 @@ func runNode(cmd *cobra.Command, args []string) {
 		var solanaFinalizedWatcher *solana.SolanaWatcher
 		var solanaFinalizedWatcher *solana.SolanaWatcher
 		if shouldStart(solanaRPC) {
 		if shouldStart(solanaRPC) {
 			logger.Info("Starting Solana watcher")
 			logger.Info("Starting Solana watcher")
-			readiness.RegisterComponent(common.ReadinessSolanaSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDSolana)
 			chainObsvReqC[vaa.ChainIDSolana] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDSolana] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "solwatch-confirmed",
 			if err := supervisor.Run(ctx, "solwatch-confirmed",
-				common.WrapWithScissors(solana.NewSolanaWatcher(*solanaRPC, nil, solAddress, *solanaContract, chainMsgC[vaa.ChainIDSolana], nil, rpc.CommitmentConfirmed, common.ReadinessSolanaSyncing, vaa.ChainIDSolana).Run, "solwatch-confirmed")); err != nil {
+				common.WrapWithScissors(solana.NewSolanaWatcher(*solanaRPC, nil, solAddress, *solanaContract, chainMsgC[vaa.ChainIDSolana], nil, rpc.CommitmentConfirmed, vaa.ChainIDSolana).Run, "solwatch-confirmed")); err != nil {
 				return err
 				return err
 			}
 			}
-			solanaFinalizedWatcher = solana.NewSolanaWatcher(*solanaRPC, nil, solAddress, *solanaContract, chainMsgC[vaa.ChainIDSolana], chainObsvReqC[vaa.ChainIDSolana], rpc.CommitmentFinalized, common.ReadinessSolanaSyncing, vaa.ChainIDSolana)
+			solanaFinalizedWatcher = solana.NewSolanaWatcher(*solanaRPC, nil, solAddress, *solanaContract, chainMsgC[vaa.ChainIDSolana], chainObsvReqC[vaa.ChainIDSolana], rpc.CommitmentFinalized, vaa.ChainIDSolana)
 			if err := supervisor.Run(ctx, "solwatch-finalized", common.WrapWithScissors(solanaFinalizedWatcher.Run, "solwatch-finalized")); err != nil {
 			if err := supervisor.Run(ctx, "solwatch-finalized", common.WrapWithScissors(solanaFinalizedWatcher.Run, "solwatch-finalized")); err != nil {
 				return err
 				return err
 			}
 			}
@@ -1345,20 +1346,20 @@ func runNode(cmd *cobra.Command, args []string) {
 
 
 		if shouldStart(pythnetRPC) {
 		if shouldStart(pythnetRPC) {
 			logger.Info("Starting Pythnet watcher")
 			logger.Info("Starting Pythnet watcher")
-			readiness.RegisterComponent(common.ReadinessPythNetSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDPythNet)
 			chainObsvReqC[vaa.ChainIDPythNet] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDPythNet] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "pythwatch-confirmed",
 			if err := supervisor.Run(ctx, "pythwatch-confirmed",
-				common.WrapWithScissors(solana.NewSolanaWatcher(*pythnetRPC, pythnetWS, pythnetAddress, *pythnetContract, chainMsgC[vaa.ChainIDPythNet], nil, rpc.CommitmentConfirmed, common.ReadinessPythNetSyncing, vaa.ChainIDPythNet).Run, "pythwatch-confirmed")); err != nil {
+				common.WrapWithScissors(solana.NewSolanaWatcher(*pythnetRPC, pythnetWS, pythnetAddress, *pythnetContract, chainMsgC[vaa.ChainIDPythNet], nil, rpc.CommitmentConfirmed, vaa.ChainIDPythNet).Run, "pythwatch-confirmed")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
 
 
 		if shouldStart(injectiveWS) {
 		if shouldStart(injectiveWS) {
 			logger.Info("Starting Injective watcher")
 			logger.Info("Starting Injective watcher")
-			readiness.RegisterComponent(common.ReadinessInjectiveSyncing)
+			common.MustRegisterReadinessSyncing(vaa.ChainIDInjective)
 			chainObsvReqC[vaa.ChainIDInjective] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			chainObsvReqC[vaa.ChainIDInjective] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 			if err := supervisor.Run(ctx, "injectivewatch",
 			if err := supervisor.Run(ctx, "injectivewatch",
-				common.WrapWithScissors(cosmwasm.NewWatcher(*injectiveWS, *injectiveLCD, *injectiveContract, chainMsgC[vaa.ChainIDInjective], chainObsvReqC[vaa.ChainIDInjective], common.ReadinessInjectiveSyncing, vaa.ChainIDInjective).Run, "injectivewatch")); err != nil {
+				common.WrapWithScissors(cosmwasm.NewWatcher(*injectiveWS, *injectiveLCD, *injectiveContract, chainMsgC[vaa.ChainIDInjective], chainObsvReqC[vaa.ChainIDInjective], vaa.ChainIDInjective).Run, "injectivewatch")); err != nil {
 				return err
 				return err
 			}
 			}
 		}
 		}
@@ -1369,9 +1370,9 @@ func runNode(cmd *cobra.Command, args []string) {
 					log.Fatalf("if neon is enabled then solana must also be enabled.")
 					log.Fatalf("if neon is enabled then solana must also be enabled.")
 				}
 				}
 				logger.Info("Starting Neon watcher")
 				logger.Info("Starting Neon watcher")
-				readiness.RegisterComponent(common.ReadinessNeonSyncing)
+				common.MustRegisterReadinessSyncing(vaa.ChainIDNeon)
 				chainObsvReqC[vaa.ChainIDNeon] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 				chainObsvReqC[vaa.ChainIDNeon] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
-				neonWatcher := evm.NewEthWatcher(*neonRPC, neonContractAddr, "neon", common.ReadinessNeonSyncing, vaa.ChainIDNeon, chainMsgC[vaa.ChainIDNeon], nil, chainObsvReqC[vaa.ChainIDNeon], *unsafeDevMode)
+				neonWatcher := evm.NewEthWatcher(*neonRPC, neonContractAddr, "neon", vaa.ChainIDNeon, chainMsgC[vaa.ChainIDNeon], nil, chainObsvReqC[vaa.ChainIDNeon], *unsafeDevMode)
 				neonWatcher.SetL1Finalizer(solanaFinalizedWatcher)
 				neonWatcher.SetL1Finalizer(solanaFinalizedWatcher)
 				if err := supervisor.Run(ctx, "neonwatch", common.WrapWithScissors(neonWatcher.Run, "neonwatch")); err != nil {
 				if err := supervisor.Run(ctx, "neonwatch", common.WrapWithScissors(neonWatcher.Run, "neonwatch")); err != nil {
 					return err
 					return err
@@ -1379,9 +1380,9 @@ func runNode(cmd *cobra.Command, args []string) {
 			}
 			}
 			if shouldStart(baseRPC) {
 			if shouldStart(baseRPC) {
 				logger.Info("Starting Base watcher")
 				logger.Info("Starting Base watcher")
-				readiness.RegisterComponent(common.ReadinessBaseSyncing)
+				common.MustRegisterReadinessSyncing(vaa.ChainIDBase)
 				chainObsvReqC[vaa.ChainIDBase] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
 				chainObsvReqC[vaa.ChainIDBase] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize)
-				baseWatcher := evm.NewEthWatcher(*baseRPC, baseContractAddr, "base", common.ReadinessBaseSyncing, vaa.ChainIDBase, chainMsgC[vaa.ChainIDBase], nil, chainObsvReqC[vaa.ChainIDBase], *unsafeDevMode)
+				baseWatcher := evm.NewEthWatcher(*baseRPC, baseContractAddr, "base", vaa.ChainIDBase, chainMsgC[vaa.ChainIDBase], nil, chainObsvReqC[vaa.ChainIDBase], *unsafeDevMode)
 				if err := supervisor.Run(ctx, "basewatch", common.WrapWithScissors(baseWatcher.Run, "basewatch")); err != nil {
 				if err := supervisor.Run(ctx, "basewatch", common.WrapWithScissors(baseWatcher.Run, "basewatch")); err != nil {
 					return err
 					return err
 				}
 				}

+ 35 - 28
node/pkg/common/readiness.go

@@ -1,33 +1,40 @@
 package common
 package common
 
 
-import "github.com/certusone/wormhole/node/pkg/readiness"
+import (
+	"fmt"
+
+	"github.com/certusone/wormhole/node/pkg/readiness"
+	"github.com/wormhole-foundation/wormhole/sdk/vaa"
+)
 
 
 const (
 const (
-	ReadinessEthSyncing       readiness.Component = "ethSyncing"
-	ReadinessSolanaSyncing    readiness.Component = "solanaSyncing"
-	ReadinessTerraSyncing     readiness.Component = "terraSyncing"
-	ReadinessAlgorandSyncing  readiness.Component = "algorandSyncing"
-	ReadinessNearSyncing      readiness.Component = "nearSyncing"
-	ReadinessAptosSyncing     readiness.Component = "aptosSyncing"
-	ReadinessSuiSyncing       readiness.Component = "suiSyncing"
-	ReadinessBSCSyncing       readiness.Component = "bscSyncing"
-	ReadinessPolygonSyncing   readiness.Component = "polygonSyncing"
-	ReadinessAvalancheSyncing readiness.Component = "avalancheSyncing"
-	ReadinessOasisSyncing     readiness.Component = "oasisSyncing"
-	ReadinessAuroraSyncing    readiness.Component = "auroraSyncing"
-	ReadinessFantomSyncing    readiness.Component = "fantomSyncing"
-	ReadinessKaruraSyncing    readiness.Component = "karuraSyncing"
-	ReadinessAcalaSyncing     readiness.Component = "acalaSyncing"
-	ReadinessKlaytnSyncing    readiness.Component = "klaytnSyncing"
-	ReadinessCeloSyncing      readiness.Component = "celoSyncing"
-	ReadinessMoonbeamSyncing  readiness.Component = "moonbeamSyncing"
-	ReadinessNeonSyncing      readiness.Component = "neonSyncing"
-	ReadinessTerra2Syncing    readiness.Component = "terra2Syncing"
-	ReadinessInjectiveSyncing readiness.Component = "injectiveSyncing"
-	ReadinessXplaSyncing      readiness.Component = "xplaSyncing"
-	ReadinessPythNetSyncing   readiness.Component = "pythnetSyncing"
-	ReadinessArbitrumSyncing  readiness.Component = "arbitrumSyncing"
-	ReadinessOptimismSyncing  readiness.Component = "optimismSyncing"
-	ReadinessBaseSyncing      readiness.Component = "baseSyncing"
-	ReadinessWormchainSyncing readiness.Component = "wormchainSyncing"
+	ReadinessEthSyncing readiness.Component = "ethSyncing"
 )
 )
+
+// MustRegisterReadinessSyncing registers the specified chain for readiness syncing. It panics if the chain ID is invalid so it should only be used during initialization.
+// This function will
+func MustRegisterReadinessSyncing(chainID vaa.ChainID) {
+	readiness.RegisterComponent(MustConvertChainIdToReadinessSyncing(chainID))
+}
+
+// MustConvertChainIdToReadinessSyncing maps a chain ID to a readiness syncing value. It panics if the chain ID is invalid so it should only be used during initialization.
+func MustConvertChainIdToReadinessSyncing(chainID vaa.ChainID) readiness.Component {
+	readinessSync, err := ConvertChainIdToReadinessSyncing(chainID)
+	if err != nil {
+		panic(err)
+	}
+	return readinessSync
+}
+
+// ConvertChainIdToReadinessSyncing maps a chain ID to a readiness syncing value. It returns an error if the chain ID is invalid.
+func ConvertChainIdToReadinessSyncing(chainID vaa.ChainID) (readiness.Component, error) {
+	if chainID == vaa.ChainIDEthereum {
+		// The readiness for Ethereum is "ethSyncing", not "ethereumSyncing". Changing it would most likely break monitoring. . .
+		return ReadinessEthSyncing, nil
+	}
+	str := chainID.String()
+	if _, err := vaa.ChainIDFromString(str); err != nil {
+		return readiness.Component(""), fmt.Errorf("invalid chainID: %d", uint16(chainID))
+	}
+	return readiness.Component(str + "Syncing"), nil
+}

+ 118 - 0
node/pkg/common/readiness_test.go

@@ -0,0 +1,118 @@
+package common
+
+import (
+	"testing"
+
+	"github.com/certusone/wormhole/node/pkg/readiness"
+	"github.com/wormhole-foundation/wormhole/sdk/vaa"
+
+	"github.com/stretchr/testify/assert"
+)
+
+const (
+	// Ethereum is defined in readiness.go.
+	ReadinessSolanaSyncing    readiness.Component = "solanaSyncing"
+	ReadinessTerraSyncing     readiness.Component = "terraSyncing"
+	ReadinessAlgorandSyncing  readiness.Component = "algorandSyncing"
+	ReadinessNearSyncing      readiness.Component = "nearSyncing"
+	ReadinessAptosSyncing     readiness.Component = "aptosSyncing"
+	ReadinessSuiSyncing       readiness.Component = "suiSyncing"
+	ReadinessBSCSyncing       readiness.Component = "bscSyncing"
+	ReadinessPolygonSyncing   readiness.Component = "polygonSyncing"
+	ReadinessAvalancheSyncing readiness.Component = "avalancheSyncing"
+	ReadinessOasisSyncing     readiness.Component = "oasisSyncing"
+	ReadinessAuroraSyncing    readiness.Component = "auroraSyncing"
+	ReadinessFantomSyncing    readiness.Component = "fantomSyncing"
+	ReadinessKaruraSyncing    readiness.Component = "karuraSyncing"
+	ReadinessAcalaSyncing     readiness.Component = "acalaSyncing"
+	ReadinessKlaytnSyncing    readiness.Component = "klaytnSyncing"
+	ReadinessCeloSyncing      readiness.Component = "celoSyncing"
+	ReadinessMoonbeamSyncing  readiness.Component = "moonbeamSyncing"
+	ReadinessNeonSyncing      readiness.Component = "neonSyncing"
+	ReadinessTerra2Syncing    readiness.Component = "terra2Syncing"
+	ReadinessInjectiveSyncing readiness.Component = "injectiveSyncing"
+	ReadinessXplaSyncing      readiness.Component = "xplaSyncing"
+	ReadinessPythNetSyncing   readiness.Component = "pythnetSyncing"
+	ReadinessArbitrumSyncing  readiness.Component = "arbitrumSyncing"
+	ReadinessOptimismSyncing  readiness.Component = "optimismSyncing"
+	ReadinessBaseSyncing      readiness.Component = "baseSyncing"
+	ReadinessWormchainSyncing readiness.Component = "wormchainSyncing"
+)
+
+// This test is just to make sure that nothing got broken when we switched from manually specifying the readiness syncing labels.
+// Once this functionality is merged, this test can probably be deleted (so that we don't need to keep adding new chains going forward).
+func TestConvertChainIdToReadinessSyncing(t *testing.T) {
+	type test struct {
+		input  vaa.ChainID
+		output readiness.Component
+	}
+
+	// Positive Test Cases
+	p_tests := []test{
+		{input: vaa.ChainIDSolana, output: ReadinessSolanaSyncing},
+		{input: vaa.ChainIDEthereum, output: ReadinessEthSyncing},
+		{input: vaa.ChainIDTerra, output: ReadinessTerraSyncing},
+		{input: vaa.ChainIDBSC, output: ReadinessBSCSyncing},
+		{input: vaa.ChainIDPolygon, output: ReadinessPolygonSyncing},
+		{input: vaa.ChainIDAvalanche, output: ReadinessAvalancheSyncing},
+		{input: vaa.ChainIDOasis, output: ReadinessOasisSyncing},
+		{input: vaa.ChainIDAlgorand, output: ReadinessAlgorandSyncing},
+		{input: vaa.ChainIDAptos, output: ReadinessAptosSyncing},
+		{input: vaa.ChainIDSui, output: ReadinessSuiSyncing},
+		{input: vaa.ChainIDNear, output: ReadinessNearSyncing},
+		{input: vaa.ChainIDAurora, output: ReadinessAuroraSyncing},
+		{input: vaa.ChainIDFantom, output: ReadinessFantomSyncing},
+		{input: vaa.ChainIDKarura, output: ReadinessKaruraSyncing},
+		{input: vaa.ChainIDAcala, output: ReadinessAcalaSyncing},
+		{input: vaa.ChainIDKlaytn, output: ReadinessKlaytnSyncing},
+		{input: vaa.ChainIDCelo, output: ReadinessCeloSyncing},
+		{input: vaa.ChainIDMoonbeam, output: ReadinessMoonbeamSyncing},
+		{input: vaa.ChainIDNeon, output: ReadinessNeonSyncing},
+		{input: vaa.ChainIDTerra2, output: ReadinessTerra2Syncing},
+		{input: vaa.ChainIDInjective, output: ReadinessInjectiveSyncing},
+		{input: vaa.ChainIDArbitrum, output: ReadinessArbitrumSyncing},
+		{input: vaa.ChainIDPythNet, output: ReadinessPythNetSyncing},
+		{input: vaa.ChainIDOptimism, output: ReadinessOptimismSyncing},
+		{input: vaa.ChainIDXpla, output: ReadinessXplaSyncing},
+		// BTC readiness not defined yet {input: vaa.ChainIDBtc, output: ReadinessBtcSyncing},
+		{input: vaa.ChainIDBase, output: ReadinessBaseSyncing},
+	}
+
+	// Negative Test Cases
+	n_tests := []test{
+		{input: vaa.ChainIDUnset, output: ""},
+	}
+
+	for _, tc := range p_tests {
+		t.Run(tc.input.String(), func(t *testing.T) {
+			chainId, err := ConvertChainIdToReadinessSyncing(tc.input)
+			assert.Equal(t, tc.output, chainId)
+			assert.NoError(t, err)
+		})
+	}
+
+	for _, tc := range n_tests {
+		t.Run(tc.input.String(), func(t *testing.T) {
+			chainId, err := ConvertChainIdToReadinessSyncing(tc.input)
+			assert.Equal(t, tc.output, chainId)
+			assert.Error(t, err)
+		})
+	}
+}
+
+func TestMustRegisterReadinessSyncing(t *testing.T) {
+	// The first time should work.
+	assert.NotPanics(t, func() {
+		MustRegisterReadinessSyncing(vaa.ChainIDEthereum)
+	})
+
+	// A second time should panic.
+	assert.Panics(t, func() {
+		MustRegisterReadinessSyncing(vaa.ChainIDEthereum)
+	})
+
+	// An invalid chainID should panic.
+	assert.Panics(t, func() {
+		MustRegisterReadinessSyncing(vaa.ChainIDUnset)
+	})
+}

+ 3 - 3
node/pkg/readiness/health.go

@@ -21,20 +21,20 @@ type Component string
 // RegisterComponent registers the given component name such that it is required to be ready for the global check to succeed.
 // RegisterComponent registers the given component name such that it is required to be ready for the global check to succeed.
 func RegisterComponent(component Component) {
 func RegisterComponent(component Component) {
 	mu.Lock()
 	mu.Lock()
+	defer mu.Unlock()
 	if _, ok := registry[string(component)]; ok {
 	if _, ok := registry[string(component)]; ok {
 		panic("component already registered")
 		panic("component already registered")
 	}
 	}
 	registry[string(component)] = false
 	registry[string(component)] = false
-	mu.Unlock()
 }
 }
 
 
 // SetReady sets the given global component state.
 // SetReady sets the given global component state.
 func SetReady(component Component) {
 func SetReady(component Component) {
 	mu.Lock()
 	mu.Lock()
+	defer mu.Unlock()
 	if !registry[string(component)] {
 	if !registry[string(component)] {
 		registry[string(component)] = true
 		registry[string(component)] = true
 	}
 	}
-	mu.Unlock()
 }
 }
 
 
 // Handler returns a net/http handler for the readiness check. It returns 200 OK if all components are ready,
 // Handler returns a net/http handler for the readiness check. It returns 200 OK if all components are ready,
@@ -54,6 +54,7 @@ func Handler(w http.ResponseWriter, r *http.Request) {
 	}
 	}
 
 
 	mu.Lock()
 	mu.Lock()
+	defer mu.Unlock()
 	for k, v := range registry {
 	for k, v := range registry {
 		_, err = fmt.Fprintf(resp, "%s\t%v\n", k, v)
 		_, err = fmt.Fprintf(resp, "%s\t%v\n", k, v)
 		if err != nil {
 		if err != nil {
@@ -64,7 +65,6 @@ func Handler(w http.ResponseWriter, r *http.Request) {
 			ready = false
 			ready = false
 		}
 		}
 	}
 	}
-	mu.Unlock()
 
 
 	if !ready {
 	if !ready {
 		w.WriteHeader(http.StatusPreconditionFailed)
 		w.WriteHeader(http.StatusPreconditionFailed)

+ 13 - 11
node/pkg/watchers/algorand/watcher.go

@@ -33,8 +33,9 @@ type (
 		algodToken   string
 		algodToken   string
 		appid        uint64
 		appid        uint64
 
 
-		msgC     chan<- *common.MessagePublication
-		obsvReqC <-chan *gossipv1.ObservationRequest
+		msgC          chan<- *common.MessagePublication
+		obsvReqC      <-chan *gossipv1.ObservationRequest
+		readinessSync readiness.Component
 
 
 		next_round uint64
 		next_round uint64
 	}
 	}
@@ -64,14 +65,15 @@ func NewWatcher(
 	obsvReqC <-chan *gossipv1.ObservationRequest,
 	obsvReqC <-chan *gossipv1.ObservationRequest,
 ) *Watcher {
 ) *Watcher {
 	return &Watcher{
 	return &Watcher{
-		indexerRPC:   indexerRPC,
-		indexerToken: indexerToken,
-		algodRPC:     algodRPC,
-		algodToken:   algodToken,
-		appid:        appid,
-		msgC:         msgC,
-		obsvReqC:     obsvReqC,
-		next_round:   0,
+		indexerRPC:    indexerRPC,
+		indexerToken:  indexerToken,
+		algodRPC:      algodRPC,
+		algodToken:    algodToken,
+		appid:         appid,
+		msgC:          msgC,
+		obsvReqC:      obsvReqC,
+		readinessSync: common.MustConvertChainIdToReadinessSyncing(vaa.ChainIDAlgorand),
+		next_round:    0,
 	}
 	}
 }
 }
 
 
@@ -252,7 +254,7 @@ func (e *Watcher) Run(ctx context.Context) error {
 				ContractAddress: fmt.Sprintf("%d", e.appid),
 				ContractAddress: fmt.Sprintf("%d", e.appid),
 			})
 			})
 
 
-			readiness.SetReady(common.ReadinessAlgorandSyncing)
+			readiness.SetReady(e.readinessSync)
 		}
 		}
 	}
 	}
 }
 }

+ 10 - 8
node/pkg/watchers/aptos/watcher.go

@@ -29,8 +29,9 @@ type (
 		aptosAccount string
 		aptosAccount string
 		aptosHandle  string
 		aptosHandle  string
 
 
-		msgC     chan<- *common.MessagePublication
-		obsvReqC <-chan *gossipv1.ObservationRequest
+		msgC          chan<- *common.MessagePublication
+		obsvReqC      <-chan *gossipv1.ObservationRequest
+		readinessSync readiness.Component
 	}
 	}
 )
 )
 
 
@@ -56,11 +57,12 @@ func NewWatcher(
 	obsvReqC <-chan *gossipv1.ObservationRequest,
 	obsvReqC <-chan *gossipv1.ObservationRequest,
 ) *Watcher {
 ) *Watcher {
 	return &Watcher{
 	return &Watcher{
-		aptosRPC:     aptosRPC,
-		aptosAccount: aptosAccount,
-		aptosHandle:  aptosHandle,
-		msgC:         msgC,
-		obsvReqC:     obsvReqC,
+		aptosRPC:      aptosRPC,
+		aptosAccount:  aptosAccount,
+		aptosHandle:   aptosHandle,
+		msgC:          msgC,
+		obsvReqC:      obsvReqC,
+		readinessSync: common.MustConvertChainIdToReadinessSyncing(vaa.ChainIDAptos),
 	}
 	}
 }
 }
 
 
@@ -223,7 +225,7 @@ func (e *Watcher) Run(ctx context.Context) error {
 					ContractAddress: e.aptosAccount,
 					ContractAddress: e.aptosAccount,
 				})
 				})
 
 
-				readiness.SetReady(common.ReadinessAptosSyncing)
+				readiness.SetReady(e.readinessSync)
 			}
 			}
 		}
 		}
 	}
 	}

+ 5 - 4
node/pkg/watchers/cosmwasm/watcher.go

@@ -43,7 +43,7 @@ type (
 		obsvReqC <-chan *gossipv1.ObservationRequest
 		obsvReqC <-chan *gossipv1.ObservationRequest
 
 
 		// Readiness component
 		// Readiness component
-		readiness readiness.Component
+		readinessSync readiness.Component
 		// VAA ChainID of the network we're connecting to.
 		// VAA ChainID of the network we're connecting to.
 		chainID vaa.ChainID
 		chainID vaa.ChainID
 		// Key for contract address in the wasm logs
 		// Key for contract address in the wasm logs
@@ -97,7 +97,6 @@ func NewWatcher(
 	contract string,
 	contract string,
 	msgC chan<- *common.MessagePublication,
 	msgC chan<- *common.MessagePublication,
 	obsvReqC <-chan *gossipv1.ObservationRequest,
 	obsvReqC <-chan *gossipv1.ObservationRequest,
-	readiness readiness.Component,
 	chainID vaa.ChainID) *Watcher {
 	chainID vaa.ChainID) *Watcher {
 
 
 	// CosmWasm 1.0.0
 	// CosmWasm 1.0.0
@@ -123,7 +122,7 @@ func NewWatcher(
 		contract:                 contract,
 		contract:                 contract,
 		msgC:                     msgC,
 		msgC:                     msgC,
 		obsvReqC:                 obsvReqC,
 		obsvReqC:                 obsvReqC,
-		readiness:                readiness,
+		readinessSync:            common.MustConvertChainIdToReadinessSyncing(chainID),
 		chainID:                  chainID,
 		chainID:                  chainID,
 		contractAddressFilterKey: contractAddressFilterKey,
 		contractAddressFilterKey: contractAddressFilterKey,
 		contractAddressLogKey:    contractAddressLogKey,
 		contractAddressLogKey:    contractAddressLogKey,
@@ -180,7 +179,7 @@ func (e *Watcher) Run(ctx context.Context) error {
 	}
 	}
 	logger.Info("subscribed to new transaction events", zap.String("network", networkName))
 	logger.Info("subscribed to new transaction events", zap.String("network", networkName))
 
 
-	readiness.SetReady(e.readiness)
+	readiness.SetReady(e.readinessSync)
 
 
 	common.RunWithScissors(ctx, errC, "cosmwasm_block_height", func(ctx context.Context) error {
 	common.RunWithScissors(ctx, errC, "cosmwasm_block_height", func(ctx context.Context) error {
 		t := time.NewTicker(5 * time.Second)
 		t := time.NewTicker(5 * time.Second)
@@ -220,6 +219,8 @@ func (e *Watcher) Run(ctx context.Context) error {
 					Height:          latestBlock.Int(),
 					Height:          latestBlock.Int(),
 					ContractAddress: e.contract,
 					ContractAddress: e.contract,
 				})
 				})
+
+				readiness.SetReady(e.readinessSync)
 			}
 			}
 		}
 		}
 	})
 	})

+ 4 - 5
node/pkg/watchers/evm/watcher.go

@@ -72,7 +72,7 @@ type (
 		// Human-readable name of the Eth network, for logging and monitoring.
 		// Human-readable name of the Eth network, for logging and monitoring.
 		networkName string
 		networkName string
 		// Readiness component
 		// Readiness component
-		readiness readiness.Component
+		readinessSync readiness.Component
 		// VAA ChainID of the network we're connecting to.
 		// VAA ChainID of the network we're connecting to.
 		chainID vaa.ChainID
 		chainID vaa.ChainID
 
 
@@ -139,7 +139,6 @@ func NewEthWatcher(
 	url string,
 	url string,
 	contract eth_common.Address,
 	contract eth_common.Address,
 	networkName string,
 	networkName string,
-	readiness readiness.Component,
 	chainID vaa.ChainID,
 	chainID vaa.ChainID,
 	msgC chan<- *common.MessagePublication,
 	msgC chan<- *common.MessagePublication,
 	setC chan<- *common.GuardianSet,
 	setC chan<- *common.GuardianSet,
@@ -151,7 +150,7 @@ func NewEthWatcher(
 		url:                  url,
 		url:                  url,
 		contract:             contract,
 		contract:             contract,
 		networkName:          networkName,
 		networkName:          networkName,
-		readiness:            readiness,
+		readinessSync:        common.MustConvertChainIdToReadinessSyncing(chainID),
 		waitForConfirmations: false,
 		waitForConfirmations: false,
 		maxWaitConfirmations: 60,
 		maxWaitConfirmations: 60,
 		chainID:              chainID,
 		chainID:              chainID,
@@ -642,7 +641,7 @@ func (w *Watcher) Run(ctx context.Context) error {
 					zap.Bool("is_safe_block", ev.Safe),
 					zap.Bool("is_safe_block", ev.Safe),
 					zap.String("eth_network", w.networkName))
 					zap.String("eth_network", w.networkName))
 				currentEthHeight.WithLabelValues(w.networkName).Set(float64(ev.Number.Int64()))
 				currentEthHeight.WithLabelValues(w.networkName).Set(float64(ev.Number.Int64()))
-				readiness.SetReady(w.readiness)
+				readiness.SetReady(w.readinessSync)
 				p2p.DefaultRegistry.SetNetworkStats(w.chainID, &gossipv1.Heartbeat_Network{
 				p2p.DefaultRegistry.SetNetworkStats(w.chainID, &gossipv1.Heartbeat_Network{
 					Height:          ev.Number.Int64(),
 					Height:          ev.Number.Int64(),
 					ContractAddress: w.contract.Hex(),
 					ContractAddress: w.contract.Hex(),
@@ -801,7 +800,7 @@ func (w *Watcher) Run(ctx context.Context) error {
 
 
 	// Now that the init is complete, peg readiness. That will also happen when we process a new head, but chains
 	// Now that the init is complete, peg readiness. That will also happen when we process a new head, but chains
 	// that wait for finality may take a while to receive the first block and we don't want to hold up the init.
 	// that wait for finality may take a while to receive the first block and we don't want to hold up the init.
-	readiness.SetReady(w.readiness)
+	readiness.SetReady(w.readinessSync)
 
 
 	select {
 	select {
 	case <-ctx.Done():
 	case <-ctx.Done():

+ 5 - 3
node/pkg/watchers/near/watcher.go

@@ -67,8 +67,9 @@ type (
 		nearRPC         string
 		nearRPC         string
 
 
 		// external channels
 		// external channels
-		msgC     chan<- *common.MessagePublication   // validated (SECURITY: and only validated!) observations go into this channel
-		obsvReqC <-chan *gossipv1.ObservationRequest // observation requests are coming from this channel
+		msgC          chan<- *common.MessagePublication   // validated (SECURITY: and only validated!) observations go into this channel
+		obsvReqC      <-chan *gossipv1.ObservationRequest // observation requests are coming from this channel
+		readinessSync readiness.Component
 
 
 		// internal queues
 		// internal queues
 		transactionProcessingQueueCounter atomic.Int64
 		transactionProcessingQueueCounter atomic.Int64
@@ -102,6 +103,7 @@ func NewWatcher(
 		nearRPC:                      nearRPC,
 		nearRPC:                      nearRPC,
 		msgC:                         msgC,
 		msgC:                         msgC,
 		obsvReqC:                     obsvReqC,
 		obsvReqC:                     obsvReqC,
+		readinessSync:                common.MustConvertChainIdToReadinessSyncing(vaa.ChainIDNear),
 		transactionProcessingQueue:   make(chan *transactionProcessingJob),
 		transactionProcessingQueue:   make(chan *transactionProcessingJob),
 		chunkProcessingQueue:         make(chan nearapi.ChunkHeader, queueSize),
 		chunkProcessingQueue:         make(chan nearapi.ChunkHeader, queueSize),
 		eventChanTxProcessedDuration: make(chan time.Duration, 10),
 		eventChanTxProcessedDuration: make(chan time.Duration, 10),
@@ -149,7 +151,7 @@ func (e *Watcher) runBlockPoll(ctx context.Context) error {
 				Height:          int64(highestFinalBlockHeightObserved),
 				Height:          int64(highestFinalBlockHeightObserved),
 				ContractAddress: e.wormholeAccount,
 				ContractAddress: e.wormholeAccount,
 			})
 			})
-			readiness.SetReady(common.ReadinessNearSyncing)
+			readiness.SetReady(e.readinessSync)
 
 
 			timer.Reset(blockPollInterval)
 			timer.Reset(blockPollInterval)
 		}
 		}

+ 13 - 14
node/pkg/watchers/solana/client.go

@@ -42,7 +42,7 @@ type (
 		pumpData    chan []byte
 		pumpData    chan []byte
 		rpcClient   *rpc.Client
 		rpcClient   *rpc.Client
 		// Readiness component
 		// Readiness component
-		readiness readiness.Component
+		readinessSync readiness.Component
 		// VAA ChainID of the network we're connecting to.
 		// VAA ChainID of the network we're connecting to.
 		chainID vaa.ChainID
 		chainID vaa.ChainID
 		// Human readable name of network
 		// Human readable name of network
@@ -181,20 +181,19 @@ func NewSolanaWatcher(
 	msgC chan<- *common.MessagePublication,
 	msgC chan<- *common.MessagePublication,
 	obsvReqC <-chan *gossipv1.ObservationRequest,
 	obsvReqC <-chan *gossipv1.ObservationRequest,
 	commitment rpc.CommitmentType,
 	commitment rpc.CommitmentType,
-	readiness readiness.Component,
 	chainID vaa.ChainID) *SolanaWatcher {
 	chainID vaa.ChainID) *SolanaWatcher {
 	return &SolanaWatcher{
 	return &SolanaWatcher{
-		rpcUrl:      rpcUrl,
-		wsUrl:       wsUrl,
-		contract:    contractAddress,
-		rawContract: rawContract,
-		msgC:        msgC,
-		obsvReqC:    obsvReqC,
-		commitment:  commitment,
-		rpcClient:   rpc.New(rpcUrl),
-		readiness:   readiness,
-		chainID:     chainID,
-		networkName: vaa.ChainID(chainID).String(),
+		rpcUrl:        rpcUrl,
+		wsUrl:         wsUrl,
+		contract:      contractAddress,
+		rawContract:   rawContract,
+		msgC:          msgC,
+		obsvReqC:      obsvReqC,
+		commitment:    commitment,
+		rpcClient:     rpc.New(rpcUrl),
+		readinessSync: common.MustConvertChainIdToReadinessSyncing(chainID),
+		chainID:       chainID,
+		networkName:   vaa.ChainID(chainID).String(),
 	}
 	}
 }
 }
 
 
@@ -334,7 +333,7 @@ func (s *SolanaWatcher) Run(ctx context.Context) error {
 					lastSlot = slot - 1
 					lastSlot = slot - 1
 				}
 				}
 				currentSolanaHeight.WithLabelValues(s.networkName, string(s.commitment)).Set(float64(slot))
 				currentSolanaHeight.WithLabelValues(s.networkName, string(s.commitment)).Set(float64(slot))
-				readiness.SetReady(s.readiness)
+				readiness.SetReady(s.readinessSync)
 				p2p.DefaultRegistry.SetNetworkStats(s.chainID, &gossipv1.Heartbeat_Network{
 				p2p.DefaultRegistry.SetNetworkStats(s.chainID, &gossipv1.Heartbeat_Network{
 					Height:          int64(slot),
 					Height:          int64(slot),
 					ContractAddress: contractAddr,
 					ContractAddress: contractAddr,

+ 5 - 3
node/pkg/watchers/sui/watcher.go

@@ -42,8 +42,9 @@ type (
 
 
 		unsafeDevMode bool
 		unsafeDevMode bool
 
 
-		msgChan  chan *common.MessagePublication
-		obsvReqC chan *gossipv1.ObservationRequest
+		msgChan       chan *common.MessagePublication
+		obsvReqC      chan *gossipv1.ObservationRequest
+		readinessSync readiness.Component
 
 
 		subId      int64
 		subId      int64
 		subscribed bool
 		subscribed bool
@@ -136,6 +137,7 @@ func NewWatcher(
 		unsafeDevMode: unsafeDevMode,
 		unsafeDevMode: unsafeDevMode,
 		msgChan:       messageEvents,
 		msgChan:       messageEvents,
 		obsvReqC:      obsvReqC,
 		obsvReqC:      obsvReqC,
+		readinessSync: common.MustConvertChainIdToReadinessSyncing(vaa.ChainIDSui),
 		subId:         0,
 		subId:         0,
 		subscribed:    false,
 		subscribed:    false,
 	}
 	}
@@ -410,7 +412,7 @@ func (e *Watcher) Run(ctx context.Context) error {
 			})
 			})
 
 
 			if e.subscribed {
 			if e.subscribed {
-				readiness.SetReady(common.ReadinessSuiSyncing)
+				readiness.SetReady(e.readinessSync)
 			}
 			}
 		}
 		}
 	}
 	}

+ 12 - 2
node/pkg/watchers/wormchain/watcher.go

@@ -39,6 +39,8 @@ type (
 		// Incoming re-observation requests from the network. Pre-filtered to only
 		// Incoming re-observation requests from the network. Pre-filtered to only
 		// include requests for our chainID.
 		// include requests for our chainID.
 		obsvReqC <-chan *gossipv1.ObservationRequest
 		obsvReqC <-chan *gossipv1.ObservationRequest
+
+		readinessSync readiness.Component
 	}
 	}
 )
 )
 
 
@@ -77,7 +79,13 @@ func NewWatcher(
 	urlLCD string,
 	urlLCD string,
 	msgC chan<- *common.MessagePublication,
 	msgC chan<- *common.MessagePublication,
 	obsvReqC <-chan *gossipv1.ObservationRequest) *Watcher {
 	obsvReqC <-chan *gossipv1.ObservationRequest) *Watcher {
-	return &Watcher{urlWS: urlWS, urlLCD: urlLCD, msgC: msgC, obsvReqC: obsvReqC}
+	return &Watcher{
+		urlWS:         urlWS,
+		urlLCD:        urlLCD,
+		msgC:          msgC,
+		obsvReqC:      obsvReqC,
+		readinessSync: common.MustConvertChainIdToReadinessSyncing(vaa.ChainIDWormchain),
+	}
 }
 }
 
 
 func (e *Watcher) Run(ctx context.Context) error {
 func (e *Watcher) Run(ctx context.Context) error {
@@ -121,7 +129,7 @@ func (e *Watcher) Run(ctx context.Context) error {
 	}
 	}
 	logger.Info("subscribed to new transaction events")
 	logger.Info("subscribed to new transaction events")
 
 
-	readiness.SetReady(common.ReadinessWormchainSyncing)
+	readiness.SetReady(e.readinessSync)
 
 
 	go func() {
 	go func() {
 		t := time.NewTicker(5 * time.Second)
 		t := time.NewTicker(5 * time.Second)
@@ -154,6 +162,8 @@ func (e *Watcher) Run(ctx context.Context) error {
 			p2p.DefaultRegistry.SetNetworkStats(vaa.ChainIDWormchain, &gossipv1.Heartbeat_Network{
 			p2p.DefaultRegistry.SetNetworkStats(vaa.ChainIDWormchain, &gossipv1.Heartbeat_Network{
 				Height: latestBlock.Int(),
 				Height: latestBlock.Int(),
 			})
 			})
+
+			readiness.SetReady(e.readinessSync)
 		}
 		}
 	}()
 	}()