From 77668ddcd132d1cc24d40abb98f64821514e0bbe Mon Sep 17 00:00:00 2001
From: Santiago Carmuega <santiago@carmuega.me>
Date: Sat, 4 Feb 2023 11:28:11 -0300
Subject: [PATCH] feat: Send inline datum as new events

---
 src/mapper/babbage.rs | 11 ++++++++---
 src/mapper/byron.rs   |  1 +
 src/mapper/collect.rs |  2 +-
 src/mapper/map.rs     | 11 ++++++++---
 src/model.rs          |  3 ++-
 5 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/src/mapper/babbage.rs b/src/mapper/babbage.rs
index b1a97d1e..443cf864 100644
--- a/src/mapper/babbage.rs
+++ b/src/mapper/babbage.rs
@@ -1,8 +1,8 @@
 use pallas::codec::utils::KeepRaw;
 
 use pallas::ledger::primitives::babbage::{
-    AuxiliaryData, MintedBlock, MintedPostAlonzoTransactionOutput, MintedTransactionBody,
-    MintedTransactionOutput, MintedWitnessSet, NetworkId,
+    AuxiliaryData, MintedBlock, MintedDatumOption, MintedPostAlonzoTransactionOutput,
+    MintedTransactionBody, MintedTransactionOutput, MintedWitnessSet, NetworkId,
 };
 
 use pallas::crypto::hash::Hash;
@@ -113,7 +113,7 @@ impl EventWriter {
                     .into();
 
                 record.plutus_data = self
-                    .collect_plutus_datum_records(&witnesses.plutus_data)?
+                    .collect_witness_plutus_datum_records(&witnesses.plutus_data)?
                     .into();
             }
 
@@ -208,6 +208,11 @@ impl EventWriter {
 
         child.crawl_transaction_output_amount(&output.value)?;
 
+        if let Some(MintedDatumOption::Data(datum)) = &output.datum_option {
+            let record = self.to_plutus_datum_record(datum)?;
+            child.append(record.into())?;
+        }
+
         Ok(())
     }
 
diff --git a/src/mapper/byron.rs b/src/mapper/byron.rs
index 42f191d4..65d05504 100644
--- a/src/mapper/byron.rs
+++ b/src/mapper/byron.rs
@@ -53,6 +53,7 @@ impl EventWriter {
             amount: source.amount,
             assets: None,
             datum_hash: None,
+            inline_datum: None,
         })
     }
 
diff --git a/src/mapper/collect.rs b/src/mapper/collect.rs
index 8dc8f4f7..515e11b5 100644
--- a/src/mapper/collect.rs
+++ b/src/mapper/collect.rs
@@ -188,7 +188,7 @@ impl EventWriter {
         }
     }
 
-    pub fn collect_plutus_datum_records(
+    pub fn collect_witness_plutus_datum_records(
         &self,
         witness_set: &Option<Vec<KeepRaw<PlutusData>>>,
     ) -> Result<Vec<PlutusDatumRecord>, Error> {
diff --git a/src/mapper/map.rs b/src/mapper/map.rs
index 51adad1b..3e2179a4 100644
--- a/src/mapper/map.rs
+++ b/src/mapper/map.rs
@@ -176,6 +176,7 @@ impl EventWriter {
             amount: get_tx_output_coin_value(&output.amount),
             assets: self.collect_asset_records(&output.amount).into(),
             datum_hash: output.datum_hash.map(|hash| hash.to_string()),
+            inline_datum: None,
         })
     }
 
@@ -194,6 +195,10 @@ impl EventWriter {
                 Some(MintedDatumOption::Data(x)) => Some(x.original_hash().to_hex()),
                 None => None,
             },
+            inline_datum: match &output.datum_option {
+                Some(MintedDatumOption::Data(x)) => Some(self.to_plutus_datum_record(x)?),
+                _ => None,
+            },
         })
     }
 
@@ -258,10 +263,10 @@ impl EventWriter {
 
     pub fn to_plutus_datum_record(
         &self,
-        datum: &alonzo::PlutusData,
+        datum: &KeepRaw<'_, alonzo::PlutusData>,
     ) -> Result<PlutusDatumRecord, crate::Error> {
         Ok(PlutusDatumRecord {
-            datum_hash: datum.compute_hash().to_hex(),
+            datum_hash: datum.original_hash().to_hex(),
             plutus_data: datum.to_json(),
         })
     }
@@ -452,7 +457,7 @@ impl EventWriter {
                     .into();
 
                 record.plutus_data = self
-                    .collect_plutus_datum_records(&witnesses.plutus_data)?
+                    .collect_witness_plutus_datum_records(&witnesses.plutus_data)?
                     .into();
             }
 
diff --git a/src/model.rs b/src/model.rs
index f3dae52a..ead944d7 100644
--- a/src/model.rs
+++ b/src/model.rs
@@ -119,12 +119,13 @@ impl From<OutputAssetRecord> for EventData {
     }
 }
 
-#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
+#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
 pub struct TxOutputRecord {
     pub address: String,
     pub amount: u64,
     pub assets: Option<Vec<OutputAssetRecord>>,
     pub datum_hash: Option<String>,
+    pub inline_datum: Option<PlutusDatumRecord>,
 }
 
 impl From<TxOutputRecord> for EventData {