@@ -109,6 +109,7 @@ import Hydra.Node.DepositPeriod (DepositPeriod (..))
109
109
import Hydra.Options (CardanoChainConfig (.. ), ChainBackendOptions (.. ), DirectOptions (.. ), RunOptions (.. ), startChainFrom )
110
110
import Hydra.Tx (HeadId , IsTx (balance ), Party , txId )
111
111
import Hydra.Tx.ContestationPeriod qualified as CP
112
+ import Hydra.Tx.Deposit (capUTxO )
112
113
import Hydra.Tx.Utils (dummyValidatorScript , verificationKeyToOnChainId )
113
114
import HydraNode (
114
115
HydraClient (.. ),
@@ -122,6 +123,7 @@ import HydraNode (
122
123
postDecommit ,
123
124
prepareHydraNode ,
124
125
requestCommitTx ,
126
+ requestCommitTx' ,
125
127
send ,
126
128
waitFor ,
127
129
waitForAllMatch ,
@@ -563,6 +565,7 @@ singlePartyCommitsFromExternal tracer workDir backend hydraScriptsTxId =
563
565
564
566
(walletVk, walletSk) <- keysFor AliceFunds
565
567
utxoToCommit <- seedFromFaucet backend walletVk 5_000_000 (contramap FromFaucet tracer)
568
+
566
569
res <-
567
570
runReq defaultHttpConfig $
568
571
req
@@ -1297,6 +1300,78 @@ canCommit tracer workDir blockTime backend hydraScriptsTxId =
1297
1300
where
1298
1301
hydraTracer = contramap FromHydraNode tracer
1299
1302
1303
+ -- | Open a a two participant head and incrementally commit part of the UTxO.
1304
+ canDepositPartially :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> NominalDiffTime -> backend -> [TxId ] -> IO ()
1305
+ canDepositPartially tracer workDir blockTime backend hydraScriptsTxId =
1306
+ (`finally` returnFundsToFaucet tracer backend Alice ) $ do
1307
+ (`finally` returnFundsToFaucet tracer backend Bob ) $ do
1308
+ refuelIfNeeded tracer backend Alice 30_000_000
1309
+ refuelIfNeeded tracer backend Bob 30_000_000
1310
+ -- NOTE: Adapt periods to block times
1311
+ let contestationPeriod = truncate $ 10 * blockTime
1312
+ depositPeriod = truncate $ 100 * blockTime
1313
+ networkId <- Backend. queryNetworkId backend
1314
+ aliceChainConfig <-
1315
+ chainConfigFor Alice workDir backend hydraScriptsTxId [Bob ] contestationPeriod
1316
+ <&> setNetworkId networkId . modifyConfig (\ c -> c{depositPeriod})
1317
+ bobChainConfig <-
1318
+ chainConfigFor Bob workDir backend hydraScriptsTxId [Alice ] contestationPeriod
1319
+ <&> setNetworkId networkId . modifyConfig (\ c -> c{depositPeriod})
1320
+ withHydraNode hydraTracer aliceChainConfig workDir 1 aliceSk [bobVk] [2 ] $ \ n1 -> do
1321
+ withHydraNode hydraTracer bobChainConfig workDir 2 bobSk [aliceVk] [1 ] $ \ n2 -> do
1322
+ send n1 $ input " Init" []
1323
+ headId <- waitMatch (10 * blockTime) n2 $ headIsInitializingWith (Set. fromList [alice, bob])
1324
+
1325
+ -- Commit nothing
1326
+ requestCommitTx n1 mempty >>= Backend. submitTransaction backend
1327
+ requestCommitTx n2 mempty >>= Backend. submitTransaction backend
1328
+ waitFor hydraTracer (20 * blockTime) [n1, n2] $
1329
+ output " HeadIsOpen" [" utxo" .= object mempty , " headId" .= headId]
1330
+
1331
+ -- Get some L1 funds
1332
+ (walletVk, walletSk) <- generate genKeyPair
1333
+ commitUTxO <- seedFromFaucet backend walletVk 5_000_000 (contramap FromFaucet tracer)
1334
+ -- This one is expected to fail since there is 5 ADA at the wallet address but we specified 6 ADA to commit
1335
+ (requestCommitTx' n1 commitUTxO (Just 6_000_000 ) <&> toJSON)
1336
+ `shouldThrow` expectErrorStatus 400 (Just " AmountTooLow" )
1337
+
1338
+ let expectedCommit = fst $ capUTxO commitUTxO 2_000_000
1339
+
1340
+ depositTransaction <- requestCommitTx' n2 commitUTxO (Just 2_000_000 )
1341
+
1342
+ let tx = signTx walletSk depositTransaction
1343
+
1344
+ Backend. submitTransaction backend tx
1345
+
1346
+ waitFor hydraTracer (2 * realToFrac depositPeriod) [n1, n2] $
1347
+ output " CommitApproved" [" headId" .= headId, " utxoToCommit" .= expectedCommit]
1348
+ waitFor hydraTracer (20 * blockTime) [n1, n2] $
1349
+ output " CommitFinalized" [" headId" .= headId, " depositTxId" .= getTxId (getTxBody tx)]
1350
+
1351
+ getSnapshotUTxO n1 `shouldReturn` expectedCommit
1352
+ -- check that user balance balance contains the change from the commit tx
1353
+ (balance <$> Backend. queryUTxOFor backend QueryTip walletVk)
1354
+ `shouldReturn` lovelaceToValue 3_000_000
1355
+
1356
+ send n2 $ input " Close" []
1357
+
1358
+ deadline <- waitMatch (10 * blockTime) n2 $ \ v -> do
1359
+ guard $ v ^? key " tag" == Just " HeadIsClosed"
1360
+ v ^? key " contestationDeadline" . _JSON
1361
+
1362
+ remainingTime <- diffUTCTime deadline <$> getCurrentTime
1363
+ waitFor hydraTracer (remainingTime + 3 * blockTime) [n1, n2] $
1364
+ output " ReadyToFanout" [" headId" .= headId]
1365
+ send n2 $ input " Fanout" []
1366
+ waitMatch (10 * blockTime) n2 $ \ v ->
1367
+ guard $ v ^? key " tag" == Just " HeadIsFinalized"
1368
+
1369
+ -- Assert final wallet balance
1370
+ (balance <$> Backend. queryUTxOFor backend QueryTip walletVk)
1371
+ `shouldReturn` balance commitUTxO
1372
+ where
1373
+ hydraTracer = contramap FromHydraNode tracer
1374
+
1300
1375
rejectCommit :: ChainBackend backend => Tracer IO EndToEndLog -> FilePath -> NominalDiffTime -> backend -> [TxId ] -> IO ()
1301
1376
rejectCommit tracer workDir blockTime backend hydraScriptsTxId =
1302
1377
(`finally` returnFundsToFaucet tracer backend Alice ) $ do
0 commit comments