Skip to content

Commit

Permalink
homework for lecture 5
Browse files Browse the repository at this point in the history
  • Loading branch information
brunjlar committed Mar 27, 2023
1 parent d61a6b9 commit e3d0105
Show file tree
Hide file tree
Showing 32 changed files with 368 additions and 706 deletions.
1 change: 1 addition & 0 deletions code/Utilities/Utilities.cabal
Expand Up @@ -14,6 +14,7 @@ library
Utilities.Serialise
build-depends: aeson
, base ^>=4.14.3.0
, base16-bytestring
, bytestring
, cardano-api
, cardano-ledger-core
Expand Down
50 changes: 33 additions & 17 deletions code/Utilities/src/Utilities/Conversions.hs
@@ -1,27 +1,43 @@
module Utilities.Conversions
( Network (..)
, validatorHash
, policyHash
, currencySymbol
, validatorAddressBech32
, posixTimeFromIso8601
, posixTimeToIso8601
, bytesFromHex
, bytesToHex
) where

import qualified Cardano.Api as Api
import qualified Cardano.Api.Shelley as Api
import Cardano.Ledger.BaseTypes (Network (..))
import Cardano.Ledger.Credential (Credential (ScriptHashObj),
StakeReference (StakeRefNull))
import qualified Data.Text as Text
import qualified Data.Time.Clock.POSIX as Time
import qualified Data.Time.Format.ISO8601 as Time
import Plutus.V2.Ledger.Api (POSIXTime, Validator)
import Utilities.Serialise (validatorToScript)
import qualified Data.ByteString as BS
import qualified Plutus.V1.Ledger.Bytes as P
import qualified Cardano.Api as Api
import qualified Cardano.Api.Shelley as Api
import Cardano.Ledger.BaseTypes (Network (..))
import Cardano.Ledger.Credential (Credential (ScriptHashObj),
StakeReference (StakeRefNull))
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as BS16
import qualified Data.Text as Text
import qualified Data.Time.Clock.POSIX as Time
import qualified Data.Time.Format.ISO8601 as Time
import Plutus.V2.Ledger.Api (CurrencySymbol (CurrencySymbol),
MintingPolicy,
MintingPolicyHash (MintingPolicyHash),
POSIXTime, Validator)
import PlutusTx.Builtins.Internal (BuiltinByteString (..))
import Utilities.Serialise (policyToScript, validatorToScript)

hashScript :: Api.PlutusScript Api.PlutusScriptV2 -> Api.ScriptHash
hashScript = Api.hashScript . Api.PlutusScript Api.PlutusScriptV2

validatorHash :: Validator -> Api.ScriptHash
validatorHash v = Api.hashScript $ Api.PlutusScript Api.PlutusScriptV2 $ validatorToScript v
validatorHash = hashScript . validatorToScript

policyHash :: MintingPolicy -> MintingPolicyHash
policyHash = MintingPolicyHash . BuiltinByteString . Api.serialiseToRawBytes . hashScript . policyToScript

currencySymbol :: MintingPolicy -> CurrencySymbol
currencySymbol = CurrencySymbol . BuiltinByteString . Api.serialiseToRawBytes . hashScript . policyToScript

validatorAddressBech32 :: Network -> Validator -> String
validatorAddressBech32 network v =
Expand All @@ -43,7 +59,7 @@ posixTimeToIso8601 :: POSIXTime -> String
posixTimeToIso8601 t = Time.formatShow Time.iso8601Format $ Time.posixSecondsToUTCTime $ fromRational $ toRational t / 1000

bytesFromHex :: BS.ByteString -> BS.ByteString
bytesFromHex = P.bytes . fromEither . P.fromHex
where
fromEither (Left e) = Prelude.error $ show e
fromEither (Right b) = b
bytesFromHex = either error id . BS16.decode

bytesToHex :: BS.ByteString -> BS.ByteString
bytesToHex = BS16.encode
28 changes: 18 additions & 10 deletions code/Utilities/src/Utilities/PlutusTx.hs
@@ -1,23 +1,31 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE RankNTypes #-}

module Utilities.PlutusTx
( wrap
( wrapValidator
, wrapPolicy
) where

import Plutus.V2.Ledger.Api (ScriptContext, UnsafeFromData,
unsafeFromBuiltinData)
import PlutusTx.Prelude (Bool, BuiltinData, check, ($))

{-# INLINABLE wrap #-}
wrap :: forall a b.
( UnsafeFromData a
, UnsafeFromData b
)
=> (a -> b -> ScriptContext -> Bool)
-> (BuiltinData -> BuiltinData -> BuiltinData -> ())
wrap f a b ctx =
{-# INLINABLE wrapValidator #-}
wrapValidator :: ( UnsafeFromData a
, UnsafeFromData b
)
=> (a -> b -> ScriptContext -> Bool)
-> (BuiltinData -> BuiltinData -> BuiltinData -> ())
wrapValidator f a b ctx =
check $ f
(unsafeFromBuiltinData a)
(unsafeFromBuiltinData b)
(unsafeFromBuiltinData ctx)

{-# INLINABLE wrapPolicy #-}
wrapPolicy :: UnsafeFromData a
=> (a -> ScriptContext -> Bool)
-> (BuiltinData -> BuiltinData -> ())
wrapPolicy f a ctx =
check $ f
(unsafeFromBuiltinData a)
(unsafeFromBuiltinData ctx)
25 changes: 21 additions & 4 deletions code/Utilities/src/Utilities/Serialise.hs
Expand Up @@ -2,7 +2,9 @@

module Utilities.Serialise
( validatorToScript
, policyToScript
, writeValidatorToFile
, writePolicyToFile
, dataToJSON
, printDataToJSON
, writeDataToFile
Expand All @@ -13,7 +15,7 @@ import Cardano.Api (Error (displayError), PlutusScript,
writeFileJSON, writeFileTextEnvelope)
import Cardano.Api.Shelley (PlutusScript (..), fromPlutusData,
scriptDataToJsonDetailedSchema)
import Codec.Serialise (serialise)
import Codec.Serialise (serialise, Serialise)
import Data.Aeson (Value)
import qualified Data.ByteString.Char8 as BS8
import qualified Data.ByteString.Lazy as BSL
Expand All @@ -22,17 +24,32 @@ import Plutus.V1.Ledger.Api (ToData)
import qualified Plutus.V2.Ledger.Api as PlutusV2
import Text.Printf (printf)

-- Serialize script

serializableToScript :: Serialise a => a -> PlutusScript PlutusScriptV2
serializableToScript = PlutusScriptSerialised . BSS.toShort . BSL.toStrict . serialise

-- Serialize validator
validatorToScript :: PlutusV2.Validator -> PlutusScript PlutusScriptV2
validatorToScript = PlutusScriptSerialised . BSS.toShort . BSL.toStrict . serialise
validatorToScript = serializableToScript

-- Serialize minting policy
policyToScript :: PlutusV2.MintingPolicy -> PlutusScript PlutusScriptV2
policyToScript = serializableToScript

-- Create file with compiled Plutus script
-- Create file with compiled Plutus validator
writeValidatorToFile :: FilePath -> PlutusV2.Validator -> IO ()
writeValidatorToFile filePath validator =
writeFileTextEnvelope filePath Nothing (validatorToScript validator) >>= \case
Left err -> print $ displayError err
Right () -> putStrLn $ "Compiled Plutus script at: " ++ filePath

-- Create file with compiled Plutus minting policy
writePolicyToFile :: FilePath -> PlutusV2.MintingPolicy -> IO ()
writePolicyToFile filePath policy =
writeFileTextEnvelope filePath Nothing (policyToScript policy) >>= \case
Left err -> print $ displayError err
Right () -> putStrLn $ "Compiled Plutus script at: " ++ filePath

dataToJSON :: ToData a => a -> Value
dataToJSON = scriptDataToJsonDetailedSchema . fromPlutusData . PlutusV2.toData

Expand Down
4 changes: 2 additions & 2 deletions code/Week02/homework/Homework1.hs
Expand Up @@ -8,7 +8,7 @@ module Homework1 where
import qualified Plutus.V2.Ledger.Api as PlutusV2
import PlutusTx (compile)
import PlutusTx.Prelude (Bool (..), BuiltinData)
import Utilities (wrap)
import Utilities (wrapValidator)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand All @@ -19,7 +19,7 @@ mkValidator :: () -> (Bool, Bool) -> PlutusV2.ScriptContext -> Bool
mkValidator _ _ _ = False

wrappedVal :: BuiltinData -> BuiltinData -> BuiltinData -> ()
wrappedVal = wrap mkValidator
wrappedVal = wrapValidator mkValidator

validator :: PlutusV2.Validator
validator = PlutusV2.mkValidatorScript $$(PlutusTx.compile [|| wrappedVal ||])
2 changes: 1 addition & 1 deletion code/Week02/homework/Homework2.hs
Expand Up @@ -11,7 +11,7 @@ import qualified Plutus.V2.Ledger.Api as PlutusV2
import PlutusTx (unstableMakeIsData)
import PlutusTx.Prelude (Bool, BuiltinData)
import Prelude (undefined)
--import Utilities (wrap)
--import Utilities (wrapValidator)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions code/Week02/lecture/CustomTypes.hs
Expand Up @@ -11,7 +11,7 @@ import PlutusTx (BuiltinData, compile, unstableMakeIsData)
import PlutusTx.Prelude (Bool, Eq ((==)), Integer, traceIfFalse,
($))
import Prelude (IO)
import Utilities (wrap, writeValidatorToFile)
import Utilities (wrapValidator, writeValidatorToFile)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand All @@ -27,7 +27,7 @@ mkCTValidator _ (MkMySillyRedeemer r) _ = traceIfFalse "expected 42" $ r == 42
{-# INLINABLE mkCTValidator #-}

wrappedMkVal :: BuiltinData -> BuiltinData -> BuiltinData -> ()
wrappedMkVal = wrap mkCTValidator
wrappedMkVal = wrapValidator mkCTValidator
{-# INLINABLE wrappedMkVal #-}

validator :: PlutusV2.Validator
Expand Down
4 changes: 2 additions & 2 deletions code/Week02/lecture/FortyTwoTyped.hs
Expand Up @@ -11,7 +11,7 @@ import PlutusTx (compile)
import PlutusTx.Prelude (Bool, Eq ((==)), Integer, traceIfFalse,
($))
import Prelude (IO)
import Utilities (wrap, writeValidatorToFile)
import Utilities (wrapValidator, writeValidatorToFile)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand All @@ -23,7 +23,7 @@ mk42Validator _ r _ = traceIfFalse "expected 42" $ r == 42
{-# INLINABLE mk42Validator #-}

validator :: PlutusV2.Validator
validator = PlutusV2.mkValidatorScript $$(PlutusTx.compile [|| wrap mk42Validator ||])
validator = PlutusV2.mkValidatorScript $$(PlutusTx.compile [|| wrapValidator mk42Validator ||])

---------------------------------------------------------------------------------------------------
------------------------------------- HELPER FUNCTIONS --------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions code/Week03/homework/Homework1.hs
Expand Up @@ -12,7 +12,7 @@ import Plutus.V2.Ledger.Api (BuiltinData, POSIXTime, PubKeyHash,
mkValidatorScript)
import PlutusTx (compile, unstableMakeIsData)
import PlutusTx.Prelude (Bool (..))
import Utilities (wrap)
import Utilities (wrapValidator)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand All @@ -33,7 +33,7 @@ mkVestingValidator _dat () _ctx = False -- FIX ME!

{-# INLINABLE mkWrappedVestingValidator #-}
mkWrappedVestingValidator :: BuiltinData -> BuiltinData -> BuiltinData -> ()
mkWrappedVestingValidator = wrap mkVestingValidator
mkWrappedVestingValidator = wrapValidator mkVestingValidator

validator :: Validator
validator = mkValidatorScript $$(compile [|| mkWrappedVestingValidator ||])
4 changes: 2 additions & 2 deletions code/Week03/homework/Homework2.hs
Expand Up @@ -12,7 +12,7 @@ import Plutus.V2.Ledger.Api (BuiltinData, POSIXTime, PubKeyHash,
mkValidatorScript)
import PlutusTx (applyCode, compile, liftCode)
import PlutusTx.Prelude (Bool (False), (.))
import Utilities (wrap)
import Utilities (wrapValidator)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand All @@ -24,7 +24,7 @@ mkParameterizedVestingValidator _beneficiary _deadline () _ctx = False -- FIX ME

{-# INLINABLE mkWrappedParameterizedVestingValidator #-}
mkWrappedParameterizedVestingValidator :: PubKeyHash -> BuiltinData -> BuiltinData -> BuiltinData -> ()
mkWrappedParameterizedVestingValidator = wrap . mkParameterizedVestingValidator
mkWrappedParameterizedVestingValidator = wrapValidator . mkParameterizedVestingValidator

validator :: PubKeyHash -> Validator
validator beneficiary = mkValidatorScript ($$(compile [|| mkWrappedParameterizedVestingValidator ||]) `applyCode` liftCode beneficiary)
4 changes: 2 additions & 2 deletions code/Week03/lecture/ParameterizedVesting.hs
Expand Up @@ -17,7 +17,7 @@ import PlutusTx (applyCode, compile, liftCode,
makeLift)
import PlutusTx.Prelude (Bool, traceIfFalse, ($), (&&), (.))
import Prelude (IO)
import Utilities (wrap, writeValidatorToFile)
import Utilities (wrapValidator, writeValidatorToFile)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand Down Expand Up @@ -45,7 +45,7 @@ mkParameterizedVestingValidator params () () ctx =

{-# INLINABLE mkWrappedParameterizedVestingValidator #-}
mkWrappedParameterizedVestingValidator :: VestingParams -> BuiltinData -> BuiltinData -> BuiltinData -> ()
mkWrappedParameterizedVestingValidator = wrap . mkParameterizedVestingValidator
mkWrappedParameterizedVestingValidator = wrapValidator . mkParameterizedVestingValidator

validator :: VestingParams -> Validator
validator params = mkValidatorScript ($$(compile [|| mkWrappedParameterizedVestingValidator ||]) `applyCode` liftCode params)
Expand Down
6 changes: 3 additions & 3 deletions code/Week03/lecture/Vesting.hs
Expand Up @@ -17,8 +17,8 @@ import PlutusTx.Prelude (Bool, traceIfFalse, ($), (&&))
import Prelude (IO, String)
import Utilities (Network, posixTimeFromIso8601,
printDataToJSON,
validatorAddressBech32, wrap,
writeValidatorToFile)
validatorAddressBech32,
wrapValidator, writeValidatorToFile)

---------------------------------------------------------------------------------------------------
----------------------------------- ON-CHAIN / VALIDATOR ------------------------------------------
Expand Down Expand Up @@ -46,7 +46,7 @@ mkVestingValidator dat () ctx = traceIfFalse "beneficiary's signature missing" s

{-# INLINABLE mkWrappedVestingValidator #-}
mkWrappedVestingValidator :: BuiltinData -> BuiltinData -> BuiltinData -> ()
mkWrappedVestingValidator = wrap mkVestingValidator
mkWrappedVestingValidator = wrapValidator mkVestingValidator

validator :: Validator
validator = mkValidatorScript $$(compile [|| mkWrappedVestingValidator ||])
Expand Down
34 changes: 18 additions & 16 deletions code/Week04/homework/Homework1.hs
Expand Up @@ -7,20 +7,22 @@

module Homework1 where

import Data.Maybe (fromJust)
import Plutus.V2.Ledger.Api (BuiltinData, POSIXTime, PubKeyHash,
import Data.Maybe (fromJust)
import Plutus.V1.Ledger.Interval (contains, to)
import Plutus.V2.Ledger.Api (BuiltinData, POSIXTime,
POSIXTimeRange, PubKeyHash,
ScriptContext (scriptContextTxInfo),
TxInfo (txInfoValidRange),
Validator, from, mkValidatorScript, POSIXTimeRange)
import Plutus.V2.Ledger.Contexts (txSignedBy)
import Plutus.V1.Ledger.Interval (to, contains)
import PlutusTx (compile, unstableMakeIsData)
import PlutusTx.Prelude (Bool, traceIfFalse, ($), (&&), (||), (+))
import Prelude (IO, String)
import Utilities (Network, posixTimeFromIso8601,
printDataToJSON,
validatorAddressBech32, wrap,
writeValidatorToFile)
Validator, from, mkValidatorScript)
import Plutus.V2.Ledger.Contexts (txSignedBy)
import PlutusTx (compile, unstableMakeIsData)
import PlutusTx.Prelude (Bool, traceIfFalse, ($), (&&), (+),
(||))
import Prelude (IO, String)
import Utilities (Network, posixTimeFromIso8601,
printDataToJSON,
validatorAddressBech32,
wrapValidator, writeValidatorToFile)

---------------------------------------------------------------------------------------------------
------------------------------------------ PROMPT -------------------------------------------------
Expand All @@ -46,8 +48,8 @@ unstableMakeIsData ''MisteryDatum

{-# INLINABLE mkMisteryValidator #-}
mkMisteryValidator :: MisteryDatum -> () -> ScriptContext -> Bool
mkMisteryValidator dat () ctx =
traceIfFalse "Benificiary1 did not sign or to late" checkCondition1 ||
mkMisteryValidator dat () ctx =
traceIfFalse "Benificiary1 did not sign or to late" checkCondition1 ||
traceIfFalse "Benificiary2 did not sign or is to early" checkCondition2
where
txInfo :: TxInfo
Expand All @@ -66,7 +68,7 @@ mkMisteryValidator dat () ctx =

{-# INLINABLE mkWrappedMisteryValidator #-}
mkWrappedMisteryValidator :: BuiltinData -> BuiltinData -> BuiltinData -> ()
mkWrappedMisteryValidator = wrap mkMisteryValidator
mkWrappedMisteryValidator = wrapValidator mkMisteryValidator

validator :: Validator
validator = mkValidatorScript $$(compile [|| mkWrappedMisteryValidator ||])
Expand All @@ -85,4 +87,4 @@ printMisteryDatumJSON pkh1 pkh2 time = printDataToJSON $ MisteryDatum
{ beneficiary1 = pkh1
, beneficiary2 = pkh2
, deadline = fromJust $ posixTimeFromIso8601 time
}
}

0 comments on commit e3d0105

Please sign in to comment.