{-# LANGUAGE NoImplicitPrelude #-}

-- | This module introduces currencies (namely the /quick values/ and the
-- /permanent values/) which make it convenient to manipulate assets that are
-- already supposed to exist when running a mock chain. For example, a market
-- maker would exchange Ada against other assets. Yet, when writing traces for
-- such a contract we would need to define a minting policy for those tokens,
-- which is tedious. Moreover, we often want wallets to have some of such tokens
-- from the start (see "Cooked.InitialDistribution").
--
-- The @quick@ prefixed functions provide access to tokens from the @const
-- (const True)@ minting policy. That is, these can be minted and burnt at will,
-- at any point in time.
--
-- The @permanent@ prefixed functions provide access to tokens from the @const
-- (const False)@ minting policy. That is, these /cannot/ ever be minted or
-- burnt and must be present in an initial distribution.
module Cooked.Currencies
  ( quickTokenName,
    quickAssetClass,
    quickValue,
    permanentTokenName,
    permanentAssetClass,
    permanentValue,
    quickCurrencyPolicy,
    quickCurrencyPolicyV3,
    quickCurrencySymbol,
    permanentCurrencyPolicy,
    permanentCurrencyPolicyV3,
    permanentCurrencySymbol,
    currencySymbolFromLanguageAndMP,
  )
where

import Plutus.Script.Utils.Scripts qualified as Script
import Plutus.Script.Utils.Typed qualified as Script
import Plutus.Script.Utils.Value qualified as Script
import PlutusLedgerApi.V3 qualified as Api
import PlutusTx qualified
import PlutusTx.Builtins.Class qualified as PlutusTx
import PlutusTx.Prelude
import Prelude qualified as Haskell

-- | Takes a minting policy and a language version and returns the associated
-- currency symbol
currencySymbolFromLanguageAndMP :: Script.Language -> Script.MintingPolicy -> Script.CurrencySymbol
currencySymbolFromLanguageAndMP :: Language -> MintingPolicy -> CurrencySymbol
currencySymbolFromLanguageAndMP Language
lang = Versioned MintingPolicy -> CurrencySymbol
Script.scriptCurrencySymbol (Versioned MintingPolicy -> CurrencySymbol)
-> (MintingPolicy -> Versioned MintingPolicy)
-> MintingPolicy
-> CurrencySymbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (MintingPolicy -> Language -> Versioned MintingPolicy)
-> Language -> MintingPolicy -> Versioned MintingPolicy
forall a b c. (a -> b -> c) -> b -> a -> c
flip MintingPolicy -> Language -> Versioned MintingPolicy
forall script. script -> Language -> Versioned script
Script.Versioned Language
lang

-- * Quick Values

-- | Token name of a /quick/ asset class; prefixes the name with a @'q'@ to make
-- it easy to distinguish between quick and permanent tokens.
quickTokenName :: Haskell.String -> Script.TokenName
quickTokenName :: String -> TokenName
quickTokenName = BuiltinByteString -> TokenName
Script.TokenName (BuiltinByteString -> TokenName)
-> (String -> BuiltinByteString) -> String -> TokenName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> BuiltinByteString
PlutusTx.stringToBuiltinByteString

-- | /Quick/ asset class from a token name
quickAssetClass :: Haskell.String -> Script.AssetClass
quickAssetClass :: String -> AssetClass
quickAssetClass = CurrencySymbol -> TokenName -> AssetClass
Script.assetClass CurrencySymbol
quickCurrencySymbol (TokenName -> AssetClass)
-> (String -> TokenName) -> String -> AssetClass
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> TokenName
quickTokenName

-- | Constructor for /quick/ values from token name and amount
quickValue :: Haskell.String -> Integer -> Api.Value
quickValue :: String -> Integer -> Value
quickValue = AssetClass -> Integer -> Value
Script.assetClassValue (AssetClass -> Integer -> Value)
-> (String -> AssetClass) -> String -> Integer -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> AssetClass
quickAssetClass

{-# INLINEABLE mkQuickCurrencyPolicy #-}
mkQuickCurrencyPolicy :: () -> Api.ScriptContext -> Bool
mkQuickCurrencyPolicy :: () -> ScriptContext -> Bool
mkQuickCurrencyPolicy ()
_ ScriptContext
_ = Bool
True

quickCurrencyPolicy :: Script.MintingPolicy
quickCurrencyPolicy :: MintingPolicy
quickCurrencyPolicy = CompiledCode (BuiltinData -> BuiltinData -> ()) -> MintingPolicy
Script.mkMintingPolicyScript $$(PlutusTx.compile [||Script.mkUntypedMintingPolicy mkQuickCurrencyPolicy||])

quickCurrencyPolicyV3 :: Script.Versioned Script.MintingPolicy
quickCurrencyPolicyV3 :: Versioned MintingPolicy
quickCurrencyPolicyV3 = MintingPolicy -> Language -> Versioned MintingPolicy
forall script. script -> Language -> Versioned script
Script.Versioned MintingPolicy
quickCurrencyPolicy Language
Script.PlutusV3

quickCurrencySymbol :: Script.CurrencySymbol
quickCurrencySymbol :: CurrencySymbol
quickCurrencySymbol = Language -> MintingPolicy -> CurrencySymbol
currencySymbolFromLanguageAndMP Language
Script.PlutusV3 MintingPolicy
quickCurrencyPolicy

-- * Permanent values

-- | Token name of a /permanent/ asset class
permanentTokenName :: Haskell.String -> Script.TokenName
permanentTokenName :: String -> TokenName
permanentTokenName = BuiltinByteString -> TokenName
Script.TokenName (BuiltinByteString -> TokenName)
-> (String -> BuiltinByteString) -> String -> TokenName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> BuiltinByteString
PlutusTx.stringToBuiltinByteString

-- | /Permanent/ asset class from a token name
permanentAssetClass :: Haskell.String -> Script.AssetClass
permanentAssetClass :: String -> AssetClass
permanentAssetClass = CurrencySymbol -> TokenName -> AssetClass
Script.assetClass CurrencySymbol
permanentCurrencySymbol (TokenName -> AssetClass)
-> (String -> TokenName) -> String -> AssetClass
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> TokenName
permanentTokenName

-- | Constructor for /Permanent/ values from token name and amount
permanentValue :: Haskell.String -> Integer -> Api.Value
permanentValue :: String -> Integer -> Value
permanentValue = AssetClass -> Integer -> Value
Script.assetClassValue (AssetClass -> Integer -> Value)
-> (String -> AssetClass) -> String -> Integer -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> AssetClass
permanentAssetClass

{-# INLINEABLE mkPermanentCurrencyPolicy #-}
mkPermanentCurrencyPolicy :: () -> Api.ScriptContext -> Bool
mkPermanentCurrencyPolicy :: () -> ScriptContext -> Bool
mkPermanentCurrencyPolicy ()
_ ScriptContext
_ = Bool
False

permanentCurrencyPolicy :: Script.MintingPolicy
permanentCurrencyPolicy :: MintingPolicy
permanentCurrencyPolicy = CompiledCode (BuiltinData -> BuiltinData -> ()) -> MintingPolicy
Script.mkMintingPolicyScript $$(PlutusTx.compile [||Script.mkUntypedMintingPolicy mkPermanentCurrencyPolicy||])

permanentCurrencyPolicyV3 :: Script.Versioned Script.MintingPolicy
permanentCurrencyPolicyV3 :: Versioned MintingPolicy
permanentCurrencyPolicyV3 = MintingPolicy -> Language -> Versioned MintingPolicy
forall script. script -> Language -> Versioned script
Script.Versioned MintingPolicy
permanentCurrencyPolicy Language
Script.PlutusV3

permanentCurrencySymbol :: Script.CurrencySymbol
permanentCurrencySymbol :: CurrencySymbol
permanentCurrencySymbol = Language -> MintingPolicy -> CurrencySymbol
currencySymbolFromLanguageAndMP Language
Script.PlutusV3 MintingPolicy
permanentCurrencyPolicy