-----------------------------------------------------------------------------
--
-- Module      :  $Headers
-- Copyright   :  (c) 2021 Brian W Bush
-- License     :  MIT
--
-- Maintainer  :  Brian W Bush <code@functionally.io>
-- Stability   :  Experimental
-- Portability :  Portable
--
-- | Minting tokens.
--
-----------------------------------------------------------------------------


module Mantra.Script (
-- * Minting
  mintingScript
) where


import Cardano.Api (Hash, PaymentKey, SimpleScript(..), Script(..), ScriptHash, SimpleScript(..), SimpleScriptV2, SimpleScriptVersion(..), SlotNo, TimeLocksSupported(..), hashScript)


-- | Create a minting script.
mintingScript :: Hash PaymentKey                           -- ^ The hash of the payment key.
              -> Maybe SlotNo                              -- ^ The last slot on which minting can occur, if any.
              -> (SimpleScript SimpleScriptV2, ScriptHash) -- ^ The script and its hash.
mintingScript :: Hash PaymentKey
-> Maybe SlotNo -> (SimpleScript SimpleScriptV2, ScriptHash)
mintingScript Hash PaymentKey
hash Maybe SlotNo
Nothing =
  let
    script :: SimpleScript lang
script = Hash PaymentKey -> SimpleScript lang
forall lang. Hash PaymentKey -> SimpleScript lang
RequireSignature Hash PaymentKey
hash
  in
    (
      SimpleScript SimpleScriptV2
forall lang. SimpleScript lang
script
    , Script SimpleScriptV2 -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript (Script SimpleScriptV2 -> ScriptHash)
-> Script SimpleScriptV2 -> ScriptHash
forall a b. (a -> b) -> a -> b
$ SimpleScriptVersion SimpleScriptV2
-> SimpleScript SimpleScriptV2 -> Script SimpleScriptV2
forall lang.
SimpleScriptVersion lang -> SimpleScript lang -> Script lang
SimpleScript SimpleScriptVersion SimpleScriptV2
SimpleScriptV2 SimpleScript SimpleScriptV2
forall lang. SimpleScript lang
script
    )
mintingScript Hash PaymentKey
hash (Just SlotNo
slot) =
  let
    script :: SimpleScript SimpleScriptV2
script =
      [SimpleScript SimpleScriptV2] -> SimpleScript SimpleScriptV2
forall lang. [SimpleScript lang] -> SimpleScript lang
RequireAllOf
        [
          Hash PaymentKey -> SimpleScript SimpleScriptV2
forall lang. Hash PaymentKey -> SimpleScript lang
RequireSignature Hash PaymentKey
hash
        , TimeLocksSupported SimpleScriptV2
-> SlotNo -> SimpleScript SimpleScriptV2
forall lang. TimeLocksSupported lang -> SlotNo -> SimpleScript lang
RequireTimeBefore TimeLocksSupported SimpleScriptV2
TimeLocksInSimpleScriptV2 SlotNo
slot
        ]
  in
    (
      SimpleScript SimpleScriptV2
script
    , Script SimpleScriptV2 -> ScriptHash
forall lang. Script lang -> ScriptHash
hashScript (Script SimpleScriptV2 -> ScriptHash)
-> Script SimpleScriptV2 -> ScriptHash
forall a b. (a -> b) -> a -> b
$ SimpleScriptVersion SimpleScriptV2
-> SimpleScript SimpleScriptV2 -> Script SimpleScriptV2
forall lang.
SimpleScriptVersion lang -> SimpleScript lang -> Script lang
SimpleScript SimpleScriptVersion SimpleScriptV2
SimpleScriptV2 SimpleScript SimpleScriptV2
script
    )