Skip to content

Commit

Permalink
Add Plutus example that computes sum [1..n]
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcFontaine committed Jul 26, 2021
1 parent cffa06c commit db187de
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 2 deletions.
3 changes: 2 additions & 1 deletion plutus-example/plutus-example/app/plutus-example.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Cardano.PlutusExample.CustomDatumRedeemerGuess
import Cardano.PlutusExample.AlwaysSucceeds (alwaysSucceedsScript)
import Cardano.PlutusExample.DatumRedeemerGuess (guessScript)
import Cardano.PlutusExample.MintingScript (apiExamplePlutusMintingScript)

import Cardano.PlutusExample.Sum (sumScript)

main :: IO ()
main = do
Expand All @@ -21,4 +21,5 @@ main = do
_ <- writeFileTextEnvelope (dir </> "guess-42-datum-42-txin.plutus") Nothing guessScript
_ <- writeFileTextEnvelope (dir </> "custom-guess-42-datum-42.plutus") Nothing customGuessScript
_ <- writeFileTextEnvelope (dir </> "anyone-can-mint.plutus") Nothing apiExamplePlutusMintingScript
_ <- writeFileTextEnvelope (dir </> "sum.plutus") Nothing sumScript
return ()
2 changes: 1 addition & 1 deletion plutus-example/plutus-example/plutus-example.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ library
Cardano.PlutusExample.DatumRedeemerGuess
Cardano.PlutusExample.MintingScript
Cardano.PlutusExample.CustomDatumRedeemerGuess

Cardano.PlutusExample.Sum
build-depends: bytestring
, cardano-api
, plutus-ledger
Expand Down
68 changes: 68 additions & 0 deletions plutus-example/plutus-example/src/Cardano/PlutusExample/Sum.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

module Cardano.PlutusExample.Sum
where

import Prelude hiding (($),(==),(+),(-))

import Cardano.Api.Shelley (PlutusScript (..), PlutusScriptV1)

import Codec.Serialise
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Short as SBS

import qualified Ledger.Typed.Scripts as Scripts
import qualified Plutus.V1.Ledger.Scripts as Plutus
import PlutusTx (Data (..))
import qualified PlutusTx
import PlutusTx.Prelude hiding (Semigroup (..), unless)


smartSum :: Integer -> Integer
smartSum a = loop a 0
where
loop !n !acc = if n==0
then acc
else loop (n - 1) (n + acc)

-- | The validation function (DataValue -> RedeemerValue -> ScriptContext -> Bool)
{-# INLINABLE validateSum #-}
validateSum :: Integer -> Integer -> x -> Bool
validateSum n s _ = isGoodSum n s

{-# INLINABLE isGoodSum #-}
isGoodSum :: Integer -> Integer -> Bool
isGoodSum n s = smartSum n == s


data SmartSum
instance Scripts.ValidatorTypes SmartSum where
type instance RedeemerType SmartSum = Integer
type instance DatumType SmartSum = Integer

sumInstance :: Scripts.TypedValidator SmartSum
sumInstance = Scripts.mkTypedValidator @SmartSum
$$(PlutusTx.compile [|| validateSum ||])
$$(PlutusTx.compile [|| wrap ||])
where
wrap = Scripts.wrapValidator @Integer @Integer

validator :: Plutus.Validator
validator = Scripts.validatorScript sumInstance

script :: Plutus.Script
script = Plutus.unValidatorScript validator

sumScriptShortBs :: SBS.ShortByteString
sumScriptShortBs = SBS.toShort . LBS.toStrict $ serialise script

sumScript :: PlutusScript PlutusScriptV1
sumScript = PlutusScriptSerialised sumScriptShortBs

0 comments on commit db187de

Please sign in to comment.