Skip to content

Commit

Permalink
Create a hydra-pab standalone PAB executable
Browse files Browse the repository at this point in the history
This is running the PAB in Simulation mode and can be communicated with
using HTTP
  • Loading branch information
ch1bo committed Jun 14, 2021
1 parent 1ee1683 commit 1db7394
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 0 deletions.
2 changes: 2 additions & 0 deletions cabal.project
Expand Up @@ -146,7 +146,9 @@ source-repository-package
plutus-contract
plutus-ledger
plutus-ledger-api
plutus-pab
plutus-tx-plugin
plutus-use-cases
prettyprinter-configurable
quickcheck-dynamic

Expand Down
99 changes: 99 additions & 0 deletions hydra-plutus/exe/hydra-pab/Main.hs
@@ -0,0 +1,99 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

module Main (main) where

import Control.Monad (void)
import Control.Monad.Freer (Eff, Member, interpret, type (~>))
import Control.Monad.Freer.Error (Error)
import Control.Monad.Freer.Extras.Log (LogMsg)
import Control.Monad.IO.Class (MonadIO (..))
import Data.Aeson (
FromJSON (..),
Options (..),
ToJSON (..),
defaultOptions,
genericParseJSON,
genericToJSON,
)
import Data.Text.Prettyprint.Doc (Pretty (..), viaShow)
import GHC.Generics (Generic)
import Plutus.Contract (BlockchainActions, ContractError)
import Plutus.Contracts.Game as Game
import Plutus.PAB.Effects.Contract (ContractEffect (..))
import Plutus.PAB.Effects.Contract.Builtin (Builtin, SomeBuiltin (..), type (.\\))
import qualified Plutus.PAB.Effects.Contract.Builtin as Builtin
import Plutus.PAB.Monitoring.PABLogMsg (PABMultiAgentMsg)
import Plutus.PAB.Simulator (SimulatorEffectHandlers)
import qualified Plutus.PAB.Simulator as Simulator
import Plutus.PAB.Types (PABError (..))
import qualified Plutus.PAB.Webserver.Server as PAB.Server
import Wallet.Emulator.Types (Wallet (..))

main :: IO ()
main = void $
Simulator.runSimulationWith handlers $ do
Simulator.logString @(Builtin StarterContracts) "Starting plutus-starter PAB webserver on port 8080. Press enter to exit."
shutdown <- PAB.Server.startServerDebug

-- Pressing enter results in the balances being printed
void $ liftIO getLine

Simulator.logString @(Builtin StarterContracts) "Balances at the end of the simulation"
b <- Simulator.currentBalances
Simulator.logBalances @(Builtin StarterContracts) b

shutdown

data StarterContracts
= HydraContract
deriving (Eq, Ord, Show, Generic)

-- NOTE: Because 'StarterContracts' only has one constructor, corresponding to
-- the demo 'Game' contract, we kindly ask aeson to still encode it as if it had
-- many; this way we get to see the label of the contract in the API output!
-- If you simple have more contracts, you can just use the anyclass deriving
-- statement on 'StarterContracts' instead:
--
-- `... deriving anyclass (ToJSON, FromJSON)`
instance ToJSON StarterContracts where
toJSON =
genericToJSON
defaultOptions
{ tagSingleConstructors = True
}
instance FromJSON StarterContracts where
parseJSON =
genericParseJSON
defaultOptions
{ tagSingleConstructors = True
}

instance Pretty StarterContracts where
pretty = viaShow

handleStarterContract ::
( Member (Error PABError) effs
, Member (LogMsg (PABMultiAgentMsg (Builtin StarterContracts))) effs
) =>
ContractEffect (Builtin StarterContracts)
~> Eff effs
handleStarterContract = Builtin.handleBuiltin getSchema getContract
where
getSchema = \case
HydraContract -> Builtin.endpointsToSchemas @(Hydra.Schema .\\ BlockchainActions)
getContract = \case
HydraContract -> SomeBuiltin (Hydra.contract @ContractError)

handlers :: SimulatorEffectHandlers (Builtin StarterContracts)
handlers =
Simulator.mkSimulatorHandlers @(Builtin StarterContracts) [HydraContract] $
interpret handleStarterContract
21 changes: 21 additions & 0 deletions hydra-plutus/hydra-plutus.cabal
Expand Up @@ -130,3 +130,24 @@ test-suite hydra-plutus-test
tasty-hunit,
tasty-quickcheck,
text

executable hydra-pab
import: project-config
hs-source-dirs: exe/hydra-pab
main-is: Main.hs
build-depends:
aeson
, base
, cardano-prelude
, freer-extras
, freer-simple
, hydra-plutus
, optparse-applicative
, plutus-contract
, plutus-ledger
, plutus-pab
, prettyprinter
, text
ghc-options:
-threaded
-rtsopts

0 comments on commit 1db7394

Please sign in to comment.