Skip to content

Commit

Permalink
Add a healthyCommitTx and validate it
Browse files Browse the repository at this point in the history
Factored out 'mkInitialOutput' to be able to use it in the commit unit tests.
  • Loading branch information
ch1bo committed Jan 26, 2022
1 parent 44c0017 commit 8caba14
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 5 deletions.
1 change: 1 addition & 0 deletions hydra-node/hydra-node.cabal
Expand Up @@ -230,6 +230,7 @@ test-suite tests
Hydra.BehaviorSpec
Hydra.Chain.Direct.Contract.Close
Hydra.Chain.Direct.Contract.CollectCom
Hydra.Chain.Direct.Contract.Commit
Hydra.Chain.Direct.Contract.FanOut
Hydra.Chain.Direct.Contract.Mutation
Hydra.Chain.Direct.ContractSpec
Expand Down
12 changes: 7 additions & 5 deletions hydra-node/src/Hydra/Chain/Direct/Tx.hs
Expand Up @@ -132,7 +132,7 @@ initTx networkId cardanoKeys HeadParameters{contestationPeriod, parties} txIn =
Api.unsafeBuildTransaction $
Api.emptyTxBody
& Api.addVkInputs [Api.fromLedgerTxIn txIn]
& Api.addOutputs (headOutput : map mkInitialOutput cardanoKeys)
& Api.addOutputs (headOutput : map (mkInitialOutput networkId) cardanoKeys)
where
headOutput =
Api.TxOut headAddress headValue headDatum
Expand All @@ -148,15 +148,17 @@ initTx networkId cardanoKeys HeadParameters{contestationPeriod, parties} txIn =
(contestationPeriodFromDiffTime contestationPeriod)
(map (partyFromVerKey . vkey) parties)

mkInitialOutput (Api.toPlutusKeyHash . Api.verificationKeyHash -> vkh) =
Api.TxOut initialAddress initialValue (mkInitialDatum vkh)
initialScript =
Api.fromPlutusScript Initial.validatorScript
mkInitialOutput :: NetworkId -> VerificationKey PaymentKey -> Api.TxOut Api.CtxTx Api.Era
mkInitialOutput networkId (Api.toPlutusKeyHash . Api.verificationKeyHash -> vkh) =
Api.TxOut initialAddress initialValue (mkInitialDatum vkh)
where
-- FIXME: should really be the minted PTs plus some ADA to make the ledger happy
initialValue =
Api.lovelaceToTxOutValue $ Api.Lovelace 2_000_000
initialAddress =
Api.mkScriptAddress @Api.PlutusScriptV1 networkId initialScript
initialScript =
Api.fromPlutusScript Initial.validatorScript
mkInitialDatum =
Api.mkTxOutDatum . Initial.datum

Expand Down
52 changes: 52 additions & 0 deletions hydra-node/test/Hydra/Chain/Direct/Contract/Commit.hs
@@ -0,0 +1,52 @@
-- | Mutation-based script validator tests for the commit transaction where a
-- 'healthyCommitTx' gets mutated by an arbitrary 'genCommitMutation'
module Hydra.Chain.Direct.Contract.Commit where

import Hydra.Prelude

import qualified Hydra.Chain.Direct.Fixture as Fixture
import Hydra.Chain.Direct.Tx (commitTx, mkInitialOutput)
import Hydra.Ledger.Cardano (CardanoTx, CtxUTxO, Era, PaymentKey, TxIn, TxOut, Utxo, VerificationKey, adaOnly, fromLedgerTx, genOutput, singletonUtxo, toCtxUTxOTxOut, toLedgerTxIn)
import Hydra.Party (Party)

-- Arbitrary VerificationKey instance
import Hydra.Chain.Direct.TxSpec ()

--
-- CommitTx
--

healthyCommitTx :: (CardanoTx, Utxo)
healthyCommitTx =
( fromLedgerTx tx
, lookupUtxo
)
where
lookupUtxo = singletonUtxo (initialInput, toCtxUTxOTxOut initialOutput)

tx =
commitTx
Fixture.testNetworkId
healthyCommitParty
healthyCommittedUtxo
(toLedgerTxIn initialInput, initialPubKeyHash)

initialInput = generateWith arbitrary 42

initialOutput = mkInitialOutput Fixture.testNetworkId healthyCommitVerificationKey

initialPubKeyHash = generateWith arbitrary 42

-- NOTE: An ada-only output which is currently addressed to some arbitrary
-- public key.
healthyCommittedUtxo :: Maybe (TxIn, TxOut CtxUTxO Era)
healthyCommittedUtxo = flip generateWith 42 $ do
txIn <- arbitrary
txOut <- adaOnly <$> (genOutput =<< arbitrary)
pure $ Just (txIn, txOut)

healthyCommitVerificationKey :: VerificationKey PaymentKey
healthyCommitVerificationKey = generateWith arbitrary 42

healthyCommitParty :: Party
healthyCommitParty = generateWith arbitrary 42
4 changes: 4 additions & 0 deletions hydra-node/test/Hydra/Chain/Direct/ContractSpec.hs
Expand Up @@ -15,6 +15,7 @@ import qualified Data.ByteString as BS
import qualified Data.ByteString.Base16 as Base16
import Hydra.Chain.Direct.Contract.Close (genCloseMutation, healthyCloseTx)
import Hydra.Chain.Direct.Contract.CollectCom (genCollectComMutation, healthyCollectComTx)
import Hydra.Chain.Direct.Contract.Commit (healthyCommitTx)
import Hydra.Chain.Direct.Contract.FanOut (genFanoutMutation, healthyFanoutTx)
import Hydra.Chain.Direct.Contract.Mutation (
genListOfSigningKeys,
Expand Down Expand Up @@ -73,6 +74,9 @@ spec = parallel $ do
describe "TxOut hashing" $ do
modifyMaxSuccess (const 20) $
prop "OffChain.hashTxOuts == OnChain.hashTxOuts" prop_consistentOnAndOffChainHashOfTxOuts
describe "Commit" $ do
prop "is healthy" $
propTransactionValidates healthyCommitTx
describe "CollectCom" $ do
prop "is healthy" $
propTransactionValidates healthyCollectComTx
Expand Down

0 comments on commit 8caba14

Please sign in to comment.