Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate to PureScript 0.15 #1521

Merged
merged 101 commits into from
Dec 15, 2023
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
c40c786
build: update `purs`, update `spago`, upgrade package-set
errfrom Jun 29, 2023
5d0d316
build: update `medea` and `sequences` deps, remove `math`
errfrom Jun 29, 2023
dcc6a7c
build: update `bignumber` dependency, fix `flake.nix`
errfrom Jun 29, 2023
87606c0
build: update `aeson` dependency
errfrom Jun 29, 2023
36c0ce2
build: update `noble-secp256k1` dependency
errfrom Jun 30, 2023
cc5dc89
build: update `toppokki` dependency
errfrom Jun 30, 2023
1f2f31e
build: use esm exports, fix aeson instances for `Plutus.AssocMap`
errfrom Jun 30, 2023
856ed1d
build: select affjax driver based on environment (node or browser)
errfrom Jun 30, 2023
4c66024
style: fix formatting
errfrom Jun 30, 2023
b41ca18
build: bump `purs` to v0.15.8
errfrom Jun 30, 2023
8cb2766
build: fix `ToData` and `FromData` instances
errfrom Jul 3, 2023
43678ef
build: use `frequency` with `NonEmptyArray`
errfrom Jul 3, 2023
389c5ce
build: use `exists` from `Node.FS.Sync` (ctl compiles!)
errfrom Jul 3, 2023
3ac0f74
build: multiple changes
errfrom Jul 4, 2023
6e061e1
build: fix `package.json`, re-gen `spago-packages.nix`, fix formatting
errfrom Jul 4, 2023
0cb50b1
chore: fix warnings
errfrom Jul 4, 2023
ba71dfa
build: fix plutip tests
errfrom Jul 5, 2023
682badc
build: bundle and serve using `esbuild`
errfrom Jul 6, 2023
ae495bd
style: fix formatting
errfrom Jul 6, 2023
a7799f2
style: remove unused imports
errfrom Jul 6, 2023
6f2758b
build: use `esm` imports in `nix/default.nix`
errfrom Jul 6, 2023
084ca27
build: use `esm` imports in `nix/default.nix`
errfrom Jul 6, 2023
fe138b0
build: create `node_modules` symlink for `NODE_PATH`
errfrom Jul 6, 2023
70e3356
build: disable md link check for `the-plutus-scaffold`
errfrom Jul 6, 2023
1b3b13d
fix: fix unit tests
errfrom Jul 6, 2023
7993b9f
build: bundle using `esbuild` for e2e tests
errfrom Jul 6, 2023
ef1441b
build: use dynamic imports when selecting affjax driver
errfrom Jul 6, 2023
d1f1e1d
build: update `templates/ctl-scaffold`
errfrom Jul 7, 2023
5a80b60
build: update dependencies
errfrom Jul 7, 2023
e5c6014
build: drop `sequences` dependency
errfrom Jul 7, 2023
218b70c
build: fix bundling using `webpack`
errfrom Jul 11, 2023
b7a151f
Use CSL version with GC
klntsky Aug 1, 2023
ebe2c7b
Update docs
klntsky Aug 4, 2023
35debff
Do not store scripts in external files
klntsky Aug 8, 2023
812afec
Fix unit tests
klntsky Aug 9, 2023
ccc7466
Update the template
klntsky Aug 9, 2023
325665b
Update NodeJS deps in the template
klntsky Aug 9, 2023
b462b65
Update CTL revision in the CTL template
klntsky Aug 9, 2023
fd65ad4
Update the template and docs
klntsky Aug 10, 2023
7139e1e
WIP
klntsky Sep 13, 2023
f1514a1
Merge remote-tracking branch 'origin/develop' into dshuiski/purs-0.15…
klntsky Oct 6, 2023
f318a77
Update spago dependencies, fix broken link
klntsky Oct 6, 2023
b764665
Fix 'Invalid "exports" main target "index.js" defined in the package …
klntsky Oct 6, 2023
0c314cc
Fix toppoki dependency
klntsky Oct 6, 2023
62faa6e
Inline script contents in ApplyArgs example to avoid bundling files
klntsky Oct 6, 2023
d51471f
Move Blockfrost API key setup to the core of the lib
klntsky Oct 10, 2023
2c01b2d
Synchronize webpack config in the template
klntsky Oct 10, 2023
5072d03
WIP: refactor bundling; let bundle* commands produce just the bundle
klntsky Oct 11, 2023
3565be1
Only enable blockfrost examples if blockfrost key is set
klntsky Oct 11, 2023
3c7c67d
Separate building of deps and sources in nix
klntsky Oct 12, 2023
1604657
Move compilers to nativeBuildInputs
klntsky Oct 12, 2023
29695e6
Rewrite the bundling system (Nix & Makefile)
klntsky Oct 13, 2023
eb8e7e8
Fix internal module name (Ctl.Internal.Test.E2E.Route)
klntsky Oct 13, 2023
0825b1b
Remove html-webpack-plugin dependency
klntsky Oct 13, 2023
bf1de19
Simplify esbuild script in nix
klntsky Oct 13, 2023
8014c94
Simplify webpack build script in nix
klntsky Oct 13, 2023
d568417
Synchronize webpack & esbuild setup in the template
klntsky Oct 13, 2023
19be30b
Update template's Makefile
klntsky Oct 13, 2023
d2fe25d
Use JS.BigInt
kozross Oct 16, 2023
c8ce038
Merge pull request #1553 from Plutonomicon/klntsky/refactor-bundling-…
klntsky Oct 17, 2023
6e4debe
Support nodejs bundling. Proxy-pass kupo requests when serving via es…
klntsky Oct 17, 2023
080e06b
Update the template
klntsky Oct 17, 2023
cc808a7
Update formatting rules
klntsky Oct 17, 2023
f3dc557
Merge branch 'dshuiski/purs-0.15-migration' into koz/1472
kozross Oct 17, 2023
73ea867
Merge pull request #1554 from Plutonomicon/klntsky/support-nodejs-bun…
klntsky Oct 20, 2023
f729825
Merge branch 'dshuiski/purs-0.15-migration' into koz/1472
kozross Oct 22, 2023
0ccc85d
Update error message fixtures in plutip tests
klntsky Nov 8, 2023
c677f5f
Use newer purescript-aeson and json-bigint
klntsky Nov 8, 2023
539093d
Remove big-integer runtime dep, update the template
klntsky Nov 8, 2023
fbf56b2
Adds a missing NPM json-bigint upgrade in CTL scaffold
bladyjoker Nov 9, 2023
6b76ffe
Merge pull request #1551 from Plutonomicon/koz/1472
klntsky Nov 9, 2023
dba4895
Merge remote-tracking branch 'origin' into dshuiski/purs-0.15-migration
klntsky Nov 10, 2023
02869ce
Fixes runPursTest setting of `node_modules`
bladyjoker Nov 13, 2023
49766d5
Merge pull request #1557 from Plutonomicon/bladyjoker/runpurstest-fix
klntsky Nov 13, 2023
acbd363
Merge remote-tracking branch 'origin/develop' into dshuiski/purs-0.15…
klntsky Nov 21, 2023
908927e
Update `easy-purscript-nix` nix flake input
aciceri Nov 21, 2023
98de298
Add Hercules CI `flake-update` effect
aciceri Nov 22, 2023
4eebbd4
Update `easy-purscript-nix` nix flake input
aciceri Nov 21, 2023
a0469eb
Fix merge
klntsky Nov 24, 2023
fffaed0
Fix formatting, improve unit test speed
klntsky Nov 25, 2023
46be734
Fix Arion volumes
aciceri Dec 5, 2023
809f3e3
Merge pull request #1561 from Plutonomicon/aciceri/upgrade-easy-pures…
klntsky Dec 5, 2023
865faae
Merge branch 'dshuiski/purs-0.15-migration' of github.com:Plutonomico…
klntsky Dec 5, 2023
a5879fd
Fixes CIP links to https://cips.cardano.org/cip/CIP-...
bladyjoker Dec 11, 2023
7620749
Merge remote-tracking branch 'plutonomicon/develop' into dshuiski/pur…
bladyjoker Dec 11, 2023
cfcaa6c
Trying an upgrade of cardano-node v8.1.1 and pinned cardano-configs
bladyjoker Dec 11, 2023
7a6c763
Trying out plutip?ref=gergley/version-bump
bladyjoker Dec 11, 2023
d86035e
Merge branch 'dshuiski/purs-0.15-migration' of github.com:Plutonomico…
klntsky Dec 11, 2023
ea6c393
Uses cardano-node 8.1.1 from flake inputs in all places (no dockerhub)
bladyjoker Dec 12, 2023
5c97dcf
Uses Kupo from flake inputs and fixes cardano-node
bladyjoker Dec 12, 2023
1666aba
Merge pull request #1573 from Plutonomicon/bladyjoker/upgrading-carda…
klntsky Dec 12, 2023
bec703d
Merge branch 'dshuiski/purs-0.15-migration' of github.com:Plutonomico…
klntsky Dec 13, 2023
8761720
Merge remote-tracking branch 'origin/develop' into dshuiski/purs-0.15…
klntsky Dec 13, 2023
774c005
Remove duplicate logging from plutip
klntsky Dec 13, 2023
7f43c00
Update the template
klntsky Dec 13, 2023
1f2e3a4
Remove searchable docs from nix machinery for now
klntsky Dec 15, 2023
cf8ffac
Update template's .gitignore
klntsky Dec 15, 2023
9f05925
Fix jssha import
klntsky Dec 15, 2023
a742692
Update CHANGELOG, docs and README
klntsky Dec 15, 2023
d78a808
Update the template
klntsky Dec 15, 2023
485cf79
Fix markdown link
klntsky Dec 15, 2023
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
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,14 @@ result-*
.node
.node-cfg
.projectile
/dist/
/dist/*
!/dist/esbuild/
/dist/esbuild/*
!/dist/esbuild/index.html
klntsky marked this conversation as resolved.
Show resolved Hide resolved
!/dist/esbuild/wrapper.js
!/dist/webpack/
/dist/webpack/*
!/dist/webpack/.gitkeep
output.js
.DS_Store
.idea/
Expand Down
27 changes: 20 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,21 +1,34 @@
SHELL := bash
.ONESHELL:
.PHONY: run-dev run-build check-format format query-testnet-tip clean check-explicit-exports
.PHONY: esbuild-bundle esbuild-serve webpack-bundle webpack-serve check-format format query-testnet-tip clean check-explicit-exports
.SHELLFLAGS := -eu -o pipefail -c

ps-sources := $(shell fd --no-ignore-parent -epurs)
nix-sources := $(shell fd --no-ignore-parent -enix --exclude='spago*')
js-sources := $(shell fd --no-ignore-parent -ejs)
ps-entrypoint := Ctl.Examples.ByUrl # points to one of the example PureScript modules in examples/
ps-bundle = spago bundle-module -m ${ps-entrypoint} --to output.js
preview-node-ipc = $(shell docker volume inspect store_node-preview-ipc | jq -r '.[0].Mountpoint')
preprod-node-ipc = $(shell docker volume inspect store_node-preprod-ipc | jq -r '.[0].Mountpoint')

run-dev:
@${ps-bundle} && BROWSER_RUNTIME=1 webpack-dev-server --progress
esbuild-bundle:
@spago build \
&& cp -rf fixtures dist/esbuild \
&& BROWSER_RUNTIME=1 node esbuild/bundle.js ${ps-entrypoint}

run-build:
@${ps-bundle} && BROWSER_RUNTIME=1 webpack --mode=production
esbuild-serve:
@spago build \
&& cp -rf fixtures dist/esbuild \
&& BROWSER_RUNTIME=1 node esbuild/serve.js ${ps-entrypoint}

webpack-bundle:
@spago build \
&& rm -rf dist/webpack/* \
&& cp -rf fixtures/* dist/webpack \
&& BROWSER_RUNTIME=1 webpack --mode=production --env entry=./output/${ps-entrypoint}/index.js

webpack-serve:
@spago build \
&& BROWSER_RUNTIME=1 webpack-dev-server --progress --env entry=./output/${ps-entrypoint}/index.js

.ONESHELL:
check-explicit-exports:
Expand All @@ -36,7 +49,7 @@ check-format: check-explicit-exports check-examples-imports check-whitespace
@purs-tidy check ${ps-sources}
@nixpkgs-fmt --check ${nix-sources}
@prettier --loglevel warn -c ${js-sources}
@eslint --quiet ${js-sources}
@eslint --quiet ${js-sources} --parser-options 'sourceType: module'

format:
@purs-tidy format-in-place ${ps-sources}
Expand Down
13 changes: 13 additions & 0 deletions dist/esbuild/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en" data-framework="purescript">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
<script type="module">
import("./index.js").then(m => m.main());
</script>
Examples source code is located in <i>examples/</i> directory.<br>
klntsky marked this conversation as resolved.
Show resolved Hide resolved
</body>
</html>
Empty file added dist/webpack/.gitkeep
Empty file.
2 changes: 2 additions & 0 deletions doc/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ Then, add `https://public-plutonomicon.cachix.org` and `public-plutonomicon.cach

The easiest way to create a new CTL project is to use our `ctl-scaffold` flake template. This lives in the CTL repo -- you can have a look [here](../templates/ctl-scaffold). It contains a simple, yet complete, flakes-based scaffolding project with example `outputs` for a CTL project, including its runtime.

<!-- markdown-link-check-disable -->
klntsky marked this conversation as resolved.
Show resolved Hide resolved
Alternatively, consider [the-plutus-scaffold](https://github.com/mlabs-haskell/the-plutus-scaffold) flake template. It's a scaffold built on top of the above mentioned `ctl-scaffold`, but includes a react based frontend and a haskell onchain additionaly. It's more of a demo application, than a minimal working example.
<!-- markdown-link-check-enable -->

A new project can be initialized as follows:

Expand Down
4 changes: 4 additions & 0 deletions esbuild/bundle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import * as esbuild from "esbuild";
import { buildOptions } from "./config.js";

esbuild.build(buildOptions);
28 changes: 28 additions & 0 deletions esbuild/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { wasmLoader } from "esbuild-plugin-wasm";
import { polyfillNode } from "esbuild-plugin-polyfill-node";

export const buildOptions = {
entryPoints: [`output/${process.argv[2]}/index.js`],
outdir: "dist/esbuild",
define: {
BROWSER_RUNTIME: process.env.BROWSER_RUNTIME,
SCRIPTS_DIR: '"fixtures/scripts"',
},
plugins: [
polyfillNode({
polyfills: {
crypto: true,
fs: true,
os: true,
},
}),
wasmLoader({
mode: "deferred",
}),
],
bundle: true,
platform: "browser",
format: "esm",
treeShaking: true,
logLevel: "error",
};
9 changes: 9 additions & 0 deletions esbuild/serve.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as esbuild from "esbuild";
import { buildOptions } from "./config.js";

const ctx = await esbuild.context(buildOptions);
await ctx.serve({
host: "127.0.0.1",
port: 4008,
servedir: "dist/esbuild",
});
14 changes: 0 additions & 14 deletions examples/AlwaysMints.js

This file was deleted.

29 changes: 10 additions & 19 deletions examples/AlwaysMints.purs
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,16 @@ import Contract.Prelude

import Contract.Config (ContractParams, testnetNamiConfig)
import Contract.Log (logInfo')
import Contract.Monad (Contract, launchAff_, runContract)
import Contract.Monad (Contract, launchAff_, liftContractAffM, runContract)
import Contract.ScriptLookups as Lookups
import Contract.Scripts (MintingPolicy(PlutusMintingPolicy))
import Contract.TextEnvelope
( decodeTextEnvelope
, plutusScriptV1FromEnvelope
)
import Contract.TextEnvelope (decodeTextEnvelope, plutusScriptV1FromEnvelope)
import Contract.Transaction (awaitTxConfirmed, submitTxFromConstraints)
import Contract.TxConstraints as Constraints
import Contract.Value as Value
import Control.Monad.Error.Class (liftMaybe)
import Ctl.Examples.Helpers
( mkCurrencySymbol
, mkTokenName
) as Helpers
import Ctl.Examples.Helpers (mkCurrencySymbol, mkTokenName) as Helpers
import Ctl.Examples.Helpers.LoadScript (loadScript)
import Data.BigInt as BigInt
import Effect.Exception (error)

main :: Effect Unit
main = example testnetNamiConfig
Expand Down Expand Up @@ -57,14 +50,12 @@ example :: ContractParams -> Effect Unit
example cfg = launchAff_ $ do
runContract cfg contract

foreign import alwaysMints :: String

alwaysMintsPolicyMaybe :: Maybe MintingPolicy
alwaysMintsPolicyMaybe = do
envelope <- decodeTextEnvelope alwaysMints
PlutusMintingPolicy <$> plutusScriptV1FromEnvelope envelope
alwaysMintsPolicyMaybe :: Aff (Maybe MintingPolicy)
alwaysMintsPolicyMaybe =
loadScript "always-mints.plutus" <#> \alwaysMints -> do
envelope <- decodeTextEnvelope alwaysMints
PlutusMintingPolicy <$> plutusScriptV1FromEnvelope envelope

alwaysMintsPolicy :: Contract MintingPolicy
alwaysMintsPolicy =
liftMaybe (error "Error decoding alwaysMintsPolicy")
alwaysMintsPolicyMaybe
liftContractAffM "Error decoding alwaysMintsPolicy" alwaysMintsPolicyMaybe
15 changes: 0 additions & 15 deletions examples/AlwaysSucceeds.js

This file was deleted.

9 changes: 4 additions & 5 deletions examples/AlwaysSucceeds.purs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
-- | balance, and submit a smart-contract transaction. It creates a transaction
-- | that pays two Ada to the `AlwaysSucceeds` script address.
module Ctl.Examples.AlwaysSucceeds
( alwaysSucceeds
, alwaysSucceedsScript
( alwaysSucceedsScript
, contract
, example
, main
Expand Down Expand Up @@ -35,6 +34,7 @@ import Contract.Utxos (utxosAt)
import Contract.Value as Value
import Contract.Wallet (ownStakePubKeyHashes)
import Control.Monad.Error.Class (liftMaybe)
import Ctl.Examples.Helpers.LoadScript (loadScript)
import Data.Array (head)
import Data.BigInt as BigInt
import Data.Lens (view)
Expand Down Expand Up @@ -118,10 +118,9 @@ spendFromAlwaysSucceeds vhash validator txId = do
awaitTxConfirmed spendTxId
logInfo' "Successfully spent locked values."

foreign import alwaysSucceeds :: String

alwaysSucceedsScript :: Contract Validator
alwaysSucceedsScript =
alwaysSucceedsScript = do
alwaysSucceeds <- liftAff $ loadScript "always-succeeds.plutus"
liftMaybe (error "Error decoding alwaysSucceeds") do
envelope <- decodeTextEnvelope alwaysSucceeds
Validator <$> plutusScriptV1FromEnvelope envelope
14 changes: 0 additions & 14 deletions examples/ECDSA.js

This file was deleted.

16 changes: 8 additions & 8 deletions examples/ECDSA.purs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import Contract.Crypto.Secp256k1.Utils
, randomSecp256k1PrivateKey
)
import Contract.Log (logInfo')
import Contract.Monad (Contract, liftContractM)
import Contract.Monad (Contract, liftContractAffM, liftContractM)
import Contract.Numeric.BigNum as BigNum
import Contract.PlutusData
( class ToData
Expand All @@ -36,6 +36,7 @@ import Contract.Transaction
import Contract.TxConstraints as Constraints
import Contract.Utxos (utxosAt)
import Contract.Value as Value
import Ctl.Examples.Helpers.LoadScript (loadScript)
import Data.Map as Map
import Data.Set as Set

Expand All @@ -59,7 +60,7 @@ contract = do
-- | Prepare the ECDSA test by locking some funds at the validator address
prepTest :: Contract TransactionHash
prepTest = do
validator <- liftContractM "Caonnot get validator" getValidator
validator <- liftContractAffM "Caonnot get validator" getValidator
let
valHash = validatorHash validator

Expand All @@ -85,7 +86,7 @@ testVerification
testVerification txId ecdsaRed = do
let red = Redeemer $ toData ecdsaRed

validator <- liftContractM "Can't get validator" getValidator
validator <- liftContractAffM "Can't get validator" getValidator
let valHash = validatorHash validator

netId <- getNetworkId
Expand Down Expand Up @@ -128,8 +129,7 @@ testECDSA txId = do
, pk: publicKey
}

getValidator :: Maybe Validator
getValidator = do
decodeTextEnvelope validateECDSA >>= plutusScriptV2FromEnvelope >>> map wrap

foreign import validateECDSA :: String
getValidator :: Aff (Maybe Validator)
getValidator =
loadScript "validate-ecdsa.plutus" <#> \validateECDSA ->
decodeTextEnvelope validateECDSA >>= plutusScriptV2FromEnvelope >>> map wrap
15 changes: 0 additions & 15 deletions examples/ExUnits.js

This file was deleted.

6 changes: 3 additions & 3 deletions examples/ExUnits.purs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import Contract.Utxos (utxosAt)
import Contract.Value as Value
import Contract.Wallet (ownStakePubKeyHashes)
import Control.Monad.Error.Class (liftMaybe)
import Ctl.Examples.Helpers.LoadScript (loadScript)
import Data.Array (head)
import Data.BigInt (BigInt)
import Data.BigInt as BigInt
Expand Down Expand Up @@ -120,10 +121,9 @@ spendFromExUnits iters vhash validator txId = do
awaitTxConfirmed spendTxId
logInfo' "Successfully spent locked values."

foreign import exUnits :: String

exUnitsScript :: Contract Validator
exUnitsScript =
exUnitsScript = do
exUnits <- liftAff $ loadScript "exunits.plutus"
liftMaybe (error "Error decoding exUnits") do
envelope <- decodeTextEnvelope exUnits
Validator <$> plutusScriptV2FromEnvelope envelope
12 changes: 12 additions & 0 deletions examples/Helpers/LoadScript.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* global BROWSER_RUNTIME SCRIPTS_DIR */

export const _loadScript = path => async () => {
if (typeof BROWSER_RUNTIME != "undefined" && BROWSER_RUNTIME) {
const response = await fetch(`${SCRIPTS_DIR}/${path}`);
return await response.text();
} else {
const fs = await import("fs");
const url = new URL(`../../fixtures/scripts/${path}`, import.meta.url);
return fs.readFileSync(url, "utf8");
}
};
14 changes: 14 additions & 0 deletions examples/Helpers/LoadScript.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module Ctl.Examples.Helpers.LoadScript
( loadScript
) where

import Prelude

import Control.Promise (Promise, toAffE)
import Effect (Effect)
import Effect.Aff (Aff)

foreign import _loadScript :: String -> Effect (Promise String)

loadScript :: String -> Aff String
loadScript filepath = toAffE $ _loadScript filepath
15 changes: 0 additions & 15 deletions examples/IncludeDatum.js

This file was deleted.

Loading