hermes_cli/commands/keys/
list.rs1use core::fmt::Write;
2use std::collections::BTreeMap;
3
4use hermes_cli_components::traits::build::CanLoadBuilder;
5use hermes_cli_framework::command::CommandRunner;
6use hermes_cli_framework::output::{json, Output};
7use ibc_relayer::keyring::{KeyRing, SigningKeyPair, Store};
8use ibc_relayer_types::core::ics24_host::identifier::ChainId;
9use oneline_eyre::eyre::eyre;
10
11use crate::contexts::app::HermesApp;
12
13#[derive(Debug, clap::Parser)]
14pub struct KeysListCmd {
15 #[clap(
16 long = "chain",
17 required = true,
18 value_name = "CHAIN_ID",
19 help_heading = "REQUIRED",
20 help = "Identifier of the chain"
21 )]
22 chain_id: ChainId,
23}
24
25impl CommandRunner<HermesApp> for KeysListCmd {
26 async fn run(&self, app: &HermesApp) -> hermes_cli_framework::Result<Output> {
27 let builder = app.load_builder().await?;
28
29 let chain_config = builder
30 .config_map
31 .get(&self.chain_id)
32 .ok_or_else(|| eyre!("chain `{}` not found in configuration file", self.chain_id))?;
33
34 let keyring = KeyRing::new_secp256k1(
35 Store::Test,
36 &chain_config.account_prefix,
37 &chain_config.id,
38 &chain_config.key_store_folder,
39 )?;
40
41 if json() {
42 let keys = keyring.keys()?.into_iter().collect::<BTreeMap<_, _>>();
43 Output::success(keys).exit()
44 } else {
45 let mut msg = String::new();
46 for (name, key) in keyring.keys()? {
47 let _ = write!(msg, "\n- {} ({})", name, key.account());
48 }
49 Output::success_msg(msg).exit()
50 }
51 }
52}