2021-07-05 16:26:31 +02:00
|
|
|
{-# LANGUAGE DataKinds #-}
|
|
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
|
|
{-# LANGUAGE NoImplicitPrelude #-}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
{-# LANGUAGE ScopedTypeVariables #-}
|
|
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
|
|
{-# LANGUAGE TypeApplications #-}
|
|
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
|
|
{-# LANGUAGE TypeOperators #-}
|
|
|
|
|
|
|
|
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
|
|
|
|
|
|
|
|
module Week02.IsData where
|
|
|
|
|
|
|
|
import Control.Monad hiding (fmap)
|
|
|
|
import Data.Map as Map
|
|
|
|
import Data.Text (Text)
|
|
|
|
import Data.Void (Void)
|
|
|
|
import Plutus.Contract
|
2021-07-07 23:29:58 +02:00
|
|
|
import PlutusTx (Data (..))
|
2021-07-05 16:26:31 +02:00
|
|
|
import qualified PlutusTx
|
|
|
|
import PlutusTx.Prelude hiding (Semigroup(..), unless)
|
|
|
|
import Ledger hiding (singleton)
|
|
|
|
import Ledger.Constraints as Constraints
|
|
|
|
import qualified Ledger.Typed.Scripts as Scripts
|
|
|
|
import Ledger.Ada as Ada
|
|
|
|
import Playground.Contract (printJson, printSchemas, ensureKnownCurrencies, stage)
|
|
|
|
import Playground.TH (mkKnownCurrencies, mkSchemaDefinitions)
|
|
|
|
import Playground.Types (KnownCurrency (..))
|
2021-07-07 23:29:58 +02:00
|
|
|
import Prelude (IO, Semigroup (..), String)
|
2021-07-05 16:26:31 +02:00
|
|
|
import Text.Printf (printf)
|
|
|
|
|
|
|
|
newtype MySillyRedeemer = MySillyRedeemer Integer
|
|
|
|
|
|
|
|
PlutusTx.unstableMakeIsData ''MySillyRedeemer
|
|
|
|
|
|
|
|
{-# INLINABLE mkValidator #-}
|
|
|
|
mkValidator :: () -> MySillyRedeemer -> ScriptContext -> Bool
|
2021-07-07 23:29:58 +02:00
|
|
|
mkValidator _ (MySillyRedeemer r) _ = traceIfFalse "wrong redeemer" $ r == 42
|
2021-07-05 16:26:31 +02:00
|
|
|
|
|
|
|
data Typed
|
|
|
|
instance Scripts.ValidatorTypes Typed where
|
|
|
|
type instance DatumType Typed = ()
|
|
|
|
type instance RedeemerType Typed = MySillyRedeemer
|
|
|
|
|
|
|
|
typedValidator :: Scripts.TypedValidator Typed
|
|
|
|
typedValidator = Scripts.mkTypedValidator @Typed
|
|
|
|
$$(PlutusTx.compile [|| mkValidator ||])
|
|
|
|
$$(PlutusTx.compile [|| wrap ||])
|
|
|
|
where
|
|
|
|
wrap = Scripts.wrapValidator @() @MySillyRedeemer
|
|
|
|
|
|
|
|
validator :: Validator
|
|
|
|
validator = Scripts.validatorScript typedValidator
|
|
|
|
|
|
|
|
valHash :: Ledger.ValidatorHash
|
|
|
|
valHash = Scripts.validatorHash typedValidator
|
|
|
|
|
|
|
|
scrAddress :: Ledger.Address
|
|
|
|
scrAddress = scriptAddress validator
|
|
|
|
|
|
|
|
type GiftSchema =
|
|
|
|
Endpoint "give" Integer
|
|
|
|
.\/ Endpoint "grab" Integer
|
|
|
|
|
|
|
|
give :: AsContractError e => Integer -> Contract w s e ()
|
|
|
|
give amount = do
|
|
|
|
let tx = mustPayToTheScript () $ Ada.lovelaceValueOf amount
|
|
|
|
ledgerTx <- submitTxConstraints typedValidator tx
|
|
|
|
void $ awaitTxConfirmed $ txId ledgerTx
|
|
|
|
logInfo @String $ printf "made a gift of %d lovelace" amount
|
|
|
|
|
|
|
|
grab :: forall w s e. AsContractError e => Integer -> Contract w s e ()
|
|
|
|
grab r = do
|
|
|
|
utxos <- utxoAt scrAddress
|
|
|
|
let orefs = fst <$> Map.toList utxos
|
|
|
|
lookups = Constraints.unspentOutputs utxos <>
|
|
|
|
Constraints.otherScript validator
|
|
|
|
tx :: TxConstraints Void Void
|
2021-07-07 23:29:58 +02:00
|
|
|
tx = mconcat [mustSpendScriptOutput oref $ Redeemer $ PlutusTx.toData (MySillyRedeemer r) | oref <- orefs]
|
2021-07-05 16:26:31 +02:00
|
|
|
ledgerTx <- submitTxConstraintsWith @Void lookups tx
|
|
|
|
void $ awaitTxConfirmed $ txId ledgerTx
|
|
|
|
logInfo @String $ "collected gifts"
|
|
|
|
|
|
|
|
endpoints :: Contract () GiftSchema Text ()
|
|
|
|
endpoints = (give' `select` grab') >> endpoints
|
|
|
|
where
|
|
|
|
give' = endpoint @"give" >>= give
|
|
|
|
grab' = endpoint @"grab" >>= grab
|
|
|
|
|
|
|
|
mkSchemaDefinitions ''GiftSchema
|
|
|
|
|
|
|
|
mkKnownCurrencies []
|