@@ -1515,6 +1515,89 @@ canRecoverDeposit tracer workDir backend hydraScriptsTxId =
1515
1515
where
1516
1516
hydraTracer = contramap FromHydraNode tracer
1517
1517
1518
+ -- | Open a single participant head, deposit, Close and then recover it.
1519
+ canRecoverDepositWhenClosed :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> backend -> [TxId ] -> IO ()
1520
+ canRecoverDepositWhenClosed tracer workDir backend hydraScriptsTxId =
1521
+ (`finally` returnFundsToFaucet tracer backend Alice ) $ do
1522
+ refuelIfNeeded tracer backend Alice 30_000_000
1523
+ -- NOTE: Directly expire deposits
1524
+ contestationPeriod <- CP. fromNominalDiffTime 2
1525
+ blockTime <- Backend. getBlockTime backend
1526
+ let depositPeriod = 1
1527
+ networkId <- Backend. queryNetworkId backend
1528
+ aliceChainConfig <-
1529
+ chainConfigFor Alice workDir backend hydraScriptsTxId [] contestationPeriod
1530
+ <&> setNetworkId networkId . modifyConfig (\ c -> c{depositPeriod})
1531
+ withHydraNode hydraTracer aliceChainConfig workDir 1 aliceSk [] [1 ] $ \ n1 -> do
1532
+ send n1 $ input " Init" []
1533
+ headId <- waitMatch 10 n1 $ headIsInitializingWith (Set. fromList [alice])
1534
+
1535
+ -- Commit nothing
1536
+ requestCommitTx n1 mempty >>= Backend. submitTransaction backend
1537
+
1538
+ waitFor hydraTracer (20 * blockTime) [n1] $
1539
+ output " HeadIsOpen" [" utxo" .= object mempty , " headId" .= headId]
1540
+
1541
+ -- Get some L1 funds
1542
+ (walletVk, walletSk) <- generate genKeyPair
1543
+ let commitAmount = 5_000_000
1544
+ commitUTxO <- seedFromFaucet backend walletVk commitAmount (contramap FromFaucet tracer)
1545
+
1546
+ (balance <$> Backend. queryUTxOFor backend QueryTip walletVk)
1547
+ `shouldReturn` lovelaceToValue commitAmount
1548
+
1549
+ depositTransaction <-
1550
+ parseUrlThrow (" POST " <> hydraNodeBaseUrl n1 <> " /commit" )
1551
+ <&> setRequestBodyJSON commitUTxO
1552
+ >>= httpJSON
1553
+ <&> getResponseBody
1554
+
1555
+ let tx = signTx walletSk depositTransaction
1556
+ Backend. submitTransaction backend tx
1557
+
1558
+ deadline <- waitMatch 10 n1 $ \ v -> do
1559
+ guard $ v ^? key " tag" == Just " CommitRecorded"
1560
+ v ^? key " deadline" >>= parseMaybe parseJSON
1561
+
1562
+ (selectLovelace . balance <$> Backend. queryUTxOFor backend QueryTip walletVk)
1563
+ `shouldReturn` 0
1564
+
1565
+ send n1 $ input " Close" []
1566
+
1567
+ deadline' <- waitMatch (10 * blockTime) n1 $ \ v -> do
1568
+ guard $ v ^? key " tag" == Just " HeadIsClosed"
1569
+ v ^? key " contestationDeadline" . _JSON
1570
+
1571
+ let path = BSC. unpack $ urlEncode False $ encodeUtf8 $ T. pack $ show (getTxId $ getTxBody tx)
1572
+ -- NOTE: we need to wait for the deadline to pass before we can recover the deposit
1573
+ diff <- realToFrac . diffUTCTime deadline <$> getCurrentTime
1574
+ threadDelay $ diff + 1
1575
+
1576
+ (`shouldReturn` " OK" ) $
1577
+ parseUrlThrow (" DELETE " <> hydraNodeBaseUrl n1 <> " /commits/" <> path)
1578
+ >>= httpJSON
1579
+ <&> getResponseBody @ String
1580
+
1581
+ waitMatch 20 n1 $ \ v -> do
1582
+ guard $ v ^? key " tag" == Just " CommitRecovered"
1583
+ guard $ v ^? key " recoveredUTxO" == Just (toJSON commitUTxO)
1584
+
1585
+ (balance <$> Backend. queryUTxOFor backend QueryTip walletVk)
1586
+ `shouldReturn` lovelaceToValue commitAmount
1587
+
1588
+ remainingTime <- diffUTCTime deadline' <$> getCurrentTime
1589
+ waitFor hydraTracer (remainingTime + 3 * blockTime) [n1] $
1590
+ output " ReadyToFanout" [" headId" .= headId]
1591
+ send n1 $ input " Fanout" []
1592
+ waitMatch (20 * blockTime) n1 $ \ v ->
1593
+ guard $ v ^? key " tag" == Just " HeadIsFinalized"
1594
+
1595
+ -- Assert final wallet balance
1596
+ (balance <$> Backend. queryUTxOFor backend QueryTip walletVk)
1597
+ `shouldReturn` balance commitUTxO
1598
+ where
1599
+ hydraTracer = contramap FromHydraNode tracer
1600
+
1518
1601
-- | Make sure to be able to see pending deposits.
1519
1602
canSeePendingDeposits :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> NominalDiffTime -> backend -> [TxId ] -> IO ()
1520
1603
canSeePendingDeposits tracer workDir blockTime backend hydraScriptsTxId =
0 commit comments