This repository has been archived by the owner on Jan 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathMain.hs
121 lines (107 loc) · 3.22 KB
/
Main.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
120
121
{-# OPTIONS_GHC -Wno-unticked-promoted-constructors #-}
{- | Module : Main
Maintainer : [email protected]
Description: Example usage of 'liqwid-script-export'.
Example usage of 'liqwid-script-export'.
-}
module Main (main) where
import Data.Default (def)
import Data.Map (fromList)
import Data.Text (unpack)
import Plutarch (compile)
import Plutarch.Api.V2 (PValidator)
import Plutarch.Prelude (
ClosedTerm,
PInteger,
PUnit (PUnit),
pcon,
pconstant,
plam,
plet,
popaque,
tcont,
unTermCont,
(#),
(:-->),
)
import Ply ((#))
import Ply.Plutarch.TypedWriter (mkEnvelope)
import ScriptExport.Export (exportMain)
import ScriptExport.ScriptInfo (
Linker,
RawScriptExport (RawScriptExport),
RoledScript (RoledScript),
ScriptExport (ScriptExport),
ScriptRole (ValidatorRole),
fetchTS,
getParam,
mkValidatorInfo,
toRoledScript,
)
import ScriptExport.Types (
Builders,
insertBuilder,
insertScriptExportWithLinker,
insertStaticBuilder,
)
main :: IO ()
main = exportMain builders
{-
This is the collection of builders. API and file will be created based on provided
builders. There are various `insertXYZBuilder` functions to provide versatile ways
of adding builders.
`insertStaticBuilder` will insert builder that does not have any
argument--as "static" suggests.
`insertBuilder` will insert builder from a function. Argument type
needs `Aeson.FromJSON` and return type needs `Aeson.ToJSON`.
`insertScriptExportWithLinker` is similar to `insertBuilder` but
specialized to `RawScriptExport` and `Linker`. It will automatically
handle linker given parameter. Also, it will return serialized
`RawScript` if no parameter is given.
-}
builders :: Builders
builders =
mconcat
[ insertStaticBuilder "alwaysSucceeds" (mkValidatorInfo alwaysSucceeds)
, insertBuilder @Integer
"alwaysSucceedsParam"
(\x -> mkValidatorInfo (alwaysSucceedsParam Plutarch.Prelude.# pconstant x))
, insertStaticBuilder "my-onchain-project" myproject
, insertScriptExportWithLinker "my-onchain-project-param" myProjectParameterized myProjectLinker
]
-- This is our dummy validator.
alwaysSucceeds :: ClosedTerm PValidator
alwaysSucceeds = plam $ \_ _ _ -> popaque (pcon PUnit)
-- This is our dummy paramterized validator.
alwaysSucceedsParam :: ClosedTerm (PInteger :--> PValidator)
alwaysSucceedsParam = plam $ \x _ _ _ -> unTermCont $ do
_ <- tcont $ plet $ x + x
pure $ popaque (pcon PUnit)
-- This is example `ScriptExport`
myproject :: ScriptExport Int
myproject =
ScriptExport
( fromList
[ ("alwaysSucceeds", RoledScript (either (error . unpack) id $ compile def alwaysSucceeds) ValidatorRole)
]
)
10
-- This is example `RawScriptExport`.
myProjectParameterized :: RawScriptExport
myProjectParameterized =
RawScriptExport $
fromList
[ ("alwaysSucceeds", either (error . unpack) id $ mkEnvelope def "alwaysSucceedsParam" alwaysSucceedsParam)
]
-- This is example script linker.
myProjectLinker :: Linker Integer (ScriptExport ())
myProjectLinker = do
as <- fetchTS @ValidatorRole @'[Integer] "alwaysSucceeds"
arg <- getParam
return $
ScriptExport
( fromList
[ ("alwaysSucceeds", toRoledScript $ as Ply.# arg)
]
)
()