-- | This module provides an interface for plutus elements that can be
-- hashed. This is used to provide aliases for hashes when pretty printing those
-- elements.
module Cooked.Pretty.Hashable where

import Cooked.Wallet
import Plutus.Script.Utils.Address qualified as Script
import Plutus.Script.Utils.Data qualified as Script
import Plutus.Script.Utils.Scripts qualified as Script
import Plutus.Script.Utils.V1.Typed qualified as Script
import Plutus.Script.Utils.V3.Typed qualified as Script
import PlutusLedgerApi.V3 qualified as Api

-- | Hashable elements can be transformed to 'Api.BuiltinByteString'
class ToHash a where
  toHash :: a -> Api.BuiltinByteString

instance ToHash Api.BuiltinByteString where
  toHash :: BuiltinByteString -> BuiltinByteString
toHash = BuiltinByteString -> BuiltinByteString
forall a. a -> a
id

instance ToHash Api.CurrencySymbol where
  toHash :: CurrencySymbol -> BuiltinByteString
toHash = CurrencySymbol -> BuiltinByteString
Api.unCurrencySymbol

instance ToHash Api.TokenName where
  toHash :: TokenName -> BuiltinByteString
toHash = TokenName -> BuiltinByteString
Api.unTokenName

instance ToHash Api.PubKeyHash where
  toHash :: PubKeyHash -> BuiltinByteString
toHash = PubKeyHash -> BuiltinByteString
Api.getPubKeyHash

instance ToHash Wallet where
  toHash :: Wallet -> BuiltinByteString
toHash = PubKeyHash -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash (PubKeyHash -> BuiltinByteString)
-> (Wallet -> PubKeyHash) -> Wallet -> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Wallet -> PubKeyHash
forall a. ToPubKeyHash a => a -> PubKeyHash
Script.toPubKeyHash

instance ToHash (Script.Versioned Script.MintingPolicy) where
  toHash :: Versioned MintingPolicy -> BuiltinByteString
toHash = CurrencySymbol -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash (CurrencySymbol -> BuiltinByteString)
-> (Versioned MintingPolicy -> CurrencySymbol)
-> Versioned MintingPolicy
-> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Versioned MintingPolicy -> CurrencySymbol
forall script.
ToMintingPolicyHash script =>
script -> CurrencySymbol
Script.toCurrencySymbol

instance ToHash (Script.Versioned Script.Script) where
  toHash :: Versioned Script -> BuiltinByteString
toHash = ScriptHash -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash (ScriptHash -> BuiltinByteString)
-> (Versioned Script -> ScriptHash)
-> Versioned Script
-> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Versioned Script -> ScriptHash
forall a. ToScriptHash a => a -> ScriptHash
Script.toScriptHash

instance ToHash Script.ScriptHash where
  toHash :: ScriptHash -> BuiltinByteString
toHash = ScriptHash -> BuiltinByteString
Script.getScriptHash

instance ToHash Script.ValidatorHash where
  toHash :: ValidatorHash -> BuiltinByteString
toHash = ValidatorHash -> BuiltinByteString
Script.getValidatorHash

instance ToHash (Script.TypedValidator a) where
  toHash :: TypedValidator a -> BuiltinByteString
toHash = ValidatorHash -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash (ValidatorHash -> BuiltinByteString)
-> (TypedValidator a -> ValidatorHash)
-> TypedValidator a
-> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypedValidator a -> ValidatorHash
forall a. TypedValidator a -> ValidatorHash
Script.tvValidatorHash

instance ToHash Api.DatumHash where
  toHash :: DatumHash -> BuiltinByteString
toHash (Api.DatumHash BuiltinByteString
hash) = BuiltinByteString
hash

instance ToHash Api.Datum where
  toHash :: Datum -> BuiltinByteString
toHash = DatumHash -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash (DatumHash -> BuiltinByteString)
-> (Datum -> DatumHash) -> Datum -> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Datum -> DatumHash
Script.datumHash

instance ToHash Api.BuiltinData where
  toHash :: BuiltinData -> BuiltinByteString
toHash = BuiltinByteString -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash (BuiltinByteString -> BuiltinByteString)
-> (BuiltinData -> BuiltinByteString)
-> BuiltinData
-> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BuiltinData -> BuiltinByteString
Script.dataHash

instance ToHash Api.TxId where
  toHash :: TxId -> BuiltinByteString
toHash = TxId -> BuiltinByteString
Api.getTxId

instance ToHash (Script.MultiPurposeScript a) where
  toHash :: MultiPurposeScript a -> BuiltinByteString
toHash = Versioned Script -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash (Versioned Script -> BuiltinByteString)
-> (MultiPurposeScript a -> Versioned Script)
-> MultiPurposeScript a
-> BuiltinByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s a. ToVersioned s a => a -> Versioned s
Script.toVersioned @Script.Script