I am trying to learn the basics of the PlutusTx module. In this module is a function applyCode
which maps the signatures CompiledCodeIn uni fun (a -> b) -> CompiledCodeIn uni fun a -> CompiledCodeIn uni fun b
. In my understanding this function is there to splice in inputs. So given the following validator
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module Modules.Contract where
import Control.Monad hiding (fmap)
import Data.Map as Map
import Data.Text (Text)
import Data.Void (Void)
import Plutus.Contract
import PlutusTx as PlutusTx
import PlutusTx.Prelude as P hiding (Semigroup(..), unless)
import Ledger hiding (singleton)
import Ledger.Constraints as Constraints
import qualified Ledger.Scripts as Scripts
import Ledger.Ada as Ada
import Playground.Contract (printJson, printSchemas, ensureKnownCurrencies, stage)
import Playground.TH (mkKnownCurrencies, mkSchemaDefinitions)
import Playground.Types (KnownCurrency (..))
import Prelude (IO, Semigroup (..), String)
import Text.Printf (printf)
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
someList :: [Integer]
someList = [1,2,3]
someListBuiltin :: BuiltinData
someListBuiltin = PlutusTx.toBuiltinData someList
{-# INLINABLE mkValidator #-}
mkValidator :: BuiltinData -> BuiltinData -> BuiltinData -> BuiltinData -> ()
mkValidator someListBuiltin _ r _
| (someListBuiltin P.!! 1) == r = ()
| otherwise = traceError "wrong redeemer"
Notice that I use BuiltinData instead of a typed version and I import the Plutus.Prelude
as P
. This simple validator checks if the redeemer is the first element in the list (so if r = (I 1) it would validate. Now how do I splice this pre determined list in the validator via template haskell? My attempt by using applyCode in infix style
validator :: Validator
validator = mkValidatorScript ($$(PlutusTx.compile [|| mkValidator ||]) `PlutusTx.applyCode` PlutusTx.liftCode someListBuiltin)
For a typed validator I got this to work.
mkTypedValidatorScript
which will do the conversions for you.List xs
, you can then doxs !! 0
.