-- | This module provides an interface for plutus elements that can be
-- hashed. This is mostly used to provide alias for hashes when pretty printing
-- those elements.
module Cooked.Conversion.ToHash where

import Cooked.Conversion.ToScriptHash
import Cooked.Wallet
import Plutus.Script.Utils.Scripts qualified as Script
import Plutus.Script.Utils.Typed qualified as Script
import PlutusLedgerApi.V3 qualified as Api

class ToHash a where
  toHash :: a -> Api.BuiltinByteString

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

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

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
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 Api.Address where
  toHash :: Address -> BuiltinByteString
toHash (Api.Address (Api.PubKeyCredential PubKeyHash
pkh) Maybe StakingCredential
_) = PubKeyHash -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash PubKeyHash
pkh
  toHash (Api.Address (Api.ScriptCredential ScriptHash
vh) Maybe StakingCredential
_) = ScriptHash -> BuiltinByteString
forall a. ToHash a => a -> BuiltinByteString
toHash ScriptHash
vh