partner_chains_plutus_data/
candidate_keys.rs1use 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 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}