diff --git a/.github/workflows/auto-format.yml b/.github/workflows/auto-format.yml new file mode 100644 index 0000000..cac0007 --- /dev/null +++ b/.github/workflows/auto-format.yml @@ -0,0 +1,33 @@ +name: Auto-Format Haskell files + +on: + push: + branches: + - '*' + +permissions: + contents: write + +jobs: + format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.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) 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/e2e-tests.cabal b/e2e-tests/e2e-tests.cabal index 0ec3899..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 @@ -166,6 +168,7 @@ test-suite antaeus-test Spec.Builtins.BLS Spec.Builtins.Hashing Spec.Builtins.SECP256k1 + Spec.Builtins.SOP Spec.ConwayFeatures Spec.WriteScriptFiles diff --git a/e2e-tests/test/Helpers/Query.hs b/e2e-tests/test/Helpers/Query.hs index dd5c2cf..4306fb1 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 @@ -154,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 @@ -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..9ffee22 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 ( @@ -195,7 +196,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/Common.hs b/e2e-tests/test/PlutusScripts/SOP/Common.hs new file mode 100644 index 0000000..5d31616 --- /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..477214c --- /dev/null +++ b/e2e-tests/test/PlutusScripts/SOP/V_1_1.hs @@ -0,0 +1,42 @@ +{-# 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 PlutusLedgerApi.Common (SerialisedScript, serialiseCompiledCode) +import PlutusScripts.Helpers ( + mintScriptWitness, + plutusL3, + policyIdV3, + ) +import PlutusScripts.SOP.Common (mkSopPolicyV3, sopAssetName) +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/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/Builtins/SOP.hs b/e2e-tests/test/Spec/Builtins/SOP.hs new file mode 100644 index 0000000..34a4a4d --- /dev/null +++ b/e2e-tests/test/Spec/Builtins/SOP.hs @@ -0,0 +1,75 @@ +{-# 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/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] 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 0000000..4527c69 --- /dev/null +++ b/issue81.json @@ -0,0 +1,79 @@ +{ + "url": "https://api.github.com/repos/IntersectMBO/antaeus/issues/81", + "repository_url": "https://api.github.com/repos/IntersectMBO/antaeus", + "labels_url": "https://api.github.com/repos/IntersectMBO/antaeus/issues/81/labels{/name}", + "comments_url": "https://api.github.com/repos/IntersectMBO/antaeus/issues/81/comments", + "events_url": "https://api.github.com/repos/IntersectMBO/antaeus/issues/81/events", + "html_url": "https://github.com/IntersectMBO/antaeus/issues/81", + "id": 2108258565, + "node_id": "I_kwDOJTiGz859qXkF", + "number": 81, + "title": "Chang HF User Story Coverage", + "user": { + "login": "catch-21", + "id": 74595920, + "node_id": "MDQ6VXNlcjc0NTk1OTIw", + "avatar_url": "https://avatars.githubusercontent.com/u/74595920?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/catch-21", + "html_url": "https://github.com/catch-21", + "followers_url": "https://api.github.com/users/catch-21/followers", + "following_url": "https://api.github.com/users/catch-21/following{/other_user}", + "gists_url": "https://api.github.com/users/catch-21/gists{/gist_id}", + "starred_url": "https://api.github.com/users/catch-21/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/catch-21/subscriptions", + "organizations_url": "https://api.github.com/users/catch-21/orgs", + "repos_url": "https://api.github.com/users/catch-21/repos", + "events_url": "https://api.github.com/users/catch-21/events{/privacy}", + "received_events_url": "https://api.github.com/users/catch-21/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "labels": [ + + ], + "state": "open", + "locked": false, + "assignees": [ + + ], + "milestone": null, + "comments": 1, + "created_at": "2024-01-30T16:21:04Z", + "updated_at": "2024-02-07T14:32:38Z", + "closed_at": null, + "assignee": null, + "author_association": "CONTRIBUTOR", + "type": null, + "active_lock_reason": null, + "sub_issues_summary": { + "total": 0, + "completed": 0, + "percent_completed": 0 + }, + "issue_dependencies_summary": { + "blocked_by": 0, + "total_blocked_by": 0, + "blocking": 0, + "total_blocking": 0 + }, + "body": "\r\nChang HF User Stories Coverage\r\n==============================\r\n\r\nLast updated **2024-01-30** for **cardano-node 8.7.2**\r\n \r\n\r\n**Legend:** ![Success Badge][success-badge] ![Failure Badge][failure-badge] ![Uncovered Badge][uncovered-badge]\r\n \r\n\r\n\r\nSmart Contract User Stories\r\n----------------\r\n\r\n| Status for Story ID | Title | Story Overview |\r\n|---------------------|-------|----------------|\r\n|[![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.|\r\n|[![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. |\r\n|[![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. |\r\n|[![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. |\r\n\r\n\r\n[success-badge]: https://img.shields.io/badge/success-green\r\n[failure-badge]: https://img.shields.io/badge/failure-red\r\n[uncovered-badge]: https://img.shields.io/badge/uncovered-grey\r\n\r\n[CIP-85-badge]: https://img.shields.io/badge/CIP-85-grey\r\n[CIP-101-badge]: https://img.shields.io/badge/CIP-101-grey\r\n[PLT-001-badge]: https://img.shields.io/badge/PLT-001-grey\r\n[CIP-87-badge]: https://img.shields.io/badge/CIP-87-grey\r\n\r\n[CIP-85-link]: https://github.com/input-output-hk/antaeus/blob/cardano-node_8-7-2/e2e-tests/test/Spec.hs#L180-L203\r\n[CIP-101-link]: https://github.com/input-output-hk/antaeus/pull/43\r\n[PLT-001-link]: https://github.com/input-output-hk/antaeus/pull/43\r\n[CIP-87-link]: https://github.com/input-output-hk/antaeus/pull/79\r\n\r\n[CIP-85-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-cip-85\r\n[CIP-101-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-cip-101\r\n[PLT-001-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-plt001\r\n[CIP-87-req]: https://github.com/IntersectMBO/cardano-test-plans/blob/main/docs/user-stories/04-smart-contracts.md#user-story-id-cip-87", + "closed_by": null, + "reactions": { + "url": "https://api.github.com/repos/IntersectMBO/antaeus/issues/81/reactions", + "total_count": 0, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 0, + "confused": 0, + "heart": 0, + "rocket": 0, + "eyes": 0 + }, + "timeline_url": "https://api.github.com/repos/IntersectMBO/antaeus/issues/81/timeline", + "performed_via_github_app": null, + "state_reason": null, + "pinned_comment": null +} diff --git a/issue81_utf8.json b/issue81_utf8.json new file mode 100644 index 0000000..e69de29