@@ -288,10 +288,23 @@ bool Mediator::Serve(const std::string& channelID)
288
288
{
289
289
m_actionsQueue.emplace_back ([this , p_channelID] () {
290
290
auto & channel = m_channels[p_channelID];
291
+
292
+ if (!channel)
293
+ {
294
+ LOG_ERROR () << " Unknown channel ID: " << to_hex (p_channelID->m_pData , p_channelID->nBytes );
295
+ return ;
296
+ }
297
+
298
+ if (IsChannelExpired (channel))
299
+ {
300
+ LOG_ERROR () << " Channel ID: "
301
+ << to_hex (p_channelID->m_pData , p_channelID->nBytes ) << " lock height expired" ;
302
+ return ;
303
+ }
304
+
291
305
if (channel)
292
306
channel->Subscribe ();
293
- else
294
- LOG_ERROR () << " Unknown channel ID: " << to_hex (p_channelID->m_pData , p_channelID->nBytes );
307
+
295
308
});
296
309
return true ;
297
310
}
@@ -367,6 +380,13 @@ bool Mediator::Close(const std::string& channelID)
367
380
return false ;
368
381
}
369
382
383
+ if (IsChannelExpired (channel))
384
+ {
385
+ LOG_ERROR () << " Channel ID: "
386
+ << to_hex (p_channelID->m_pData , p_channelID->nBytes ) << " lock height expired" ;
387
+ return false ;
388
+ }
389
+
370
390
m_actionsQueue.emplace_back ([this , p_channelID] () {
371
391
CloseInternal (p_channelID);
372
392
});
@@ -398,6 +418,13 @@ bool Mediator::GracefulClose(const std::string& channelID)
398
418
return false ;
399
419
}
400
420
421
+ if (IsChannelExpired (channel))
422
+ {
423
+ LOG_ERROR () << " Channel ID: "
424
+ << to_hex (p_channelID->m_pData , p_channelID->nBytes ) << " lock height expired" ;
425
+ return false ;
426
+ }
427
+
401
428
if (!IsInSync ())
402
429
{
403
430
m_actionsQueue.emplace_back ([this , &channel] () {
@@ -825,7 +852,8 @@ void Mediator::UpdateChannels()
825
852
826
853
if (state != Lightning::Channel::State::None &&
827
854
state != Lightning::Channel::State::Closed &&
828
- state != Lightning::Channel::State::OpenFailed)
855
+ state != Lightning::Channel::State::OpenFailed &&
856
+ !IsChannelExpired (channel))
829
857
{
830
858
channel->Update ();
831
859
}
@@ -941,4 +969,11 @@ bool Mediator::IsInSync()
941
969
return IsValidTimeStamp (tip.m_TimeStamp , kDefaultLaserTolerance );
942
970
}
943
971
972
+ bool Mediator::IsChannelExpired (const std::unique_ptr<Channel>& channel)
973
+ {
974
+ Block::SystemState::Full tip;
975
+ get_History ().get_Tip (tip);
976
+ return tip.m_Height >= channel->get_LockHeight () + channel->m_Params .m_hLockTime + channel->m_Params .m_hPostLockReserve ;
977
+ }
978
+
944
979
} // namespace beam::wallet::laser
0 commit comments