-- | 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.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.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
walletPKHash

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.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