{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}

module Cardano.Api.Internal.Tx.UTxO where

import Cardano.Api.Internal.Eon.ShelleyBasedEra
  ( IsShelleyBasedEra
  , ShelleyBasedEra
  , ShelleyLedgerEra
  )
import Cardano.Api.Internal.Eras.Core (IsCardanoEra)
import Cardano.Api.Internal.Tx.Output (CtxUTxO, TxOut (..), fromShelleyTxOut, toShelleyTxOut)
import Cardano.Api.Internal.TxIn (TxIn (..), fromShelleyTxIn, toShelleyTxIn)

import Cardano.Ledger.Babbage ()
import Cardano.Ledger.Shelley.UTxO qualified as Ledger

import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Aeson qualified as Aeson
import Data.Aeson.KeyMap qualified as KeyMap
import Data.Aeson.Types (Parser)
import Data.Map (Map)
import Data.Map qualified as Map
import Data.MonoTraversable
import Data.Set (Set)
import Data.Text (Text)
import GHC.Exts qualified as GHC

newtype UTxO era = UTxO {forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO :: Map TxIn (TxOut CtxUTxO era)}
  deriving stock (UTxO era -> UTxO era -> Bool
(UTxO era -> UTxO era -> Bool)
-> (UTxO era -> UTxO era -> Bool) -> Eq (UTxO era)
forall era. UTxO era -> UTxO era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era. UTxO era -> UTxO era -> Bool
== :: UTxO era -> UTxO era -> Bool
$c/= :: forall era. UTxO era -> UTxO era -> Bool
/= :: UTxO era -> UTxO era -> Bool
Eq, Int -> UTxO era -> ShowS
[UTxO era] -> ShowS
UTxO era -> String
(Int -> UTxO era -> ShowS)
-> (UTxO era -> String) -> ([UTxO era] -> ShowS) -> Show (UTxO era)
forall era. Int -> UTxO era -> ShowS
forall era. [UTxO era] -> ShowS
forall era. UTxO era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> UTxO era -> ShowS
showsPrec :: Int -> UTxO era -> ShowS
$cshow :: forall era. UTxO era -> String
show :: UTxO era -> String
$cshowList :: forall era. [UTxO era] -> ShowS
showList :: [UTxO era] -> ShowS
Show)
  deriving newtype (NonEmpty (UTxO era) -> UTxO era
UTxO era -> UTxO era -> UTxO era
(UTxO era -> UTxO era -> UTxO era)
-> (NonEmpty (UTxO era) -> UTxO era)
-> (forall b. Integral b => b -> UTxO era -> UTxO era)
-> Semigroup (UTxO era)
forall b. Integral b => b -> UTxO era -> UTxO era
forall era. NonEmpty (UTxO era) -> UTxO era
forall era. UTxO era -> UTxO era -> UTxO era
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall era b. Integral b => b -> UTxO era -> UTxO era
$c<> :: forall era. UTxO era -> UTxO era -> UTxO era
<> :: UTxO era -> UTxO era -> UTxO era
$csconcat :: forall era. NonEmpty (UTxO era) -> UTxO era
sconcat :: NonEmpty (UTxO era) -> UTxO era
$cstimes :: forall era b. Integral b => b -> UTxO era -> UTxO era
stimes :: forall b. Integral b => b -> UTxO era -> UTxO era
Semigroup, Semigroup (UTxO era)
UTxO era
Semigroup (UTxO era) =>
UTxO era
-> (UTxO era -> UTxO era -> UTxO era)
-> ([UTxO era] -> UTxO era)
-> Monoid (UTxO era)
[UTxO era] -> UTxO era
UTxO era -> UTxO era -> UTxO era
forall era. Semigroup (UTxO era)
forall era. UTxO era
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall era. [UTxO era] -> UTxO era
forall era. UTxO era -> UTxO era -> UTxO era
$cmempty :: forall era. UTxO era
mempty :: UTxO era
$cmappend :: forall era. UTxO era -> UTxO era -> UTxO era
mappend :: UTxO era -> UTxO era -> UTxO era
$cmconcat :: forall era. [UTxO era] -> UTxO era
mconcat :: [UTxO era] -> UTxO era
Monoid)

instance GHC.IsList (UTxO era) where
  type Item (UTxO era) = (TxIn, TxOut CtxUTxO era)
  fromList :: [Item (UTxO era)] -> UTxO era
fromList = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> ([(TxIn, TxOut CtxUTxO era)] -> Map TxIn (TxOut CtxUTxO era))
-> [(TxIn, TxOut CtxUTxO era)]
-> UTxO era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(TxIn, TxOut CtxUTxO era)] -> Map TxIn (TxOut CtxUTxO era)
[Item (Map TxIn (TxOut CtxUTxO era))]
-> Map TxIn (TxOut CtxUTxO era)
forall l. IsList l => [Item l] -> l
GHC.fromList
  toList :: UTxO era -> [Item (UTxO era)]
toList = Map TxIn (TxOut CtxUTxO era) -> [(TxIn, TxOut CtxUTxO era)]
Map TxIn (TxOut CtxUTxO era)
-> [Item (Map TxIn (TxOut CtxUTxO era))]
forall l. IsList l => l -> [Item l]
GHC.toList (Map TxIn (TxOut CtxUTxO era) -> [(TxIn, TxOut CtxUTxO era)])
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> [(TxIn, TxOut CtxUTxO era)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO

instance IsCardanoEra era => ToJSON (UTxO era) where
  toJSON :: UTxO era -> Value
toJSON (UTxO Map TxIn (TxOut CtxUTxO era)
m) = Map TxIn (TxOut CtxUTxO era) -> Value
forall a. ToJSON a => a -> Value
toJSON Map TxIn (TxOut CtxUTxO era)
m
  toEncoding :: UTxO era -> Encoding
toEncoding (UTxO Map TxIn (TxOut CtxUTxO era)
m) = Map TxIn (TxOut CtxUTxO era) -> Encoding
forall a. ToJSON a => a -> Encoding
toEncoding Map TxIn (TxOut CtxUTxO era)
m

instance IsShelleyBasedEra era => FromJSON (UTxO era) where
  parseJSON :: Value -> Parser (UTxO era)
parseJSON = String
-> (Object -> Parser (UTxO era)) -> Value -> Parser (UTxO era)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"UTxO" ((Object -> Parser (UTxO era)) -> Value -> Parser (UTxO era))
-> (Object -> Parser (UTxO era)) -> Value -> Parser (UTxO era)
forall a b. (a -> b) -> a -> b
$ \Object
hm -> do
    let l :: [Item (HashMap Text Value)]
l = HashMap Text Value -> [Item (HashMap Text Value)]
forall l. IsList l => l -> [Item l]
GHC.toList (HashMap Text Value -> [Item (HashMap Text Value)])
-> HashMap Text Value -> [Item (HashMap Text Value)]
forall a b. (a -> b) -> a -> b
$ Object -> HashMap Text Value
forall v. KeyMap v -> HashMap Text v
KeyMap.toHashMapText Object
hm
    [(TxIn, TxOut CtxUTxO era)]
res <- ((Text, Value) -> Parser (TxIn, TxOut CtxUTxO era))
-> [(Text, Value)] -> Parser [(TxIn, TxOut CtxUTxO era)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Text, Value) -> Parser (TxIn, TxOut CtxUTxO era)
toTxIn [(Text, Value)]
[Item (HashMap Text Value)]
l
    UTxO era -> Parser (UTxO era)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (UTxO era -> Parser (UTxO era))
-> (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> Map TxIn (TxOut CtxUTxO era)
-> Parser (UTxO era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> Parser (UTxO era))
-> Map TxIn (TxOut CtxUTxO era) -> Parser (UTxO era)
forall a b. (a -> b) -> a -> b
$ [(TxIn, TxOut CtxUTxO era)] -> Map TxIn (TxOut CtxUTxO era)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(TxIn, TxOut CtxUTxO era)]
res
   where
    toTxIn :: (Text, Aeson.Value) -> Parser (TxIn, TxOut CtxUTxO era)
    toTxIn :: (Text, Value) -> Parser (TxIn, TxOut CtxUTxO era)
toTxIn (Text
txinText, Value
txOutVal) = do
      (,)
        (TxIn -> TxOut CtxUTxO era -> (TxIn, TxOut CtxUTxO era))
-> Parser TxIn
-> Parser (TxOut CtxUTxO era -> (TxIn, TxOut CtxUTxO era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser TxIn
forall a. FromJSON a => Value -> Parser a
parseJSON (Text -> Value
Aeson.String Text
txinText)
        Parser (TxOut CtxUTxO era -> (TxIn, TxOut CtxUTxO era))
-> Parser (TxOut CtxUTxO era) -> Parser (TxIn, TxOut CtxUTxO era)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Value -> Parser (TxOut CtxUTxO era)
forall a. FromJSON a => Value -> Parser a
parseJSON Value
txOutVal

type instance Element (UTxO era) = TxOut CtxUTxO era

instance MonoFunctor (UTxO era) where
  omap :: (Element (UTxO era) -> Element (UTxO era)) -> UTxO era -> UTxO era
omap Element (UTxO era) -> Element (UTxO era)
f (UTxO Map TxIn (TxOut CtxUTxO era)
utxos) = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall a b. (a -> b) -> a -> b
$ Element (UTxO era) -> Element (UTxO era)
TxOut CtxUTxO era -> TxOut CtxUTxO era
f (TxOut CtxUTxO era -> TxOut CtxUTxO era)
-> Map TxIn (TxOut CtxUTxO era) -> Map TxIn (TxOut CtxUTxO era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map TxIn (TxOut CtxUTxO era)
utxos

deriving newtype instance MonoFoldable (UTxO era)

instance MonoTraversable (UTxO era) where
  otraverse :: forall (f :: * -> *).
Applicative f =>
(Element (UTxO era) -> f (Element (UTxO era)))
-> UTxO era -> f (UTxO era)
otraverse = (Element (UTxO era) -> f (Element (UTxO era)))
-> UTxO era -> f (UTxO era)
forall mono (f :: * -> *).
(MonoTraversable mono, Applicative f) =>
(Element mono -> f (Element mono)) -> mono -> f mono
forall (f :: * -> *).
Applicative f =>
(Element (UTxO era) -> f (Element (UTxO era)))
-> UTxO era -> f (UTxO era)
omapM
  omapM :: forall (f :: * -> *).
Applicative f =>
(Element (UTxO era) -> f (Element (UTxO era)))
-> UTxO era -> f (UTxO era)
omapM Element (UTxO era) -> m (Element (UTxO era))
f (UTxO Map TxIn (TxOut CtxUTxO era)
utxos) = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> m (Map TxIn (TxOut CtxUTxO era)) -> m (UTxO era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Element (Map TxIn (TxOut CtxUTxO era))
 -> m (Element (Map TxIn (TxOut CtxUTxO era))))
-> Map TxIn (TxOut CtxUTxO era) -> m (Map TxIn (TxOut CtxUTxO era))
forall mono (f :: * -> *).
(MonoTraversable mono, Applicative f) =>
(Element mono -> f (Element mono)) -> mono -> f mono
forall (m :: * -> *).
Applicative m =>
(Element (Map TxIn (TxOut CtxUTxO era))
 -> m (Element (Map TxIn (TxOut CtxUTxO era))))
-> Map TxIn (TxOut CtxUTxO era) -> m (Map TxIn (TxOut CtxUTxO era))
omapM Element (Map TxIn (TxOut CtxUTxO era))
-> m (Element (Map TxIn (TxOut CtxUTxO era)))
Element (UTxO era) -> m (Element (UTxO era))
f Map TxIn (TxOut CtxUTxO era)
utxos

-- | Infix version of `difference`.
(\\) :: UTxO era -> UTxO era -> UTxO era
UTxO era
a \\ :: forall era. UTxO era -> UTxO era -> UTxO era
\\ UTxO era
b = UTxO era -> UTxO era -> UTxO era
forall era. UTxO era -> UTxO era -> UTxO era
difference UTxO era
a UTxO era
b

-- | Create an empty `UTxO`.
empty :: UTxO era
empty :: forall era. UTxO era
empty = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO Map TxIn (TxOut CtxUTxO era)
forall k a. Map k a
Map.empty

-- | Create a `UTxO` from a single unspent transaction output.
singleton :: TxIn -> TxOut CtxUTxO era -> UTxO era
singleton :: forall era. TxIn -> TxOut CtxUTxO era -> UTxO era
singleton TxIn
i TxOut CtxUTxO era
o = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall a b. (a -> b) -> a -> b
$ TxIn -> TxOut CtxUTxO era -> Map TxIn (TxOut CtxUTxO era)
forall k a. k -> a -> Map k a
Map.singleton TxIn
i TxOut CtxUTxO era
o

-- | Find a 'TxOut' for a given 'TxIn'.
lookup :: TxIn -> UTxO era -> Maybe (TxOut CtxUTxO era)
lookup :: forall era. TxIn -> UTxO era -> Maybe (TxOut CtxUTxO era)
lookup TxIn
k = TxIn -> Map TxIn (TxOut CtxUTxO era) -> Maybe (TxOut CtxUTxO era)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup TxIn
k (Map TxIn (TxOut CtxUTxO era) -> Maybe (TxOut CtxUTxO era))
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> Maybe (TxOut CtxUTxO era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO

-- | Synonym for `lookup`.
resolveTxIn :: TxIn -> UTxO era -> Maybe (TxOut CtxUTxO era)
resolveTxIn :: forall era. TxIn -> UTxO era -> Maybe (TxOut CtxUTxO era)
resolveTxIn = TxIn -> UTxO era -> Maybe (TxOut CtxUTxO era)
forall era. TxIn -> UTxO era -> Maybe (TxOut CtxUTxO era)
Cardano.Api.Internal.Tx.UTxO.lookup

-- | Filter all `TxOut` that satisfy the predicate.
filter :: (TxOut CtxUTxO era -> Bool) -> UTxO era -> UTxO era
filter :: forall era. (TxOut CtxUTxO era -> Bool) -> UTxO era -> UTxO era
filter TxOut CtxUTxO era -> Bool
fn = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> UTxO era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxOut CtxUTxO era -> Bool)
-> Map TxIn (TxOut CtxUTxO era) -> Map TxIn (TxOut CtxUTxO era)
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter TxOut CtxUTxO era -> Bool
fn (Map TxIn (TxOut CtxUTxO era) -> Map TxIn (TxOut CtxUTxO era))
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> Map TxIn (TxOut CtxUTxO era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO

-- | Filter all UTxO to only include 'out's satisfying given predicate.
filterWithKey :: (TxIn -> TxOut CtxUTxO era -> Bool) -> UTxO era -> UTxO era
filterWithKey :: forall era.
(TxIn -> TxOut CtxUTxO era -> Bool) -> UTxO era -> UTxO era
filterWithKey TxIn -> TxOut CtxUTxO era -> Bool
fn = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> UTxO era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxIn -> TxOut CtxUTxO era -> Bool)
-> Map TxIn (TxOut CtxUTxO era) -> Map TxIn (TxOut CtxUTxO era)
forall k a. (k -> a -> Bool) -> Map k a -> Map k a
Map.filterWithKey TxIn -> TxOut CtxUTxO era -> Bool
fn (Map TxIn (TxOut CtxUTxO era) -> Map TxIn (TxOut CtxUTxO era))
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> Map TxIn (TxOut CtxUTxO era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO

-- | Get the 'UTxO domain input's set
inputSet :: UTxO era -> Set TxIn
inputSet :: forall era. UTxO era -> Set TxIn
inputSet = Map TxIn (TxOut CtxUTxO era) -> Set TxIn
forall k a. Map k a -> Set k
Map.keysSet (Map TxIn (TxOut CtxUTxO era) -> Set TxIn)
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> Set TxIn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO

-- | Get the UTxO output set.
txOutputs :: UTxO era -> [TxOut CtxUTxO era]
txOutputs :: forall era. UTxO era -> [TxOut CtxUTxO era]
txOutputs = Map TxIn (TxOut CtxUTxO era) -> [TxOut CtxUTxO era]
forall k a. Map k a -> [a]
Map.elems (Map TxIn (TxOut CtxUTxO era) -> [TxOut CtxUTxO era])
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> [TxOut CtxUTxO era]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO

-- | Remove the right hand side from the left hand side.
difference :: UTxO era -> UTxO era -> UTxO era
difference :: forall era. UTxO era -> UTxO era -> UTxO era
difference UTxO era
a UTxO era
b = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall a b. (a -> b) -> a -> b
$ Map TxIn (TxOut CtxUTxO era)
-> Map TxIn (TxOut CtxUTxO era) -> Map TxIn (TxOut CtxUTxO era)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.difference (UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO UTxO era
a) (UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO UTxO era
b)

-- | Convert from a list of key/value pairs.
fromList :: [(TxIn, TxOut CtxUTxO era)] -> UTxO era
fromList :: forall era. [(TxIn, TxOut CtxUTxO era)] -> UTxO era
fromList = Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> ([(TxIn, TxOut CtxUTxO era)] -> Map TxIn (TxOut CtxUTxO era))
-> [(TxIn, TxOut CtxUTxO era)]
-> UTxO era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(TxIn, TxOut CtxUTxO era)] -> Map TxIn (TxOut CtxUTxO era)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList

-- | Convert to a list of key/value pairs.
toList :: UTxO era -> [(TxIn, TxOut CtxUTxO era)]
toList :: forall era. UTxO era -> [(TxIn, TxOut CtxUTxO era)]
toList (UTxO Map TxIn (TxOut CtxUTxO era)
xs) = Map TxIn (TxOut CtxUTxO era) -> [(TxIn, TxOut CtxUTxO era)]
forall k a. Map k a -> [(k, a)]
Map.toList Map TxIn (TxOut CtxUTxO era)
xs

-- | Convert to a Map of TxIn/TxOut.
toMap :: UTxO era -> Map TxIn (TxOut CtxUTxO era)
toMap :: forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
toMap = UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO

-- | Convert from a `cardano-api` `UTxO` to a `cardano-ledger` UTxO.
toShelleyUTxO :: ShelleyBasedEra era -> UTxO era -> Ledger.UTxO (ShelleyLedgerEra era)
toShelleyUTxO :: forall era.
ShelleyBasedEra era -> UTxO era -> UTxO (ShelleyLedgerEra era)
toShelleyUTxO ShelleyBasedEra era
sbe =
  Map TxIn (TxOut (ShelleyLedgerEra era))
-> UTxO (ShelleyLedgerEra era)
forall era. Map TxIn (TxOut era) -> UTxO era
Ledger.UTxO (Map TxIn (TxOut (ShelleyLedgerEra era))
 -> UTxO (ShelleyLedgerEra era))
-> (UTxO era -> Map TxIn (TxOut (ShelleyLedgerEra era)))
-> UTxO era
-> UTxO (ShelleyLedgerEra era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxIn
 -> TxOut CtxUTxO era -> Map TxIn (TxOut (ShelleyLedgerEra era)))
-> Map TxIn (TxOut CtxUTxO era)
-> Map TxIn (TxOut (ShelleyLedgerEra era))
forall m k a. Monoid m => (k -> a -> m) -> Map k a -> m
Map.foldMapWithKey TxIn
-> TxOut CtxUTxO era -> Map TxIn (TxOut (ShelleyLedgerEra era))
f (Map TxIn (TxOut CtxUTxO era)
 -> Map TxIn (TxOut (ShelleyLedgerEra era)))
-> (UTxO era -> Map TxIn (TxOut CtxUTxO era))
-> UTxO era
-> Map TxIn (TxOut (ShelleyLedgerEra era))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO era -> Map TxIn (TxOut CtxUTxO era)
forall era. UTxO era -> Map TxIn (TxOut CtxUTxO era)
unUTxO
 where
  f :: TxIn
-> TxOut CtxUTxO era -> Map TxIn (TxOut (ShelleyLedgerEra era))
f TxIn
i TxOut CtxUTxO era
o =
    TxIn
-> TxOut (ShelleyLedgerEra era)
-> Map TxIn (TxOut (ShelleyLedgerEra era))
forall k a. k -> a -> Map k a
Map.singleton (TxIn -> TxIn
toShelleyTxIn TxIn
i) (ShelleyBasedEra era
-> TxOut CtxUTxO era -> TxOut (ShelleyLedgerEra era)
forall era ledgerera.
(HasCallStack, ShelleyLedgerEra era ~ ledgerera) =>
ShelleyBasedEra era -> TxOut CtxUTxO era -> TxOut ledgerera
toShelleyTxOut ShelleyBasedEra era
sbe TxOut CtxUTxO era
o)

-- | Convert from a `cardano-ledger` `UTxO` to a `cardano-api` UTxO.
fromShelleyUTxO :: ShelleyBasedEra era -> Ledger.UTxO (ShelleyLedgerEra era) -> UTxO era
fromShelleyUTxO :: forall era.
ShelleyBasedEra era -> UTxO (ShelleyLedgerEra era) -> UTxO era
fromShelleyUTxO ShelleyBasedEra era
sbe =
  Map TxIn (TxOut CtxUTxO era) -> UTxO era
forall era. Map TxIn (TxOut CtxUTxO era) -> UTxO era
UTxO (Map TxIn (TxOut CtxUTxO era) -> UTxO era)
-> (UTxO (ShelleyLedgerEra era) -> Map TxIn (TxOut CtxUTxO era))
-> UTxO (ShelleyLedgerEra era)
-> UTxO era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TxIn
 -> TxOut (ShelleyLedgerEra era) -> Map TxIn (TxOut CtxUTxO era))
-> Map TxIn (TxOut (ShelleyLedgerEra era))
-> Map TxIn (TxOut CtxUTxO era)
forall m k a. Monoid m => (k -> a -> m) -> Map k a -> m
Map.foldMapWithKey TxIn
-> TxOut (ShelleyLedgerEra era) -> Map TxIn (TxOut CtxUTxO era)
f (Map TxIn (TxOut (ShelleyLedgerEra era))
 -> Map TxIn (TxOut CtxUTxO era))
-> (UTxO (ShelleyLedgerEra era)
    -> Map TxIn (TxOut (ShelleyLedgerEra era)))
-> UTxO (ShelleyLedgerEra era)
-> Map TxIn (TxOut CtxUTxO era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTxO (ShelleyLedgerEra era)
-> Map TxIn (TxOut (ShelleyLedgerEra era))
forall era. UTxO era -> Map TxIn (TxOut era)
Ledger.unUTxO
 where
  f :: TxIn
-> TxOut (ShelleyLedgerEra era) -> Map TxIn (TxOut CtxUTxO era)
f TxIn
i TxOut (ShelleyLedgerEra era)
o =
    TxIn -> TxOut CtxUTxO era -> Map TxIn (TxOut CtxUTxO era)
forall k a. k -> a -> Map k a
Map.singleton (TxIn -> TxIn
fromShelleyTxIn TxIn
i) (ShelleyBasedEra era
-> TxOut (ShelleyLedgerEra era) -> TxOut CtxUTxO era
forall era ctx.
ShelleyBasedEra era
-> TxOut (ShelleyLedgerEra era) -> TxOut ctx era
fromShelleyTxOut ShelleyBasedEra era
sbe TxOut (ShelleyLedgerEra era)
o)