11{-# LANGUAGE FlexibleInstances #-}
22{-# LANGUAGE LambdaCase #-}
3+ {-# LANGUAGE OverloadedStrings #-}
34{-# LANGUAGE RankNTypes #-}
5+ {-# LANGUAGE RecordWildCards #-}
46{-# LANGUAGE UndecidableSuperClasses #-}
57{-# LANGUAGE NoImplicitPrelude #-}
68
@@ -13,6 +15,7 @@ module Cardano.DbSync.Era.Shelley.Generic.Tx.Types (
1315 TxWithdrawal (.. ),
1416 TxIn (.. ),
1517 TxOut (.. ),
18+ TxOutMultiAsset (.. ),
1619 TxRedeemer (.. ),
1720 TxScript (.. ),
1821 PlutusData (.. ),
@@ -26,6 +29,7 @@ module Cardano.DbSync.Era.Shelley.Generic.Tx.Types (
2629 getMaybeDatumHash ,
2730 sumTxOutCoin ,
2831 toTxHash ,
32+ fromMultiAssetMap ,
2933) where
3034
3135import qualified Cardano.Db as DB
@@ -42,12 +46,16 @@ import Cardano.Ledger.Conway.Governance
4246import Cardano.Ledger.Conway.Scripts
4347import Cardano.Ledger.Conway.TxCert (ConwayTxCert )
4448import Cardano.Ledger.Core (TxBody )
45- import Cardano.Ledger.Mary.Value (AssetName , MultiAsset , PolicyID )
49+ import Cardano.Ledger.Mary.Value (AssetName ( .. ) , MultiAsset , PolicyID )
4650import qualified Cardano.Ledger.Shelley.TxBody as Shelley
4751import Cardano.Ledger.Shelley.TxCert
4852import qualified Cardano.Ledger.TxIn as Ledger
4953import Cardano.Prelude
5054import Cardano.Slotting.Slot (SlotNo (.. ))
55+ import Data.Aeson (FromJSON (.. ), ToJSON (.. ), (.:) , (.=) )
56+ import Data.Aeson.Types (object , withObject )
57+ import Data.ByteString.Short (toShort )
58+ import qualified Data.Map as Map
5159import Ouroboros.Consensus.Cardano.Block (StandardAlonzo , StandardBabbage , StandardConway , StandardCrypto , StandardShelley )
5260
5361data Tx = Tx
@@ -114,6 +122,13 @@ data TxOut = TxOut
114122 , txOutDatum :: ! TxOutDatum
115123 }
116124
125+ data TxOutMultiAsset = TxOutMultiAsset
126+ { txOutMaPolicyId :: ! (PolicyID StandardCrypto )
127+ , txOutMaAssetName :: ! AssetName
128+ , txOutMaAmount :: ! Integer
129+ }
130+ deriving (Eq , Show )
131+
117132data TxRedeemer = TxRedeemer
118133 { txRedeemerMem :: ! Word64
119134 , txRedeemerSteps :: ! Word64
@@ -151,6 +166,24 @@ data PoolStats = PoolStats
151166 , votingPower :: Maybe Coin
152167 }
153168
169+ instance ToJSON TxOutMultiAsset where
170+ toJSON TxOutMultiAsset {.. } =
171+ object
172+ [ " policyId" .= txOutMaPolicyId
173+ , " assetName" .= txOutMaAssetName
174+ , " amount" .= txOutMaAmount
175+ ]
176+
177+ instance FromJSON TxOutMultiAsset where
178+ parseJSON = withObject " MultiAsset" $ \ o ->
179+ TxOutMultiAsset
180+ <$> o .: " policyId"
181+ <*> (parseAssetName <$> o .: " assetName" )
182+ <*> o .: " amount"
183+ where
184+ parseAssetName :: Text -> AssetName
185+ parseAssetName t = AssetName $ toShort (encodeUtf8 t)
186+
154187toTxCert :: Word16 -> Cert -> TxCertificate
155188toTxCert idx dcert =
156189 TxCertificate
@@ -172,6 +205,17 @@ getMaybeDatumHash :: Maybe DataHash -> TxOutDatum
172205getMaybeDatumHash Nothing = NoDatum
173206getMaybeDatumHash (Just hsh) = DatumHash hsh
174207
208+ fromMultiAssetMap ::
209+ Map (PolicyID StandardCrypto ) (Map AssetName Integer ) ->
210+ [TxOutMultiAsset ]
211+ fromMultiAssetMap = concat . toListBy foldAssets
212+ where
213+ foldAssets :: PolicyID StandardCrypto -> Map AssetName Integer -> [TxOutMultiAsset ]
214+ foldAssets policy = toListBy (TxOutMultiAsset policy)
215+
216+ toListBy :: (k -> a -> b ) -> Map k a -> [b ]
217+ toListBy f = Map. foldrWithKey (\ k a xs -> f k a : xs) []
218+
175219sumTxOutCoin :: [TxOut ] -> Coin
176220sumTxOutCoin = Coin . sum . map (unCoin . txOutAdaValue)
177221
0 commit comments