plutus_ledger_api/v1/
redeemer.rs

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