From a5af5edd04e6020a963596421d8763bbc622d316 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 14 Aug 2024 17:47:46 -0400 Subject: [PATCH 1/6] Improvements to CLI clarity --- .../steward-cli/src/commands/command_args.rs | 4 + .../src/commands/info/view_state.rs | 188 ++++++++++++------ utils/steward-cli/steward_cli_notes.md | 49 ++++- 3 files changed, 171 insertions(+), 70 deletions(-) diff --git a/utils/steward-cli/src/commands/command_args.rs b/utils/steward-cli/src/commands/command_args.rs index 88d3ef4..28a5659 100644 --- a/utils/steward-cli/src/commands/command_args.rs +++ b/utils/steward-cli/src/commands/command_args.rs @@ -243,6 +243,10 @@ pub struct ViewState { /// Views the steward state for all validators in the pool #[arg(short, long)] pub verbose: bool, + + /// Optional vote account to view the state of + #[arg(long)] + pub vote_account: Option, } #[derive(Parser)] diff --git a/utils/steward-cli/src/commands/info/view_state.rs b/utils/steward-cli/src/commands/info/view_state.rs index 4f9a4c3..515479f 100644 --- a/utils/steward-cli/src/commands/info/view_state.rs +++ b/utils/steward-cli/src/commands/info/view_state.rs @@ -1,14 +1,15 @@ use anchor_lang::AccountDeserialize; use anyhow::Result; use jito_steward::{ - constants::LAMPORT_BALANCE_DEFAULT, utils::ValidatorList, Config, StewardStateAccount, + constants::LAMPORT_BALANCE_DEFAULT, utils::ValidatorList, Config, Delegation, + StewardStateAccount, }; use solana_client::nonblocking::rpc_client::RpcClient; use solana_sdk::{account::Account, pubkey::Pubkey}; use spl_stake_pool::{ find_stake_program_address, find_transient_stake_program_address, state::StakeStatus, }; -use std::{collections::HashMap, sync::Arc}; +use std::{collections::HashMap, fmt::format, sync::Arc}; use validator_history::ValidatorHistory; use crate::commands::command_args::ViewState; @@ -30,7 +31,7 @@ pub async fn command_view_state( let all_steward_accounts = get_all_steward_accounts(client, &program_id, &steward_config).await?; - if args.verbose { + if args.verbose || args.vote_account.is_some() { let vote_accounts: Vec = all_steward_accounts .validator_list_account .validators @@ -67,6 +68,7 @@ pub async fn command_view_state( &all_steward_accounts.config_account, &all_steward_accounts.validator_list_account, &all_history_map, + args.vote_account, ); } else { _print_default_state( @@ -250,16 +252,46 @@ fn _print_default_state( println!("{}", formatted_string) } +fn compute_overall_ranks(steward_state_account: &StewardStateAccount) -> Vec { + // For all validators from index 0 to num_pool_validators, we want to determine an overall rank with primary key of score, and secondary key of yield score, both descending. + // The final vector created will be a vector of length num_pool_validators, with the index being the rank, and the value being the index of the validator in the steward list. + + let state = &steward_state_account.state; + let num_pool_validators = state.num_pool_validators as usize; + + // (index, score, yield_score) + let mut sorted_validator_indices: Vec<(usize, u32, u32)> = (0..num_pool_validators) + .map(|i| (i, state.scores[i], state.yield_scores[i])) + .collect(); + + // Sorts based on score (descending) and yield_score (descending) + sorted_validator_indices.sort_by(|a, b| { + b.1.cmp(&a.1) // Compare scores (descending) + .then_with(|| b.2.cmp(&a.2)) // If scores are equal, compare yield_scores (descending) + }); + + // final ranking vector + let mut ranks: Vec = vec![0; num_pool_validators]; + for (rank, (index, _, _)) in sorted_validator_indices.into_iter().enumerate() { + ranks[index] = rank; + } + + ranks +} + fn _print_verbose_state( steward_state_account: &StewardStateAccount, config_account: &Config, validator_list_account: &ValidatorList, validator_histories: &HashMap>, + maybe_vote_account: Option, ) { let mut formatted_string; let mut top_scores: Vec<(Pubkey, u32)> = vec![]; + let overall_ranks = compute_overall_ranks(steward_state_account); + for (index, validator) in validator_list_account.validators.iter().enumerate() { let history_info = validator_histories .get(&validator.vote_account_address) @@ -268,7 +300,14 @@ fn _print_verbose_state( ValidatorHistory::try_deserialize(&mut account.data.as_slice()).ok() }); + if let Some(vote_account) = maybe_vote_account { + if vote_account != validator.vote_account_address { + continue; + } + } + let vote_account = validator.vote_account_address; + let (stake_address, _) = find_stake_program_address( &spl_stake_pool::id(), &vote_account, @@ -283,51 +322,67 @@ fn _print_verbose_state( validator.transient_seed_suffix.into(), ); - let score_index = steward_state_account - .state - .sorted_score_indices - .iter() - .position(|&i| i == index as u16); - let yield_score_index = steward_state_account - .state - .sorted_yield_score_indices - .iter() - .position(|&i| i == index as u16); + // let score_index = steward_state_account + // .state + // .sorted_score_indices + // .iter() + // .position(|&i| i == index as u16); + // let yield_score_index = steward_state_account + // .state + // .sorted_yield_score_indices + // .iter() + // .position(|&i| i == index as u16); + + let score = steward_state_account.state.scores.get(index); + + let eligibility_criteria = match score { + Some(0) => "No", + Some(_) => "Yes", + None => "N/A", + }; formatted_string = String::new(); formatted_string += &format!("Vote Account: {:?}\n", vote_account); formatted_string += &format!("Stake Account: {:?}\n", stake_address); formatted_string += &format!("Transient Stake Account: {:?}\n", transient_stake_address); + formatted_string += &format!("Steward List Index: {}\n", index); + + let overall_rank_str = match overall_ranks.get(index) { + Some(rank) => (rank + 1).to_string(), + None => "N/A".into(), + }; + + formatted_string += &format!("Overall Rank: {}\n", overall_rank_str); + formatted_string += &format!("Score: {}\n", score.unwrap_or(&0)); formatted_string += &format!( - "Internal Validator Lamports: {}\n", - match steward_state_account + "Yield Score: {}\n", + steward_state_account .state - .validator_lamport_balances + .yield_scores .get(index) - { - Some(&LAMPORT_BALANCE_DEFAULT) | None => "Unset".to_string(), - Some(&lamports) => lamports.to_string(), - } + .unwrap_or(&0) ); - formatted_string += &format!("Index: {}\n", index); + formatted_string += &format!("Passing Eligibility Criteria: {}\n", eligibility_criteria); formatted_string += &format!( - "Marked for removal: {}\n", + "Target Delegation Ratio: {} / {} \n", steward_state_account .state - .validators_to_remove + .delegations .get(index) - .unwrap_or_default() - ); - formatted_string += &format!( - "Marked for immediate removal: {}\n", + .unwrap_or(&Delegation::default()) + .numerator, steward_state_account .state - .validators_for_immediate_removal + .delegations .get(index) - .unwrap_or_default() + .unwrap_or(&Delegation::default()) + .denominator, ); + + formatted_string += "\n"; + formatted_string += &format!( "Is Instant Unstake: {}\n", steward_state_account @@ -336,30 +391,15 @@ fn _print_verbose_state( .get(index) .unwrap_or_default() ); - formatted_string += &format!( - "Score: {}\n", - steward_state_account.state.scores.get(index).unwrap_or(&0) - ); - formatted_string += &format!( - "Yield Score: {}\n", - steward_state_account - .state - .yield_scores - .get(index) - .unwrap_or(&0) - ); - formatted_string += &format!("Score Index: {:?}\n", score_index); - formatted_string += &format!("Yield Score Index: {:?}\n", yield_score_index); if let Some(history_info) = history_info { - formatted_string += &format!("\nValidator History Index: {}\n", history_info.index); - formatted_string += &format!( "Is blacklisted: {}\n", config_account .validator_history_blacklist .get_unsafe(history_info.index as usize) ); + formatted_string += &format!("\nValidator History Index: {}\n", history_info.index); } formatted_string += "\n"; @@ -373,7 +413,17 @@ fn _print_verbose_state( u64::from(validator.transient_stake_lamports), u64::from(validator.transient_stake_lamports) as f64 / 10f64.powf(9.), ); - + formatted_string += &format!( + "Steward Internal Lamports: {}\n", + match steward_state_account + .state + .validator_lamport_balances + .get(index) + { + Some(&LAMPORT_BALANCE_DEFAULT) | None => "Unset".to_string(), + Some(&lamports) => lamports.to_string(), + } + ); let status = match StakeStatus::try_from(validator.status).unwrap() { StakeStatus::Active => "🟩 Active", StakeStatus::DeactivatingAll => "🟨 Deactivating All", @@ -382,6 +432,22 @@ fn _print_verbose_state( StakeStatus::ReadyForRemoval => "🟥 Ready for Removal", }; formatted_string += &format!("Status: {}\n", status); + formatted_string += &format!( + "Marked for removal: {}\n", + steward_state_account + .state + .validators_to_remove + .get(index) + .unwrap_or_default() + ); + formatted_string += &format!( + "Marked for immediate removal: {}\n", + steward_state_account + .state + .validators_for_immediate_removal + .get(index) + .unwrap_or_default() + ); formatted_string += "\n"; @@ -394,24 +460,24 @@ fn _print_verbose_state( println!("{}", formatted_string); } - println!("\nAll Ranked Validators ( {} ): \n", top_scores.len()); - println!("{:<45} : Score\n", "Vote Account"); - - top_scores.sort_by(|a, b| b.1.cmp(&a.1)); - top_scores.iter().for_each(|(vote_account, score)| { - let formatted_score = - format!("{}", score) - .chars() - .rev() - .enumerate() - .fold(String::new(), |acc, (i, c)| { + if maybe_vote_account.is_none() { + println!("\nAll Ranked Validators ( {} ): \n", top_scores.len()); + println!("{:<45} : Score\n", "Vote Account"); + + top_scores.sort_by(|a, b| b.1.cmp(&a.1)); + top_scores.iter().for_each(|(vote_account, score)| { + let formatted_score = format!("{}", score).chars().rev().enumerate().fold( + String::new(), + |acc, (i, c)| { if i > 0 && i % 3 == 0 { format!("{}_{}", c, acc) } else { format!("{}{}", c, acc) } - }); - let vote_account = format!("{:?}", vote_account); - println!("{:<45} : {}", vote_account, formatted_score); - }); + }, + ); + let vote_account = format!("{:?}", vote_account); + println!("{:<45} : {}", vote_account, formatted_score); + }); + } } diff --git a/utils/steward-cli/steward_cli_notes.md b/utils/steward-cli/steward_cli_notes.md index 8992c91..894281e 100644 --- a/utils/steward-cli/steward_cli_notes.md +++ b/utils/steward-cli/steward_cli_notes.md @@ -1,12 +1,11 @@ - # Accounts -| Account | Address | -|-----------------|---------------------------------------------| -| Program | Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 | -| Steward Config | jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv | -| Steward State | 9BAmGVLGxzqct6bkgjWmKSv3BFB6iKYXNBQp8GWG1LDY| -| Authority | 9eZbWiHsPRsxLSiHxzg2pkXsAuQMwAjQrda7C7e21Fw6| +| Account | Address | +| -------------- | -------------------------------------------- | +| Program | Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 | +| Steward Config | jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv | +| Steward State | 9BAmGVLGxzqct6bkgjWmKSv3BFB6iKYXNBQp8GWG1LDY | +| Authority | 9eZbWiHsPRsxLSiHxzg2pkXsAuQMwAjQrda7C7e21Fw6 | # CLI Commands @@ -24,7 +23,39 @@ cargo run -- --program-id Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 view-confi cargo run -- --json-rpc-url $(solana config get | grep "RPC URL" | awk '{print $3}') view-state --steward-config jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv ``` -### View State Per Validator +Displays high level Steward internal operations including current state, total number of validators in the pool, next cycle epoch, etc. + +### View State of Single Validator + +```bash +cargo run -- --json-rpc-url $(solana config get | grep "RPC URL" | awk '{print $3}') view-state --steward-config jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv --vote-account J1to1yufRnoWn81KYg1XkTWzmKjnYSnmE2VY8DGUJ9Qv +``` + +Displays state of a single Validator. + +`Vote Account`: Validator's vote account address +`Stake Account`: Validator's stake account from this stake pool +`Transient Stake Account`: Validator's transient stake account used for activating/deactivating stake +`Steward List Index`: Position in the Steward list, 1-1 with spl-stake-pool `ValidatorList` +`Overall Rank`: Validator's rank among all validators, indicating priority for stake if Target is nonzero, and priority for unstaking if target is zero +`Passing Eligibility Criteria`: Indicates if validator meets binary eligibility requirements +`Score`: Validator's overall score +`Yield Score`: Validator's relative yield score +`Target Delegation Ratio`: Share of the stake pool TVL this validator is targeted to receive. Not a guaranteed amount - dependent on staking and unstaking priority. + +`Is Instant Unstake`: Indicates if this validator should be immediately unstaked +`Is blacklisted`: Indicates if validator is blacklisted from the pool + +`Validator History Index`: Position in the validator history + +`Active Lamports`: Amount of actively staked lamports +`Transient Lamports`: Amount of lamports in transient state +`Steward Internal Lamports`: Steward's internal tracking of stake used to detect user deposits +`Status`: Validator's `StakeStatus` in the spl-stake-pool `ValidatorList` account +`Marked for removal`: Indicates if validator is flagged for removal next epoch +`Marked for immediate removal`: Indicates if validator is flagged for immediate removal + +### View State of All Validators ```bash cargo run -- --program-id Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 --json-rpc-url $(solana config get | grep "RPC URL" | awk '{print $3}') view-state --steward-config jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv --verbose @@ -45,7 +76,7 @@ cargo run -- --program-id Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 auto-remov ### Auto Add Validator ```bash -cargo run -- --program-id Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 auto-add-validator-from-pool --steward-config jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv --payer-keypair-path ../../credentials/stakenet_test.json --vote-account 4m64H5TbwAGtZVnxaGAVoTSwjZGV8BCLKRPr8agKQv4Z +cargo run -- --program-id Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 auto-add-validator-from-pool --steward-config jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv --payer-keypair-path ../../credentials/stakenet_test.json --vote-account 4m64H5TbwAGtZVnxaGAVoTSwjZGV8BCLKRPr8agKQv4Z ``` ### Manually Update All Vote Accounts From 6b57d2dc800c12ed7366463df8dbf639cca07248 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 14 Aug 2024 17:49:36 -0400 Subject: [PATCH 2/6] ... --- utils/steward-cli/src/commands/info/view_state.rs | 2 +- utils/steward-cli/steward_cli_notes.md | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/utils/steward-cli/src/commands/info/view_state.rs b/utils/steward-cli/src/commands/info/view_state.rs index 515479f..bcaf03e 100644 --- a/utils/steward-cli/src/commands/info/view_state.rs +++ b/utils/steward-cli/src/commands/info/view_state.rs @@ -9,7 +9,7 @@ use solana_sdk::{account::Account, pubkey::Pubkey}; use spl_stake_pool::{ find_stake_program_address, find_transient_stake_program_address, state::StakeStatus, }; -use std::{collections::HashMap, fmt::format, sync::Arc}; +use std::{collections::HashMap, sync::Arc}; use validator_history::ValidatorHistory; use crate::commands::command_args::ViewState; diff --git a/utils/steward-cli/steward_cli_notes.md b/utils/steward-cli/steward_cli_notes.md index 894281e..ca01eec 100644 --- a/utils/steward-cli/steward_cli_notes.md +++ b/utils/steward-cli/steward_cli_notes.md @@ -34,25 +34,39 @@ cargo run -- --json-rpc-url $(solana config get | grep "RPC URL" | awk '{print $ Displays state of a single Validator. `Vote Account`: Validator's vote account address + `Stake Account`: Validator's stake account from this stake pool + `Transient Stake Account`: Validator's transient stake account used for activating/deactivating stake + `Steward List Index`: Position in the Steward list, 1-1 with spl-stake-pool `ValidatorList` + `Overall Rank`: Validator's rank among all validators, indicating priority for stake if Target is nonzero, and priority for unstaking if target is zero + `Passing Eligibility Criteria`: Indicates if validator meets binary eligibility requirements + `Score`: Validator's overall score + `Yield Score`: Validator's relative yield score + `Target Delegation Ratio`: Share of the stake pool TVL this validator is targeted to receive. Not a guaranteed amount - dependent on staking and unstaking priority. `Is Instant Unstake`: Indicates if this validator should be immediately unstaked + `Is blacklisted`: Indicates if validator is blacklisted from the pool `Validator History Index`: Position in the validator history `Active Lamports`: Amount of actively staked lamports + `Transient Lamports`: Amount of lamports in transient state + `Steward Internal Lamports`: Steward's internal tracking of stake used to detect user deposits + `Status`: Validator's `StakeStatus` in the spl-stake-pool `ValidatorList` account + `Marked for removal`: Indicates if validator is flagged for removal next epoch + `Marked for immediate removal`: Indicates if validator is flagged for immediate removal ### View State of All Validators From 9f911f9f98226ca1eda37ba59fa3194627372a83 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 14 Aug 2024 17:51:05 -0400 Subject: [PATCH 3/6] ... --- utils/steward-cli/steward_cli_notes.md | 32 +++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/utils/steward-cli/steward_cli_notes.md b/utils/steward-cli/steward_cli_notes.md index ca01eec..7e23be1 100644 --- a/utils/steward-cli/steward_cli_notes.md +++ b/utils/steward-cli/steward_cli_notes.md @@ -19,19 +19,45 @@ cargo run -- --program-id Stewardf95sJbmtcZsyagb2dg4Mo8eVQho8gpECvLx8 view-confi ### View State +Displays high level Steward internal operations including current state, total number of validators in the pool, next cycle epoch, etc. + ```bash cargo run -- --json-rpc-url $(solana config get | grep "RPC URL" | awk '{print $3}') view-state --steward-config jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv ``` -Displays high level Steward internal operations including current state, total number of validators in the pool, next cycle epoch, etc. - ### View State of Single Validator +Displays state of a single Validator. + ```bash cargo run -- --json-rpc-url $(solana config get | grep "RPC URL" | awk '{print $3}') view-state --steward-config jitoVjT9jRUyeXHzvCwzPgHj7yWNRhLcUoXtes4wtjv --vote-account J1to1yufRnoWn81KYg1XkTWzmKjnYSnmE2VY8DGUJ9Qv ``` -Displays state of a single Validator. +Output: + +``` +Vote Account: J1to1yufRnoWn81KYg1XkTWzmKjnYSnmE2VY8DGUJ9Qv +Stake Account: 6PAY8LEswawgCGnzB3tKGJBtELUwDpeMfDCiNpCyNt8q +Transient Stake Account: C2AurJCKxp5Q8DbaZ84aiSUiKKazqgRVsUiTiihqNYui +Steward List Index: 3 +Overall Rank: 441 +Score: 0 +Yield Score: 912832510 +Passing Eligibility Criteria: No +Target Delegation Ratio: 0 / 1 + +Is Instant Unstake: false +Is blacklisted: false + +Validator History Index: 321 + +Active Lamports: 3398839 (0.00 ◎) +Transient Lamports: 0 (0.00 ◎) +Steward Internal Lamports: 114590 +Status: 🟩 Active +Marked for removal: false +Marked for immediate removal: false +``` `Vote Account`: Validator's vote account address From 8bb838431cdcb1d7e9373a4260f6d4ec82581dfe Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 14 Aug 2024 17:52:54 -0400 Subject: [PATCH 4/6] ... --- .../steward-cli/src/commands/info/view_state.rs | 17 +++++++++-------- utils/steward-cli/steward_cli_notes.md | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/utils/steward-cli/src/commands/info/view_state.rs b/utils/steward-cli/src/commands/info/view_state.rs index bcaf03e..eb4fe84 100644 --- a/utils/steward-cli/src/commands/info/view_state.rs +++ b/utils/steward-cli/src/commands/info/view_state.rs @@ -366,19 +366,20 @@ fn _print_verbose_state( formatted_string += &format!("Passing Eligibility Criteria: {}\n", eligibility_criteria); formatted_string += &format!( - "Target Delegation Ratio: {} / {} \n", + "Target Delegation Percent: {:.1}%\n", steward_state_account .state .delegations .get(index) .unwrap_or(&Delegation::default()) - .numerator, - steward_state_account - .state - .delegations - .get(index) - .unwrap_or(&Delegation::default()) - .denominator, + .numerator as f64 + / steward_state_account + .state + .delegations + .get(index) + .unwrap_or(&Delegation::default()) + .denominator as f64 + * 100.0 ); formatted_string += "\n"; diff --git a/utils/steward-cli/steward_cli_notes.md b/utils/steward-cli/steward_cli_notes.md index 7e23be1..1915958 100644 --- a/utils/steward-cli/steward_cli_notes.md +++ b/utils/steward-cli/steward_cli_notes.md @@ -75,7 +75,7 @@ Marked for immediate removal: false `Yield Score`: Validator's relative yield score -`Target Delegation Ratio`: Share of the stake pool TVL this validator is targeted to receive. Not a guaranteed amount - dependent on staking and unstaking priority. +`Target Delegation Percent`: Share of the stake pool TVL this validator is targeted to receive. Not a guaranteed amount - dependent on staking and unstaking priority. `Is Instant Unstake`: Indicates if this validator should be immediately unstaked From cdcc63c4c18d2350f47f47bb4772bff52a0488b9 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 14 Aug 2024 17:53:20 -0400 Subject: [PATCH 5/6] .. --- utils/steward-cli/steward_cli_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/steward-cli/steward_cli_notes.md b/utils/steward-cli/steward_cli_notes.md index 1915958..00a05b3 100644 --- a/utils/steward-cli/steward_cli_notes.md +++ b/utils/steward-cli/steward_cli_notes.md @@ -44,7 +44,7 @@ Overall Rank: 441 Score: 0 Yield Score: 912832510 Passing Eligibility Criteria: No -Target Delegation Ratio: 0 / 1 +Target Delegation Ratio: 0.0% Is Instant Unstake: false Is blacklisted: false From bca3aa1e835bdce62fcb6dfdecbe4321c33951f5 Mon Sep 17 00:00:00 2001 From: Evan Batsell Date: Wed, 14 Aug 2024 17:53:40 -0400 Subject: [PATCH 6/6] .. --- utils/steward-cli/steward_cli_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/steward-cli/steward_cli_notes.md b/utils/steward-cli/steward_cli_notes.md index 00a05b3..fb51d15 100644 --- a/utils/steward-cli/steward_cli_notes.md +++ b/utils/steward-cli/steward_cli_notes.md @@ -44,7 +44,7 @@ Overall Rank: 441 Score: 0 Yield Score: 912832510 Passing Eligibility Criteria: No -Target Delegation Ratio: 0.0% +Target Delegation Percent: 0.0% Is Instant Unstake: false Is blacklisted: false