hermes_cli/commands/keys/
list.rs

1use 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}