/
TokenNamePolicy.hs
119 lines (97 loc) · 4.23 KB
/
TokenNamePolicy.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module TokenNamePolicy
( serialisedScriptV1,
serialisedScriptV2,
scriptSBSV1,
scriptSBSV2,
scriptV1,
scriptV2,
writeSerialisedScriptV1,
writeSerialisedScriptV2,
printPIRV2
)
where
import Cardano.Api (PlutusScriptV1,
PlutusScriptV2,
writeFileTextEnvelope)
import Cardano.Api.Shelley (PlutusScript (..))
import Codec.Serialise
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Short as SBS
import Data.Functor (void)
import Data.Maybe (fromJust)
import qualified Ledger.Typed.Scripts as Scripts
import Ledger.Value as Value
import qualified Plutus.Script.Utils.V1.Typed.Scripts as PSU.V1
import qualified Plutus.Script.Utils.V2.Typed.Scripts as PSU.V2
import qualified Plutus.V1.Ledger.Api as PlutusV1
import qualified Plutus.V1.Ledger.Contexts as PlutusV1
import qualified Plutus.V2.Ledger.Api as PlutusV2
import qualified Plutus.V2.Ledger.Contexts as PlutusV2
import PlutusTx (getPir)
import qualified PlutusTx
import PlutusTx.Prelude as P hiding
(Semigroup (..),
unless, (.))
import Prelude (IO, (.))
import Prettyprinter.Extras (pretty)
{-
The validator script (checks redeemer token name is used for minting)
-}
{-# INLINEABLE tokenNamePolicyV1 #-}
tokenNamePolicyV1 :: TokenName -> PlutusV1.ScriptContext -> Bool
tokenNamePolicyV1 tn ctx = traceIfFalse "wrong token name" checkTokenName
where
info :: PlutusV1.TxInfo
info = PlutusV1.scriptContextTxInfo ctx
checkTokenName :: Bool
checkTokenName = valueOf (PlutusV1.txInfoMint info) (PlutusV1.ownCurrencySymbol ctx) tn > 0
{-# INLINEABLE tokenNamePolicyV2 #-}
tokenNamePolicyV2 :: TokenName -> PlutusV2.ScriptContext -> Bool
tokenNamePolicyV2 tn ctx = traceIfFalse "wrong token name" checkTokenName
where
info :: PlutusV2.TxInfo
info = PlutusV2.scriptContextTxInfo ctx
checkTokenName :: Bool
checkTokenName = valueOf (PlutusV2.txInfoMint info) (PlutusV2.ownCurrencySymbol ctx) tn > 0
{-
As a Minting Policy
-}
policyV1 :: Scripts.MintingPolicy
policyV1 = PlutusV1.mkMintingPolicyScript $$(PlutusTx.compile [|| Scripts.mkUntypedMintingPolicy tokenNamePolicyV1 ||])
policyV2 :: Scripts.MintingPolicy
policyV2 = PlutusV2.mkMintingPolicyScript $$(PlutusTx.compile [|| Scripts.mkUntypedMintingPolicy tokenNamePolicyV2 ||])
printPIRV2 = pretty $ fromJust $ getPir $$(PlutusTx.compile [|| Scripts.mkUntypedMintingPolicy tokenNamePolicyV2 ||])
{-
As a Script
-}
scriptV1 :: PlutusV1.Script
scriptV1 = PlutusV1.unMintingPolicyScript policyV1
scriptV2 :: PlutusV2.Script
scriptV2 = PlutusV2.unMintingPolicyScript policyV2
{-
As a Short Byte String
-}
scriptSBSV1 :: SBS.ShortByteString
scriptSBSV1 = SBS.toShort . LBS.toStrict $ serialise scriptV1
scriptSBSV2 :: SBS.ShortByteString
scriptSBSV2 = SBS.toShort . LBS.toStrict $ serialise scriptV2
{-
As a Serialised Script
-}
serialisedScriptV1 :: PlutusScript PlutusScriptV1
serialisedScriptV1 = PlutusScriptSerialised scriptSBSV1
writeSerialisedScriptV1 :: IO ()
writeSerialisedScriptV1 = void $ writeFileTextEnvelope "token-name-policy-V1.plutus" Nothing serialisedScriptV1
serialisedScriptV2 :: PlutusScript PlutusScriptV2
serialisedScriptV2 = PlutusScriptSerialised scriptSBSV2
writeSerialisedScriptV2 :: IO ()
writeSerialisedScriptV2 = void $ writeFileTextEnvelope "token-name-policy-V2.plutus" Nothing serialisedScriptV2