whisky_pallas/converter/tx_builder_body/
output.rs

1use crate::converter::{bytes_from_bech32, convert_value};
2use whisky_common::{LanguageVersion, Output, WError};
3
4use crate::wrapper::transaction_body::{
5    Datum, DatumKind, ScriptRef, ScriptRefKind, TransactionOutput,
6};
7
8pub fn convert_output(output: &Output) -> Result<TransactionOutput, WError> {
9    let datum: Option<Datum> = match &output.datum {
10        Some(datum_source) => match datum_source {
11            whisky_common::Datum::Inline(datum_str) => Some(Datum::new(DatumKind::Data {
12                plutus_data_hex: datum_str.to_string(),
13            })?),
14            whisky_common::Datum::Hash(datum_str) => {
15                let datum = Datum::new(DatumKind::Data {
16                    plutus_data_hex: datum_str.to_string(),
17                })?;
18
19                let datum_hash_str = datum.hash()?;
20                Some(Datum::new(DatumKind::Hash {
21                    datum_hash: datum_hash_str,
22                })?)
23            }
24            whisky_common::Datum::Embedded(datum_str) => None,
25        },
26        None => None,
27    };
28
29    let script_ref = match &output.reference_script {
30        Some(script_source) => match script_source {
31            whisky_common::OutputScriptSource::ProvidedScriptSource(provided_script_source) => {
32                let plutus_script = match provided_script_source.language_version {
33                    LanguageVersion::V1 => ScriptRef::new(ScriptRefKind::PlutusV1Script {
34                        plutus_v1_script_hex: provided_script_source.script_cbor.clone(),
35                    })?,
36                    LanguageVersion::V2 => ScriptRef::new(ScriptRefKind::PlutusV2Script {
37                        plutus_v2_script_hex: provided_script_source.script_cbor.clone(),
38                    })?,
39                    LanguageVersion::V3 => ScriptRef::new(ScriptRefKind::PlutusV3Script {
40                        plutus_v3_script_hex: provided_script_source.script_cbor.clone(),
41                    })?,
42                };
43                Some(plutus_script)
44            }
45            whisky_common::OutputScriptSource::ProvidedSimpleScriptSource(
46                provided_simple_script_source,
47            ) => {
48                let native_script = ScriptRef::new(ScriptRefKind::NativeScript {
49                    native_script_hex: provided_simple_script_source.script_cbor.clone(),
50                })?;
51                Some(native_script)
52            }
53        },
54        None => None,
55    };
56
57    let tx_output = TransactionOutput::new(
58        &bytes_from_bech32(&output.address)?,
59        convert_value(&output.amount.clone())?,
60        datum,
61        script_ref,
62    )?;
63
64    Ok(tx_output)
65}