diff --git a/cli/src/feature.rs b/cli/src/feature.rs index 3641fb5ae..e843d549e 100644 --- a/cli/src/feature.rs +++ b/cli/src/feature.rs @@ -8,7 +8,9 @@ use { serde::{Deserialize, Serialize}, solana_clap_utils::{input_parsers::*, input_validators::*, keypair::*}, solana_cli_output::{cli_version::CliVersion, QuietDisplay, VerboseDisplay}, - solana_client::{client_error::ClientError, rpc_client::RpcClient}, + solana_client::{ + client_error::ClientError, rpc_client::RpcClient, rpc_request::MAX_MULTIPLE_ACCOUNTS, + }, solana_remote_wallet::remote_wallet::RemoteWalletManager, solana_sdk::{ account::Account, @@ -800,35 +802,40 @@ fn process_status( None }; let mut inactive = false; - let mut features = rpc_client - .get_multiple_accounts(feature_ids)? - .into_iter() - .zip(feature_ids) - .map(|(account, feature_id)| { - let feature_name = FEATURE_NAMES.get(feature_id).unwrap(); - account - .and_then(status_from_account) - .map(|feature_status| CliFeature { - id: feature_id.to_string(), - description: feature_name.to_string(), - status: feature_status, - }) - .unwrap_or_else(|| { - inactive = true; - CliFeature { + let mut features = vec![]; + for feature_ids in feature_ids.chunks(MAX_MULTIPLE_ACCOUNTS) { + let mut feature_chunk = rpc_client + .get_multiple_accounts(feature_ids) + .unwrap_or_default() + .into_iter() + .zip(feature_ids) + .map(|(account, feature_id)| { + let feature_name = FEATURE_NAMES.get(feature_id).unwrap(); + account + .and_then(status_from_account) + .map(|feature_status| CliFeature { id: feature_id.to_string(), description: feature_name.to_string(), - status: CliFeatureStatus::Inactive, - } - }) - }) - .filter(|feature| match (filter, &feature.status) { - (Some(min_activation), CliFeatureStatus::Active(activation)) => { - activation > &min_activation - } - _ => true, - }) - .collect::>(); + status: feature_status, + }) + .unwrap_or_else(|| { + inactive = true; + CliFeature { + id: feature_id.to_string(), + description: feature_name.to_string(), + status: CliFeatureStatus::Inactive, + } + }) + }) + .filter(|feature| match (filter, &feature.status) { + (Some(min_activation), CliFeatureStatus::Active(activation)) => { + activation > &min_activation + } + _ => true, + }) + .collect::>(); + features.append(&mut feature_chunk); + } features.sort_unstable();