partner_chains_plutus_data/
candidate_keys.rs

1//! Functions related to PlutusData decoding and encoding of candidates keys
2use cardano_serialization_lib::{PlutusData, PlutusList};
3use sidechain_domain::{CandidateKey, CandidateKeys};
4
5pub(crate) fn decode_candidate_keys(data: &PlutusData) -> Option<CandidateKeys> {
6	let outer_list: PlutusList = data.as_list()?;
7	let mut keys: Vec<CandidateKey> = Vec::with_capacity(outer_list.len());
8	for kv in outer_list.into_iter() {
9		keys.push(decode_candidate_key(kv)?);
10	}
11	Some(CandidateKeys(keys))
12}
13
14pub(crate) fn decode_candidate_key(data: &PlutusData) -> Option<CandidateKey> {
15	// Allow only key-value pair
16	let list = data.as_list().filter(|l| l.len() == 2)?;
17	let key_id: Vec<u8> = list.get(0).as_bytes()?;
18	let key_id: [u8; 4] = key_id.try_into().ok()?;
19	let key_bytes = list.get(1).as_bytes()?;
20	Some(CandidateKey { id: key_id, bytes: key_bytes })
21}
22
23pub(crate) fn candidate_keys_to_plutus(keys: &CandidateKeys) -> PlutusData {
24	let mut plutus_keys = PlutusList::new();
25	for key in keys.0.iter() {
26		plutus_keys.add(&candidate_key_to_plutus(key));
27	}
28	PlutusData::new_list(&plutus_keys)
29}
30
31pub(crate) fn candidate_key_to_plutus(key: &CandidateKey) -> PlutusData {
32	let mut l = PlutusList::new();
33	l.add(&PlutusData::new_bytes(key.id.to_vec()));
34	l.add(&PlutusData::new_bytes(key.bytes.clone()));
35	PlutusData::new_list(&l)
36}