1pub mod cbor_encodings;
5pub mod serialization;
6pub mod utils;
7
8use crate::allegra::AllegraCertificate;
9use crate::alonzo::AlonzoRedeemer;
10use crate::shelley::ProtocolVersionStruct;
11use cbor_encodings::{
12 BabbageBlockEncoding, BabbageFormatAuxDataEncoding, BabbageFormatTxOutEncoding,
13 BabbageProtocolParamUpdateEncoding, BabbageTransactionBodyEncoding, BabbageTransactionEncoding,
14 BabbageTransactionWitnessSetEncoding, BabbageUpdateEncoding,
15};
16use cml_chain::address::Address;
17use cml_chain::assets::{Coin, Value};
18use cml_chain::auxdata::{Metadata, ShelleyFormatAuxData, ShelleyMAFormatAuxData};
19use cml_chain::block::Header;
20use cml_chain::crypto::{
21 AuxiliaryDataHash, BootstrapWitness, GenesisHash, ScriptDataHash, Vkeywitness,
22};
23use cml_chain::plutus::{
24 CostModels, ExUnitPrices, ExUnits, PlutusData, PlutusV1Script, PlutusV2Script,
25};
26use cml_chain::transaction::{AlonzoFormatTxOut, DatumOption, NativeScript, TransactionInput};
27use cml_chain::{Epoch, NetworkId, Rational, RequiredSigners, UnitInterval, Withdrawals};
28
29use cml_core::ordered_hash_map::OrderedHashMap;
30use cml_core::serialization::LenEncoding;
31use cml_core::TransactionIndex;
32
33use std::collections::BTreeMap;
34
35use self::utils::BabbageMint;
36
37#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
38pub enum BabbageAuxiliaryData {
39 Shelley(ShelleyFormatAuxData),
40 ShelleyMA(ShelleyMAFormatAuxData),
41 Babbage(BabbageFormatAuxData),
42}
43
44impl BabbageAuxiliaryData {
45 pub fn new_shelley(shelley: ShelleyFormatAuxData) -> Self {
46 Self::Shelley(shelley)
47 }
48
49 pub fn new_shelley_ma(shelley_ma: ShelleyMAFormatAuxData) -> Self {
50 Self::ShelleyMA(shelley_ma)
51 }
52
53 pub fn new_babbage(babbage: BabbageFormatAuxData) -> Self {
54 Self::Babbage(babbage)
55 }
56}
57
58#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
59pub struct BabbageBlock {
60 pub header: Header,
61 pub transaction_bodies: Vec<BabbageTransactionBody>,
62 pub transaction_witness_sets: Vec<BabbageTransactionWitnessSet>,
63 pub auxiliary_data_set: OrderedHashMap<TransactionIndex, BabbageAuxiliaryData>,
64 pub invalid_transactions: Vec<TransactionIndex>,
65 #[serde(skip)]
66 pub encodings: Option<BabbageBlockEncoding>,
67}
68
69impl BabbageBlock {
70 pub fn new(
71 header: Header,
72 transaction_bodies: Vec<BabbageTransactionBody>,
73 transaction_witness_sets: Vec<BabbageTransactionWitnessSet>,
74 auxiliary_data_set: OrderedHashMap<TransactionIndex, BabbageAuxiliaryData>,
75 invalid_transactions: Vec<TransactionIndex>,
76 ) -> Self {
77 Self {
78 header,
79 transaction_bodies,
80 transaction_witness_sets,
81 auxiliary_data_set,
82 invalid_transactions,
83 encodings: None,
84 }
85 }
86}
87
88pub type BabbageCostModels = CostModels;
89
90#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
91pub struct BabbageFormatAuxData {
92 pub metadata: Option<Metadata>,
93 pub native_scripts: Option<Vec<NativeScript>>,
94 pub plutus_v1_scripts: Option<Vec<PlutusV1Script>>,
95 pub plutus_v2_scripts: Option<Vec<PlutusV2Script>>,
96 #[serde(skip)]
97 pub encodings: Option<BabbageFormatAuxDataEncoding>,
98}
99
100impl BabbageFormatAuxData {
101 pub fn new() -> Self {
102 Self {
103 metadata: None,
104 native_scripts: None,
105 plutus_v1_scripts: None,
106 plutus_v2_scripts: None,
107 encodings: None,
108 }
109 }
110}
111
112impl Default for BabbageFormatAuxData {
113 fn default() -> Self {
114 Self::new()
115 }
116}
117
118#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
119pub struct BabbageFormatTxOut {
120 pub address: Address,
121 pub amount: Value,
122 pub datum_option: Option<DatumOption>,
123 pub script_reference: Option<BabbageScriptRef>,
124 #[serde(skip)]
125 pub encodings: Option<BabbageFormatTxOutEncoding>,
126}
127
128impl BabbageFormatTxOut {
129 pub fn new(address: Address, amount: Value) -> Self {
130 Self {
131 address,
132 amount,
133 datum_option: None,
134 script_reference: None,
135 encodings: None,
136 }
137 }
138}
139
140pub type BabbageProposedProtocolParameterUpdates =
141 OrderedHashMap<GenesisHash, BabbageProtocolParamUpdate>;
142
143#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
144pub struct BabbageProtocolParamUpdate {
145 pub minfee_a: Option<u64>,
146 pub minfee_b: Option<u64>,
147 pub max_block_body_size: Option<u64>,
148 pub max_transaction_size: Option<u64>,
149 pub max_block_header_size: Option<u64>,
150 pub key_deposit: Option<Coin>,
151 pub pool_deposit: Option<Coin>,
152 pub maximum_epoch: Option<Epoch>,
153 pub n_opt: Option<u64>,
154 pub pool_pledge_influence: Option<Rational>,
155 pub expansion_rate: Option<UnitInterval>,
156 pub treasury_growth_rate: Option<UnitInterval>,
157 pub protocol_version: Option<ProtocolVersionStruct>,
158 pub min_pool_cost: Option<Coin>,
159 pub ada_per_utxo_byte: Option<Coin>,
160 pub cost_models_for_script_languages: Option<BabbageCostModels>,
161 pub execution_costs: Option<ExUnitPrices>,
162 pub max_tx_ex_units: Option<ExUnits>,
163 pub max_block_ex_units: Option<ExUnits>,
164 pub max_value_size: Option<u64>,
165 pub collateral_percentage: Option<u64>,
166 pub max_collateral_inputs: Option<u64>,
167 #[serde(skip)]
168 pub encodings: Option<BabbageProtocolParamUpdateEncoding>,
169}
170
171impl BabbageProtocolParamUpdate {
172 pub fn new() -> Self {
173 Self {
174 minfee_a: None,
175 minfee_b: None,
176 max_block_body_size: None,
177 max_transaction_size: None,
178 max_block_header_size: None,
179 key_deposit: None,
180 pool_deposit: None,
181 maximum_epoch: None,
182 n_opt: None,
183 pool_pledge_influence: None,
184 expansion_rate: None,
185 treasury_growth_rate: None,
186 protocol_version: None,
187 min_pool_cost: None,
188 ada_per_utxo_byte: None,
189 cost_models_for_script_languages: None,
190 execution_costs: None,
191 max_tx_ex_units: None,
192 max_block_ex_units: None,
193 max_value_size: None,
194 collateral_percentage: None,
195 max_collateral_inputs: None,
196 encodings: None,
197 }
198 }
199}
200
201impl Default for BabbageProtocolParamUpdate {
202 fn default() -> Self {
203 Self::new()
204 }
205}
206
207#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
208pub enum BabbageScript {
209 Native {
210 script: NativeScript,
211 #[serde(skip)]
212 len_encoding: LenEncoding,
213 #[serde(skip)]
214 tag_encoding: Option<cbor_event::Sz>,
215 },
216 PlutusV1 {
217 script: PlutusV1Script,
218 #[serde(skip)]
219 len_encoding: LenEncoding,
220 #[serde(skip)]
221 tag_encoding: Option<cbor_event::Sz>,
222 },
223 PlutusV2 {
224 script: PlutusV2Script,
225 #[serde(skip)]
226 len_encoding: LenEncoding,
227 #[serde(skip)]
228 tag_encoding: Option<cbor_event::Sz>,
229 },
230}
231
232impl BabbageScript {
233 pub fn new_native(script: NativeScript) -> Self {
234 Self::Native {
235 script,
236 len_encoding: LenEncoding::default(),
237 tag_encoding: None,
238 }
239 }
240
241 pub fn new_plutus_v1(script: PlutusV1Script) -> Self {
242 Self::PlutusV1 {
243 script,
244 len_encoding: LenEncoding::default(),
245 tag_encoding: None,
246 }
247 }
248
249 pub fn new_plutus_v2(script: PlutusV2Script) -> Self {
250 Self::PlutusV2 {
251 script,
252 len_encoding: LenEncoding::default(),
253 tag_encoding: None,
254 }
255 }
256}
257
258pub type BabbageScriptRef = BabbageScript;
259
260#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
261pub struct BabbageTransaction {
262 pub body: BabbageTransactionBody,
263 pub witness_set: BabbageTransactionWitnessSet,
264 pub is_valid: bool,
265 pub auxiliary_data: Option<BabbageAuxiliaryData>,
266 #[serde(skip)]
267 pub encodings: Option<BabbageTransactionEncoding>,
268}
269
270impl BabbageTransaction {
271 pub fn new(
272 body: BabbageTransactionBody,
273 witness_set: BabbageTransactionWitnessSet,
274 is_valid: bool,
275 auxiliary_data: Option<BabbageAuxiliaryData>,
276 ) -> Self {
277 Self {
278 body,
279 witness_set,
280 is_valid,
281 auxiliary_data,
282 encodings: None,
283 }
284 }
285}
286
287#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
288pub struct BabbageTransactionBody {
289 pub inputs: Vec<TransactionInput>,
290 pub outputs: Vec<BabbageTransactionOutput>,
291 pub fee: Coin,
292 pub ttl: Option<u64>,
293 pub certs: Option<Vec<AllegraCertificate>>,
294 pub withdrawals: Option<Withdrawals>,
295 pub update: Option<BabbageUpdate>,
296 pub auxiliary_data_hash: Option<AuxiliaryDataHash>,
297 pub validity_interval_start: Option<u64>,
298 pub mint: Option<BabbageMint>,
299 pub script_data_hash: Option<ScriptDataHash>,
300 pub collateral_inputs: Option<Vec<TransactionInput>>,
301 pub required_signers: Option<RequiredSigners>,
302 pub network_id: Option<NetworkId>,
303 pub collateral_return: Option<BabbageTransactionOutput>,
304 pub total_collateral: Option<Coin>,
305 pub reference_inputs: Option<Vec<TransactionInput>>,
306 #[serde(skip)]
307 pub encodings: Option<BabbageTransactionBodyEncoding>,
308}
309
310impl BabbageTransactionBody {
311 pub fn new(
312 inputs: Vec<TransactionInput>,
313 outputs: Vec<BabbageTransactionOutput>,
314 fee: Coin,
315 ) -> Self {
316 Self {
317 inputs,
318 outputs,
319 fee,
320 ttl: None,
321 certs: None,
322 withdrawals: None,
323 update: None,
324 auxiliary_data_hash: None,
325 validity_interval_start: None,
326 mint: None,
327 script_data_hash: None,
328 collateral_inputs: None,
329 required_signers: None,
330 network_id: None,
331 collateral_return: None,
332 total_collateral: None,
333 reference_inputs: None,
334 encodings: None,
335 }
336 }
337}
338
339#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
340pub enum BabbageTransactionOutput {
341 AlonzoFormatTxOut(AlonzoFormatTxOut),
342 BabbageFormatTxOut(BabbageFormatTxOut),
343}
344
345impl BabbageTransactionOutput {
346 pub fn new_alonzo_format_tx_out(alonzo_format_tx_out: AlonzoFormatTxOut) -> Self {
347 Self::AlonzoFormatTxOut(alonzo_format_tx_out)
348 }
349
350 pub fn new_babbage_format_tx_out(babbage_format_tx_out: BabbageFormatTxOut) -> Self {
351 Self::BabbageFormatTxOut(babbage_format_tx_out)
352 }
353}
354
355#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
356pub struct BabbageTransactionWitnessSet {
357 pub vkeywitnesses: Option<Vec<Vkeywitness>>,
358 pub native_scripts: Option<Vec<NativeScript>>,
359 pub bootstrap_witnesses: Option<Vec<BootstrapWitness>>,
360 pub plutus_v1_scripts: Option<Vec<PlutusV1Script>>,
361 pub plutus_datums: Option<Vec<PlutusData>>,
362 pub redeemers: Option<Vec<AlonzoRedeemer>>,
363 pub plutus_v2_scripts: Option<Vec<PlutusV2Script>>,
364 #[serde(skip)]
365 pub encodings: Option<BabbageTransactionWitnessSetEncoding>,
366}
367
368impl BabbageTransactionWitnessSet {
369 pub fn new() -> Self {
370 Self {
371 vkeywitnesses: None,
372 native_scripts: None,
373 bootstrap_witnesses: None,
374 plutus_v1_scripts: None,
375 plutus_datums: None,
376 redeemers: None,
377 plutus_v2_scripts: None,
378 encodings: None,
379 }
380 }
381}
382
383impl Default for BabbageTransactionWitnessSet {
384 fn default() -> Self {
385 Self::new()
386 }
387}
388
389#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, schemars::JsonSchema)]
390pub struct BabbageUpdate {
391 pub updates: BabbageProposedProtocolParameterUpdates,
392 pub epoch: Epoch,
393 #[serde(skip)]
394 pub encodings: Option<BabbageUpdateEncoding>,
395}
396
397impl BabbageUpdate {
398 pub fn new(updates: BabbageProposedProtocolParameterUpdates, epoch: Epoch) -> Self {
399 Self {
400 updates,
401 epoch,
402 encodings: None,
403 }
404 }
405}