From ce93d4517ee6727a08c2b5a75cae323602766fd6 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 13:06:28 +0300 Subject: [PATCH 01/16] Fix #81: Add Chang HF SOP User Story coverage --- e2e-tests/e2e-tests.cabal | 3 + e2e-tests/test/PlutusScripts/SOP/Common.hs | 53 ++++++++++++++ e2e-tests/test/PlutusScripts/SOP/V_1_1.hs | 44 ++++++++++++ e2e-tests/test/Spec.hs | 2 + e2e-tests/test/Spec/Builtins/SOP.hs | 76 +++++++++++++++++++++ issue.txt | 40 +++++++++++ issue81.json | Bin 0 -> 11464 bytes issue81_utf8.json | 0 8 files changed, 218 insertions(+) create mode 100644 e2e-tests/test/PlutusScripts/SOP/Common.hs create mode 100644 e2e-tests/test/PlutusScripts/SOP/V_1_1.hs create mode 100644 e2e-tests/test/Spec/Builtins/SOP.hs create mode 100644 issue.txt create mode 100644 issue81.json create mode 100644 issue81_utf8.json diff --git a/e2e-tests/e2e-tests.cabal b/e2e-tests/e2e-tests.cabal index 0ec3899..8cb0cfc 100644 --- a/e2e-tests/e2e-tests.cabal +++ b/e2e-tests/e2e-tests.cabal @@ -166,6 +166,9 @@ test-suite antaeus-test Spec.Builtins.BLS Spec.Builtins.Hashing Spec.Builtins.SECP256k1 + Spec.Builtins.SOP + PlutusScripts.SOP.Common + PlutusScripts.SOP.V_1_1 Spec.ConwayFeatures Spec.WriteScriptFiles diff --git a/e2e-tests/test/PlutusScripts/SOP/Common.hs b/e2e-tests/test/PlutusScripts/SOP/Common.hs new file mode 100644 index 0000000..4ab8714 --- /dev/null +++ b/e2e-tests/test/PlutusScripts/SOP/Common.hs @@ -0,0 +1,53 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NumericUnderscores #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE ViewPatterns #-} +{-# OPTIONS_GHC -Wno-missing-fields #-} +{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-} + +module PlutusScripts.SOP.Common where + +import Cardano.Api qualified as C +import PlutusScripts.Helpers ( + toScriptData, + ) +import PlutusTx qualified +import PlutusTx.Prelude qualified as P + +data SOPRedeemer + = Sum1 Integer + | Sum2 Integer Integer + | Sum3 Integer Integer Integer + +PlutusTx.unstableMakeIsData ''SOPRedeemer +PlutusTx.makeLift ''SOPRedeemer + +{-# INLINEABLE mkSopPolicyV3 #-} +mkSopPolicyV3 :: SOPRedeemer -> P.BuiltinUnit +mkSopPolicyV3 redeemer = + case redeemer of + Sum1 a -> + P.check (a P.== 1) + Sum2 a b -> + P.check (a P.== 1 P.&& b P.== 2) + Sum3 a b c -> + P.check (a P.== 1 P.&& b P.== 2 P.&& c P.== 3) + +sopAssetName :: C.AssetName +sopAssetName = C.AssetName "sop" + +sopRedeemer1 :: C.HashableScriptData +sopRedeemer1 = toScriptData (Sum1 1) + +sopRedeemer2 :: C.HashableScriptData +sopRedeemer2 = toScriptData (Sum2 1 2) + +sopRedeemer3 :: C.HashableScriptData +sopRedeemer3 = toScriptData (Sum3 1 2 3) + +sopRedeemerFail :: C.HashableScriptData +sopRedeemerFail = toScriptData (Sum3 1 2 4) diff --git a/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs b/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs new file mode 100644 index 0000000..c21a56a --- /dev/null +++ b/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs @@ -0,0 +1,44 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NumericUnderscores #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeApplications #-} +{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-} +{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.1.0 #-} + +module PlutusScripts.SOP.V_1_1 where + +import Cardano.Api qualified as C +import Cardano.Api.Shelley qualified as C +import PlutusCore.Version (plcVersion110) +import PlutusLedgerApi.Common (SerialisedScript, serialiseCompiledCode) +import PlutusScripts.SOP.Common (mkSopPolicyV3, sopAssetName) +import PlutusScripts.Helpers ( + mintScriptWitness, + plutusL3, + policyIdV3, + toScriptData, + ) +import PlutusTx qualified + +checkSopPolicy :: SerialisedScript +checkSopPolicy = + serialiseCompiledCode $ + $$(PlutusTx.compile [||mkSopPolicyV3||]) + +checkSopPolicyScriptV3 :: C.PlutusScript C.PlutusScriptV3 +checkSopPolicyScriptV3 = C.PlutusScriptSerialised checkSopPolicy + +checkSopAssetIdV3 :: C.AssetId +checkSopAssetIdV3 = C.AssetId (policyIdV3 checkSopPolicy) sopAssetName + +checkSopMintWitnessV3 + :: C.ShelleyBasedEra era + -> C.HashableScriptData + -> (C.PolicyId, C.ScriptWitness C.WitCtxMint era) +checkSopMintWitnessV3 sbe redeemer = + ( policyIdV3 checkSopPolicy + , mintScriptWitness sbe plutusL3 (Left checkSopPolicyScriptV3) redeemer + ) diff --git a/e2e-tests/test/Spec.hs b/e2e-tests/test/Spec.hs index 629984f..4cd5d2e 100644 --- a/e2e-tests/test/Spec.hs +++ b/e2e-tests/test/Spec.hs @@ -39,6 +39,7 @@ import Spec.AlonzoFeatures qualified as Alonzo import Spec.BabbageFeatures qualified as Babbage import Spec.Builtins qualified as Builtins import Spec.Builtins.Bitwise qualified as Conway +import Spec.Builtins.SOP qualified as SOP import Spec.ConwayFeatures qualified as Conway import Spec.WriteScriptFiles (writeV3ScriptFiles) import System.Directory (createDirectoryIfMissing) @@ -315,6 +316,7 @@ pv9Tests resultsRef = integrationRetryWorkspace 0 "pv9" $ \tempAbsPath -> do run Conway.integerToByteStringBitwiseSizeArgumentGreaterThan8192ErrorTestInfo -- Failing for unknown reason , run Conway.verifyBitwiseFunctionsTestInfo + , run SOP.verifySopTestInfo ] failureMessages <- liftIO $ suiteFailureMessages resultsRef diff --git a/e2e-tests/test/Spec/Builtins/SOP.hs b/e2e-tests/test/Spec/Builtins/SOP.hs new file mode 100644 index 0000000..9ae91a7 --- /dev/null +++ b/e2e-tests/test/Spec/Builtins/SOP.hs @@ -0,0 +1,76 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE NumericUnderscores #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# OPTIONS_GHC -Wno-missing-import-lists #-} +{-# OPTIONS_GHC -Wno-missing-signatures #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +-- Not using all CardanoEra +{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-} + +module Spec.Builtins.SOP where + +import Cardano.Api qualified as C +import Control.Monad.IO.Class (MonadIO) +import Data.Map qualified as Map +import GHC.IsList (fromList) +import Hedgehog (MonadTest) +import Helpers.Common (toShelleyBasedEra) +import Helpers.Query qualified as Q +import Helpers.Test (assert) +import Helpers.TestData (TestInfo (..), TestParams (..)) +import Helpers.Testnet qualified as TN +import Helpers.Tx qualified as Tx +import PlutusScripts.SOP.Common qualified as SOP +import PlutusScripts.SOP.V_1_1 qualified as SOP_1_1 + +verifySopTestInfo = + TestInfo + { testName = "verifySopTest" + , testDescription = + "Sums-of-products optimization can be used in Plutus V3 scripts to mint." + , test = verifySopTest + } + +verifySopTest + :: (MonadIO m, MonadTest m) + => TN.TestEnvironmentOptions era + -> TestParams era + -> m (Maybe String) +verifySopTest networkOptions TestParams{localNodeConnectInfo, pparams, networkId, tempAbsPath} = do + era <- TN.eraFromOptionsM networkOptions + (w1SKey, w1Address) <- TN.w1 tempAbsPath networkId + let sbe = toShelleyBasedEra era + + -- Only Plutus V3 supports natively compiled SOPs. Therefore, run only in Conway+ + case era of + C.ConwayEra -> do + txIn <- Q.adaOnlyTxInAtAddress era localNodeConnectInfo w1Address + + let + tokenValues = fromList [(SOP_1_1.checkSopAssetIdV3, 5)] + mintWitnesses = Map.fromList [SOP_1_1.checkSopMintWitnessV3 sbe SOP.sopRedeemer3] + + txOut = Tx.txOut era (C.lovelaceToValue 3_000_000 <> tokenValues) w1Address + collateral = Tx.txInsCollateral era [txIn] + txBodyContent = + (Tx.emptyTxBodyContent sbe pparams) + { C.txIns = Tx.pubkeyTxIns [txIn] + , C.txInsCollateral = collateral + , C.txMintValue = Tx.txMintValue era tokenValues mintWitnesses + , C.txOuts = [txOut] + } + + -- Build and submit transaction + signedTx <- Tx.buildTx era localNodeConnectInfo txBodyContent w1Address w1SKey + Tx.submitTx sbe localNodeConnectInfo signedTx + let expectedTxIn = Tx.txIn (Tx.txId signedTx) 0 + + -- Query for txo and assert it contains newly minting tokens to prove successful use of SOP + resultTxOut <- + Q.getTxOutAtAddress era localNodeConnectInfo w1Address expectedTxIn "TN.getTxOutAtAddress" + txOutHasTokenValue <- Q.txOutHasValue resultTxOut tokenValues + assert "txOut has SOP tokens" txOutHasTokenValue + _ -> + assert "SOP feature is only applicable starting from Conway era" True diff --git a/issue.txt b/issue.txt new file mode 100644 index 0000000..bbc1221 --- /dev/null +++ b/issue.txt @@ -0,0 +1,40 @@ + +Chang HF User Stories Coverage +============================== + +Last updated **2024-01-30** for **cardano-node 8.7.2** +  + +**Legend:** ![Success Badge][success-badge] ![Failure Badge][failure-badge] ![Uncovered Badge][uncovered-badge] +  + + +Smart Contract User Stories +---------------- + +| Status for Story ID | Title | Story Overview | +|---------------------|-------|----------------| +|[![Status Badge][CIP-85-badge]][CIP-85-link] PlutusV3 is not supported in this build so cannot use plutus-tx compiler v1.1.0| Sums-of-products in Plutus v3 [→][CIP-85-req] | As a DApp developer I want to use sums-of-products instead of Scott-encoding in my Plutus scripts to get better performance.| +|[![Status Badge][CIP-101-badge]][CIP-101-link] Plutus version in use doesn't include this builtin| Keccak256 in Plutus v3 [→][CIP-101-req] | As a DApp developer I want to use the Keccak hashing function to validate ECDSA signatures formatted via the EVM standard. | +|[![Status Badge][PLT-001-badge]][PLT-001-link] Plutus version in use doesn't include this builtin| Blake2b-224 in Plutus v3 [→][PLT-001-req] | As a DApp developer I want to use the Blake2b-224 hashing function to compute PubKeyHash onchain. | +|[![Status Badge][CIP-87-badge]][CIP-87-link] Plutus version in use doesn't include this builtin| Use bitwise operations in Plutus V3 [→][CIP-87-req] | As a DApp developer I want to use bitwise operations So that I can work with data bytestrings in a more granular and optimized way and perform operations at the bit level. | + + +[success-badge]: https://img.shields.io/badge/success-green +[failure-badge]: https://img.shields.io/badge/failure-red +[uncovered-badge]: https://img.shields.io/badge/uncovered-grey + +[CIP-85-badge]: https://img.shields.io/badge/CIP-85-grey +[CIP-101-badge]: https://img.shields.io/badge/CIP-101-grey +[PLT-001-badge]: https://img.shields.io/badge/PLT-001-grey +[CIP-87-badge]: https://img.shields.io/badge/CIP-87-grey + +[CIP-85-link]: https://github.com/input-output-hk/antaeus/blob/cardano-node_8-7-2/e2e-tests/test/Spec.hs#L180-L203 +[CIP-101-link]: https://github.com/input-output-hk/antaeus/pull/43 +[PLT-001-link]: https://github.com/input-output-hk/antaeus/pull/43 +[CIP-87-link]: https://github.com/input-output-hk/antaeus/pull/79 + +[CIP-85-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-cip-85 +[CIP-101-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-cip-101 +[PLT-001-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-plt001 +[CIP-87-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-cip-87 diff --git a/issue81.json b/issue81.json new file mode 100644 index 0000000000000000000000000000000000000000..598e3eec02515e08b2be121b106f2af830a79497 GIT binary patch literal 11464 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 literal 0 HcmV?d00001 diff --git a/issue81_utf8.json b/issue81_utf8.json new file mode 100644 index 0000000..e69de29 From c15ecd2012fb8368dc04b9878dbeb8d4ffdebfba Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 17:55:56 +0300 Subject: [PATCH 02/16] Fix Template Haskell splices for GHC 8.10.7 --- e2e-tests/test/PlutusScripts/SOP/Common.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e-tests/test/PlutusScripts/SOP/Common.hs b/e2e-tests/test/PlutusScripts/SOP/Common.hs index 4ab8714..5e62c73 100644 --- a/e2e-tests/test/PlutusScripts/SOP/Common.hs +++ b/e2e-tests/test/PlutusScripts/SOP/Common.hs @@ -23,10 +23,10 @@ data SOPRedeemer | Sum2 Integer Integer | Sum3 Integer Integer Integer -PlutusTx.unstableMakeIsData ''SOPRedeemer -PlutusTx.makeLift ''SOPRedeemer +$(PlutusTx.unstableMakeIsData ''SOPRedeemer) +$(PlutusTx.makeLift ''SOPRedeemer) -{-# INLINEABLE mkSopPolicyV3 #-} +{-# INLINABLE mkSopPolicyV3 #-} mkSopPolicyV3 :: SOPRedeemer -> P.BuiltinUnit mkSopPolicyV3 redeemer = case redeemer of From 462728f026fb067dca5f67599109779268e2cee5 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 20:14:03 +0300 Subject: [PATCH 03/16] Fix trailing whitespace in CODEOWNERS.md, issue81.json, and SOP.hs --- CODEOWNERS.md | 4 ++-- e2e-tests/test/Spec/Builtins/SOP.hs | 3 +-- issue81.json | Bin 11464 -> 5652 bytes 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CODEOWNERS.md b/CODEOWNERS.md index 1eb09c5..5b35df0 100644 --- a/CODEOWNERS.md +++ b/CODEOWNERS.md @@ -4,5 +4,5 @@ * @ # General reviewers per PR -# Name Name -* @ @ \ No newline at end of file +# Name Name +* @ @ \ No newline at end of file diff --git a/e2e-tests/test/Spec/Builtins/SOP.hs b/e2e-tests/test/Spec/Builtins/SOP.hs index 9ae91a7..34a4a4d 100644 --- a/e2e-tests/test/Spec/Builtins/SOP.hs +++ b/e2e-tests/test/Spec/Builtins/SOP.hs @@ -51,7 +51,6 @@ verifySopTest networkOptions TestParams{localNodeConnectInfo, pparams, networkId let tokenValues = fromList [(SOP_1_1.checkSopAssetIdV3, 5)] mintWitnesses = Map.fromList [SOP_1_1.checkSopMintWitnessV3 sbe SOP.sopRedeemer3] - txOut = Tx.txOut era (C.lovelaceToValue 3_000_000 <> tokenValues) w1Address collateral = Tx.txInsCollateral era [txIn] txBodyContent = @@ -72,5 +71,5 @@ verifySopTest networkOptions TestParams{localNodeConnectInfo, pparams, networkId Q.getTxOutAtAddress era localNodeConnectInfo w1Address expectedTxIn "TN.getTxOutAtAddress" txOutHasTokenValue <- Q.txOutHasValue resultTxOut tokenValues assert "txOut has SOP tokens" txOutHasTokenValue - _ -> + _ -> assert "SOP feature is only applicable starting from Conway era" True diff --git a/issue81.json b/issue81.json index 598e3eec02515e08b2be121b106f2af830a79497..4527c6955b65238713582b48936bf18016e481a1 100644 GIT binary patch literal 5652 zcmc&&ZExE)5dNND!KJ_kc#~x-FLu0kLzAp)*0jkQrzn;M0!1-4XNgov%AT9_>wds~ z;(p1Fq$tZymbVpXfYu;+_uTQ}-I1ruHH6knnXM1d`dI5i4Z;u?tUY3STqbQI@=(%3 zsPKSmDitOA_3lxKxyH0qAycZPD(rXHzcV;il4&95@naz!P=*tlsYin>{0be?Wyo<( zKRIyNQ%<@5Ebt!7A=ByS!gWXvb*%Gjm5Rpk+~;6e3g;VjJN;;@zqP$(4~vVG#&%)- zAfC+jkA4}lpFj4uc0RnHyl|FznI}|&YQJk$G}9S1k+L_&e1u-UK&OgIbYe~%?TIOs zcto9Q2@4>331I<&k%glaW72 z=gn}^JsKX&EIx?gDb`r7660o76~D#{A|P_PwxL{x-qw%PXPX{rBr7b(hM&GYgblO` zSNC(rS*?m+h%6H`0J^q~!L{hwamQ}-kQLIM&Sh9gHpOIKQzR*&YznkL26RQ)`={rHEdZw`y{mjR?!;3@ zXR%)`$|PgNuPdf$jMLm!fD4={3VHs?78F;Vp)j1S!Q8o>gLBu`hA1ev7*IaQgqjj& zwXGCZij6p>YFRmF8C6 z+5FAfEsOM;ToiPA!|vu_BN}Y;%0<>6|p-ovIRxYT1IV^|V|*;q3U>>a%szCGAI z9Ui@Pb}JqiP(;H)#)gI%Tvx)>(s~u*Id&Iutjavcat^Ci;nhN8bGQ523RDysg}pcC z3aF7#AmgRA`iLxYoKiT9lybtTx^5+L2NWm9vNvT-$2Tt7NhmuvOIHiE2Z=}x?)vZY zcYgii0f*|V$4ET8_0LF{e}`CUR2?sBwH6`JYM~1uVTxdxVlD!68=-!?*N$2(qxm&Y zRPnvXX|)dN2$&gw-dATQB_UKPw2RXbJwH=!7$kNG>n||NN=g0tg&Qu`PdPD{C{4XY z=_e|g>kgQi6F74XBycS;(Th77s4>gI%AfcB3NCJ}OJz6g?(l(AhtK{argF>4$UR;JHE=?LRLHltLBFpd?9jfM)RiMOs*+kaDY- zN>iL7ae+>V&^myu5h(<?z*9)eb`^`) z;_CQt7<3xc__3wN29{_40o3^5+0F2TMoADwn@bc`TBBzOY6GJABOCadDOkUCX zOW+U*PR5w=|Kz|XQ*S9c`n_gw{0|D?)<+4`GX}pV72Ip7!3Jb(Ba3?XkCYowPXru1 z){t(H;%Fx11kIo+MG!F}{Il$ivtX!Rv>rGyWVZ;@F(YC}NNELCkLLYs?FWNi5lMv_u{%bYD&_&e0S zFw}oz|7^AR-=V$`2mAAS2TQf~4v0$D>)XP-C^h#`Ho~>G&j?qj?$Gwawf0gR-=SQ| zdR@z2wHKTE3-w0d%s8Z0AWCh1#*_M+20Ts@=<61@f7}mxK@`%61}5lKX#NjR3QF2z z_2jVI?*xZYXQQ@S7vl$+E#S2pZaNfC#>1U&qExIr5~R1Y8bYSB-MFQtFA$zNLsC#= zn5)n-nnTeFQ$bW{`h@@<=@Q;2VP`W?=J^tsHr+g5R69?f)FShMr2%0DJQtSu{i43W z0b6JMF?}&-icG_GR}%wu{)@R{!xm#Q7I-9X)?K;L37e$%j3&B^T_Snl)L5xxm{ zRMY9fM+?_=5K(f|+xcGP+iqhJGzS?jN8`rgSO|%mZ4AWa1%zX>VH#5i*oKZY?P+s@ z&TU`XsaqJhi74bDz2nQky|(PJ9M{#I2HhvTlww!jVq6s9UQNC2sBdT-3&uGp!Xv|c L53MxTKCS%=v(s23 literal 11464 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 From c04df4d01a392934b719569626a44e72691e7524 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 20:38:04 +0300 Subject: [PATCH 04/16] Format Haskell source according to fourmolu and cabal-fmt --- e2e-tests/e2e-tests.cabal | 4 ++-- e2e-tests/test/PlutusScripts/SOP/Common.hs | 2 +- e2e-tests/test/PlutusScripts/SOP/V_1_1.hs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/e2e-tests/e2e-tests.cabal b/e2e-tests/e2e-tests.cabal index 8cb0cfc..c4598f4 100644 --- a/e2e-tests/e2e-tests.cabal +++ b/e2e-tests/e2e-tests.cabal @@ -156,6 +156,8 @@ test-suite antaeus-test PlutusScripts.SECP256k1.Common PlutusScripts.SECP256k1.V_1_0 PlutusScripts.SECP256k1.V_1_1 + PlutusScripts.SOP.Common + PlutusScripts.SOP.V_1_1 PlutusScripts.V1TxInfo PlutusScripts.V2TxInfo PlutusScripts.V3TxInfo @@ -167,8 +169,6 @@ test-suite antaeus-test Spec.Builtins.Hashing Spec.Builtins.SECP256k1 Spec.Builtins.SOP - PlutusScripts.SOP.Common - PlutusScripts.SOP.V_1_1 Spec.ConwayFeatures Spec.WriteScriptFiles diff --git a/e2e-tests/test/PlutusScripts/SOP/Common.hs b/e2e-tests/test/PlutusScripts/SOP/Common.hs index 5e62c73..5d31616 100644 --- a/e2e-tests/test/PlutusScripts/SOP/Common.hs +++ b/e2e-tests/test/PlutusScripts/SOP/Common.hs @@ -26,7 +26,7 @@ data SOPRedeemer $(PlutusTx.unstableMakeIsData ''SOPRedeemer) $(PlutusTx.makeLift ''SOPRedeemer) -{-# INLINABLE mkSopPolicyV3 #-} +{-# INLINEABLE mkSopPolicyV3 #-} mkSopPolicyV3 :: SOPRedeemer -> P.BuiltinUnit mkSopPolicyV3 redeemer = case redeemer of diff --git a/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs b/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs index c21a56a..7471e54 100644 --- a/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs +++ b/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs @@ -14,13 +14,13 @@ import Cardano.Api qualified as C import Cardano.Api.Shelley qualified as C import PlutusCore.Version (plcVersion110) import PlutusLedgerApi.Common (SerialisedScript, serialiseCompiledCode) -import PlutusScripts.SOP.Common (mkSopPolicyV3, sopAssetName) import PlutusScripts.Helpers ( mintScriptWitness, plutusL3, policyIdV3, toScriptData, ) +import PlutusScripts.SOP.Common (mkSopPolicyV3, sopAssetName) import PlutusTx qualified checkSopPolicy :: SerialisedScript From c72f75ccdffcab361315e328bddf368d7cd79d49 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 21:44:00 +0300 Subject: [PATCH 05/16] Add GitHub Action to auto-format source code --- .github/workflows/auto-format.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/auto-format.yml diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml new file mode 100644 index 0000000..94ff1a8 --- /dev/null +++ b/.github/workflows/auto-format.yml @@ -0,0 +1,28 @@ +name: Auto-Format Haskell files + +on: + workflow_dispatch: + +jobs: + format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + + - name: Install Nix + uses: cachix/install-nix-action@v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - name: Run pre-commit formatter + run: | + nix develop --extra-experimental-features "nix-command flakes" -c pre-commit run --all-files || true + + - name: Commit changes + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add -A + git diff-index --quiet HEAD || (git commit -m "Auto-format Haskell files" && git push) From a42c29633371fe59471949276daa1af1fea6d243 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 22:59:33 +0300 Subject: [PATCH 06/16] Trigger auto-format Action on push --- .github/workflows/auto-format.yml | 4 +++- e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 94ff1a8..2865b5a 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -1,7 +1,9 @@ name: Auto-Format Haskell files on: - workflow_dispatch: + push: + branches: + - '*' jobs: format: diff --git a/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs b/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs index d480957..05feb1b 100644 --- a/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs +++ b/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs @@ -101,10 +101,10 @@ verifyBlsVrfScript P.== ( P.sha2_256 P.. P.mconcat P.$ P.bls12_381_G2_compress - P.<$> [uncompressedG2, h, pubKey, gamma, u, v] + P.<$> [uncompressedG2, h, pubKey, gamma, u, v] ) P.&& beta - P.== (P.sha2_256 P.. P.bls12_381_G2_compress P.$ P.bls12_381_G2_scalarMul f gamma) + P.== (P.sha2_256 P.. P.bls12_381_G2_compress P.$ P.bls12_381_G2_scalarMul f gamma) -- used offchain to generate the vrf proof output generateVrfProofWithOutput :: Integer -> P.BuiltinByteString -> VrfProofWithOutput From 1429dddf44bd51ba79f66839766fd5d5089ab732 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 23:23:35 +0300 Subject: [PATCH 07/16] Trigger formatting bot From 2509e426a2706795b24513b72d68016eade470f6 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sat, 28 Feb 2026 23:44:36 +0300 Subject: [PATCH 08/16] Fix GHC deprecation warnings and unused imports --- e2e-tests/test/Helpers/Query.hs | 11 ++++++----- e2e-tests/test/Helpers/Tx.hs | 2 +- e2e-tests/test/Helpers/TypeConverters.hs | 5 ++--- e2e-tests/test/PlutusScripts/SOP/V_1_1.hs | 2 -- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/e2e-tests/test/Helpers/Query.hs b/e2e-tests/test/Helpers/Query.hs index dd5c2cf..29ca4a3 100644 --- a/e2e-tests/test/Helpers/Query.hs +++ b/e2e-tests/test/Helpers/Query.hs @@ -23,6 +23,7 @@ import Data.List (isInfixOf, sortBy) import Data.Map qualified as Map import Data.Maybe (fromJust) import Data.Set qualified as Set +import GHC.Exts (toList) import Hedgehog (MonadTest) import Hedgehog.Extras.Test qualified as HE import Hedgehog.Extras.Test.Base qualified as H @@ -66,16 +67,16 @@ adaOnlyTxInAtAddress era localNodeConnectInfo address = do adaOnly = filter ( \(_, C.TxOut _ (C.TxOutValueShelleyBased sbe v) _ _) -> - ((length $ C.valueToList (C.fromLedgerValue sbe v)) == 1) - && ((fst $ head $ C.valueToList (C.fromLedgerValue sbe v)) == C.AdaAssetId) + ((length $ toList (C.fromLedgerValue sbe v)) == 1) + && ((fst $ head $ toList (C.fromLedgerValue sbe v)) == C.AdaAssetId) ) sortByMostAda = sortBy ( \(_, C.TxOut _ (C.TxOutValueShelleyBased sbe v1) _ _) (_, C.TxOut _ (C.TxOutValueShelleyBased _ v2) _ _) -> compare - (snd $ head $ C.valueToList (C.fromLedgerValue sbe v2)) - (snd $ head $ C.valueToList (C.fromLedgerValue sbe v1)) + (snd $ head $ toList (C.fromLedgerValue sbe v2)) + (snd $ head $ toList (C.fromLedgerValue sbe v1)) ) -- | Get TxIns from all UTxOs @@ -221,7 +222,7 @@ txOutHasValue -> m Bool txOutHasValue (C.TxOut _ txOutValue _ _) tokenValue = do let value = C.txOutValueToValue txOutValue - return $ isInfixOf (C.valueToList tokenValue) (C.valueToList value) + return $ isInfixOf (toList tokenValue) (toList value) -- | Query network's protocol parameters getProtocolParams diff --git a/e2e-tests/test/Helpers/Tx.hs b/e2e-tests/test/Helpers/Tx.hs index 19b3b28..2b57476 100644 --- a/e2e-tests/test/Helpers/Tx.hs +++ b/e2e-tests/test/Helpers/Tx.hs @@ -428,7 +428,7 @@ buildRawTx => C.ShelleyBasedEra era -> C.TxBodyContent C.BuildTx era -> m (C.TxBody era) -buildRawTx sbe = HE.leftFail . C.createAndValidateTransactionBody sbe -- TODO: handle error +buildRawTx sbe = HE.leftFail . C.createTransactionBody sbe -- TODO: handle error -- | Witness txbody with signing key when not using convenience build function signTx diff --git a/e2e-tests/test/Helpers/TypeConverters.hs b/e2e-tests/test/Helpers/TypeConverters.hs index 15f2bf2..2f7fda1 100644 --- a/e2e-tests/test/Helpers/TypeConverters.hs +++ b/e2e-tests/test/Helpers/TypeConverters.hs @@ -10,6 +10,7 @@ import Cardano.Chain.Common (addrToBase58) import Cardano.Ledger.Conway.Governance qualified as L import Cardano.Ledger.Crypto qualified as L import Cardano.Ledger.Shelley.API qualified as L +import GHC.Exts (toList) import PlutusLedgerApi.V1 qualified as PV1 import PlutusLedgerApi.V1.Address (Address (Address)) import PlutusLedgerApi.V1.Credential ( @@ -19,9 +20,7 @@ import PlutusLedgerApi.V1.Credential ( import PlutusLedgerApi.V1.Value qualified as Value import PlutusLedgerApi.V2 qualified as PV2 import PlutusLedgerApi.V3 qualified as PV3 -import PlutusTx.Prelude qualified as PlutusTx -fromCardanoPaymentKeyHash :: C.Hash C.PaymentKey -> PV1.PubKeyHash fromCardanoPaymentKeyHash = PV1.PubKeyHash . PlutusTx.toBuiltin . C.serialiseToRawBytes fromCardanoStakeKeyHash :: C.Hash C.StakeKey -> PV1.PubKeyHash @@ -195,7 +194,7 @@ fromCardanoAssetId (C.AssetId policyId assetName) = Value.assetClass (fromCardanoPolicyId policyId) (fromCardanoAssetName assetName) fromCardanoValue :: C.Value -> Value.Value -fromCardanoValue (C.valueToList -> list) = +fromCardanoValue (toList -> list) = foldMap fromSingleton list where fromSingleton (fromCardanoAssetId -> assetClass, C.Quantity quantity) = diff --git a/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs b/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs index 7471e54..477214c 100644 --- a/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs +++ b/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs @@ -12,13 +12,11 @@ module PlutusScripts.SOP.V_1_1 where import Cardano.Api qualified as C import Cardano.Api.Shelley qualified as C -import PlutusCore.Version (plcVersion110) import PlutusLedgerApi.Common (SerialisedScript, serialiseCompiledCode) import PlutusScripts.Helpers ( mintScriptWitness, plutusL3, policyIdV3, - toScriptData, ) import PlutusScripts.SOP.Common (mkSopPolicyV3, sopAssetName) import PlutusTx qualified From c4b0f71f5c52cde6513026e9e34356a487977b33 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 00:13:59 +0300 Subject: [PATCH 09/16] Fix auto-format CI permissions to push formatting back to branch --- .github/workflows/auto-format.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml index 2865b5a..cac0007 100644 --- a/.github/workflows/auto-format.yml +++ b/.github/workflows/auto-format.yml @@ -5,14 +5,17 @@ on: branches: - '*' +permissions: + contents: write + jobs: format: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: - ref: ${{ github.head_ref }} - + ref: ${{ github.ref }} + - name: Install Nix uses: cachix/install-nix-action@v27 with: @@ -21,7 +24,7 @@ jobs: - name: Run pre-commit formatter run: | nix develop --extra-experimental-features "nix-command flakes" -c pre-commit run --all-files || true - + - name: Commit changes run: | git config --local user.email "github-actions[bot]@users.noreply.github.com" From 9a6059f0dff7b6eb29952e2cb5b2a420ecd11b5b Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 00:29:58 +0300 Subject: [PATCH 10/16] Fix final Vrf Common.hs fourmolu formatting --- e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs b/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs index 05feb1b..d480957 100644 --- a/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs +++ b/e2e-tests/test/PlutusScripts/BLS/Vrf/Common.hs @@ -101,10 +101,10 @@ verifyBlsVrfScript P.== ( P.sha2_256 P.. P.mconcat P.$ P.bls12_381_G2_compress - P.<$> [uncompressedG2, h, pubKey, gamma, u, v] + P.<$> [uncompressedG2, h, pubKey, gamma, u, v] ) P.&& beta - P.== (P.sha2_256 P.. P.bls12_381_G2_compress P.$ P.bls12_381_G2_scalarMul f gamma) + P.== (P.sha2_256 P.. P.bls12_381_G2_compress P.$ P.bls12_381_G2_scalarMul f gamma) -- used offchain to generate the vrf proof output generateVrfProofWithOutput :: Integer -> P.BuiltinByteString -> VrfProofWithOutput From 42e468c69bf360dbc72b1dd9d7277380c0fb7b3b Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 00:34:27 +0300 Subject: [PATCH 11/16] Fix missing PlutusTx import in TypeConverters --- e2e-tests/test/Helpers/TypeConverters.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e-tests/test/Helpers/TypeConverters.hs b/e2e-tests/test/Helpers/TypeConverters.hs index 2f7fda1..156a6f0 100644 --- a/e2e-tests/test/Helpers/TypeConverters.hs +++ b/e2e-tests/test/Helpers/TypeConverters.hs @@ -12,6 +12,7 @@ import Cardano.Ledger.Crypto qualified as L import Cardano.Ledger.Shelley.API qualified as L import GHC.Exts (toList) import PlutusLedgerApi.V1 qualified as PV1 +import PlutusTx.Prelude qualified as PlutusTx import PlutusLedgerApi.V1.Address (Address (Address)) import PlutusLedgerApi.V1.Credential ( Credential (PubKeyCredential, ScriptCredential), From cb9506d5080dbaaf350701ea15839dcbd739c488 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 00:38:07 +0300 Subject: [PATCH 12/16] Fix fourmolu alphabetical import sorting in TypeConverters --- e2e-tests/test/Helpers/TypeConverters.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/test/Helpers/TypeConverters.hs b/e2e-tests/test/Helpers/TypeConverters.hs index 156a6f0..96ddcb7 100644 --- a/e2e-tests/test/Helpers/TypeConverters.hs +++ b/e2e-tests/test/Helpers/TypeConverters.hs @@ -12,7 +12,6 @@ import Cardano.Ledger.Crypto qualified as L import Cardano.Ledger.Shelley.API qualified as L import GHC.Exts (toList) import PlutusLedgerApi.V1 qualified as PV1 -import PlutusTx.Prelude qualified as PlutusTx import PlutusLedgerApi.V1.Address (Address (Address)) import PlutusLedgerApi.V1.Credential ( Credential (PubKeyCredential, ScriptCredential), @@ -21,6 +20,7 @@ import PlutusLedgerApi.V1.Credential ( import PlutusLedgerApi.V1.Value qualified as Value import PlutusLedgerApi.V2 qualified as PV2 import PlutusLedgerApi.V3 qualified as PV3 +import PlutusTx.Prelude qualified as PlutusTx fromCardanoPaymentKeyHash = PV1.PubKeyHash . PlutusTx.toBuiltin . C.serialiseToRawBytes From 805ed958d9e4e6a91b0f240efb2058e161a3867e Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 00:49:36 +0300 Subject: [PATCH 13/16] Restore accidentally deleted type signature --- e2e-tests/test/Helpers/TypeConverters.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e-tests/test/Helpers/TypeConverters.hs b/e2e-tests/test/Helpers/TypeConverters.hs index 96ddcb7..9ffee22 100644 --- a/e2e-tests/test/Helpers/TypeConverters.hs +++ b/e2e-tests/test/Helpers/TypeConverters.hs @@ -22,6 +22,7 @@ import PlutusLedgerApi.V2 qualified as PV2 import PlutusLedgerApi.V3 qualified as PV3 import PlutusTx.Prelude qualified as PlutusTx +fromCardanoPaymentKeyHash :: C.Hash C.PaymentKey -> PV1.PubKeyHash fromCardanoPaymentKeyHash = PV1.PubKeyHash . PlutusTx.toBuiltin . C.serialiseToRawBytes fromCardanoStakeKeyHash :: C.Hash C.StakeKey -> PV1.PubKeyHash From 912529a0c9e64b7bf0091df3dbf3e3d0b7c4d38c Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 20:34:11 +0300 Subject: [PATCH 14/16] Retrigger CI to bypass Hydra builder Nix cache corruption From 1995327e8c759007cc929433b87a2a17bee6d562 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 21:57:01 +0300 Subject: [PATCH 15/16] Extend E2E waitForTxInAtAddress timeout to 180s to mitigate CI testnet mining lag --- e2e-tests/test/Helpers/Query.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/test/Helpers/Query.hs b/e2e-tests/test/Helpers/Query.hs index 29ca4a3..4306fb1 100644 --- a/e2e-tests/test/Helpers/Query.hs +++ b/e2e-tests/test/Helpers/Query.hs @@ -155,7 +155,7 @@ waitForTxInAtAddress -> String -- temp debug text for intermittent timeout failure -> m () waitForTxInAtAddress era localNodeConnectInfo address txIn debugStr = do - let timeoutSeconds = 90 :: Int + let timeoutSeconds = 180 :: Int loop i prevUtxo = do if i == 0 then From d91633ac2d8a206c906d855846a70dfd985e2650 Mon Sep 17 00:00:00 2001 From: Lemayan Leleina Date: Sun, 1 Mar 2026 22:17:20 +0300 Subject: [PATCH 16/16] Double txValidityUpperBound to 5400 slots to prevent mempool expiration on slow runners --- e2e-tests/test/Spec/AlonzoFeatures.hs | 2 +- e2e-tests/test/Spec/BabbageFeatures.hs | 2 +- e2e-tests/test/Spec/ConwayFeatures.hs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e-tests/test/Spec/AlonzoFeatures.hs b/e2e-tests/test/Spec/AlonzoFeatures.hs index 5029745..b42dc6e 100644 --- a/e2e-tests/test/Spec/AlonzoFeatures.hs +++ b/e2e-tests/test/Spec/AlonzoFeatures.hs @@ -155,7 +155,7 @@ checkTxInfoV1Test networkOptions params = do , C.txOuts = [txOut1, txOut2] , C.txFee = Tx.txFee era fee , C.txValidityLowerBound = Tx.txValidityLowerBound era 1 - , C.txValidityUpperBound = Tx.txValidityUpperBound era 2700 + , C.txValidityUpperBound = Tx.txValidityUpperBound era 5400 , -- \^ ~9min range (200ms slots) -- \^ Babbage era onwards cannot have upper slot beyond epoch boundary (10_000 slot epoch) C.txExtraKeyWits = Tx.txExtraKeyWits era [w1VKey] diff --git a/e2e-tests/test/Spec/BabbageFeatures.hs b/e2e-tests/test/Spec/BabbageFeatures.hs index 3dfcee2..b0fd7cf 100644 --- a/e2e-tests/test/Spec/BabbageFeatures.hs +++ b/e2e-tests/test/Spec/BabbageFeatures.hs @@ -165,7 +165,7 @@ checkTxInfoV2Test networkOptions testParams = do , C.txOuts = [txOut1, txOut2] , C.txFee = Tx.txFee era fee , C.txValidityLowerBound = Tx.txValidityLowerBound era 1 - , C.txValidityUpperBound = Tx.txValidityUpperBound era 2700 + , C.txValidityUpperBound = Tx.txValidityUpperBound era 5400 , -- \^ ~9min range (200ms slots) -- \^ Babbage era onwards cannot have upper slot beyond epoch boundary (10_000 slot epoch) C.txExtraKeyWits = Tx.txExtraKeyWits era [wVKey] diff --git a/e2e-tests/test/Spec/ConwayFeatures.hs b/e2e-tests/test/Spec/ConwayFeatures.hs index 06c9941..008eb4d 100644 --- a/e2e-tests/test/Spec/ConwayFeatures.hs +++ b/e2e-tests/test/Spec/ConwayFeatures.hs @@ -167,7 +167,7 @@ checkTxInfoV3Test networkOptions TestParams{..} = do , C.txOuts = [txOut1, txOut2] , C.txFee = Tx.txFee era fee , C.txValidityLowerBound = Tx.txValidityLowerBound era 1 - , C.txValidityUpperBound = Tx.txValidityUpperBound era 2700 + , C.txValidityUpperBound = Tx.txValidityUpperBound era 5400 , -- \^ ~9min range (200ms slots) -- \^ Babbage era onwards cannot have upper slot beyond epoch boundary (10_000 slot epoch) C.txExtraKeyWits = Tx.txExtraKeyWits era [w1VKey]