plutus_ledger_api/v1/
redeemer.rs

1//! Types related to Plutus Redeemers
2
3use std::borrow::Cow;
4
5use cardano_serialization_lib as csl;
6
7#[cfg(feature = "lbf")]
8use lbr_prelude::json::Json;
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11
12use crate as plutus_ledger_api;
13use crate::csl::pla_to_csl::{TryFromPLA, TryFromPLAError, TryToCSL};
14use crate::plutus_data::{IsPlutusData, PlutusData};
15use crate::v1::crypto::LedgerBytes;
16
17//////////////
18// Redeemer //
19//////////////
20
21/// Piece of information attached to a transaction when redeeming a value from a validator or a
22/// minting policy
23#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, IsPlutusData)]
24#[is_plutus_data_derive_strategy = "Newtype"]
25#[cfg_attr(feature = "lbf", derive(Json))]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27pub struct Redeemer(pub PlutusData);
28
29impl Redeemer {
30    pub fn with_extra_info<'a>(
31        &'a self,
32        tag: csl::RedeemerTag,
33        index: u64,
34    ) -> RedeemerWithExtraInfo<'a> {
35        RedeemerWithExtraInfo {
36            redeemer: Cow::Borrowed(self),
37            tag,
38            index,
39        }
40    }
41}
42
43#[derive(Clone, Debug)]
44pub struct RedeemerWithExtraInfo<'a> {
45    pub redeemer: Cow<'a, Redeemer>,
46    pub tag: csl::RedeemerTag,
47    pub index: u64,
48}
49
50impl TryFromPLA<RedeemerWithExtraInfo<'_>> for csl::Redeemer {
51    fn try_from_pla<'a>(val: &RedeemerWithExtraInfo<'_>) -> Result<csl::Redeemer, TryFromPLAError> {
52        let Redeemer(plutus_data) = val.redeemer.as_ref();
53        Ok(csl::Redeemer::new(
54            &val.tag,
55            &val.index.try_to_csl()?,
56            &plutus_data.try_to_csl()?,
57            &csl::ExUnits::new(&csl::BigNum::from(0u64), &csl::BigNum::from(0u64)),
58        ))
59    }
60}
61
62//////////////////
63// RedeemerHash //
64//////////////////
65
66/// blake2b-256 hash of a datum
67#[derive(Clone, Debug, PartialEq, Eq, IsPlutusData)]
68#[is_plutus_data_derive_strategy = "Newtype"]
69#[cfg_attr(feature = "lbf", derive(Json))]
70#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
71pub struct RedeemerHash(pub LedgerBytes);