Skip to content
This repository was archived by the owner on Sep 17, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cabal.project
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ index-state: 2022-02-22T20:47:03Z
packages:
locking-contract
minting-contract
nft-locking-contract
nft-minting-contract

-- You never, ever, want this.
write-ghc-environment-files: never
Expand Down
2 changes: 2 additions & 0 deletions hie.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ cradle:
component: "plutus-starter:exe:plutus-starter-pab"
- path: "./minting-contract/src"
component: "minting-contract:lib:minting-contract"
- path: "./nft-minting-contract/src"
component: "nft-locking-contract:lib:nft-locking-contract"
2 changes: 1 addition & 1 deletion locking-scripts/lockAndFractionalize.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ FEE=$(${cli} transaction build \
--change-address ${buyer_address} \
--tx-in ${buyer_tx_in} \
--tx-in ${script_tx_in} \
--tx-in-collateral 85598de14b96a9c45442c55eae6d3b097071099289580a51bc3ec1ffe061f9e6#0 \
--tx-in-collateral 3ffc0c720f618c2ea451dfa95ede3836f674508673678dc356c8ffc531bd3343#0 \
--tx-in-datum-file data/datum.json \
--tx-in-redeemer-file data/lock_redeemer.json \
--tx-out="${buyer_address_out}" \
Expand Down
34 changes: 34 additions & 0 deletions nft-locking-contract/app/nft-locking-contract.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import Prelude
import System.Environment
import Cardano.Api
import Cardano.Api.Shelley
import qualified Cardano.Ledger.Alonzo.Data as Alonzo
import qualified Plutus.V1.Ledger.Api as Plutus
import qualified Data.ByteString.Short as SBS
import NFTLockingContract (lockingContractScript, lockingContractScriptShortBs)

main :: IO ()
main = do
args <- getArgs
let nargs = length args
let scriptnum = if nargs > 0 then read (args!!0) else 420
let scriptname = if nargs > 1 then args!!1 else "nft_locking_contract.plutus"
putStrLn $ "OUTPUT: " ++ scriptname
writePlutusScript scriptnum scriptname lockingContractScript lockingContractScriptShortBs

writePlutusScript :: Integer -> FilePath -> PlutusScript PlutusScriptV1 -> SBS.ShortByteString -> IO ()
writePlutusScript scriptnum filename scriptSerial scriptSBS =
do
case Plutus.defaultCostModelParams of
Just m ->
let Alonzo.Data pData = toAlonzoData (ScriptDataNumber scriptnum)
(logout, e) = Plutus.evaluateScriptCounting Plutus.Verbose m scriptSBS [pData]
in do print ("OUTPUT" :: String) >> print logout
case e of
Left evalErr -> print ("Error" :: String) >> print evalErr
Right exbudget -> print ("Budget" :: String) >> print exbudget
Nothing -> error "defaultCostModelParams failed"
result <- writeFileTextEnvelope filename Nothing scriptSerial
case result of
Left err -> print $ displayError err
Right () -> return ()
22 changes: 22 additions & 0 deletions nft-locking-contract/app/nft-minting-contract.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import Prelude
import Cardano.Api
import Cardano.Api.Shelley
import qualified Cardano.Ledger.Alonzo.Data as Alonzo
import qualified Plutus.V1.Ledger.Api as Plutus
import NFTMintingContract (apiExamplePlutusMintingScript, mintingScriptShortBs)

main :: IO ()
main = do
case Plutus.defaultCostModelParams of
Just m ->
let Alonzo.Data pData = toAlonzoData (ScriptDataNumber 42)
(logout, e) = Plutus.evaluateScriptCounting Plutus.Verbose m mintingScriptShortBs [pData]
in do print ("Log output" :: String) >> print logout
case e of
Left evalErr -> print ("Eval Error" :: String) >> print evalErr
Right exbudget -> print ("Ex Budget" :: String) >> print exbudget
Nothing -> error "defaultCostModelParams failed"
result <- writeFileTextEnvelope "nft_minting_contract.plutus" Nothing apiExamplePlutusMintingScript
case result of
Left err -> print $ displayError err
Right () -> return ()
5 changes: 5 additions & 0 deletions nft-locking-contract/build-project.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
cabal build -w ghc-8.10.4
cabal run nft-locking-contract
cardano-cli transaction policyid --script-file nft_locking_contract.plutus > validator.hash
echo "Validator Hash:" $(cat validator.hash)
echo "DONE"
7 changes: 7 additions & 0 deletions nft-locking-contract/full-build-project.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
cabal clean
cabal update
cabal build -w ghc-8.10.4 -O2
cabal run nft-locking-contract
cardano-cli transaction policyid --script-file nft_locking_contract.plutus > validator.hash
echo "Validator Hash:" $(cat validator.hash)
echo "DONE"
81 changes: 81 additions & 0 deletions nft-locking-contract/nft-locking-contract.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
cabal-version: 2.4

name: nft-locking-contract
version: 1
description: A plutus script for locking funds..
author: Quinn Parkinson
maintainer: qparkinson@projectnewm.io
license: AGPL-3.0-only
build-type: Simple

Flag unexpected_thunks
Description: Turn on unexpected thunks checks
Default: False

common base
build-depends: base >= 4.14 && < 4.15

common project-config
default-language: Haskell2010

default-extensions: NoImplicitPrelude
OverloadedStrings

ghc-options: -Wall
-Wcompat
-Wincomplete-record-updates
-Wpartial-fields
-Wredundant-constraints
-Wincomplete-uni-patterns
-Wmissing-export-lists
-Wpartial-fields
-Wmissing-deriving-strategies
-Wunused-packages

common maybe-Win32
if os(windows)
build-depends: Win32

library
import: base, project-config
, maybe-Win32

if flag(unexpected_thunks)
cpp-options: -DUNEXPECTED_THUNKS

hs-source-dirs: src

exposed-modules: NFTLockingContract
CheckFuncs
TokenHelper

build-depends: bytestring
, cardano-api
, plutus-ledger
, plutus-ledger-api
, plutus-tx
, plutus-tx-plugin
, serialise
, text
, containers
, plutus-contract
, openapi3
, aeson

ghc-options: -fobject-code -fno-ignore-interface-pragmas -fno-omit-interface-pragmas

executable nft-locking-contract
import: base, project-config
hs-source-dirs: app
main-is: nft-locking-contract.hs

ghc-options: -threaded
-rtsopts
"-with-rtsopts=-T"
-O2

build-depends: cardano-api
, cardano-ledger-alonzo
, nft-locking-contract
, plutus-ledger-api
, bytestring
5 changes: 5 additions & 0 deletions nft-locking-contract/nft_locking_contract.plutus
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "PlutusScriptV1",
"description": "",
"cborHex": "59116a591167010000332323232323232323232323232323322323232322232323223223232533533300a3333573466e1cd55cea804240004646464246660020080060046eb8d5d09aba25009375a6ae854020dd71aba1500823263533573803c0380360346666ae68cdc3a80224004424400446666ae68cdc3a802a40004244002464c6a66ae7007c07407006c068cccd5cd19b8735573aa004900011991091980080180119191919191919191919191999ab9a3370e6aae754029200023333333333222222222212333333333300100b00a009008007006005004003002335018232323333573466e1cd55cea8012400046644246600200600460466ae854008c074d5d09aba2500223263533573805c05805605426aae7940044dd50009aba1500a33501801935742a012666aa036eb94068d5d0a804199aa80dbae501a35742a00e66a0300466ae854018cd4060cd54098091d69aba150053232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40a5d69aba15002302a357426ae8940088c98d4cd5ce01901801781709aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a814bad35742a00460546ae84d5d1280111931a99ab9c03203002f02e135573ca00226ea8004d5d09aba2500223263533573805c05805605426aae7940044dd50009aba1500433501875c6ae85400ccd4060cd54099d710009aba150023020357426ae8940088c98d4cd5ce01501401381309aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aab9e5001137540026ae854008c8c8c8cccd5cd19b875001480188c848888c010014c06cd5d09aab9e500323333573466e1d40092004232122223002005301d357426aae7940108cccd5cd19b875003480088c848888c004014c064d5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931a99ab9c02502302202102001f01e135573aa00226ea8004d5d09aba2500223263533573803c0380360342036264c6a66ae712401035054350001b01a135573ca00226ea80044d55ce9baa001135744a00226aae7940044dd50008919118011bac001320013550142233335573e0024a012466a01060086ae84008c00cd5d100100991919191999ab9a3370e6aae75400d20002333222123330010040030023232323333573466e1cd55cea80124000466442466002006004602a6ae854008cd4038050d5d09aba2500223263533573803403002e02c26aae7940044dd50009aba150033335500775ca00c6ae854008cd4029d71aba135744a004464c6a66ae7005805004c0484d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355012223233335573e0044a010466a00e66aa028600c6aae754008c014d55cf280118021aba200301213574200222440042442446600200800624464646666ae68cdc3a800a40004642446004006600a6ae84d55cf280191999ab9a3370ea0049001109100091931a99ab9c01201000f00e00d135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931a99ab9c00f00d00c00b135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98d4cd5ce00680580500489baa00112232323333573466e1d400520042122200123333573466e1d40092002232122230030043006357426aae7940108cccd5cd19b87500348000848880088c98d4cd5ce00800700680600580509aab9d5001137540024646666ae68cdc3a800a4004424400446666ae68cdc3a801240004244002464c6a66ae7003002802402001c4d55ce9baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98d4cd5ce00a00900880800780700680600580509aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6a66ae7003402c0280240204d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263533573801401000e00c00a26aae7540044dd50008891119191999ab9a3370e6aae754009200023355009300635742a004600a6ae84d5d1280111931a99ab9c00a008007006135573ca00226ea800526120011122123300100300249103505431001123230010012233003300200200133232332233223232323232323322323232323232323232323232323232332232323232323232323232322222323232533500513355028300a491134578697420456e64706f696e74204572726f72003335501e301a1200123332001502800102e3501d12233002335502a300c491105369676e696e67205478204572726f72003300b500500900113355028300a491164d696e744e465420456e64706f696e74204572726f72003335501e301a1200123332001502800102e3501d12233002335502a300c491105369676e696e67205478204572726f72003300b500500933002335502a300c49011353696e676c6520536372697074204572726f7200323301a00148000c8d400488888888880294014cc008cd540a8c03124110436f6e7420506179696e204572726f7200330125003533535006223500222222222223302700a00b21335502b2350012220023500122001132635335738921154e6f20496e70757420746f2056616c69646174652e0002800a330023300c49010e4e4654204d696e74204572726f72005335323302d5032001323500122222222220075005102e2213500222253350041330273301d0033500d222003330273301d0023232337140046602866602e00202aa07002c6a01c4440046a01a44400266046002900111081a9980119aa815180624810b446174756d204572726f7200300450030011350032235002222222222253353302400a00b2135001223500122233355302312001223500222235008223500522325335335005233500425335333573466e3c0080041281245400c412481248cd4010812494cd4ccd5cd19b8f00200104a049150031049133504900a00910091533500321533500221335002233500223350022335002233036002001204c2335002204c23303600200122204c222335004204c2225335333573466e1c01800c13c13854cd4ccd5cd19b8700500204f04e13303e004001104e104e104715335001210471047504000f132635335738921024c66000310133200135502f225335001102c221533535002222001215335323500122222222225335333553028120015029235001225335333573466e3c00803c0f80f44d40d800c540d400884d40d0d400488004540c940188c8c8c8c854cd4ccccccd5d200291999ab9a3370e6aae7540152000233335573ea00a4a05e46666aae7d4014940c08cccd55cfa8029281891999aab9f35744a00c4a66aa66aa66a60626ae85402484d40d08848ccc00401000c008540c8854cd4c8ccccccd5d20009281a9281a9281a91a81b1bad0022503503635742a012426a06a60040022a0662a06442a66a60646ae85402084d40d4c008004540cc540c8940c80cc0c80c40c0940b8044940b4940b4940b4940b40b8854cd4ccd5cd19b8f3500f2220033500122200303603515335333573466e1ccdc01a807911001240046a00244400406c06a2666ae68cdc79a8079110009a80091100081b01a881a881a881a09aba25001135744a00226aae7940044dd500088178980200089a8009100124c446a0044444444444a66a666aa603a24002a03c4a66a666ae68cdc780600081881809a8148008a81400190818881791299a8008812899ab9c00202432001355026222533500210012213300500133714006a66a666ae68cdc38010048138130a44101300015335333573466e1c0092002027026148901310015335333573466e1c0092004027026148901320015335333573466e1c0092006027026148901330015335333573466e1c0092008027026148901340015335333573466e1c009200a027026148901350015335333573466e1c009200c027026148901360015335333573466e1c009200e027026148901370015335333573466e1c0092010027026148901380015335333573466e1c0092012027026148901390015335333573466e1c00801809c0985220101610015335333573466e1c0092016027026148901620015335333573466e1c0092018027026148901630015335333573466e1c009201a027026148901640015335333573466e1c009201c027026148901650015335333573466e1c009201e0270261489016600100748051221003200135502322225335333573466e1c00c01408c08840044ccc010cdc180180100119a81219b8600300200148000c8004d540848894cd4008407c884d40088894cd4ccd54c04848004d4065405c8d400488ccd54c05448004d407140688d400488ccd40048cc0a12000001223302900200123302800148000004cd54c034480048d400488cd540ac008ccd40048cd54c044480048d400488cd540bc008d5404c00400488ccd55403804c0080048cd54c044480048d400488cd540bc008d54048004004ccd55402403800801840944cc020010018444888ccd54c010480054080cd54c01c480048d400488cd54094008d54024004ccd54c0104800488d4008894cd4ccd54c04048004c8cd406488ccd400c88008008004d40048800448cc004894cd40084098400408c8d400488cc028008014018400c4cd409001000d4084004cd54c01c480048d400488c8cd5409800cc004014c8004d54098894cd40044d5402800c884d4008894cd4cc03000802044888cc0080280104c01800c008c8004d5407c88448894cd40044008884cc014008ccd54c01c480040140100044484888c00c0104484888c004010c8004d540708844894cd400454078884cd407cc010008cd54c0184800401000488ccd5cd19b8f0020010190183200135501a22253350021333573466e1c004010064060884d400888d40048894cd4004854cd4ccd5cd19b8900900c02102013300b0073370001201820402a66a666ae68cdc480400581000f899805003004080fa4004446666a0024a01c4a01c4a01c4666aa600824002a00a46a00244a66aa66a666ae68cdc79a801110011a8021100100d00c8999ab9a3370e6a004440026a00844002034032203226a0240062a022006640026aa02e4422444a66a00226a00644002442666a00a440046008004666aa600e2400200a008002266a00e44a66a004420062002a01244666ae68cdc38010008098090919a800a8092809889119aa8011a802a8018008891980080100791299a801080088070919a80111199a801910010010009a80091000891091980080180111999999aba400125003250032500325003235004375c004008242446004006224400224002244a66a00420022a66a002200e20102244600400244666ae68cdc4001000802803190009aa803911299a80088011109a8011119803999804001003000801990009aa8031111299a80088011109a80111299a999ab9a3370e00290000050048999804003803001899980400399a805891998008040018010030018910010910008891001091091198008020018891091980080180108919180080091198019801001000a4411ca2108b7b1704f9fe12c906096ea1634df8e089c9ccfd651abae4a4390001"
}
97 changes: 97 additions & 0 deletions nft-locking-contract/pab/Main.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

module Main(main, writeCostingScripts) where

import Control.Monad (void)
import Control.Monad.Freer (interpret)
import Control.Monad.IO.Class (MonadIO (..))
import Data.Aeson (FromJSON (..), ToJSON (..), genericToJSON, genericParseJSON
, defaultOptions, Options(..))
import Data.Default (def)
import qualified Data.OpenApi as OpenApi
import Data.Text.Prettyprint.Doc (Pretty (..), viaShow)
import GHC.Generics (Generic)
import Plutus.Contract (ContractError)
import Plutus.PAB.Effects.Contract.Builtin (Builtin, SomeBuiltin (..), BuiltinHandler(contractHandler))
import qualified Plutus.PAB.Effects.Contract.Builtin as Builtin
import Plutus.PAB.Simulator (SimulatorEffectHandlers)
import qualified Plutus.PAB.Simulator as Simulator
import qualified Plutus.PAB.Webserver.Server as PAB.Server
-- import Plutus.Contracts.Game as Game
import Plutus.Trace.Emulator.Extract (writeScriptsTo, ScriptsConfig (..), Command (..))
import Ledger.Index (ValidatorMode(..))

import LockingContract

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
-- Example of spinning up a game instance on startup
-- void $ Simulator.activateContract (Wallet 1) GameContract
-- You can add simulator actions here:
-- Simulator.observableState
-- etc.
-- That way, the simulation gets to a predefined state and you don't have to
-- use the HTTP API for setup.

-- 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

-- | An example of computing the script size for a particular trace.
-- Read more: <https://plutus.readthedocs.io/en/latest/plutus/howtos/analysing-scripts.html>
writeCostingScripts :: IO ()
writeCostingScripts = do
putStrLn $ "ExBudget = "


data StarterContracts =
LockingContract
deriving (Eq, Ord, Show, Generic)
deriving anyclass OpenApi.ToSchema

-- 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

instance Builtin.HasDefinitions StarterContracts where
getDefinitions = [LockingContract]
getSchema = \case
LockingContract -> Builtin.endpointsToSchemas @LockingContract.Schema
getContract = \case
LockingContract -> SomeBuiltin (LockingContract.contract @ContractError)

handlers :: SimulatorEffectHandlers (Builtin StarterContracts)
handlers =
Simulator.mkSimulatorHandlers def def
$ interpret (contractHandler Builtin.handleBuiltin)


1 change: 1 addition & 0 deletions nft-locking-contract/quick-build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cabal build -w ghc-8.10.4
Loading