partner_chains_smart_contracts_commands/
permissioned_candidates.rs

1use crate::{GenesisUtxo, PaymentFilePath, option_to_json};
2use partner_chains_cardano_offchain::permissioned_candidates::upsert_permissioned_candidates;
3use std::fs::read_to_string;
4use std::str::FromStr;
5
6#[derive(Clone, Debug, clap::Parser)]
7/// Command for upserting the permissioned candidates on the main chain
8pub struct UpsertPermissionedCandidatesCmd {
9	#[clap(flatten)]
10	common_arguments: crate::CommonArguments,
11	#[arg(long)]
12	/// Path to the file containing the permissioned candidates data.
13	/// Each line represents one permissioned candidate in format PARTNER_CHAINS_KEY,KEY_1_ID:KEY_1_BYTES,...,KEY_N_ID:KEY_N_BYTES.
14	/// Legacy format of PARTNER_CHAINS_KEY:AURA_PUB_KEY:GRANDPA_PUB_KEY is supported, each line is equivalent to `PARTNER_CHAINS_KEY,aura:AURA_PUB_KEY,gran:GRANDPA_PUB_KEY`.
15	permissioned_candidates_file: String,
16	#[clap(flatten)]
17	/// Path to the payment key file
18	payment_key_file: PaymentFilePath,
19	#[clap(flatten)]
20	/// Genesis UTXO
21	genesis_utxo: GenesisUtxo,
22}
23
24impl UpsertPermissionedCandidatesCmd {
25	/// Upserts the permissioned candidates on the main chain.
26	pub async fn execute(self) -> crate::SubCmdResult {
27		let payment_key = self.payment_key_file.read_key()?;
28
29		let mut permissioned_candidates = Vec::new();
30
31		let file_content = read_to_string(&self.permissioned_candidates_file).map_err(|e| {
32			format!(
33				"Could not read permissioned candidates file '{}'. Cause: {e}",
34				&self.permissioned_candidates_file
35			)
36		})?;
37		for line in file_content.lines() {
38			if line.is_empty() {
39				continue;
40			}
41			let permissioned_candidate =
42				sidechain_domain::PermissionedCandidateData::from_str(line).map_err(|e| {
43					format!("Failed to parse permissioned candidate: '{}', because of {}", line, e)
44				})?;
45			permissioned_candidates.push(permissioned_candidate);
46		}
47
48		let client = self.common_arguments.get_ogmios_client().await?;
49
50		let result = upsert_permissioned_candidates(
51			self.genesis_utxo.into(),
52			&permissioned_candidates,
53			&payment_key,
54			&client,
55			&self.common_arguments.retries(),
56		)
57		.await?;
58		Ok(option_to_json(result))
59	}
60}