@@ -301,12 +301,13 @@ onOpenNetworkReqTx ::
301
301
IsTx tx =>
302
302
Environment ->
303
303
Ledger tx ->
304
+ ChainSlot ->
304
305
OpenState tx ->
305
306
TTL ->
306
307
-- | The transaction to be submitted to the head.
307
308
tx ->
308
309
Outcome tx
309
- onOpenNetworkReqTx env ledger st ttl tx =
310
+ onOpenNetworkReqTx env ledger currentSlot st ttl tx =
310
311
-- Keep track of transactions by-id
311
312
(newState TransactionReceived {tx} <> ) $
312
313
-- Spec: wait L̂ ◦ tx ≠ ⊥
@@ -363,7 +364,7 @@ onOpenNetworkReqTx env ledger st ttl tx =
363
364
364
365
Snapshot {number = confirmedSn} = getSnapshot confirmedSnapshot
365
366
366
- OpenState {coordinatedHeadState, headId, currentSlot, parameters} = st
367
+ OpenState {coordinatedHeadState, headId, parameters} = st
367
368
368
369
snapshotInFlight = case seenSnapshot of
369
370
NoSeenSnapshot -> False
@@ -392,6 +393,7 @@ onOpenNetworkReqSn ::
392
393
Environment ->
393
394
Ledger tx ->
394
395
PendingDeposits tx ->
396
+ ChainSlot ->
395
397
OpenState tx ->
396
398
-- | Party which sent the ReqSn.
397
399
Party ->
@@ -406,7 +408,7 @@ onOpenNetworkReqSn ::
406
408
-- | Optional commit of additional funds into the head.
407
409
Maybe (TxIdType tx ) ->
408
410
Outcome tx
409
- onOpenNetworkReqSn env ledger pendingDeposits st otherParty sv sn requestedTxIds mDecommitTx mDepositTxId =
411
+ onOpenNetworkReqSn env ledger pendingDeposits currentSlot st otherParty sv sn requestedTxIds mDecommitTx mDepositTxId =
410
412
-- Spec: require v = v̂ ∧ s = ŝ + 1 ∧ leader(s) = j
411
413
requireReqSn $
412
414
-- Spec: wait ŝ = ̅S.s
@@ -582,7 +584,7 @@ onOpenNetworkReqSn env ledger pendingDeposits st otherParty sv sn requestedTxIds
582
584
583
585
CoordinatedHeadState {confirmedSnapshot, seenSnapshot, allTxs, localTxs, version} = coordinatedHeadState
584
586
585
- OpenState {parameters, coordinatedHeadState, currentSlot, headId} = st
587
+ OpenState {parameters, coordinatedHeadState, headId} = st
586
588
587
589
Environment {signingKey} = env
588
590
@@ -750,18 +752,17 @@ onOpenNetworkAckSn Environment{party} pendingDeposits openState otherParty snaps
750
752
-- | Client request to recover deposited UTxO.
751
753
--
752
754
-- __Transition__: 'OpenState' → 'OpenState'
753
- onOpenClientRecover ::
755
+ onClientRecover ::
754
756
IsTx tx =>
755
- HeadId ->
756
757
ChainSlot ->
757
758
PendingDeposits tx ->
758
759
TxIdType tx ->
759
760
Outcome tx
760
- onOpenClientRecover headId currentSlot pendingDeposits recoverTxId =
761
+ onClientRecover currentSlot pendingDeposits recoverTxId =
761
762
case Map. lookup recoverTxId pendingDeposits of
762
763
Nothing ->
763
764
Error $ RequireFailed NoMatchingDeposit
764
- Just Deposit {deposited} ->
765
+ Just Deposit {headId, deposited} ->
765
766
causes
766
767
[ OnChainEffect
767
768
{ postChainTx =
@@ -842,10 +843,11 @@ onOpenNetworkReqDec ::
842
843
Environment ->
843
844
Ledger tx ->
844
845
TTL ->
846
+ ChainSlot ->
845
847
OpenState tx ->
846
848
tx ->
847
849
Outcome tx
848
- onOpenNetworkReqDec env ledger ttl openState decommitTx =
850
+ onOpenNetworkReqDec env ledger ttl currentSlot openState decommitTx =
849
851
-- Spec: wait 𝑈𝛼 = ∅ ^ txω =⊥ ∧ L̂ ◦ tx ≠ ⊥
850
852
waitOnApplicableDecommit $ \ newLocalUTxO -> do
851
853
-- Spec: L̂ ← L̂ ◦ tx \ outputs(tx)
@@ -921,7 +923,6 @@ onOpenNetworkReqDec env ledger ttl openState decommitTx =
921
923
{ headId
922
924
, parameters
923
925
, coordinatedHeadState
924
- , currentSlot
925
926
} = openState
926
927
927
928
-- | Process the chain (and time) advancing in an open head.
@@ -978,6 +979,8 @@ onOpenChainTick env pendingDeposits st chainTime =
978
979
979
980
plusTime = flip addUTCTime
980
981
982
+ -- REVIEW! check what if there are more than 1 new active deposit
983
+ -- What is the sorting criteria to pick next?
981
984
withNextActive :: forall tx . (Eq (UTxOType tx ), Monoid (UTxOType tx )) => Map (TxIdType tx ) (Deposit tx ) -> (TxIdType tx -> Outcome tx ) -> Outcome tx
982
985
withNextActive deposits cont = do
983
986
-- NOTE: Do not consider empty deposits.
@@ -1326,7 +1329,7 @@ update ::
1326
1329
-- | Input to be processed.
1327
1330
Input tx ->
1328
1331
Outcome tx
1329
- update env ledger NodeState {headState = st, pendingDeposits} ev = case (st, ev) of
1332
+ update env ledger NodeState {headState = st, pendingDeposits, currentSlot } ev = case (st, ev) of
1330
1333
(_, NetworkInput _ (ConnectivityEvent conn)) ->
1331
1334
onConnectionEvent env. configuredPeers conn
1332
1335
(Idle _, ClientInput Init ) ->
@@ -1350,9 +1353,9 @@ update env ledger NodeState{headState = st, pendingDeposits} ev = case (st, ev)
1350
1353
(Open {}, ClientInput (NewTx tx)) ->
1351
1354
onOpenClientNewTx tx
1352
1355
(Open openState, NetworkInput ttl (ReceivedMessage {msg = ReqTx tx})) ->
1353
- onOpenNetworkReqTx env ledger openState ttl tx
1356
+ onOpenNetworkReqTx env ledger currentSlot openState ttl tx
1354
1357
(Open openState, NetworkInput _ (ReceivedMessage {sender, msg = ReqSn sv sn txIds decommitTx depositTxId})) ->
1355
- onOpenNetworkReqSn env ledger pendingDeposits openState sender sv sn txIds decommitTx depositTxId
1358
+ onOpenNetworkReqSn env ledger pendingDeposits currentSlot openState sender sv sn txIds decommitTx depositTxId
1356
1359
(Open openState, NetworkInput _ (ReceivedMessage {sender, msg = AckSn snapshotSignature sn})) ->
1357
1360
onOpenNetworkAckSn env pendingDeposits openState sender snapshotSignature sn
1358
1361
( Open openState@ OpenState {headId = ourHeadId}
@@ -1371,12 +1374,10 @@ update env ledger NodeState{headState = st, pendingDeposits} ev = case (st, ev)
1371
1374
-- another party likely opened the head before us and it's okay to ignore.
1372
1375
(Open {}, ChainInput PostTxError {postChainTx = CollectComTx {}}) ->
1373
1376
noop
1374
- (Open OpenState {headId, currentSlot}, ClientInput Recover {recoverTxId}) -> do
1375
- onOpenClientRecover headId currentSlot pendingDeposits recoverTxId
1376
- (Open OpenState {headId, coordinatedHeadState, currentSlot}, ClientInput Decommit {decommitTx}) -> do
1377
+ (Open OpenState {headId, coordinatedHeadState}, ClientInput Decommit {decommitTx}) -> do
1377
1378
onOpenClientDecommit headId ledger currentSlot coordinatedHeadState decommitTx
1378
1379
(Open openState, NetworkInput ttl (ReceivedMessage {msg = ReqDec {transaction}})) ->
1379
- onOpenNetworkReqDec env ledger ttl openState transaction
1380
+ onOpenNetworkReqDec env ledger ttl currentSlot openState transaction
1380
1381
(Open OpenState {headId = ourHeadId}, ChainInput Observation {observedTx = OnDepositTx {headId, depositTxId, deposited, created, deadline}, newChainState})
1381
1382
| ourHeadId == headId ->
1382
1383
newState DepositRecorded {chainState = newChainState, headId, depositTxId, deposited, created, deadline}
@@ -1421,6 +1422,9 @@ update env ledger NodeState{headState = st, pendingDeposits} ev = case (st, ev)
1421
1422
onClosedChainFanoutTx closedState newChainState fanoutUTxO
1422
1423
| otherwise ->
1423
1424
Error NotOurHead {ourHeadId, otherHeadId = headId}
1425
+ -- Node-level
1426
+ (_, ClientInput Recover {recoverTxId}) -> do
1427
+ onClientRecover currentSlot pendingDeposits recoverTxId
1424
1428
-- General
1425
1429
(_, ChainInput Rollback {rolledBackChainState}) ->
1426
1430
newState ChainRolledBack {chainState = rolledBackChainState}
@@ -1441,8 +1445,8 @@ aggregateNodeState nodeState@NodeState{headState} sc =
1441
1445
let headState' = aggregate headState sc
1442
1446
ns@ NodeState {headState = st, pendingDeposits} = nodeState{headState = headState'}
1443
1447
in case sc of
1444
- HeadOpened {} ->
1445
- ns{pendingDeposits = mempty }
1448
+ HeadOpened {chainState } ->
1449
+ ns{pendingDeposits = mempty , currentSlot = chainStateSlot chainState }
1446
1450
DepositRecorded {headId, depositTxId, deposited, created, deadline} ->
1447
1451
ns{pendingDeposits = Map. insert depositTxId Deposit {headId, deposited, created, deadline, status = Inactive } pendingDeposits}
1448
1452
DepositActivated {depositTxId, deposit} ->
@@ -1479,6 +1483,8 @@ aggregateNodeState nodeState@NodeState{headState} sc =
1479
1483
ns
1480
1484
{ pendingDeposits = Map. delete depositTxId pendingDeposits
1481
1485
}
1486
+ TickObserved {chainSlot} ->
1487
+ ns{currentSlot = chainSlot}
1482
1488
_ -> ns
1483
1489
1484
1490
-- * HeadState aggregate
@@ -1543,7 +1549,6 @@ aggregate st = \case
1543
1549
, chainState
1544
1550
, headId
1545
1551
, headSeed
1546
- , currentSlot = chainStateSlot chainState
1547
1552
}
1548
1553
_otherState -> st
1549
1554
TransactionReceived {tx} ->
@@ -1758,10 +1763,7 @@ aggregate st = \case
1758
1763
_otherState -> st
1759
1764
ChainRolledBack {chainState} ->
1760
1765
setChainState chainState st
1761
- TickObserved {chainSlot} ->
1762
- case st of
1763
- Open ost@ OpenState {} -> Open ost{currentSlot = chainSlot}
1764
- _otherState -> st
1766
+ TickObserved {} -> st
1765
1767
IgnoredHeadInitializing {} -> st
1766
1768
TxInvalid {transaction} -> case st of
1767
1769
Open ost@ OpenState {coordinatedHeadState = coordState@ CoordinatedHeadState {allTxs = allTransactions}} ->
0 commit comments