A software engineer website

Plutus: Pioneers Program 4th cohort - Lecture 10 - Built with plutus

Gautier DI FOLCO May 07, 2023 [HaskellBlockchain] #haskell #cardano #smart contracts

As a last lecture, instead of writing regular Plutus code through Haskell, alternatives are presented.

First, we have MeshJS, which aims to bootstrap DApps, based on React, NextJS, and JavaScript/TypeScript.

Then come plu-ts, which allows tu write scripts which will be compiled down to plutus.

It looks a lot like Haskkell-based Plutus scripts:

import { Address, bool, compile, makeValidator, PaymentCredentials, pBool, pfn, Script, ScriptType, V2 } from "@harmoniclabs/plu-ts";

export const contract = pfn([
],  bool)
(( datum, redeemer, ctx ) =>
    pBool( true )

export const untypedValidator = makeValidator( contract );

export const compiledContract = compile( untypedValidator );

export const script = new Script(

export const scriptMainnetAddr = new Address(
    new PaymentCredentials(

Then we have OpShin, which is python-based.

from opshin.prelude import *

class WithdrawDatum(PlutusData):
    pubkeyhash: bytes

def validator(datum: WithdrawDatum, redeemer: None, context: ScriptContext) -> None:
    sig_present = False
    for s in context.tx_info.signatories:
        if datum.pubkeyhash == s:
            sig_present = True
    assert sig_present, "Required signature missing"

Then we have plutarch, which is a Haskell eDSL, it aims to produce a smaller and more efficient Untyped PLutus Core:

alwaysSucceeds :: Term s (PAsData PDatum :--> PAsData PRedeemer :--> PAsData PScriptContext :--> PUnit)
alwaysSucceeds = plam $ \_datm _redm _ctx -> pconstant ()

Finally there's Aiken which is a dedicated functional programming language for Smart Contracts.

validator {
  fn hello_world(datum, redeemer, context) -> Bool {
    let must_say_hello =
      redeemer == "Hello, World!"

    let must_be_signed =

    must_say_hello? && must_be_signed?

Notes: while Plutus Pioneers Program 4th Cohort ends here, the 1st cohort, which I attended to, cover Plutus Application Backend.

Its aims to enable interactions between clients and contracts (e.g. through HTTP requests to long-running contracts, or notify clients when ledger changes).

To be deployed, it takes: