{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Mary.Scripts (
  module Cardano.Ledger.Allegra.Scripts,
) where

import Cardano.Ledger.Allegra.Scripts
import Cardano.Ledger.Core
import Cardano.Ledger.Mary.Era (MaryEra)
import Cardano.Ledger.Shelley.Scripts (
  ShelleyEraScript (..),
  nativeMultiSigTag,
 )

-- | Since Timelock scripts are a strictly backwards compatible extension of
-- MultiSig scripts, we can use the same 'scriptPrefixTag' tag here as we did
-- for the ValidateScript instance in MultiSig
instance EraScript MaryEra where
  type Script MaryEra = Timelock MaryEra
  type NativeScript MaryEra = Timelock MaryEra

  upgradeScript :: EraScript (PreviousEra MaryEra) =>
Script (PreviousEra MaryEra) -> Script MaryEra
upgradeScript = Timelock AllegraEra -> Timelock MaryEra
Script (PreviousEra MaryEra) -> Script MaryEra
forall era1 era2.
(Era era1, Era era2) =>
Timelock era1 -> Timelock era2
translateTimelock

  scriptPrefixTag :: Script MaryEra -> ByteString
scriptPrefixTag Script MaryEra
_script = ByteString
nativeMultiSigTag -- "\x00"

  getNativeScript :: Script MaryEra -> Maybe (NativeScript MaryEra)
getNativeScript = Timelock MaryEra -> Maybe (Timelock MaryEra)
Script MaryEra -> Maybe (NativeScript MaryEra)
forall a. a -> Maybe a
Just

  fromNativeScript :: NativeScript MaryEra -> Script MaryEra
fromNativeScript = Timelock MaryEra -> Timelock MaryEra
NativeScript MaryEra -> Script MaryEra
forall a. a -> a
id

instance ShelleyEraScript MaryEra where
  mkRequireSignature :: KeyHash 'Witness -> NativeScript MaryEra
mkRequireSignature = KeyHash 'Witness -> Timelock MaryEra
KeyHash 'Witness -> NativeScript MaryEra
forall era. Era era => KeyHash 'Witness -> Timelock era
mkRequireSignatureTimelock
  getRequireSignature :: NativeScript MaryEra -> Maybe (KeyHash 'Witness)
getRequireSignature = Timelock MaryEra -> Maybe (KeyHash 'Witness)
NativeScript MaryEra -> Maybe (KeyHash 'Witness)
forall {k} (era :: k). Timelock era -> Maybe (KeyHash 'Witness)
getRequireSignatureTimelock

  mkRequireAllOf :: StrictSeq (NativeScript MaryEra) -> NativeScript MaryEra
mkRequireAllOf = StrictSeq (Timelock MaryEra) -> Timelock MaryEra
StrictSeq (NativeScript MaryEra) -> NativeScript MaryEra
forall era. Era era => StrictSeq (Timelock era) -> Timelock era
mkRequireAllOfTimelock
  getRequireAllOf :: NativeScript MaryEra -> Maybe (StrictSeq (NativeScript MaryEra))
getRequireAllOf = Timelock MaryEra -> Maybe (StrictSeq (Timelock MaryEra))
NativeScript MaryEra -> Maybe (StrictSeq (NativeScript MaryEra))
forall {k} (era :: k).
Timelock era -> Maybe (StrictSeq (Timelock era))
getRequireAllOfTimelock

  mkRequireAnyOf :: StrictSeq (NativeScript MaryEra) -> NativeScript MaryEra
mkRequireAnyOf = StrictSeq (Timelock MaryEra) -> Timelock MaryEra
StrictSeq (NativeScript MaryEra) -> NativeScript MaryEra
forall era. Era era => StrictSeq (Timelock era) -> Timelock era
mkRequireAnyOfTimelock
  getRequireAnyOf :: NativeScript MaryEra -> Maybe (StrictSeq (NativeScript MaryEra))
getRequireAnyOf = Timelock MaryEra -> Maybe (StrictSeq (Timelock MaryEra))
NativeScript MaryEra -> Maybe (StrictSeq (NativeScript MaryEra))
forall {k} (era :: k).
Timelock era -> Maybe (StrictSeq (Timelock era))
getRequireAnyOfTimelock

  mkRequireMOf :: Int -> StrictSeq (NativeScript MaryEra) -> NativeScript MaryEra
mkRequireMOf = Int -> StrictSeq (Timelock MaryEra) -> Timelock MaryEra
Int -> StrictSeq (NativeScript MaryEra) -> NativeScript MaryEra
forall era.
Era era =>
Int -> StrictSeq (Timelock era) -> Timelock era
mkRequireMOfTimelock
  getRequireMOf :: NativeScript MaryEra
-> Maybe (Int, StrictSeq (NativeScript MaryEra))
getRequireMOf = Timelock MaryEra -> Maybe (Int, StrictSeq (Timelock MaryEra))
NativeScript MaryEra
-> Maybe (Int, StrictSeq (NativeScript MaryEra))
forall {k} (era :: k).
Timelock era -> Maybe (Int, StrictSeq (Timelock era))
getRequireMOfTimelock

instance AllegraEraScript MaryEra where
  mkTimeStart :: SlotNo -> NativeScript MaryEra
mkTimeStart = SlotNo -> Timelock MaryEra
SlotNo -> NativeScript MaryEra
forall era. Era era => SlotNo -> Timelock era
mkTimeStartTimelock
  getTimeStart :: NativeScript MaryEra -> Maybe SlotNo
getTimeStart = Timelock MaryEra -> Maybe SlotNo
NativeScript MaryEra -> Maybe SlotNo
forall {k} (era :: k). Timelock era -> Maybe SlotNo
getTimeStartTimelock

  mkTimeExpire :: SlotNo -> NativeScript MaryEra
mkTimeExpire = SlotNo -> Timelock MaryEra
SlotNo -> NativeScript MaryEra
forall era. Era era => SlotNo -> Timelock era
mkTimeExpireTimelock
  getTimeExpire :: NativeScript MaryEra -> Maybe SlotNo
getTimeExpire = Timelock MaryEra -> Maybe SlotNo
NativeScript MaryEra -> Maybe SlotNo
forall {k} (era :: k). Timelock era -> Maybe SlotNo
getTimeExpireTimelock