namada_apps_lib 0.251.4

Namada CLI apps library code
Documentation
use color_eyre::eyre::Result;
use namada_sdk::io::Io;

use crate::cli;
use crate::cli::api::{CliApi, CliClient};

impl CliApi {
    #[cfg(not(feature = "namada-eth-bridge"))]
    pub async fn handle_relayer_command<C>(
        _client: Option<C>,
        _cmd: cli::NamadaRelayer,
        io: impl Io,
    ) -> Result<()>
    where
        C: CliClient,
    {
        use namada_sdk::io::display_line;

        display_line!(&io, "The Namada Ethereum bridge is disabled");
        Ok(())
    }

    #[cfg(feature = "namada-eth-bridge")]
    pub async fn handle_relayer_command<C>(
        client: Option<C>,
        cmd: cli::NamadaRelayer,
        io: impl Io,
    ) -> Result<()>
    where
        C: CliClient,
    {
        use namada_sdk::eth_bridge::{bridge_pool, validator_set};

        use crate::cli::args::{CliToSdk, CliToSdkCtxless};
        use crate::cli::cmds::*;
        use crate::cli::utils::get_eth_rpc_client;

        match cmd {
            cli::NamadaRelayer::EthBridgePoolWithCtx(boxed) => {
                let (sub, mut ctx) = *boxed;
                match sub {
                    EthBridgePoolWithCtx::RecommendBatch(RecommendBatch(
                        args,
                    )) => {
                        let chain_ctx = ctx.borrow_mut_chain_or_exit();
                        let ledger_address =
                            chain_ctx.get(&args.query.ledger_address);
                        let client = client.unwrap_or_else(|| {
                            C::from_tendermint_address(&ledger_address)
                        });
                        client.wait_until_node_is_synced(&io).await?;
                        let args = args.to_sdk(&mut ctx)?;
                        let namada = ctx.to_sdk(client, io);
                        bridge_pool::recommend_batch(&namada, args).await?;
                    }
                }
            }
            cli::NamadaRelayer::EthBridgePoolWithoutCtx(sub) => match sub {
                EthBridgePoolWithoutCtx::ConstructProof(ConstructProof(
                    args,
                )) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&args.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    let args = args.to_sdk_ctxless();
                    bridge_pool::construct_proof(&client, &io, args).await?;
                }
                EthBridgePoolWithoutCtx::RelayProof(RelayProof(args)) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&args.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    let eth_client =
                        get_eth_rpc_client(&args.eth_rpc_endpoint).await;
                    let args = args.to_sdk_ctxless();
                    bridge_pool::relay_bridge_pool_proof(
                        eth_client, &client, &io, args,
                    )
                    .await?;
                }
                EthBridgePoolWithoutCtx::QueryPool(QueryEthBridgePool(
                    query,
                )) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&query.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    bridge_pool::query_bridge_pool(&client, &io).await?;
                }
                EthBridgePoolWithoutCtx::QuerySigned(
                    QuerySignedBridgePool(query),
                ) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&query.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    bridge_pool::query_signed_bridge_pool(&client, &io).await?;
                }
                EthBridgePoolWithoutCtx::QueryRelays(QueryRelayProgress(
                    query,
                )) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&query.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    bridge_pool::query_relay_progress(&client, &io).await?;
                }
            },
            cli::NamadaRelayer::ValidatorSet(sub) => match sub {
                ValidatorSet::BridgeValidatorSet(BridgeValidatorSet(args)) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&args.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    let args = args.to_sdk_ctxless();
                    validator_set::query_bridge_validator_set(
                        &client, &io, args,
                    )
                    .await?;
                }
                ValidatorSet::GovernanceValidatorSet(
                    GovernanceValidatorSet(args),
                ) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&args.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    let args = args.to_sdk_ctxless();
                    validator_set::query_governnace_validator_set(
                        &client, &io, args,
                    )
                    .await?;
                }
                ValidatorSet::ValidatorSetProof(ValidatorSetProof(args)) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&args.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    let args = args.to_sdk_ctxless();
                    validator_set::query_validator_set_update_proof(
                        &client, &io, args,
                    )
                    .await?;
                }
                ValidatorSet::ValidatorSetUpdateRelay(
                    ValidatorSetUpdateRelay(args),
                ) => {
                    let client = client.unwrap_or_else(|| {
                        C::from_tendermint_address(&args.ledger_address)
                    });
                    client.wait_until_node_is_synced(&io).await?;
                    let eth_client =
                        get_eth_rpc_client(&args.eth_rpc_endpoint).await;
                    let args = args.to_sdk_ctxless();
                    validator_set::relay_validator_set_update(
                        eth_client, &client, &io, args,
                    )
                    .await?;
                }
            },
        }
        Ok(())
    }
}