@@ -169,6 +169,7 @@ instance StateModel WorldState where
169
169
Init :: Party -> Action WorldState ()
170
170
Commit :: Party -> UTxOType Payment -> Action WorldState ActualCommitted
171
171
Abort :: Party -> Action WorldState ()
172
+ Close :: Party -> Action WorldState ()
172
173
NewTx :: Party -> Payment -> Action WorldState Payment
173
174
Wait :: DiffTime -> Action WorldState ()
174
175
ObserveConfirmedTx :: Var Payment -> Action WorldState ()
@@ -192,9 +193,12 @@ instance StateModel WorldState where
192
193
[ (5 , genCommit pendingCommits)
193
194
, (1 , genAbort)
194
195
]
195
- Open {} -> do
196
- genNewTx
197
- _ -> fmap Some genSeed
196
+ Open {} ->
197
+ frequency
198
+ [ (5 , genNewTx)
199
+ , (1 , genClose)
200
+ ]
201
+ Final {} -> fmap Some genSeed
198
202
where
199
203
genCommit :: Uncommitted -> Gen (Any (Action WorldState ))
200
204
genCommit pending = do
@@ -208,6 +212,11 @@ instance StateModel WorldState where
208
212
209
213
genNewTx = genPayment st >>= \ (party, transaction) -> pure . Some $ NewTx party transaction
210
214
215
+ genClose = do
216
+ (key, _) <- elements hydraParties
217
+ let party = deriveParty key
218
+ pure . Some $ Close party
219
+
211
220
precondition WorldState {hydraState = Start } Seed {} =
212
221
True
213
222
precondition WorldState {hydraState = Idle {}} Init {} =
@@ -216,6 +225,8 @@ instance StateModel WorldState where
216
225
isPendingCommitFrom party hydraState
217
226
precondition WorldState {hydraState = Initial {}} Abort {} =
218
227
True
228
+ precondition WorldState {hydraState = Open {}} (Close _) =
229
+ True
219
230
precondition WorldState {hydraState = Open {offChainState}} (NewTx _ tx) =
220
231
(from tx, value tx) `List.elem` confirmedUTxO offChainState
221
232
precondition _ Wait {} =
@@ -290,6 +301,13 @@ instance StateModel WorldState where
290
301
committedUTxO = mconcat $ Map. elems commits
291
302
_ -> Final mempty
292
303
--
304
+ Close {} ->
305
+ WorldState {hydraParties, hydraState = updateWithClose hydraState}
306
+ where
307
+ updateWithClose = \ case
308
+ Open {offChainState} -> Final $ confirmedUTxO offChainState
309
+ _ -> error " unexpected state"
310
+ --
293
311
(NewTx _ tx) ->
294
312
WorldState {hydraParties, hydraState = updateWithNewTx hydraState}
295
313
where
@@ -335,7 +353,7 @@ genToCommit (hk, ck) = do
335
353
336
354
genContestationPeriod :: Gen ContestationPeriod
337
355
genContestationPeriod = do
338
- n <- choose (1 , 200 )
356
+ n <- choose (1 , 10 )
339
357
pure $ UnsafeContestationPeriod $ wordToNatural n
340
358
341
359
genInit :: [(SigningKey HydraKey , b )] -> Gen (Action WorldState () )
@@ -477,6 +495,8 @@ instance
477
495
performInit party
478
496
Abort party -> do
479
497
performAbort party
498
+ Close party ->
499
+ performClose party
480
500
Wait delay ->
481
501
lift $ threadDelay delay
482
502
ObserveConfirmedTx var -> do
@@ -495,10 +515,6 @@ instance
495
515
Nothing -> error " The head is not open for node"
496
516
StopTheWorld ->
497
517
stopTheWorld
498
- where
499
- headIsOpen = \ case
500
- HeadIsOpen {} -> True
501
- _otherwise -> False
502
518
503
519
-- ** Performing actions
504
520
@@ -607,7 +623,6 @@ performNewTx party tx = do
607
623
let recipient = mkVkAddress testNetworkId . getVerificationKey . signingKey $ to tx
608
624
nodes <- gets nodes
609
625
let thisNode = nodes ! party
610
-
611
626
waitForOpen thisNode
612
627
613
628
(i, o) <-
@@ -623,7 +638,7 @@ performNewTx party tx = do
623
638
624
639
party `sendsInput` Input. NewTx realTx
625
640
lift $ do
626
- waitUntilMatch [thisNode] $ \ case
641
+ waitUntilMatch (toList nodes) $ \ case
627
642
SnapshotConfirmed {snapshot = snapshot} ->
628
643
txId realTx `elem` Snapshot. confirmed snapshot
629
644
err@ TxInvalid {} -> error (" expected tx to be valid: " <> show err)
@@ -635,14 +650,9 @@ performNewTx party tx = do
635
650
waitForOpen :: MonadDelay m => TestHydraClient tx m -> RunMonad m ()
636
651
waitForOpen node = do
637
652
outs <- lift $ serverOutputs node
638
- unless
639
- (any headIsOpen outs)
653
+ unless (any headIsOpen outs) $
640
654
waitAndRetry
641
655
where
642
- headIsOpen = \ case
643
- HeadIsOpen {} -> True
644
- _ -> False
645
-
646
656
waitAndRetry = lift (threadDelay 0.1 ) >> waitForOpen node
647
657
648
658
sendsInput :: (MonadSTM m , MonadThrow m ) => Party -> ClientInput Tx -> RunMonad m ()
@@ -655,7 +665,6 @@ sendsInput party command = do
655
665
performInit :: (MonadThrow m , MonadAsync m , MonadTimer m ) => Party -> RunMonad m ()
656
666
performInit party = do
657
667
party `sendsInput` Input. Init
658
-
659
668
nodes <- gets nodes
660
669
lift $
661
670
waitUntilMatch (toList nodes) $ \ case
@@ -674,6 +683,19 @@ performAbort party = do
674
683
err@ CommandFailed {} -> error $ show err
675
684
_ -> False
676
685
686
+ performClose :: (MonadThrow m , MonadAsync m , MonadTimer m , MonadDelay m ) => Party -> RunMonad m ()
687
+ performClose party = do
688
+ nodes <- gets nodes
689
+ let thisNode = nodes ! party
690
+ waitForOpen thisNode
691
+ party `sendsInput` Input. Close
692
+
693
+ lift $
694
+ waitUntilMatch (toList nodes) $ \ case
695
+ HeadIsClosed {} -> True
696
+ err@ CommandFailed {} -> error $ show err
697
+ _ -> False
698
+
677
699
stopTheWorld :: MonadAsync m => RunMonad m ()
678
700
stopTheWorld =
679
701
gets threads >>= mapM_ (lift . cancel)
@@ -692,6 +714,7 @@ showFromAction k = \case
692
714
Init {} -> k
693
715
Commit {} -> k
694
716
Abort {} -> k
717
+ Close {} -> k
695
718
NewTx {} -> k
696
719
Wait {} -> k
697
720
ObserveConfirmedTx {} -> k
@@ -738,3 +761,8 @@ isOwned (CardanoSigningKey sk) (_, TxOut{txOutAddress = ShelleyAddressInEra (She
738
761
(PaymentCredentialByKey ha) -> verificationKeyHash (getVerificationKey sk) == ha
739
762
_ -> False
740
763
isOwned _ _ = False
764
+
765
+ headIsOpen :: ServerOutput tx -> Bool
766
+ headIsOpen = \ case
767
+ HeadIsOpen {} -> True
768
+ _otherwise -> False
0 commit comments