pallas_traverse/
lib.rs

1//! Utilities to traverse over multi-era block data
2
3use pallas_codec::utils::NonZeroInt;
4use pallas_codec::utils::PositiveCoin;
5use std::{borrow::Cow, fmt::Display, hash::Hash as StdHash};
6
7use serde::{Deserialize, Serialize};
8use thiserror::Error;
9
10use pallas_codec::utils::{KeepRaw, KeyValuePairs, NonEmptyKeyValuePairs};
11use pallas_crypto::hash::Hash;
12use pallas_primitives::{alonzo, babbage, byron, conway};
13
14mod support;
15
16pub mod assets;
17pub mod auxiliary;
18pub mod block;
19pub mod cert;
20pub mod era;
21pub mod fees;
22pub mod hashes;
23pub mod header;
24pub mod input;
25pub mod meta;
26pub mod output;
27pub mod probe;
28pub mod redeemers;
29pub mod signers;
30pub mod size;
31pub mod time;
32pub mod tx;
33pub mod update;
34pub mod value;
35pub mod withdrawals;
36pub mod witnesses;
37
38// TODO: move to genesis crate
39pub mod wellknown;
40
41#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
42#[non_exhaustive]
43pub enum Era {
44    Byron,
45    Shelley,
46    Allegra, // time-locks
47    Mary,    // multi-assets
48    Alonzo,  // smart-contracts
49    Babbage, // CIP-31/32/33
50    Conway,  // governance CIP-1694
51}
52
53#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
54#[non_exhaustive]
55pub enum Feature {
56    TimeLocks,
57    MultiAssets,
58    Staking,
59    SmartContracts,
60    CIP31,
61    CIP32,
62    CIP33,
63    CIP1694,
64}
65
66#[derive(Debug)]
67pub enum MultiEraHeader<'b> {
68    EpochBoundary(Cow<'b, KeepRaw<'b, byron::EbbHead>>),
69    ShelleyCompatible(Cow<'b, KeepRaw<'b, alonzo::MintedHeader<'b>>>),
70    BabbageCompatible(Cow<'b, KeepRaw<'b, babbage::MintedHeader<'b>>>),
71    Byron(Cow<'b, KeepRaw<'b, byron::BlockHead>>),
72}
73
74#[derive(Debug, Clone)]
75#[non_exhaustive]
76pub enum MultiEraBlock<'b> {
77    EpochBoundary(Box<byron::MintedEbBlock<'b>>),
78    AlonzoCompatible(Box<alonzo::MintedBlock<'b>>, Era),
79    Babbage(Box<babbage::MintedBlock<'b>>),
80    Byron(Box<byron::MintedBlock<'b>>),
81    Conway(Box<conway::MintedBlock<'b>>),
82}
83
84#[derive(Debug, Clone)]
85#[non_exhaustive]
86pub enum MultiEraTx<'b> {
87    AlonzoCompatible(Box<Cow<'b, alonzo::MintedTx<'b>>>, Era),
88    Babbage(Box<Cow<'b, babbage::MintedTx<'b>>>),
89    Byron(Box<Cow<'b, byron::MintedTxPayload<'b>>>),
90    Conway(Box<Cow<'b, conway::MintedTx<'b>>>),
91}
92
93#[derive(Debug, Clone)]
94#[non_exhaustive]
95pub enum MultiEraValue<'b> {
96    Byron(u64),
97    AlonzoCompatible(Cow<'b, alonzo::Value>),
98    Conway(Cow<'b, conway::Value>),
99}
100
101#[derive(Debug, Clone, PartialEq, Eq)]
102#[non_exhaustive]
103pub enum MultiEraOutput<'b> {
104    AlonzoCompatible(Box<Cow<'b, alonzo::TransactionOutput>>, Era),
105    Babbage(Box<Cow<'b, babbage::MintedTransactionOutput<'b>>>),
106    Conway(Box<Cow<'b, conway::MintedTransactionOutput<'b>>>),
107    Byron(Box<Cow<'b, byron::TxOut>>),
108}
109
110#[derive(Debug, Clone, PartialEq, Eq, StdHash)]
111#[non_exhaustive]
112pub enum MultiEraInput<'b> {
113    Byron(Box<Cow<'b, byron::TxIn>>),
114    AlonzoCompatible(Box<Cow<'b, alonzo::TransactionInput>>),
115}
116
117#[derive(Debug, Clone)]
118#[non_exhaustive]
119pub enum MultiEraCert<'b> {
120    NotApplicable,
121    AlonzoCompatible(Box<Cow<'b, alonzo::Certificate>>),
122    Conway(Box<Cow<'b, conway::Certificate>>),
123}
124
125#[derive(Debug, Clone)]
126#[non_exhaustive]
127pub enum MultiEraRedeemer<'b> {
128    AlonzoCompatible(Box<Cow<'b, alonzo::Redeemer>>),
129    Conway(
130        Box<Cow<'b, conway::RedeemersKey>>,
131        Box<Cow<'b, conway::RedeemersValue>>,
132    ),
133}
134
135#[derive(Debug, Clone, Default)]
136#[non_exhaustive]
137pub enum MultiEraMeta<'b> {
138    #[default]
139    Empty,
140    NotApplicable,
141    AlonzoCompatible(&'b alonzo::Metadata),
142}
143
144#[derive(Debug, Clone)]
145#[non_exhaustive]
146pub enum MultiEraPolicyAssets<'b> {
147    AlonzoCompatibleMint(
148        &'b alonzo::PolicyId,
149        &'b KeyValuePairs<alonzo::AssetName, i64>,
150    ),
151    AlonzoCompatibleOutput(
152        &'b alonzo::PolicyId,
153        &'b KeyValuePairs<alonzo::AssetName, u64>,
154    ),
155    ConwayMint(
156        &'b alonzo::PolicyId,
157        &'b NonEmptyKeyValuePairs<alonzo::AssetName, NonZeroInt>,
158    ),
159    ConwayOutput(
160        &'b alonzo::PolicyId,
161        &'b NonEmptyKeyValuePairs<alonzo::AssetName, PositiveCoin>,
162    ),
163}
164
165#[derive(Debug, Clone)]
166#[non_exhaustive]
167pub enum MultiEraAsset<'b> {
168    AlonzoCompatibleOutput(&'b alonzo::PolicyId, &'b alonzo::AssetName, u64),
169    AlonzoCompatibleMint(&'b alonzo::PolicyId, &'b alonzo::AssetName, i64),
170    ConwayOutput(&'b alonzo::PolicyId, &'b alonzo::AssetName, PositiveCoin),
171    ConwayMint(&'b alonzo::PolicyId, &'b alonzo::AssetName, NonZeroInt),
172}
173
174#[derive(Debug, Clone)]
175#[non_exhaustive]
176pub enum MultiEraWithdrawals<'b> {
177    NotApplicable,
178    Empty,
179    AlonzoCompatible(&'b alonzo::Withdrawals),
180    Conway(&'b conway::Withdrawals),
181}
182
183#[derive(Debug, Clone)]
184#[non_exhaustive]
185pub enum MultiEraUpdate<'b> {
186    Byron(u64, Box<Cow<'b, byron::UpProp>>),
187    AlonzoCompatible(Box<Cow<'b, alonzo::Update>>),
188    Babbage(Box<Cow<'b, babbage::Update>>),
189    Conway(Box<Cow<'b, conway::Update>>),
190}
191
192#[derive(Debug, Clone)]
193#[non_exhaustive]
194pub enum MultiEraSigners<'b> {
195    NotApplicable,
196    Empty,
197    AlonzoCompatible(&'b alonzo::RequiredSigners),
198}
199
200#[derive(Debug, Clone, Hash, PartialEq, Eq)]
201pub struct OutputRef(Hash<32>, u64);
202
203#[derive(Debug, Error)]
204pub enum Error {
205    #[error("Invalid CBOR structure: {0}")]
206    InvalidCbor(String),
207
208    #[error("Unknown CBOR structure: {0}")]
209    UnknownCbor(String),
210
211    #[error("Unknown era tag: {0}")]
212    UnknownEra(u16),
213
214    #[error("Invalid era for request: {0}")]
215    InvalidEra(Era),
216
217    #[error("Invalid UTxO ref: {0}")]
218    InvalidUtxoRef(String),
219}
220
221impl Error {
222    pub fn invalid_cbor(error: impl Display) -> Self {
223        Error::InvalidCbor(format!("{error}"))
224    }
225
226    pub fn unknown_cbor(bytes: &[u8]) -> Self {
227        Error::UnknownCbor(hex::encode(bytes))
228    }
229
230    pub fn invalid_utxo_ref(str: &str) -> Self {
231        Error::InvalidUtxoRef(str.to_owned())
232    }
233}
234
235pub trait ComputeHash<const BYTES: usize> {
236    fn compute_hash(&self) -> pallas_crypto::hash::Hash<BYTES>;
237}
238
239pub trait OriginalHash<const BYTES: usize> {
240    fn original_hash(&self) -> pallas_crypto::hash::Hash<BYTES>;
241}