diff --git a/README.md b/README.md index 9008cb5..c76371a 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ GLOBAL OPTIONS: --start-timeout value timeout to wait on startup for one node to be ready (default: 10s) --stop-timeout value timeout to wait on stop (default: 10s) --validator value [ --validator value ] validator address(es) to track (use :my-label to add a custom label in metrics & ouput) + --enable-all-validators enable to track all validators in the pool. (to track every validators, the chain should have staking module) --webhook-url value endpoint where to send upgrade webhooks (experimental) --webhook-custom-block value [ --webhook-custom-block value ] trigger a custom webhook at a given block number (experimental) --x-gov value version of the gov module to use (v1|v1beta1) (default: "v1") diff --git a/pkg/app/flags.go b/pkg/app/flags.go index 768dc2f..ddefab7 100644 --- a/pkg/app/flags.go +++ b/pkg/app/flags.go @@ -81,6 +81,10 @@ var Flags = []cli.Flag{ Name: "validator", Usage: "validator address(es) to track (use :my-label to add a custom label in metrics & ouput)", }, + &cli.BoolFlag{ + Name: "enable-all-validators", + Usage: "enable to track all validators in the pool. (to track every validators, the chain should have staking module)", + }, &cli.StringFlag{ Name: "webhook-url", Usage: "endpoint where to send upgrade webhooks (experimental)", diff --git a/pkg/app/run.go b/pkg/app/run.go index b0b4395..df1b810 100644 --- a/pkg/app/run.go +++ b/pkg/app/run.go @@ -50,6 +50,7 @@ func RunFunc(cCtx *cli.Context) error { startTimeout = cCtx.Duration("start-timeout") stopTimeout = cCtx.Duration("stop-timeout") validators = cCtx.StringSlice("validator") + enableAllValidators = cCtx.Bool("enable-all-validators") webhookURL = cCtx.String("webhook-url") webhookCustomBlocks = cCtx.StringSlice("webhook-custom-block") xGov = cCtx.String("x-gov") @@ -106,7 +107,7 @@ func RunFunc(cCtx *cli.Context) error { Msg("cosmos modules features status") // Parse validators into name & address - trackedValidators, err := createTrackedValidators(ctx, pool, validators, noStaking) + trackedValidators, err := createTrackedValidators(ctx, pool, validators, noStaking, enableAllValidators) if err != nil { return err } @@ -362,7 +363,7 @@ func ensureCosmosModule(name string, modules []*upgrade.ModuleVersion) bool { return false } -func createTrackedValidators(ctx context.Context, pool *rpc.Pool, validators []string, noStaking bool) ([]watcher.TrackedValidator, error) { +func createTrackedValidators(ctx context.Context, pool *rpc.Pool, validators []string, noStaking, trackAll bool) ([]watcher.TrackedValidator, error) { var stakingValidators []staking.Validator if !noStaking { node := pool.GetSyncedNode() @@ -380,35 +381,65 @@ func createTrackedValidators(ctx context.Context, pool *rpc.Pool, validators []s stakingValidators = resp.Validators } - trackedValidators := lo.Map(validators, func(v string, _ int) watcher.TrackedValidator { - val := watcher.ParseValidator(v) - - for _, stakingVal := range stakingValidators { - address := crypto.PubKeyAddress(stakingVal.ConsensusPubkey) - if address == val.Address { - hrp := crypto.GetHrpPrefix(stakingVal.OperatorAddress) + "valcons" - val.Moniker = stakingVal.Description.Moniker - val.OperatorAddress = stakingVal.OperatorAddress - val.ConsensusAddress = crypto.PubKeyBech32Address(stakingVal.ConsensusPubkey, hrp) + var trackedValidators []watcher.TrackedValidator + + if trackAll { + log.Info().Msg("tracking all validators") + + trackedValidators = lo.Map(stakingValidators, func(stakingVal staking.Validator, index int) watcher.TrackedValidator { + val := watcher.ParseValidator(fmt.Sprintf("%s:%s", crypto.PubKeyAddress(stakingVal.ConsensusPubkey), stakingVal.Description.Moniker)) + hrp := crypto.GetHrpPrefix(stakingVal.OperatorAddress) + "valcons" + val.Moniker = stakingVal.Description.Moniker + val.OperatorAddress = stakingVal.OperatorAddress + val.ConsensusAddress = crypto.PubKeyBech32Address(stakingVal.ConsensusPubkey, hrp) + + log.Info(). + Str("alias", val.Name). + Str("moniker", val.Moniker). + Msgf("tracking validator %s", val.Address) + + log.Debug(). + Str("account", val.AccountAddress()). + Str("address", val.Address). + Str("alias", val.Name). + Str("moniker", val.Moniker). + Str("operator", val.OperatorAddress). + Str("consensus", val.ConsensusAddress). + Msgf("validator info") + + return val + }) + } else { + trackedValidators = lo.Map(validators, func(v string, _ int) watcher.TrackedValidator { + val := watcher.ParseValidator(v) + + for _, stakingVal := range stakingValidators { + address := crypto.PubKeyAddress(stakingVal.ConsensusPubkey) + if address == val.Address { + hrp := crypto.GetHrpPrefix(stakingVal.OperatorAddress) + "valcons" + val.Moniker = stakingVal.Description.Moniker + val.OperatorAddress = stakingVal.OperatorAddress + val.ConsensusAddress = crypto.PubKeyBech32Address(stakingVal.ConsensusPubkey, hrp) + } } - } - log.Info(). - Str("alias", val.Name). - Str("moniker", val.Moniker). - Msgf("tracking validator %s", val.Address) - - log.Debug(). - Str("account", val.AccountAddress()). - Str("address", val.Address). - Str("alias", val.Name). - Str("moniker", val.Moniker). - Str("operator", val.OperatorAddress). - Str("consensus", val.ConsensusAddress). - Msgf("validator info") - - return val - }) + log.Info(). + Str("alias", val.Name). + Str("moniker", val.Moniker). + Msgf("tracking validator %s", val.Address) + + log.Debug(). + Str("account", val.AccountAddress()). + Str("address", val.Address). + Str("alias", val.Name). + Str("moniker", val.Moniker). + Str("operator", val.OperatorAddress). + Str("consensus", val.ConsensusAddress). + Msgf("validator info") + + return val + }) + } return trackedValidators, nil }