{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Cardano.CLI.EraBased.Script.Mint.Type
  ( createSimpleOrPlutusScriptFromCliArgs
  , createPlutusReferenceScriptFromCliArgs
  , createSimpleReferenceScriptFromCliArgs
  , MintScriptWitnessWithPolicyId (..)
  )
where

import Cardano.Api
import Cardano.Api.Experimental
import Cardano.Api.Experimental qualified as Exp

import Cardano.CLI.EraBased.Script.Type
import Cardano.CLI.Type.Common (ScriptDataOrFile)

-- We always need the policy id when constructing a transaction that mints.
-- In the case of reference scripts, the user currently must provide the policy id (script hash)
-- in order to correctly construct the transaction.
data MintScriptWitnessWithPolicyId era
  = MintScriptWitnessWithPolicyId
  { forall era. MintScriptWitnessWithPolicyId era -> PolicyId
mswPolId :: PolicyId
  , forall era.
MintScriptWitnessWithPolicyId era -> ScriptWitness WitCtxMint era
mswScriptWitness :: ScriptWitness WitCtxMint era
  }
  deriving Int -> MintScriptWitnessWithPolicyId era -> ShowS
[MintScriptWitnessWithPolicyId era] -> ShowS
MintScriptWitnessWithPolicyId era -> String
(Int -> MintScriptWitnessWithPolicyId era -> ShowS)
-> (MintScriptWitnessWithPolicyId era -> String)
-> ([MintScriptWitnessWithPolicyId era] -> ShowS)
-> Show (MintScriptWitnessWithPolicyId era)
forall era. Int -> MintScriptWitnessWithPolicyId era -> ShowS
forall era. [MintScriptWitnessWithPolicyId era] -> ShowS
forall era. MintScriptWitnessWithPolicyId era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> MintScriptWitnessWithPolicyId era -> ShowS
showsPrec :: Int -> MintScriptWitnessWithPolicyId era -> ShowS
$cshow :: forall era. MintScriptWitnessWithPolicyId era -> String
show :: MintScriptWitnessWithPolicyId era -> String
$cshowList :: forall era. [MintScriptWitnessWithPolicyId era] -> ShowS
showList :: [MintScriptWitnessWithPolicyId era] -> ShowS
Show

createSimpleOrPlutusScriptFromCliArgs
  :: File ScriptInAnyLang In
  -> Maybe (ScriptDataOrFile, ExecutionUnits)
  -> ScriptRequirements MintItem
createSimpleOrPlutusScriptFromCliArgs :: File ScriptInAnyLang 'In
-> Maybe (ScriptDataOrFile, ExecutionUnits)
-> ScriptRequirements 'MintItem
createSimpleOrPlutusScriptFromCliArgs File ScriptInAnyLang 'In
scriptFp Maybe (ScriptDataOrFile, ExecutionUnits)
Nothing =
  File ScriptInAnyLang 'In -> ScriptRequirements 'MintItem
forall (witnessable :: WitnessableItem).
File ScriptInAnyLang 'In -> ScriptRequirements witnessable
OnDiskSimpleScript File ScriptInAnyLang 'In
scriptFp
createSimpleOrPlutusScriptFromCliArgs File ScriptInAnyLang 'In
scriptFp (Just (ScriptDataOrFile
redeemerFile, ExecutionUnits
execUnits)) =
  OnDiskPlutusScriptCliArgs 'MintItem -> ScriptRequirements 'MintItem
forall (witnessable :: WitnessableItem).
OnDiskPlutusScriptCliArgs witnessable
-> ScriptRequirements witnessable
OnDiskPlutusScript (OnDiskPlutusScriptCliArgs 'MintItem
 -> ScriptRequirements 'MintItem)
-> OnDiskPlutusScriptCliArgs 'MintItem
-> ScriptRequirements 'MintItem
forall a b. (a -> b) -> a -> b
$
    File ScriptInAnyLang 'In
-> OptionalDatum 'MintItem
-> ScriptDataOrFile
-> ExecutionUnits
-> OnDiskPlutusScriptCliArgs 'MintItem
forall (witnessable :: WitnessableItem).
File ScriptInAnyLang 'In
-> OptionalDatum witnessable
-> ScriptDataOrFile
-> ExecutionUnits
-> OnDiskPlutusScriptCliArgs witnessable
OnDiskPlutusScriptCliArgs File ScriptInAnyLang 'In
scriptFp NoScriptDatum
OptionalDatum 'MintItem
Exp.NoScriptDatumAllowed ScriptDataOrFile
redeemerFile ExecutionUnits
execUnits

createSimpleReferenceScriptFromCliArgs
  :: TxIn
  -> PolicyId
  -> ScriptRequirements MintItem
createSimpleReferenceScriptFromCliArgs :: TxIn -> PolicyId -> ScriptRequirements 'MintItem
createSimpleReferenceScriptFromCliArgs TxIn
txin PolicyId
polid =
  SimpleRefScriptCliArgs 'MintItem -> ScriptRequirements 'MintItem
forall (witnessable :: WitnessableItem).
SimpleRefScriptCliArgs witnessable
-> ScriptRequirements witnessable
SimpleReferenceScript (SimpleRefScriptCliArgs 'MintItem -> ScriptRequirements 'MintItem)
-> SimpleRefScriptCliArgs 'MintItem -> ScriptRequirements 'MintItem
forall a b. (a -> b) -> a -> b
$ TxIn -> MintPolicyId 'MintItem -> SimpleRefScriptCliArgs 'MintItem
forall (witnessable :: WitnessableItem).
TxIn
-> MintPolicyId witnessable -> SimpleRefScriptCliArgs witnessable
SimpleRefScriptArgs TxIn
txin PolicyId
MintPolicyId 'MintItem
polid

createPlutusReferenceScriptFromCliArgs
  :: TxIn
  -> AnyPlutusScriptVersion
  -> ScriptDataOrFile
  -> ExecutionUnits
  -> PolicyId
  -> ScriptRequirements MintItem
createPlutusReferenceScriptFromCliArgs :: TxIn
-> AnyPlutusScriptVersion
-> ScriptDataOrFile
-> ExecutionUnits
-> PolicyId
-> ScriptRequirements 'MintItem
createPlutusReferenceScriptFromCliArgs TxIn
txin AnyPlutusScriptVersion
scriptVersion ScriptDataOrFile
scriptData ExecutionUnits
execUnits PolicyId
polid =
  PlutusRefScriptCliArgs 'MintItem -> ScriptRequirements 'MintItem
forall (witnessable :: WitnessableItem).
PlutusRefScriptCliArgs witnessable
-> ScriptRequirements witnessable
PlutusReferenceScript (PlutusRefScriptCliArgs 'MintItem -> ScriptRequirements 'MintItem)
-> PlutusRefScriptCliArgs 'MintItem -> ScriptRequirements 'MintItem
forall a b. (a -> b) -> a -> b
$
    TxIn
-> AnyPlutusScriptVersion
-> OptionalDatum 'MintItem
-> MintPolicyId 'MintItem
-> ScriptDataOrFile
-> ExecutionUnits
-> PlutusRefScriptCliArgs 'MintItem
forall (witnessable :: WitnessableItem).
TxIn
-> AnyPlutusScriptVersion
-> OptionalDatum witnessable
-> MintPolicyId witnessable
-> ScriptDataOrFile
-> ExecutionUnits
-> PlutusRefScriptCliArgs witnessable
PlutusRefScriptCliArgs TxIn
txin AnyPlutusScriptVersion
scriptVersion NoScriptDatum
OptionalDatum 'MintItem
Exp.NoScriptDatumAllowed PolicyId
MintPolicyId 'MintItem
polid ScriptDataOrFile
scriptData ExecutionUnits
execUnits