package Ġfr . ac in q . lightning . channel . states Ċ Ċ import Ġfr . ac in q . bitcoin .* Ċ import Ġfr . ac in q . lightning .* Ċ import Ġfr . ac in q . lightning . Lightning . random Bytes 3 2 Ċ import Ġfr . ac in q . lightning . blockchain .* Ċ import Ġfr . ac in q . lightning . blockchain . fee . Fe erate Per Kw Ċ import Ġfr . ac in q . lightning . channel .* Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . add H tl c Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . claim H tl c Success T xs Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . claim H tl c Timeout T xs Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . cross Sign Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . ful fill H tl c Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . ht lc Success T xs Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . ht lc Timeout T xs Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . make Cmd Add Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . process Ex Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . reach Normal Ċ import Ġfr . ac in q . lightning . channel . Tests Helper . sign And Rev ack Ċ import Ġfr . ac in q . lightning . crypto . sphinx . S phinx Ċ import Ġfr . ac in q . lightning . router . Anno unce ments Ċ import Ġfr . ac in q . lightning . serialization . Serialization Ċ import Ġfr . ac in q . lightning . tests . Test Constants Ċ import Ġfr . ac in q . lightning . tests . utils . Lightning TestSuite Ċ import Ġfr . ac in q . lightning . transactions . Transactions . weight 2 fee Ċ import Ġfr . ac in q . lightning . transactions . in com ings Ċ import Ġfr . ac in q . lightning . transactions . out go ings Ċ import Ġfr . ac in q . lightning . utils .* Ċ import Ġfr . ac in q . lightning . wire .* Ċ import Ġkotlin . test .* Ċ Ċ @ Experimental Unsigned Types Ċ class ĠNormal Tests Common Ġ: ĠLight ning TestSuite () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdefault Add Ġ= ĠCMD _ ADD _ HT LC ( ĊĠĠĠĠĠĠĠĠ 5 0 _ 0 0 0 _ 0 0 0 . ms at , ĊĠĠĠĠĠĠĠ Ġrandom Bytes 3 2 (), ĊĠĠĠĠĠĠĠ ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( Test Constants . default Block Height . to Long ()), ĊĠĠĠĠĠĠĠ ĠTest Constants . empty On ion Packet , ĊĠĠĠĠĠĠĠ ĠUUID . randomUUID () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( payment Hash Ġ= Ġrandom Bytes 3 2 ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 . commit ments . available Balance For Send () Ġ< Ġalice 0 . commit ments . available Balance For Send ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġht lc Ġ= Ġactions . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġht lc . id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( add . payment Hash , Ġht lc . payment Hash ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġalice 0 . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit ments Ġ= Ġalice 0 . commit ments . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Next H tl c Id Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Changes Ġ= Ġalice 0 . commit ments . local Changes . copy ( pro posed Ġ= ĠlistOf ( ht lc )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayments Ġ= Ġmap Of ( 0 L Ġto Ġadd . payment Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġalice 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( increment ing Ġids )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġvar Ġalice Ġ= Ġalice 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( payment Hash Ġ= Ġrandom Bytes 3 2 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( temp Alice , Ġactions ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice Ġ= Ġtemp Alice Ġas ĠNormal ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġht lc Ġ= Ġactions . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( i . to Long (), Ġht lc . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( add . payment Hash , Ġht lc . payment Hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( expiry Ġtoo Ġsmall )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġusually Ġdangerous Ġfor ĠBob Ġto Ġaccept ĠHT LC s Ġthat Ġare Ġexp iring Ġsoon . ĠHowever Ġit 's Ġnot ĠAlice 's Ġdecision Ġto Ġreject ĊĠĠĠĠĠĠĠ Ġ// Ġthem Ġwhen Ġshe 's Ġasked Ġto Ġrelay ; Ġshe Ġshould Ġforward Ġthose ĠHT LC s Ġto ĠBob , Ġand ĠBob Ġwill Ġchoose Ġwhether Ġto Ġfail Ġthem ĊĠĠĠĠĠĠĠ Ġ// Ġor Ġfulfill Ġthem Ġ( Bob Ġcould Ġbe Ġ# re ck less Ġand Ġfulfill ĠHT LC s Ġwith Ġa Ġvery Ġlow Ġexpiry Ġdelta ). ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Block Height Ġ= Ġalice 0 . current Block Height . to Long () ĊĠĠĠĠĠĠĠ Ġval Ġexpiry Too Small Ġ= ĠC lt v Expiry ( current Block Height Ġ+ Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( cl tv Expiry Ġ= Ġexpiry Too Small ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( expiry Ġtoo Ġbig )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Block Height Ġ= Ġalice 0 . current Block Height . to Long () ĊĠĠĠĠĠĠĠ Ġval Ġexpiry Too Big Ġ= Ġ( Channel . MAX _ CL TV _ EXPI RY _ DELTA Ġ+ Ġ 1 ). to C lt v Expiry ( current Block Height ) ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( cl tv Expiry Ġ= Ġexpiry Too Big ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions 1 . find Command Error < Expiry Too Big >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠExp iry Too Big ( alice 0 . channelId , ĠChannel . MAX _ CL TV _ EXPI RY _ DELTA . to C lt v Expiry ( current Block Height ), Ġexpiry Too Big , Ġcurrent Block Height ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 0 , Ġalice 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( value Ġtoo Ġsmall )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( amount Ġ= Ġ 5 0 . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < H tl c Value Too Small >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠH tl c Value Too Small ( alice 0 . channelId , Ġ 1 0 0 0 . ms at , Ġ 5 0 . ms at ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 0 , Ġalice 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( 0 Ġms at )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġ// ĠAlice Ġhas Ġa Ġminimum Ġset Ġto Ġ 0 Ġms at Ġ( which Ġshould Ġbe Ġinvalid , Ġbut Ġmay Ġmis lead ĠBob Ġinto Ġrelay ing Ġ 0 - value ĠHT LC s Ġwhich Ġis Ġforbidden Ġby Ġthe Ġspec ). ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . ms at , Ġalice 0 . commit ments . local Params . ht lc Minimum ) ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( amount Ġ= Ġ 0 . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < H tl c Value Too Small >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠH tl c Value Too Small ( bob 0 . channelId , Ġ 1 . ms at , Ġ 0 . ms at ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 0 , Ġbob 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( in creasing Ġbalance Ġbut Ġstill Ġbelow Ġreserve )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal ( push Ms at Ġ= Ġ 0 . ms at ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( alice 0 . commit ments . channel Features . has Feature ( Feature . Zero Reserve Channels )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( bob 0 . commit ments . channel Features . has Feature ( Feature . Zero Reserve Channels )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . ms at , Ġbob 0 . commit ments . available Balance For Send ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Add Ġ= Ġdefault Add . copy ( amount Ġ= Ġ 1 _ 5 0 0 . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( cmd Add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġactions Alice . has Outgoing Message < Update Add H tl c >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions Bob ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions Bob . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . ms at , Ġbob 1 . commit ments . available Balance For Send ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( ins ufficient Ġfunds )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( amount Ġ= ĠInt . MAX _ VALUE . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < Ins ufficient Funds >() ĊĠĠĠĠĠĠĠ Ġval Ġexpect Error Ġ= ĠIns ufficient Funds ( alice 0 . channelId , Ġamount Ġ= ĠInt . MAX _ VALUE . ms at , Ġmissing Ġ= Ġ 1 _ 3 8 2 _ 8 2 3 . sat , Ġreserve Ġ= Ġ 2 0 _ 0 0 0 . sat , Ġfees Ġ= Ġ 7 _ 1 4 0 . sat ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expect Error , Ġactual Error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 0 , Ġalice 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( ins ufficient Ġfunds , Ġmissing Ġ 1 Ġms at )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( amount Ġ= Ġbob 0 . commit ments . available Balance For Send () Ġ+ Ġ 1 . sat . to Milli Sat oshi ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < Ins ufficient Funds >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠIns ufficient Funds ( bob 0 . channelId , Ġamount Ġ= Ġadd . amount , Ġmissing Ġ= Ġ 1 . sat , Ġreserve Ġ= Ġ 1 0 0 0 0 . sat , Ġfees Ġ= Ġ 0 . sat ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 0 , Ġbob 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( HT LC Ġd ips Ġinto Ġremote Ġfun der Ġfee Ġreserve )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( 7 6 4 _ 6 6 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġcross Sign ( alice 1 , Ġbob 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . ms at , Ġ( alice 2 Ġas ĠChannel State With Commit ments ). commit ments . available Balance For Send ()) ĊĊĠĠĠĠĠĠĠ Ġtail rec Ġfun Ġloop ( bob : ĠChannel State , Ġcount : ĠInt ): ĠChannel State Ġ= Ġif Ġ( count Ġ== Ġ 0 ) Ġbob Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( new Bob , Ġactions 1 ) Ġ= Ġbob . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 6 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloop ( new Bob , Ġcount Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġactual Ġtest Ġbegins ĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthis Ġpoint Ġalice Ġhas Ġthe Ġminimal Ġamount Ġto Ġs ustain Ġa Ġchannel ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġmaintains Ġan Ġextra Ġreserve Ġto Ġac commod ate Ġfor Ġa Ġfew Ġmore ĠHT LC s , Ġso Ġthe Ġfirst ĠHT LC s Ġshould Ġbe Ġallowed ĊĠĠĠĠĠĠĠ Ġval Ġbob 3 Ġ= Ġloop ( bob 2 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġ// Ġbut Ġthis Ġone Ġwill Ġdip Ġalice Ġbelow Ġher Ġreserve : Ġwe Ġmust Ġwait Ġfor Ġthe Ġprevious ĠHT LC s Ġto Ġset tle Ġbefore Ġsending Ġany Ġmore ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 2 _ 5 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġactions Bob 4 . find Command Error < Remote Cannot Aff ord Fees For New H tl c >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( ins ufficient Ġfunds Ġwith Ġpending Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 3 0 0 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġactions Alice 1 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 3 0 0 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġactions Alice 2 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 5 0 0 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions Alice 3 . find Command Error < Ins ufficient Funds >() ĊĠĠĠĠĠĠĠ Ġval Ġexpect Error Ġ= ĠIns ufficient Funds ( alice 0 . channelId , Ġamount Ġ= Ġ 5 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġmissing Ġ= Ġ 3 3 8 _ 7 8 0 . sat , Ġreserve Ġ= Ġ 2 0 _ 0 0 0 . sat , Ġfees Ġ= Ġ 8 _ 8 6 0 . sat ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expect Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( ins ufficient Ġfunds Ġwith Ġpending Ġht lcs Ġand Ġ 0 Ġbalance )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 5 0 0 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġactions Alice 1 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 2 0 0 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġactions Alice 2 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions Alice 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 6 1 _ 1 2 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġactions Alice 3 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 4 ) Ġ= Ġalice 3 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions Alice 4 . find Command Error < Ins ufficient Funds >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠIns ufficient Funds ( alice 0 . channelId , Ġamount Ġ= Ġ 1 _ 0 0 0 _ 0 0 0 . ms at , Ġmissing Ġ= Ġ 9 0 0 . sat , Ġreserve Ġ= Ġ 2 0 _ 0 0 0 . sat , Ġfees Ġ= Ġ 8 _ 8 6 0 . sat ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( over Ġtheir Ġmax Ġin - flight Ġht lc Ġvalue )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbob 0 Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbob . copy ( commit ments Ġ= Ġbob . commit ments . copy ( remote Params Ġ= Ġbob . commit ments . remote Params . copy ( max H tl c Value In Flight Ms at Ġ= Ġ 1 5 0 _ 0 0 0 _ 0 0 0 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 5 1 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < H tl c Value Too High In Flight >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠH tl c Value Too High In Flight ( bob 0 . channelId , Ġmaximum Ġ= Ġ 1 5 0 _ 0 0 0 _ 0 0 0 UL , Ġactual Ġ= Ġ 1 5 1 _ 0 0 0 _ 0 0 0 . ms at ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( over Ġour Ġmax Ġin - flight Ġht lc Ġvalue )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbob 0 Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbob . copy ( commit ments Ġ= Ġbob . commit ments . copy ( local Params Ġ= Ġbob . commit ments . local Params . copy ( max H tl c Value In Flight Ms at Ġ= Ġ 1 0 0 _ 0 0 0 _ 0 0 0 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 0 1 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < H tl c Value Too High In Flight >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠH tl c Value Too High In Flight ( bob 0 . channelId , Ġmaximum Ġ= Ġ 1 0 0 _ 0 0 0 _ 0 0 0 UL , Ġactual Ġ= Ġ 1 0 1 _ 0 0 0 _ 0 0 0 . ms at ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( over Ġmax Ġin - flight Ġht lc Ġvalue Ġwith Ġduplicate Ġamounts )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbob 0 Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbob . copy ( commit ments Ġ= Ġbob . commit ments . copy ( remote Params Ġ= Ġbob . commit ments . remote Params . copy ( max H tl c Value In Flight Ms at Ġ= Ġ 1 5 0 _ 0 0 0 _ 0 0 0 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions Bob 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 7 5 _ 5 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġactions Bob 1 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 7 5 _ 5 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions Bob 2 . find Command Error < H tl c Value Too High In Flight >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠH tl c Value Too High In Flight ( bob 0 . channelId , Ġmaximum Ġ= Ġ 1 5 0 _ 0 0 0 _ 0 0 0 UL , Ġactual Ġ= Ġ 1 5 1 _ 0 0 0 _ 0 0 0 . ms at ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( over Ġmax Ġaccepted Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBob Ġaccepts Ġa Ġmaximum Ġof Ġ 1 0 0 Ġht lcs ĊĠĠĠĠĠĠĠ Ġval Ġalice 1 Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġalice Ġ= Ġalice 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġbob 0 . static Params . node Params . max Accepted H tl cs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( temp Alice , Ġactions ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactions . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalice Ġ= Ġtemp Alice Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < Too Many Accepted H tl cs >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠToo Many Accepted H tl cs ( alice 0 . channelId , Ġmaximum Ġ= Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( over Ġmax Ġoffered Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġ// ĠBob Ġaccepts Ġa Ġmaximum Ġof Ġ 1 0 0 Ġht lcs , Ġbut Ġfor ĠAlice Ġthat Ġvalue Ġis Ġonly Ġ 5 ĊĠĠĠĠĠĠĠ Ġval Ġalice 1 Ġ= Ġalice 0 . copy ( commit ments Ġ= Ġalice 0 . commit ments . copy ( local Params Ġ= Ġalice 0 . commit ments . local Params . copy ( max Accepted H tl cs Ġ= Ġ 5 ))) ĊĊĠĠĠĠĠĠĠ Ġval Ġalice 2 Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġalice Ġ= Ġalice 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( temp Alice , Ġactions ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactions . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalice Ġ= Ġtemp Alice Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions ) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= Ġ 1 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < Too Many Offer ed H tl cs >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠToo Many Offer ed H tl cs ( alice 0 . channelId , Ġmaximum Ġ= Ġ 5 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( over Ġcapacity )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( amount Ġ= ĠTest Constants . fund ing Amount . to Milli Sat oshi () Ġ* Ġ 2 Ġ/ Ġ 3 ))) ĊĠĠĠĠĠĠĠ Ġactions Alice 1 . has Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġactions Alice 2 . has Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġover Ġchannel - capacity ĊĠĠĠĠĠĠĠ Ġval Ġfail Add Ġ= Ġdefault Add . copy ( amount Ġ= ĠTest Constants . fund ing Amount . to Milli Sat oshi () Ġ* Ġ 2 Ġ/ Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( fail Add )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions Alice 3 . find Command Error < Ins ufficient Funds >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠIns ufficient Funds ( alice 0 . channelId , Ġfail Add . amount , Ġ 5 7 0 _ 3 9 3 . sat , Ġ 2 0 _ 0 0 0 . sat , Ġ 8 _ 0 0 0 . sat ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( after Ġhaving Ġsent ĠShutdown )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġactions Alice 1 . find Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal Ġ&& Ġalice 1 . local Shutdown Ġ!= Ġnull Ġ&& Ġalice 1 . remote Shutdown Ġ== Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġcmd Add ) Ġ= Ġmake Cmd Add ( 5 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 . static Params . node Params . nodeId , ĠTest Constants . default Block Height . to Long (), Ġrandom Bytes 3 2 ()) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( cmd Add )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( actions Alice 2 . find Command Error < No More H tl cs Closing InProgress >()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ ADD _ HT LC Ġ( after Ġhaving Ġreceived ĠShutdown )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĊĠĠĠĠĠĠĠ Ġ// Ġlet 's Ġmake Ġalice Ġsend Ġan Ġht lc ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġcmd Add 1 ) Ġ= Ġmake Cmd Add ( 5 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 . static Params . node Params . nodeId , ĠTest Constants . default Block Height . to Long (), Ġrandom Bytes 3 2 ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( cmd Add 1 )) ĊĠĠĠĠĠĠĠ Ġactions Alice 1 . find Outgoing Message < Update Add H tl c >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthe Ġsame Ġtime Ġbob Ġiniti ates Ġa Ġclosing ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġval Ġshutdown Ġ= Ġactions Bob 1 . find Outgoing Message < Shutdown >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġ_) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( shutdown )) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġcmd Add 2 ) Ġ= Ġmake Cmd Add ( 1 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 . static Params . node Params . nodeId , ĠTest Constants . default Block Height . to Long (), Ġrandom Bytes 3 2 ()) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( cmd Add 2 )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( actions Alice 3 . find Command Error < No More H tl cs Closing InProgress >()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Add H tl c `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( bob 0 . channelId , Ġ 0 , Ġ 1 5 _ 0 0 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( bob 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġbob 0 . copy ( commit ments Ġ= Ġbob 0 . commit ments . copy ( remote Next H tl c Id Ġ= Ġ 1 , Ġremote Changes Ġ= Ġbob 0 . commit ments . remote Changes . copy ( pro posed Ġ= ĠlistOf ( add )))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġbob 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Add H tl c Ġ( unexpected Ġid )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( bob 0 . channelId , Ġ 0 , Ġ 1 5 _ 0 0 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( bob 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( add . copy ( id Ġ= Ġ 1 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . Message Received ( add . copy ( id Ġ= Ġ 2 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 3 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . Message Received ( add . copy ( id Ġ= Ġ 4 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 4 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 4 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠUnexpected H tl c Id ( bob 0 . channelId , Ġ 3 , Ġ 4 ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Add H tl c Ġ( value Ġtoo Ġsmall )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( bob 0 . channelId , Ġ 0 , Ġ 1 5 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( bob 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 1 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠH tl c Value Too Small ( bob 0 . channelId , Ġ 1 _ 0 0 0 . ms at , Ġadd . amount Ms at ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Add H tl c Ġ( ins ufficient Ġfunds )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( bob 0 . channelId , Ġ 0 , Ġ 8 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( bob 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 1 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠIns ufficient Funds ( bob 0 . channelId , Ġ 8 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġ 2 7 _ 1 4 0 . sat , Ġ 2 0 _ 0 0 0 . sat , Ġ 7 _ 1 4 0 . sat ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Add H tl c Ġ( ins ufficient Ġfunds Ġwith Ġpending Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( bob 0 . channelId , Ġ 0 , Ġ 1 5 _ 0 0 0 _ 0 0 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( bob 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( add . copy ( id Ġ= Ġ 1 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . Message Received ( add . copy ( id Ġ= Ġ 2 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 3 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . Message Received ( add . copy ( id Ġ= Ġ 3 , Ġamount Ms at Ġ= Ġ 8 0 0 _ 0 0 0 _ 0 0 0 . ms at ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 4 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 4 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠIns ufficient Funds ( bob 0 . channelId , Ġ 8 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġ 7 4 _ 7 2 0 . sat , Ġ 2 0 _ 0 0 0 . sat , Ġ 9 _ 7 2 0 . sat ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Add H tl c Ġ( over Ġmax Ġin - flight Ġht lc Ġvalue )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalice 0 Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice . copy ( commit ments Ġ= Ġalice . commit ments . copy ( local Params Ġ= Ġalice . commit ments . local Params . copy ( max H tl c Value In Flight Ms at Ġ= Ġ 1 5 0 _ 0 0 0 _ 0 0 0 ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( alice 0 . channelId , Ġ 0 , Ġ 1 5 1 _ 0 0 0 _ 0 0 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( alice 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 1 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠH tl c Value Too High In Flight ( alice 0 . channelId , Ġ 1 5 0 _ 0 0 0 _ 0 0 0 UL , Ġ 1 5 1 _ 0 0 0 _ 0 0 0 . ms at ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Add H tl c Ġ( over Ġmax Ġaccepted Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBob Ġaccepts Ġa Ġmaximum Ġof Ġ 1 0 0 Ġht lcs ĊĠĠĠĠĠĠĠ Ġval Ġbob 1 Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbob Ġ= Ġbob 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġbob 0 . static Params . node Params . max Accepted H tl cs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( bob 0 . channelId , Ġi . to Long (), Ġ 2 _ 5 0 0 _ 0 0 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( bob 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( temp Bob , Ġactions ) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( actions . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbob Ġ= Ġtemp Bob Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbob ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnext H tl c Id Ġ= Ġbob 1 . commit ments . remote Next H tl c Id ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= ĠUpdate Add H tl c ( bob 0 . channelId , Ġnext H tl c Id , Ġ 2 _ 0 0 0 _ 0 0 0 . ms at , Ġrandom Bytes 3 2 (), ĠC lt v Expiry Delta ( 1 4 4 ). to C lt v Expiry ( bob 0 . current Block Height . to Long ()), ĠTest Constants . empty On ion Packet ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 2 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠToo Many Accepted H tl cs ( bob 0 . channelId , Ġbob 0 . static Params . node Params . max Accepted H tl cs . to Long ()). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 0 , Ġpay ee Ġ= Ġbob 0 ). first ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcommit Sig . ht lc Signatures . size ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠChannel State With Commit ments ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 . commit ments . remote Next Commit Info . is Left ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( two Ġidentical Ġht lcs Ġin Ġeach Ġdirection )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( amount Ġ= Ġ 1 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpayment Hash Ġ= Ġrandom Bytes 3 2 ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġht lc 1 Ġ= Ġactions Alice 1 . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġ_) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( ht lc 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġht lc 2 Ġ= Ġactions Alice 2 . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġ_) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( ht lc 2 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġbob 3 ) Ġ= Ġcross Sign ( alice 2 , Ġbob 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions Bob 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġht lc 3 Ġ= Ġactions Bob 4 . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġ_) Ġ= Ġalice 3 . process Ex ( Channel Event . Message Received ( ht lc 3 )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġactions Bob 5 ) Ġ= Ġbob 4 . process Ex ( Channel Event . ExecuteCommand ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġht lc 4 Ġ= Ġactions Bob 5 . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġalice 4 . process Ex ( Channel Event . Message Received ( ht lc 4 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 6 ) Ġ= Ġbob 5 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Bob 6 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġcommit Sig . ht lc Signatures . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( check Ġht lc Ġinfo Ġare Ġpersisted )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġthe Ġtest Ġto Ġbe Ġreally Ġuseful Ġwe Ġhave Ġconstraint Ġon Ġparameters ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 0 . static Params . node Params . dust Limit Ġ> Ġbob 0 . static Params . node Params . dust Limit ) ĊĠĠĠĠĠĠĠ Ġ// Ġwe 're Ġgonna Ġexchange Ġtwo Ġht lcs Ġin Ġeach Ġdirection , Ġthe Ġgoal Ġis Ġto Ġhave Ġbob 's Ġcommit ment Ġhave Ġ 4 Ġht lcs , Ġand Ġalice 's ĊĠĠĠĠĠĠĠ Ġ// Ġcommit ment Ġonly Ġhave Ġ 3 . ĠWe Ġwill Ġthen Ġcheck Ġthat Ġalice Ġindeed Ġpersisted Ġ 4 Ġht lcs , Ġand Ġbob Ġonly Ġ 3 . ĊĠĠĠĠĠĠĠ Ġval Ġalice Min Receive Ġ= ĠTest Constants . Alice . node Params . dust Limit Ġ+ Ġweight 2 fee ( Fe erate Per Kw . Commit ment Fe erate , ĠCommit ments . HT LC _ SUCCESS _ WEIGHT ) ĊĠĠĠĠĠĠĠ Ġval Ġalice Min Offer Ġ= ĠTest Constants . Alice . node Params . dust Limit Ġ+ Ġweight 2 fee ( Fe erate Per Kw . Commit ment Fe erate , ĠCommit ments . HT LC _ TIMEOUT _ WEIGHT ) ĊĠĠĠĠĠĠĠ Ġval Ġbob Min Receive Ġ= ĠTest Constants . Bob . node Params . dust Limit Ġ+ Ġweight 2 fee ( Fe erate Per Kw . Commit ment Fe erate , ĠCommit ments . HT LC _ SUCCESS _ WEIGHT ) ĊĠĠĠĠĠĠĠ Ġval Ġbob Min Offer Ġ= ĠTest Constants . Bob . node Params . dust Limit Ġ+ Ġweight 2 fee ( Fe erate Per Kw . Commit ment Fe erate , ĠCommit ments . HT LC _ TIMEOUT _ WEIGHT ) ĊĠĠĠĠĠĠĠ Ġval Ġadd Alice 1 Ġ= Ġbob Min Receive Ġ+ Ġ 1 0 . sat Ġ// Ġwill Ġbe Ġin Ġalice Ġand Ġbob Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġadd Alice 2 Ġ= Ġbob Min Receive Ġ+ Ġ 2 0 . sat Ġ// Ġwill Ġbe Ġin Ġalice Ġand Ġbob Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġadd Bob 1 Ġ= Ġalice Min Receive Ġ+ Ġ 1 0 . sat Ġ// Ġwill Ġbe Ġin Ġalice Ġand Ġbob Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġadd Bob 2 Ġ= Ġbob Min Offer Ġ+ Ġ 1 0 . sat Ġ// Ġwill Ġbe Ġonly Ġbe Ġin Ġbob Ġtx ĊĠĠĠĠĠĠĠ ĠassertTrue ( add Alice 1 Ġ> Ġalice Min Offer Ġ&& Ġadd Alice 1 Ġ> Ġbob Min Receive ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( add Alice 2 Ġ> Ġalice Min Offer Ġ&& Ġadd Alice 2 Ġ> Ġbob Min Receive ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( add Bob 1 Ġ> Ġalice Min Receive Ġ&& Ġadd Bob 1 Ġ> Ġbob Min Offer ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( add Bob 2 Ġ< Ġalice Min Receive Ġ&& Ġadd Bob 2 Ġ> Ġbob Min Offer ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( add Alice 1 . to Milli Sat oshi (), Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġadd H tl c ( add Alice 2 . to Milli Sat oshi (), Ġalice 1 , Ġbob 1 ). first ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġalice 3 ) Ġ= Ġadd H tl c ( add Bob 1 . to Milli Sat oshi (), Ġbob 2 , Ġalice 2 ). first ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġalice 4 ) Ġ= Ġadd H tl c ( add Bob 2 . to Milli Sat oshi (), Ġbob 3 , Ġalice 3 ). first ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 5 , Ġa Actions 5 ) Ġ= Ġalice 4 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 0 Ġ= Ġa Actions 5 . find Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġb Actions 5 ) Ġ= Ġbob 4 . process Ex ( Channel Event . Message Received ( commit Sig 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 0 Ġ= Ġb Actions 5 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġcommand Sign 0 Ġ= Ġb Actions 5 . find Command < CMD _ SIGN >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 6 , Ġ_) Ġ= Ġalice 5 . process Ex ( Channel Event . Message Received ( revoke And Ack 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 6 , Ġb Actions 6 ) Ġ= Ġbob 5 . process Ex ( Channel Event . ExecuteCommand ( command Sign 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 1 Ġ= Ġb Actions 6 . find Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 7 , Ġa Actions 7 ) Ġ= Ġalice 6 . process Ex ( Channel Event . Message Received ( commit Sig 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 1 Ġ= Ġa Actions 7 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 7 , Ġ_) Ġ= Ġbob 6 . process Ex ( Channel Event . Message Received ( revoke And Ack 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcommand Sign 1 Ġ= Ġa Actions 7 . find Command < CMD _ SIGN >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 8 , Ġa Actions 8 ) Ġ= Ġalice 7 . process Ex ( Channel Event . ExecuteCommand ( command Sign 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 2 Ġ= Ġa Actions 8 . find Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġb Actions 8 ) Ġ= Ġbob 7 . process Ex ( Channel Event . Message Received ( commit Sig 2 )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 2 Ġ= Ġb Actions 8 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġ_) Ġ= Ġalice 8 . process Ex ( Channel Event . Message Received ( revoke And Ack 2 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġalice H tl c Infos Ġ= Ġbuild List Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( a Actions 5 . filter Is Instance < Channel Action . Storage . Store H tl c Infos >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( a Actions 8 . filter Is Instance < Channel Action . Storage . Store H tl c Infos >()) ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . ht lcs Ġ}. flatten () ĊĊĠĠĠĠĠĠĠ Ġval Ġbob H tl c Infos Ġ= Ġb Actions 6 . filter Is Instance < Channel Action . Storage . Store H tl c Infos >(). map Ġ{ Ġit . ht lcs Ġ}. flatten () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġalice H tl c Infos . count Ġ{ Ġit . channelId Ġ== Ġalice 0 . channelId Ġ&& Ġit . commit ment Number Ġ== Ġ 0 L Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġalice H tl c Infos . count Ġ{ Ġit . channelId Ġ== Ġalice 0 . channelId Ġ&& Ġit . commit ment Number Ġ== Ġ 1 L Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġalice H tl c Infos . count Ġ{ Ġit . channelId Ġ== Ġalice 0 . channelId Ġ&& Ġit . commit ment Number Ġ== Ġ 2 L Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbob H tl c Infos . count Ġ{ Ġit . channelId Ġ== Ġbob 0 . channelId Ġ&& Ġit . commit ment Number Ġ== Ġ 0 L Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġbob H tl c Infos . count Ġ{ Ġit . channelId Ġ== Ġbob 0 . channelId Ġ&& Ġit . commit ment Number Ġ== Ġ 1 L Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( ht lcs Ġwith Ġsame Ġpub key Script Ġbut Ġdifferent Ġamounts )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġdefault Add . copy ( amount Ġ= Ġ 1 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpayment Hash Ġ= Ġrandom Bytes 3 2 ()) ĊĠĠĠĠĠĠĠ Ġval Ġeps il ons Ġ= ĠlistOf ( 3 , Ġ 1 , Ġ 5 , Ġ 7 , Ġ 6 ) Ġ// Ġunordered Ġon Ġpurpose ĊĠĠĠĠĠĠĠ Ġval Ġht lc Count Ġ= Ġeps il ons . size ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ( alice 1 , Ġbob 1 ) Ġ= Ġalice 0 Ġto Ġbob 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġeps il ons ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( state A , Ġactions A ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( add . copy ( amount Ġ= Ġadd . amount Ġ+ Ġ( i Ġ* Ġ 1 0 0 0 ). ms at ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalice 1 Ġ= Ġstate A Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Add H tl c Ġ= Ġactions A . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( state B , Ġ_) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( update Add H tl c )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbob 1 Ġ= Ġstate B Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice 1 Ġto Ġbob 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Alice 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( ht lc Count , Ġcommit Sig . ht lc Signatures . size ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġ_) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ Ġbob 2 Ġas ĠChannel State With Commit ments ĊĠĠĠĠĠĠĠ Ġval Ġht lc T xs Ġ= Ġbob 2 . commit ments . local Commit . publish able T xs . ht lc T xs And Sig s ĊĠĠĠĠĠĠĠ ĠassertEquals ( ht lc Count , Ġht lc T xs . size ) ĊĠĠĠĠĠĠĠ Ġval Ġamounts Ġ= Ġht lc T xs . map Ġ{ Ġit . tx info . tx . tx Out . first (). amount . sat Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( amount s , Ġamounts . sorted ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( no Ġchanges )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( while Ġwaiting Ġfor ĠRe voke And Ack , Ġno Ġpending Ġchanges )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 . commit ments . remote Next Commit Info . is Right ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġactions Alice 2 . has Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 2 . commit ments . remote Next Commit Info . left ) ĊĠĠĠĠĠĠĠ Ġval ĠwaitFor Rev ocation Ġ= Ġalice 2 . commit ments . remote Next Commit Info . left !! ĊĠĠĠĠĠĠĠ ĠassertFalse ( waitFor Rev ocation . re Sign As ap ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions Alice 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Either . Left ( waitFor Rev ocation ), Ġalice 3 . commit ments . remote Next Commit Info ) ĊĠĠĠĠĠĠĠ ĠassertNull ( actions Alice 3 . find Outgoing Message Opt < Commit Sig >()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( while Ġwaiting Ġfor ĠRe voke And Ack , Ġwith Ġpending Ġchanges )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 . commit ments . remote Next Commit Info . is Right ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġactions Alice 2 . has Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 2 . commit ments . remote Next Commit Info . left ) ĊĠĠĠĠĠĠĠ Ġval ĠwaitFor Rev ocation Ġ= Ġalice 2 . commit ments . remote Next Commit Info . left !! ĊĠĠĠĠĠĠĠ ĠassertFalse ( waitFor Rev ocation . re Sign As ap ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 2 , Ġbob 1 ). first ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġactions Alice 4 ) Ġ= Ġalice 3 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 4 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Either . Left ( waitFor Rev ocation . copy ( re Sign As ap Ġ= Ġtrue )), Ġalice 4 . commit ments . remote Next Commit Info ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions Alice 4 . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( going Ġabove Ġreserve )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal ( push Ms at Ġ= Ġ 0 . ms at ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 . ms at , Ġbob 0 . commit ments . available Balance For Send ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġpre image , Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 1 ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 2 ) Ġ= Ġcross Sign ( alice 1 , Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FUL FILL _ HT LC ( ht lc . id , Ġpre image ))) ĊĠĠĠĠĠĠĠ Ġactions 3 . has Outgoing Message < Update Ful fill H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 4 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 4 . has Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 4 . commit ments . available Balance For Send () Ġ> Ġ 0 . ms at ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( after ĠCMD _ UPDATE _ F EE )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ UPDATE _ F EE ( Fe erate Per Kw . Commit ment Fe erate Ġ+ ĠFe erate Per Kw ( 1 _ 0 0 0 . sat )))) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Update Fee >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Outgoing Message < Commit Sig >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ SIGN Ġ( channel Ġbackup , Ġfun dee )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice . commit ments . local Params . features . has Feature ( Feature . Channel Backup Provider )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob . commit ments . local Params . features . has Feature ( Feature . Channel Backup Client )) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġcmd Add ) Ġ= Ġmake Cmd Add ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice . static Params . node Params . nodeId , Ġalice . current Block Height . to Long ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions ) Ġ= Ġbob . process Ex ( Channel Event . ExecuteCommand ( cmd Add )) ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġactions . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġalice . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġ( alice 1 Ġas ĠNormal ). commit ments . remote Changes . pro posed . contains ( add ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġblob Ġ= ĠSerialization . encrypt ( bob . static Params . node Params . node PrivateKey . value , Ġbob 2 Ġas ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( blob , Ġcommit Sig . channel Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( one Ġht lc Ġreceived )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal ( bob Features Ġ= ĠTest Constants . Bob . node Params . features . remove ( Feature . Channel Backup Client )) ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 0 , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 0 ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 2 ) Ġ= Ġsign And Rev ack ( alice 1 , Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions 3 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( commit Sig . channel Data . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 3 . commit ments . local Commit . spec . ht lcs . in com ings (). any Ġ{ Ġit . id Ġ== Ġht lc . id Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġbob 3 . commit ments . local Commit . publish able T xs . ht lc T xs And Sig s . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 . commit ments . local Commit . spec . to Local , Ġbob 3 . commit ments . local Commit . spec . to Local ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbob 3 . commit ments . remote Changes . ack ed . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġbob 3 . commit ments . remote Changes . signed . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( one Ġht lc Ġsent )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 0 , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 0 ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġsign And Rev ack ( alice 1 , Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions Bob 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Bob 3 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġ_) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 . commit ments . local Commit . spec . ht lcs . out go ings (). any Ġ{ Ġit . id Ġ== Ġht lc . id Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġalice 3 . commit ments . local Commit . publish able T xs . ht lc T xs And Sig s . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġalice 3 . commit ments . local Commit . publish able T xs . ht lc T xs And Sig s . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 . commit ments . local Commit . spec . to Local , Ġbob 3 . commit ments . local Commit . spec . to Local ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( multiple Ġht lcs Ġin Ġboth Ġdirections )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) Ġ// Ġa -> b Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 1 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 2 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 8 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 1 , Ġbob 1 ) Ġ// Ġ Ġa -> b Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġnodes 2 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 3 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 3 0 0 _ 0 0 0 . ms at , Ġbob 2 , Ġalice 2 ) Ġ// ĠĠ Ġb -> a Ġ( dust ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġalice 3 ) Ġ= Ġnodes 3 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 4 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 3 , Ġbob 3 ) Ġ// Ġ Ġa -> b Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġbob 4 ) Ġ= Ġnodes 4 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 5 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġbob 4 , Ġalice 4 ) Ġ// Ġb -> a Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġalice 5 ) Ġ= Ġnodes 5 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 6 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 _ 0 0 0 . ms at , Ġalice 5 , Ġbob 5 ) Ġ// ĠĠ Ġa -> b Ġ( dust ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 6 , Ġbob 6 ) Ġ= Ġnodes 6 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 7 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 4 _ 0 0 0 _ 0 0 0 . ms at , Ġbob 6 , Ġalice 6 ) Ġ// Ġ Ġb -> a Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 7 , Ġalice 7 ) Ġ= Ġnodes 7 ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 8 , Ġbob 8 ) Ġ= Ġsign And Rev ack ( alice 7 , Ġbob 7 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 9 ) Ġ= Ġbob 8 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Bob 9 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 9 , Ġ_) Ġ= Ġalice 8 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 9 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġalice 9 . commit ments . local Commit . index ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġalice 9 . commit ments . local Commit . publish able T xs . ht lc T xs And Sig s . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( only Ġfee Ġupdate )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( CMD _ UPDATE _ F EE ( Fe erate Per Kw . Commit ment Fe erate Ġ+ ĠFe erate Per Kw ( 1 _ 0 0 0 . sat ), Ġfalse ))) ĊĠĠĠĠĠĠĠ Ġval Ġupdate Fee Ġ= Ġactions 1 . find Outgoing Message < Update Fee >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( Fe erate Per Kw . Commit ment Fe erate Ġ+ ĠFe erate Per Kw ( 1 _ 0 0 0 . sat ), Ġupdate Fee . fe erate Per Kw ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġ_) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( update Fee )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions 3 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack Ġ= Ġactions 3 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġ_) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( revoke And Ack )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠNormal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( two Ġht lcs Ġreceived Ġwith Ġsame Ġpre image )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġrandom Bytes 3 2 () ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= ĠCrypto . sha 2 5 6 ( r ). to Byte Vector 3 2 () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions Alice 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( payment Hash Ġ= Ġh ))) ĊĠĠĠĠĠĠĠ Ġval Ġht lc 1 Ġ= Ġactions Alice 1 . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġ_) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( ht lc 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( default Add . copy ( payment Hash Ġ= Ġh ))) ĊĠĠĠĠĠĠĠ Ġval Ġht lc 2 Ġ= Ġactions Alice 2 . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġ_) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( ht lc 2 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( ht lc 1 , Ġht lc 2 ), Ġ( bob 2 Ġas ĠChannel State With Commit ments ). commit ments . remote Changes . pro posed ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 3 ) Ġ= Ġcross Sign ( alice 2 , Ġbob 2 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 3 . commit ments . local Commit . spec . ht lcs . in com ings (). any Ġ{ Ġit . id Ġ== Ġht lc 1 . id Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġbob 3 . commit ments . local Commit . publish able T xs . ht lc T xs And Sig s . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 2 . commit ments . local Commit . spec . to Local , Ġbob 3 . commit ments . local Commit . spec . to Local ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġbob 3 . commit ments . local Commit . publish able T xs . commit Tx . tx . tx Out . count Ġ{ Ġit . amount Ġ== Ġ 5 0 _ 0 0 0 . sat Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( no Ġchanges )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġbob 0 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġ// Ġsignature Ġis Ġinvalid Ġbut Ġit Ġdoesn 't Ġmatter ĊĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠCommit Sig ( Byte Vector 3 2 . Zero es , ĠByte Vector 6 4 . Zero es , Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions Bob 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( sig )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions Bob 1 . has Outgoing Message < Error >() ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). first (). tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 1 . find W atches < Watch Confirmed >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions Bob 1 . find W atches < Watch Confirmed >(). first (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġe . tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactions Bob 1 . find W atches < Watch Confirmed >(). last (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( invalid Ġsignature )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġbob 0 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġ// Ġsignature Ġis Ġinvalid Ġbut Ġit Ġdoesn 't Ġmatter ĊĠĠĠĠĠĠĠ Ġval Ġsig Ġ= ĠCommit Sig ( Byte Vector 3 2 . Zero es , ĠByte Vector 6 4 . Zero es , Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions Bob 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( sig )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions Bob 1 . has Outgoing Message < Error >() ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). first (). tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 1 . find W atches < Watch Confirmed >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions Bob 1 . find W atches < Watch Confirmed >(). first (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġe . tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactions Bob 1 . find W atches < Watch Confirmed >(). last (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( bad Ġht lc Ġsig Ġcount )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġbob 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Alice 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġbad Commit Sig Ġ= Ġcommit Sig . copy ( ht lc Signatures Ġ= Ġcommit Sig . ht lc Signatures Ġ+ Ġcommit Sig . ht lc Signatures ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( bad Commit Sig )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). first (). tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 2 . find W atches < Watch Confirmed >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . find W atches < Watch Confirmed >(). first (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġe . tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . find W atches < Watch Confirmed >(). last (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCommit Sig Ġ( invalid Ġht lc Ġsig )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġbob 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Alice 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġbad Commit Sig Ġ= Ġcommit Sig . copy ( ht lc Signatures Ġ= ĠlistOf ( commit Sig . signature )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( bad Commit Sig )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). first (). tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Bob 2 . find W atches < Watch Confirmed >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . find W atches < Watch Confirmed >(). first (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx , Ġe . tx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . find W atches < Watch Confirmed >(). last (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġevent Ġas ? ĠBIT CO IN _ TX _ CON FI R MED ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( tx . tx id , Ġactions Bob 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). last (). tx . tx In . first (). out Point . tx id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠRe voke And Ack Ġ( channel Ġbackup , Ġfun dee )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice . commit ments . local Params . features . has Feature ( Feature . Channel Backup Provider )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob . commit ments . local Params . features . has Feature ( Feature . Channel Backup Client )) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġcmd Add ) Ġ= Ġmake Cmd Add ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice . static Params . node Params . nodeId , Ġalice . current Block Height . to Long ()) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions ) Ġ= Ġbob . process Ex ( Channel Event . ExecuteCommand ( cmd Add )) ĊĠĠĠĠĠĠĠ Ġval Ġadd Ġ= Ġactions . find Outgoing Message < Update Add H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġalice . process Ex ( Channel Event . Message Received ( add )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 . commit ments . remote Changes . pro posed . contains ( add )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 3 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ Ġval Ġrev ack Ġ= Ġactions 3 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġ_) Ġ= Ġbob 2 . process Ex ( Channel Event . Message Received ( rev ack )) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions 4 ) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 1 Ġ= Ġactions 4 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions 5 ) Ġ= Ġbob 3 . process Ex ( Channel Event . Message Received ( commit Sig 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġrev ack 1 Ġ= Ġactions 5 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġblob Ġ= ĠSerialization . encrypt ( bob 4 . static Params . node Params . node PrivateKey . value , Ġbob 4 Ġas ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( blob , Ġrev ack 1 . channel Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠRe voke And Ack Ġ( one Ġht lc Ġsent )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal ( bob Features Ġ= ĠTest Constants . Bob . node Params . features . remove ( Feature . Channel Backup Client )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 . commit ments . remote Next Commit Info . is Left ) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Alice 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack Ġ= Ġactions Bob 2 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( revoke And Ack . channel Data . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġ_) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( revoke And Ack )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 . commit ments . remote Next Commit Info . is Right ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġalice 3 . commit ments . local Changes . ack ed . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠRe voke And Ack Ġ( one Ġht lc Ġreceived )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġadd ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 0 Ġ= Ġactions Alice 2 . find Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( commit Sig 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 0 Ġ= Ġactions Bob 2 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġactions Bob 2 . find Command < CMD _ SIGN >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions Bob 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . ExecuteCommand ( cmd )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġ_) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( revoke And Ack 0 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 . commit ments . remote Next Commit Info . is Right ) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 1 Ġ= Ġactions Bob 3 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 4 ) Ġ= Ġalice 3 . process Ex ( Channel Event . Message Received ( commit Sig 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 1 Ġ= Ġactions Alice 4 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions Bob 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . Message Received ( revoke And Ack 1 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 4 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 4 . commit ments . remote Next Commit Info . is Right ) ĊĠĠĠĠĠĠĠ Ġactions Bob 4 . has < Channel Action . Storage . Store State >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( add , Ġactions Bob 4 . find < Channel Action . Process Incoming H tl c >(). add ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠRe voke And Ack Ġ( multiple Ġht lcs Ġin Ġboth Ġdirections )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġ_, Ġadd 1 ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) Ġ// Ġa -> b Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 1 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 2 , Ġ_, Ġadd 2 ) Ġ= Ġadd H tl c ( 8 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 1 , Ġbob 1 ) Ġ// Ġ Ġa -> b Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġnodes 2 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 3 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 3 0 0 _ 0 0 0 . ms at , Ġbob 2 , Ġalice 2 ) Ġ// ĠĠ Ġb -> a Ġ( dust ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġalice 3 ) Ġ= Ġnodes 3 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 4 , Ġ_, Ġadd 3 ) Ġ= Ġadd H tl c ( 1 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 3 , Ġbob 3 ) Ġ// Ġ Ġa -> b Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġbob 4 ) Ġ= Ġnodes 4 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 5 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġbob 4 , Ġalice 4 ) Ġ// Ġb -> a Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġalice 5 ) Ġ= Ġnodes 5 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 6 , Ġ_, Ġadd 4 ) Ġ= Ġadd H tl c ( 5 0 0 _ 0 0 0 . ms at , Ġalice 5 , Ġbob 5 ) Ġ// ĠĠ Ġa -> b Ġ( dust ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 6 , Ġbob 6 ) Ġ= Ġnodes 6 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 7 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 4 _ 0 0 0 _ 0 0 0 . ms at , Ġbob 6 , Ġalice 6 ) Ġ// Ġ Ġb -> a Ġ( regular ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 7 , Ġalice 7 ) Ġ= Ġnodes 7 ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 8 , Ġactions Alice 8 ) Ġ= Ġalice 7 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 0 Ġ= Ġactions Alice 8 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 8 , Ġactions Bob 8 ) Ġ= Ġbob 7 . process Ex ( Channel Event . Message Received ( commit Sig 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 0 Ġ= Ġactions Bob 8 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġactions Bob 8 . find Command < CMD _ SIGN >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 9 , Ġactions Bob 9 ) Ġ= Ġbob 8 . process Ex ( Channel Event . ExecuteCommand ( cmd )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 9 , Ġ_) Ġ= Ġalice 8 . process Ex ( Channel Event . Message Received ( revoke And Ack 0 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 9 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 9 . commit ments . remote Next Commit Info . is Right ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 1 Ġ= Ġactions Bob 9 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 1 0 ) Ġ= Ġalice 9 . process Ex ( Channel Event . Message Received ( commit Sig 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 1 Ġ= Ġactions Alice 1 0 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 0 , Ġactions Bob 1 0 ) Ġ= Ġbob 9 . process Ex ( Channel Event . Message Received ( revoke And Ack 1 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 0 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 0 . commit ments . remote Next Commit Info . is Right ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġbob 1 0 . commit ments . remote Commit . index ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 , Ġbob 1 0 . commit ments . remote Commit . spec . ht lcs . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( add 1 , Ġadd 2 , Ġadd 3 , Ġadd 4 ), Ġactions Bob 1 0 . filter Is Instance < Channel Action . Process Incoming H tl c >(). map Ġ{ Ġit . add Ġ}. toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠRe voke And Ack Ġ( with Ġre Sign As ap = true )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 . commit ments . remote Next Commit Info . is Right ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 0 Ġ= Ġactions Alice 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( commit Sig 0 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 2 , Ġbob 2 ). first ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġ_) Ġ= Ġalice 3 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 4 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 4 . commit ments . remote Next Commit Info . left ?. re Sign As ap Ġ== Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġre voke And Ack 0 Ġ= Ġactions Bob 2 . find Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 5 , Ġactions Alice 5 ) Ġ= Ġalice 4 . process Ex ( Channel Event . Message Received ( revoke And Ack 0 )) ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġactions Alice 5 . find Command < CMD _ SIGN >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 6 ) Ġ= Ġalice 5 . process Ex ( Channel Event . ExecuteCommand ( cmd )) ĊĠĠĠĠĠĠĠ Ġactions Alice 6 . has Outgoing Message < Commit Sig >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠRe voke And Ack Ġ( invalid Ġpre image )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġalice 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig 0 Ġ= Ġactions Alice 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( commit Sig 0 )) ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . has Outgoing Message < Re voke And Ack >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions Alice 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( Re voke And Ack ( Byte Vector 3 2 . Zero es , ĠPrivate Key ( random Bytes 3 2 ()), ĠPrivate Key ( random Bytes 3 2 ()). publicKey ()))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions Alice 3 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Alice 3 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Alice 3 . find W atches < Watch Confirmed >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions Alice 3 . has Tx ( tx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠRe voke And Ack Ġ( unexpected ly )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ). first ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 . commit ments . remote Next Commit Info . is Right ) ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġalice 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( Re voke And Ack ( Byte Vector 3 2 . Zero es , ĠPrivate Key ( random Bytes 3 2 ()), ĠPrivate Key ( random Bytes 3 2 ()). publicKey ()))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions Alice 2 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Alice 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions Alice 2 . find W atches < Watch Confirmed >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions Alice 2 . has Tx ( tx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FUL FILL _ HT LC `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġr , Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FUL FILL _ HT LC ( ht lc . id , Ġr ))) ĊĠĠĠĠĠĠĠ Ġval Ġfulfill H tl c Ġ= Ġactions Bob 2 . find Outgoing Message < Update Ful fill H tl c >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 . copy ( commit ments Ġ= Ġbob 1 . commit ments . copy ( local Changes Ġ= Ġbob 1 . commit ments . local Changes . copy ( bob 1 . commit ments . local Changes . pro posed Ġ+ Ġfulfill H tl c ))), Ġbob 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FUL FILL _ HT LC Ġ( unknown Ġht lc Ġid )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= ĠCMD _ FUL FILL _ HT LC ( 4 2 , Ġrandom Bytes 3 2 ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( cmd )) ĊĠĠĠĠĠĠĠ Ġval Ġactual Error Ġ= Ġactions . find Command Error < Unknown H tl c Id >() ĊĠĠĠĠĠĠĠ Ġval Ġexpected Error Ġ= ĠUnknown H tl c Id ( bob 0 . channelId , Ġ 4 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( expected Error , Ġactual Error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FUL FILL _ HT LC Ġ( invalid Ġpre image )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= ĠCMD _ FUL FILL _ HT LC ( ht lc . id , ĠByte Vector 3 2 . Zero es ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( cmd )) ĊĠĠĠĠĠĠĠ Ġactions Bob 2 . has Command Error < Invalid H tl c Pre image >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 , Ġbob 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Ful fill H tl c `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġr , Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FUL FILL _ HT LC ( ht lc . id , Ġr ))) ĊĠĠĠĠĠĠĠ Ġval Ġfulfill Ġ= Ġactions Bob 2 . find Outgoing Message < Update Ful fill H tl c >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( ful fill )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 1 . copy ( commit ments Ġ= Ġalice 1 . commit ments . copy ( remote Changes Ġ= Ġalice 1 . commit ments . remote Changes . copy ( alice 1 . commit ments . remote Changes . pro posed Ġ+ Ġfulfill ))), Ġalice 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġadd Set tled Ġ= Ġactions Alice 2 . filter Is Instance < Channel Action . Process Cmd Res . Add Set tled Ful fill >(). first () ĊĠĠĠĠĠĠĠ ĠassertEquals ( ht lc , Ġadd Set tled . ht lc ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Channel Action . H tl c Result . Ful fill . Remote Ful fill ( ful fill ), Ġadd Set tled . result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Ful fill H tl c Ġ( unknown Ġht lc Ġid )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġalice 0 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . Message Received ( Update Ful fill H tl c ( alice 0 . channelId , Ġ 4 2 , Ġrandom Bytes 3 2 ()))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . contains ( Channel Action . Storage . Store State ( alice 1 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . contains ( Channel Action . Blockchain . Publish Tx ( commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . find W atches < Watch Confirmed >(). isNotEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . filter Is Instance < Channel Action . Blockchain . Send Watch >(). all Ġ{ Ġit . watch Ġis ĠWatch Confirmed Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 1 . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠUnknown H tl c Id ( alice 0 . channelId , Ġ 4 2 ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Ful fill H tl c Ġ( sender Ġhas Ġnot Ġsigned Ġht lc )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġr , Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġnodes . first . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġalice 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( Update Ful fill H tl c ( alice 1 . channelId , Ġht lc . id , Ġr ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Storage . Store State ( alice 2 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Blockchain . Publish Tx ( commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . find W atches < Watch Confirmed >(). isNotEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . filter Is Instance < Channel Action . Blockchain . Send Watch >(). all Ġ{ Ġit . watch Ġis ĠWatch Confirmed Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 2 . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠUnknown H tl c Id ( alice 0 . channelId , Ġ 0 ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Ful fill H tl c Ġ( invalid Ġpre image )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġalice 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( Update Ful fill H tl c ( alice 0 . channelId , Ġht lc . id , ĠByte Vector 3 2 . Zero es ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Storage . Store State ( alice 2 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Blockchain . Publish Tx ( commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġactions 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). size ) Ġ// Ġcommit Ġtx Ġ+ Ġmain Ġdelayed Ġ+ Ġht lc - timeout Ġ+ Ġht lc Ġdelayed ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġactions 2 . filter Is Instance < Channel Action . Blockchain . Send Watch >(). size ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 2 . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠInvalid H tl c Pre image ( alice 0 . channelId , Ġht lc . id ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FAIL _ HT LC `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= ĠCMD _ FAIL _ HT LC ( ht lc . id , ĠCMD _ FAIL _ HT LC . Reason . Failure ( Permanent Channel Failure )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( cmd )) ĊĠĠĠĠĠĠĠ Ġval Ġfail Ġ= Ġactions 2 . find Outgoing Message < Update Fail H tl c >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 . copy ( commit ments Ġ= Ġbob 1 . commit ments . copy ( local Changes Ġ= Ġbob 1 . commit ments . local Changes . copy ( bob 1 . commit ments . local Changes . pro posed Ġ+ Ġfail ))), Ġbob 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FAIL _ HT LC Ġ( unknown Ġht lc Ġid )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġcmd Fail Ġ= ĠCMD _ FAIL _ HT LC ( 4 2 , ĠCMD _ FAIL _ HT LC . Reason . Failure ( Permanent Channel Failure )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( cmd Fail )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( actions 1 , ĠlistOf ( Channel Action . Process Cmd Res . Not Executed ( cmd Fail , ĠUnknown H tl c Id ( bob 0 . channelId , Ġ 4 2 )))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 0 , Ġbob 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FAIL _ HT LC _ MAL FOR MED `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Fail Ġ= ĠCMD _ FAIL _ MAL FOR MED _ HT LC ( ht lc . id , ĠS phinx . hash ( ht lc . on ion Routing Packet ), ĠFailure Message . BAD ON ION ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( cmd Fail )) ĊĠĠĠĠĠĠĠ Ġval Ġfail Ġ= Ġactions 2 . find Outgoing Message < Update Fail Malformed H tl c >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 . copy ( commit ments Ġ= Ġbob 1 . commit ments . copy ( local Changes Ġ= Ġbob 1 . commit ments . local Changes . copy ( bob 1 . commit ments . local Changes . pro posed Ġ+ Ġfail ))), Ġbob 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FAIL _ HT LC _ MAL FOR MED Ġ( unknown Ġht lc Ġid )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġcmd Fail Ġ= ĠCMD _ FAIL _ MAL FOR MED _ HT LC ( 4 2 , ĠByte Vector 3 2 . Zero es , ĠFailure Message . BAD ON ION ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob 0 . process Ex ( Channel Event . ExecuteCommand ( cmd Fail )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( actions 1 , ĠlistOf ( Channel Action . Process Cmd Res . Not Executed ( cmd Fail , ĠUnknown H tl c Id ( bob 0 . channelId , Ġ 4 2 )))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 0 , Ġbob 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ FAIL _ HT LC _ MAL FOR MED Ġ( invalid Ġfailure _ code )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Fail Ġ= ĠCMD _ FAIL _ MAL FOR MED _ HT LC ( ht lc . id , ĠS phinx . hash ( ht lc . on ion Routing Packet ), Ġ 4 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( cmd Fail )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( actions 2 , ĠlistOf ( Channel Action . Process Cmd Res . Not Executed ( cmd Fail , ĠInvalid Failure Code ( bob 0 . channelId )))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 , Ġbob 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fail H tl c `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FAIL _ HT LC ( ht lc . id , ĠCMD _ FAIL _ HT LC . Reason . Failure ( Permanent Channel Failure )))) ĊĠĠĠĠĠĠĠ Ġval Ġfail Ġ= Ġactions Bob 2 . find Outgoing Message < Update Fail H tl c >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( fail )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions Alice 2 . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 1 . copy ( commit ments Ġ= Ġalice 1 . commit ments . copy ( remote Changes Ġ= Ġalice 1 . commit ments . remote Changes . copy ( alice 1 . commit ments . remote Changes . pro posed Ġ+ Ġfail ))), Ġalice 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fail H tl c Ġ( unknown Ġht lc Ġid )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġalice 0 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . Message Received ( Update Fail H tl c ( alice 0 . channelId , Ġ 4 2 , ĠByte Vector . empty ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . contains ( Channel Action . Storage . Store State ( alice 1 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . contains ( Channel Action . Blockchain . Publish Tx ( commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . find W atches < Watch Confirmed >(). isNotEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . filter Is Instance < Channel Action . Blockchain . Send Watch >(). all Ġ{ Ġit . watch Ġis ĠWatch Confirmed Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 1 . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠUnknown H tl c Id ( alice 0 . channelId , Ġ 4 2 ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fail H tl c Ġ( sender Ġhas Ġnot Ġsigned Ġht lc )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġnodes . first . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġalice 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( Update Fail H tl c ( alice 1 . channelId , Ġht lc . id , ĠByte Vector . empty ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Storage . Store State ( alice 2 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Blockchain . Publish Tx ( commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . find W atches < Watch Confirmed >(). isNotEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . filter Is Instance < Channel Action . Blockchain . Send Watch >(). all Ġ{ Ġit . watch Ġis ĠWatch Confirmed Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 2 . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠUnknown H tl c Id ( alice 0 . channelId , Ġ 0 ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fail Malformed H tl c `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FAIL _ MAL FOR MED _ HT LC ( ht lc . id , ĠS phinx . hash ( ht lc . on ion Routing Packet ), ĠFailure Message . BAD ON ION ))) ĊĠĠĠĠĠĠĠ Ġval Ġfail Ġ= Ġactions Bob 2 . find Outgoing Message < Update Fail Malformed H tl c >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions Alice 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( fail )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions Alice 2 . isEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 1 . copy ( commit ments Ġ= Ġalice 1 . commit ments . copy ( remote Changes Ġ= Ġalice 1 . commit ments . remote Changes . copy ( alice 1 . commit ments . remote Changes . pro posed Ġ+ Ġfail ))), Ġalice 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fail Malformed H tl c Ġ( unknown Ġht lc Ġid )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġalice 0 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice 0 . process Ex ( Channel Event . Message Received ( Update Fail Malformed H tl c ( alice 0 . channelId , Ġ 4 2 , ĠByte Vector 3 2 . Zero es , ĠFailure Message . BAD ON ION ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . contains ( Channel Action . Storage . Store State ( alice 1 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . contains ( Channel Action . Blockchain . Publish Tx ( commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . find W atches < Watch Confirmed >(). isNotEmpty ()) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 1 . filter Is Instance < Channel Action . Blockchain . Send Watch >(). all Ġ{ Ġit . watch Ġis ĠWatch Confirmed Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 1 . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠUnknown H tl c Id ( alice 0 . channelId , Ġ 4 2 ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fail Malformed H tl c Ġ( invalid Ġfailure _ code )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġalice 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( Update Fail Malformed H tl c ( alice 0 . channelId , Ġht lc . id , ĠS phinx . hash ( ht lc . on ion Routing Packet ), Ġ 4 2 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Storage . Store State ( alice 2 ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . contains ( Channel Action . Blockchain . Publish Tx ( commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġactions 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). size ) Ġ// Ġcommit Ġtx Ġ+ Ġmain Ġdelayed Ġ+ Ġht lc - timeout Ġ+ Ġht lc Ġdelayed ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġactions 2 . filter Is Instance < Channel Action . Blockchain . Send Watch >(). size ) ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions 2 . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠInvalid Failure Code ( alice 0 . channelId ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fee `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġfee Ġ= ĠUpdate Fee ( Byte Vector 3 2 . Zero es , ĠFe erate Per Kw ( 7 _ 5 0 0 . sat )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġ_) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( fee )) ĊĠĠĠĠĠĠĠ Ġbob 1 Ġas ĠNormal ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob . commit ments . copy ( remote Changes Ġ= Ġbob . commit ments . remote Changes . copy ( pro posed Ġ= Ġbob . commit ments . remote Changes . pro posed Ġ+ Ġfee )), Ġbob 1 . commit ments ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fee Ġ( 2 Ġin Ġa Ġrow )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġfee 1 Ġ= ĠUpdate Fee ( Byte Vector 3 2 . Zero es , ĠFe erate Per Kw ( 7 _ 5 0 0 . sat )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġ_) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( fee 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġfee 2 Ġ= ĠUpdate Fee ( Byte Vector 3 2 . Zero es , ĠFe erate Per Kw ( 9 _ 0 0 0 . sat )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġ_) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( fee 2 )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob . commit ments . copy ( remote Changes Ġ= Ġbob . commit ments . remote Changes . copy ( pro posed Ġ= Ġbob . commit ments . remote Changes . pro posed Ġ+ Ġfee 2 )), Ġbob 2 . commit ments ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fee Ġ( sender Ġcannot Ġaff ord Ġit )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġput Ġall Ġthe Ġbalance Ġon ĠBob 's Ġside , Ġso Ġthat ĠAlice Ġcannot Ġaff ord Ġa Ġfe erate Ġincrease . ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( alice . commit ments . available Balance For Send (), Ġalice , Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Tx Ġ= Ġbob 1 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĊĠĠĠĠĠĠĠ Ġval Ġfee Ġ= ĠUpdate Fee ( Byte Vector 3 2 . Zero es , ĠFe erate Per Kw . Commit ment Fe erate Ġ* Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( fee )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions . has Tx ( commit Tx ) ĊĠĠĠĠĠĠĠ Ġactions . has Watch < Watch Confirmed >() ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( error . to Ascii (), ĠCannot Aff ord Fees ( bob . channelId , Ġmissing Ġ= Ġ 1 1 _ 2 4 0 . sat , Ġreserve Ġ= Ġ 2 0 _ 0 0 0 . sat , Ġfees Ġ= Ġ 2 6 _ 5 8 0 . sat ). message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠUpdate Fee Ġ( remote Ġfe erate Ġis Ġtoo Ġsmall )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Fe erate Per Kw . Commit ment Fe erate , Ġbob . commit ments . local Commit . spec . fe erate ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions ) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( Update Fee ( bob . channelId , ĠFe erate Per Kw ( 2 5 2 . sat )))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions . has Tx ( bob . commit ments . local Commit . publish able T xs . commit Tx . tx ) ĊĠĠĠĠĠĠĠ Ġactions . has Watch < Watch Confirmed >() ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġactions . find Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( error . to Ascii (). contains (" em ote Ġfee Ġrate Ġis Ġtoo Ġsmall : Ġremote Fe erate Per Kw = 2 5 2 ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠChannel Update `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertNull ( alice . remote Channel Update ) ĊĠĠĠĠĠĠĠ ĠassertNull ( bob . remote Channel Update ) ĊĠĠĠĠĠĠĠ Ġval Ġalice Update Ġ= ĠAnno unce ments . make Channel Update ( alice . static Params . node Params . chain Hash , Ġalice . privateKey , Ġalice . static Params . remote NodeId , Ġalice . short Channel Id , ĠC lt v Expiry Delta ( 3 6 ), Ġ 5 . ms at , Ġ 1 5 . ms at , Ġ 1 5 0 , Ġ 1 5 0 _ 0 0 0 . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( alice Update )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 . remote Channel Update , Ġalice Update ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has < Channel Action . Storage . Store State >() ĊĊĠĠĠĠĠĠĠ Ġval Ġalice Update Other Channel Ġ= ĠAnno unce ments . make Channel Update ( alice . static Params . node Params . chain Hash , Ġalice . privateKey , Ġalice . static Params . remote NodeId , ĠShort Channel Id ( 7 ), ĠC lt v Expiry Delta ( 1 2 ), Ġ 1 . ms at , Ġ 1 0 . ms at , Ġ 5 0 , Ġ 1 5 _ 0 0 0 . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( alice Update Other Channel )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 , Ġbob 2 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġbob Update Ġ= ĠAnno unce ments . make Channel Update ( bob . static Params . node Params . chain Hash , Ġbob . privateKey , Ġbob . static Params . remote NodeId , Ġbob . short Channel Id , ĠC lt v Expiry Delta ( 2 4 ), Ġ 1 . ms at , Ġ 5 . ms at , Ġ 1 0 , Ġ 1 2 5 _ 0 0 0 . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . Message Received ( bob Update )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 , Ġbob 3 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 3 . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( no Ġpending Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertNull ( alice . local Shutdown ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 1 . local Shutdown ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( with Ġun ack ed Ġsent Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġnodes ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 1 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Command Error < Cannot Close With Unsigned Outgoing H tl cs >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( with Ġun ack ed Ġreceived Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġnodes ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 1 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ ĠassertNotNull ( bob 2 . local Shutdown ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( with Ġinvalid Ġfinal Ġscript )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertNull ( alice . local Shutdown ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( Byte Vector (" 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 "), Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Command Error < Invalid Final Script >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( with Ġunsupported Ġnative Ġseg wit Ġscript )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertNull ( alice . local Shutdown ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( Byte Vector (" 5 1 0 5 0 1 0 2 0 3 0 4 0 5 "), Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Command Error < Invalid Final Script >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( with Ġnative Ġseg wit Ġscript )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice Features Ġ= ĠTest Constants . Alice . node Params . features . copy ( Test Constants . Alice . node Params . features . activated Ġ+ Ġ( Feature . Shutdown Any Seg wit Ġto ĠFeature Support . Optional )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbob Features Ġ= ĠTest Constants . Bob . node Params . features . copy ( Test Constants . Bob . node Params . features . activated Ġ+ Ġ( Feature . Shutdown Any Seg wit Ġto ĠFeature Support . Optional )), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertNull ( alice . local Shutdown ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( Byte Vector (" 5 1 0 5 0 1 0 2 0 3 0 4 0 5 "), Ġnull ))) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 1 . local Shutdown ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( with Ġsigned Ġsent Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 1 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 2 . local Shutdown ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( two Ġin Ġa Ġrow )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ ĠassertNull ( alice . local Shutdown ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 1 . local Shutdown ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Command Error < Closing Already InProgress >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( while Ġwaiting Ġfor Ġa ĠRe voke And Ack )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġnodes . first . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Outgoing Message < Shutdown >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠCMD _ CLOSE Ġ( with Ġunsigned Ġfee Ġupdate )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ UPDATE _ F EE ( Fe erate Per Kw ( 2 0 _ 0 0 0 . sat ), Ġfalse ))) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Update Fee >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Command Error < Cannot Close With Unsigned Outgoing Update Fee >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġ_) Ġ= Ġalice 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġactions 4 ) Ġ= Ġalice 3 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 4 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġactions 4 . has Outgoing Message < Shutdown >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( no Ġpending Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . Message Received ( Shutdown ( alice . channelId , Ġbob . commit ments . local Params . default Final Script PubKey ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNeg oti ating ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Closing Signed >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġun ack ed Ġsent Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 0 0 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġnodes . second . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĊĠĠĠĠĠĠĠ Ġval Ġshutdown Ġ= Ġactions 1 . find Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 2 ) Ġ= Ġnodes . first . process Ex ( Channel Event . Message Received ( shutdown )) ĊĠĠĠĠĠĠĠ Ġ// ĠAlice Ġsends Ġa Ġnew Ġsig ĊĠĠĠĠĠĠĠ ĠassertEquals ( actions 2 , ĠlistOf ( Channel Action . Message . Send To Self ( CMD _ SIGN ))) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 3 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions 3 . find Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠBob Ġreplies Ġwith Ġa Ġrev ocation ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions 4 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ Ġval Ġrev ack Ġ= Ġactions 4 . find Outgoing Message < Re voke And Ack >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġas Ġsoon Ġas Ġalice Ġhas Ġreceived Ġthe Ġrev ocation , Ġshe Ġwill Ġsend Ġher Ġshutdown Ġmessage ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions 5 ) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( rev ack )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠSh ut ting Down ) ĊĠĠĠĠĠĠĠ Ġactions 5 . has Outgoing Message < Shutdown >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġun ack ed Ġreceived Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 0 0 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġnodes . second . process Ex ( Channel Event . Message Received ( Shutdown ( alice . channelId , Ġalice . commit ments . local Params . default Final Script PubKey ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Watch < Watch Confirmed >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġunsigned Ġfee Ġupdate )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġalice Actions 1 ) Ġ= Ġalice . process Ex ( Channel Event . ExecuteCommand ( CMD _ UPDATE _ F EE ( Fe erate Per Kw ( 2 0 _ 0 0 0 . sat ), Ġtrue ))) ĊĠĠĠĠĠĠĠ Ġval Ġupdate Fee Ġ= Ġalice Actions 1 . has Outgoing Message < Update Fee >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġalice Actions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġsig Alice Ġ= Ġalice Actions 2 . has Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠBob Ġiniti ates Ġa Ġclose Ġbefore Ġreceiving Ġthe Ġsignature . ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġ_) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( update Fee )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġbob Actions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġval Ġshutdown Bob Ġ= Ġbob Actions 2 . has Outgoing Message < Shutdown >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġbob Actions 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . Message Received ( sig Alice )) ĊĠĠĠĠĠĠĠ Ġval Ġrev Bob Ġ= Ġbob Actions 3 . has Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġbob Actions 3 . has Command < CMD _ SIGN >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġbob Actions 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġsig Bob Ġ= Ġbob Actions 4 . has Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġalice Actions 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( shutdown Bob )) ĊĠĠĠĠĠĠĠ Ġval Ġshutdown Alice Ġ= Ġalice Actions 3 . has Outgoing Message < Shutdown >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġ_) Ġ= Ġalice 3 . process Ex ( Channel Event . Message Received ( rev Bob )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 5 , Ġalice Actions 5 ) Ġ= Ġalice 4 . process Ex ( Channel Event . Message Received ( sig Bob )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 5 Ġis ĠNeg oti ating ) ĊĠĠĠĠĠĠĠ Ġval Ġrev Alice Ġ= Ġalice Actions 5 . has Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġclosing Alice Ġ= Ġalice Actions 5 . has Outgoing Message < Closing Signed >() ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġ_) Ġ= Ġbob 4 . process Ex ( Channel Event . Message Received ( shutdown Alice )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 6 , Ġ_) Ġ= Ġbob 5 . process Ex ( Channel Event . Message Received ( rev Alice )) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 7 , Ġbob Actions 7 ) Ġ= Ġbob 6 . process Ex ( Channel Event . Message Received ( closing Alice )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 7 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġval Ġclosing Bob Ġ= Ġbob Actions 7 . has Outgoing Message < Closing Signed >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 6 , Ġ_) Ġ= Ġalice 5 . process Ex ( Channel Event . Message Received ( closing Bob )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 6 Ġis ĠClosing ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġinvalid Ġscript )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( Shutdown ( bob . channelId , ĠByte Vector (" 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 ")) )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Watch < Watch Confirmed >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġunsupported Ġnative Ġseg wit Ġscript )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( Shutdown ( bob . channelId , ĠByte Vector (" 5 1 0 5 0 1 0 2 0 3 0 4 0 5 ")) )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions 1 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Watch < Watch Confirmed >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġnative Ġseg wit Ġscript )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob ) Ġ= Ġreach Normal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice Features Ġ= ĠTest Constants . Alice . node Params . features . copy ( Test Constants . Alice . node Params . features . activated Ġ+ Ġ( Feature . Shutdown Any Seg wit Ġto ĠFeature Support . Optional )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbob Features Ġ= ĠTest Constants . Bob . node Params . features . copy ( Test Constants . Bob . node Params . features . activated Ġ+ Ġ( Feature . Shutdown Any Seg wit Ġto ĠFeature Support . Optional )), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob . process Ex ( Channel Event . Message Received ( Shutdown ( bob . channelId , ĠByte Vector (" 5 1 0 5 0 1 0 2 0 3 0 4 0 5 ")) )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠNeg oti ating ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġinvalid Ġfinal Ġscript Ġand Ġsigned Ġht lcs , Ġin Ġresponse Ġto Ġa ĠShutdown )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 0 0 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 1 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġactual Ġtest Ġbegins ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 2 ) Ġ= Ġbob 2 . process Ex ( Channel Event . Message Received ( Shutdown ( bob . channelId , ĠByte Vector (" 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 ")) )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 3 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġactions 2 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). count ()) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Watch < Watch Confirmed >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( with Ġsigned Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 0 0 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġactual Ġtest Ġbegins ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 1 ) Ġ= Ġbob 1 . process Ex ( Channel Event . Message Received ( Shutdown ( bob . channelId , Ġalice . commit ments . local Params . default Final Script PubKey ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 2 Ġis ĠSh ut ting Down ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Shutdown >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( while Ġwaiting Ġfor Ġa ĠRe voke And Ack )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 0 0 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 1 ) Ġ= Ġnodes . first . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions 2 ) Ġ= Ġbob . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġval Ġshutdown Ġ= Ġactions 2 . find Outgoing Message < Shutdown >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġactual Ġtest Ġbegins ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 3 ) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( shutdown )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 2 Ġis ĠSh ut ting Down ) ĊĠĠĠĠĠĠĠ Ġactions 3 . has Outgoing Message < Shutdown >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠShutdown Ġ( while Ġwaiting Ġfor Ġa ĠRe voke And Ack Ġwith Ġpending Ġoutgoing Ġht lc )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġ// Ġlet 's Ġmake Ġbob Ġsend Ġa ĠShutdown Ġmessage ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions 1 ) Ġ= Ġbob . process Ex ( Channel Event . ExecuteCommand ( CMD _ CLOSE ( null , Ġnull ))) ĊĠĠĠĠĠĠĠ Ġval Ġshutdown Ġ= Ġactions 1 . find Outgoing Message < Shutdown >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġjust Ġso Ġwe Ġhave Ġsomething Ġto Ġsign ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 0 0 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġactions 2 ) Ġ= Ġnodes . first . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions 2 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 3 ) Ġ= Ġnodes . second . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ Ġval Ġrev ack Ġ= Ġactions 3 . find Outgoing Message < Re voke And Ack >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġadding Ġan Ġoutgoing Ġpending Ġht lc ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 0 0 0 0 0 0 . ms at , Ġpay er Ġ= Ġalice 1 , Ġpay ee Ġ= Ġbob 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġactual Ġtest Ġbegins ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġeventually Ġgets Ġbob 's Ġshutdown ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions 4 ) Ġ= Ġnodes 1 . first . process Ex ( Channel Event . Message Received ( shutdown )) ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġcan 't Ġdo Ġanything Ġfor Ġnow Ġother Ġthan Ġwaiting Ġfor Ġbob Ġto Ġsend Ġthe Ġrev ocation ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 4 . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ// Ġbob Ġsends Ġthe Ġrev ocation ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġactions 5 ) Ġ= Ġalice 3 . process Ex ( Channel Event . Message Received ( rev ack )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 5 . contains ( Channel Action . Message . Send To Self ( CMD _ SIGN ))) ĊĠĠĠĠĠĠĠ Ġ// Ġbob Ġwill Ġalso Ġsign Ġback ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 6 ) Ġ= Ġnodes 1 . second . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 5 , Ġactions 7 ) Ġ= Ġalice 4 . process Ex ( Channel Event . Message Received ( actions 6 . find Outgoing Message < Commit Sig > ())) ĊĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġalice Ġcan Ġsign Ġthe Ġ 2 nd Ġht lc ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 7 . contains ( Channel Action . Message . Send To Self ( CMD _ SIGN ))) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 6 , Ġactions 8 ) Ġ= Ġalice 5 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 6 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions 9 ) Ġ= Ġbob 3 . process Ex ( Channel Event . Message Received ( actions 8 . find Outgoing Message < Commit Sig > ())) ĊĠĠĠĠĠĠĠ Ġ// Ġbob Ġreplies Ġwith Ġthe Ġ 2 nd Ġrev ocation ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 7 , Ġactions 1 1 ) Ġ= Ġalice 6 . process Ex ( Channel Event . Message Received ( actions 9 . find Outgoing Message < Re voke And Ack > ())) ĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġalice Ġsends Ġher Ġshutdown ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 7 Ġis ĠSh ut ting Down ) ĊĠĠĠĠĠĠĠ Ġactions 1 1 . has Outgoing Message < Shutdown >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠBIT CO IN _ F UND ING _ SP ENT Ġ( their Ġcommit Ġwith Ġht lc )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 0 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 2 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 0 , Ġpay ee Ġ= Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 0 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġpre image _ alice 2 bob _ 2 , Ġ_) Ġ= Ġadd H tl c ( 1 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 1 , Ġpay ee Ġ= Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġnodes 1 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 2 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 2 , Ġpay ee Ġ= Ġbob 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġbob 3 ) Ġ= Ġnodes 2 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 3 , Ġpre image _ bob 2 alice _ 1 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġbob 3 , Ġpay ee Ġ= Ġalice 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġalice 4 ) Ġ= Ġnodes 3 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 4 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 5 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġbob 4 , Ġpay ee Ġ= Ġalice 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġalice 5 ) Ġ= Ġnodes 4 ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 6 , Ġbob 6 ) Ġ= Ġcross Sign ( alice 5 , Ġbob 5 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 7 , Ġbob 7 ) Ġ= Ġfulfill H tl c ( 1 , Ġpre image _ alice 2 bob _ 2 , Ġpay er Ġ= Ġalice 6 , Ġpay ee Ġ= Ġbob 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 8 , Ġalice 8 ) Ġ= Ġfulfill H tl c ( 0 , Ġpre image _ bob 2 alice _ 1 , Ġpay er Ġ= Ġbob 7 , Ġpay ee Ġ= Ġalice 7 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 8 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 8 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthis Ġpoint Ġhere Ġis Ġthe Ġsituation Ġfrom Ġalice Ġp ov Ġand Ġwhat Ġshe Ġshould Ġdo Ġwhen Ġbob Ġpub lishes Ġhis Ġcommit Ġtx : ĊĠĠĠĠĠĠĠ Ġ// Ġbalances Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice 's Ġbalance Ġ: Ġ 4 4 9 Ġ 9 9 9 Ġ 9 9 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġnothing Ġto Ġdo ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob 's Ġbalance ĠĠ Ġ: ĠĠ 9 5 Ġ 0 0 0 Ġ 0 0 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġnothing Ġto Ġdo ĊĠĠĠĠĠĠĠ Ġ// Ġht lcs Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: Ġ 2 5 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( bob Ġdoes Ġnot Ġhave Ġthe Ġpre image ) ĠĠ Ġ=> Ġwait Ġfor Ġthe Ġtimeout Ġand Ġspend ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: Ġ 1 0 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( bob Ġhas Ġthe Ġpre image ) ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġif Ġbob Ġdoes Ġnot Ġuse Ġthe Ġpre image , Ġwait Ġfor Ġthe Ġtimeout Ġand Ġspend ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: ĠĠĠĠĠĠ 1 0 Ġ 0 0 0 Ġ( dust ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġwon 't Ġappear Ġin Ġthe Ġcommit ment Ġtx ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob Ġ-> Ġalice ĠĠĠ Ġ: ĠĠ 5 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( alice Ġhas Ġthe Ġpre image ) ĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġspend Ġimmediately Ġusing Ġthe Ġpre image ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob Ġ-> Ġalice ĠĠĠ Ġ: ĠĠ 5 5 Ġ 0 0 0 Ġ 0 0 0 Ġ( alice Ġdoes Ġnot Ġhave Ġthe Ġpre image ) Ġ=> Ġnothing Ġto Ġdo , Ġbob Ġwill Ġget Ġhis Ġmoney Ġback Ġafter Ġthe Ġtimeout ĊĊĠĠĠĠĠĠĠ Ġval Ġbob Commit Tx Ġ= Ġbob 8 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 , Ġbob Commit Tx . tx Out . size ) Ġ// Ġ 2 Ġmain Ġoutputs , Ġ 4 Ġpending Ġht lcs Ġand Ġ 2 Ġanchors ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice Closing , Ġactions ) Ġ= Ġalice 8 . process Ex ( Channel Event . Watch Received ( Watch Event Sp ent ( alice 8 . channelId , ĠBIT CO IN _ F UND ING _ SP ENT , Ġbob Commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice Closing Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġin Ġresponse Ġto Ġthat , Ġalice Ġpub lishes Ġits Ġclaim Ġt xs ĊĠĠĠĠĠĠĠ Ġval Ġclaim T xs Ġ= Ġactions . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). map Ġ{ Ġit . tx Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġclaim T xs . size ) ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġaddition Ġto Ġits Ġmain Ġoutput , Ġalice Ġcan Ġonly Ġclaim Ġ 3 Ġout Ġof Ġ 4 Ġht lcs , ĊĠĠĠĠĠĠĠ Ġ// Ġshe Ġcan 't Ġdo Ġanything Ġregarding Ġthe Ġht lc Ġsent Ġby Ġbob Ġfor Ġwhich Ġshe Ġdoes Ġnot Ġhave Ġthe Ġpre image ĊĠĠĠĠĠĠĠ Ġval Ġamount Cl a imed Ġ= Ġclaim T xs . map Ġ{ Ġclaim H tl c Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġclaim H tl c Tx . tx In . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġclaim H tl c Tx . tx Out . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( claim H tl c Tx , ĠlistOf ( bob Commit Tx ), ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclaim H tl c Tx . tx Out [ 0 ]. amount ĊĠĠĠĠĠĠĠ Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġ// Ġat Ġbest Ġwe Ġhave Ġa Ġlittle Ġless Ġthan Ġ 4 5 0 Ġ 0 0 0 Ġ+ Ġ 2 5 0 Ġ 0 0 0 Ġ+ Ġ 1 0 0 Ġ 0 0 0 Ġ+ Ġ 5 0 Ġ 0 0 0 Ġ= Ġ 8 5 0 Ġ 0 0 0 Ġ( because Ġfees ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 1 9 _ 1 5 0 . sat , Ġamount Cl a imed ) ĊĊĠĠĠĠĠĠĠ Ġval Ġr cp Ġ= Ġalice Closing . remote Commit Published !! ĊĠĠĠĠĠĠĠ Ġval Ġwatch Confirmed Ġ= Ġactions . find W atches < Watch Confirmed >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġwatch Confirmed . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( BIT CO IN _ TX _ CON FI R MED ( bob Commit Tx ), Ġwatch Confirmed [ 0 ]. event ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( BIT CO IN _ TX _ CON FI R MED ( rcp . claim Main Output Tx !!. tx ), Ġwatch Confirmed [ 1 ]. event ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġactions . find W atches < Watch Sp ent >(). count Ġ{ Ġit . event Ġis ĠBIT CO IN _ OUTPUT _ SP ENT Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġr cp . claim H tl c T xs . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġr cp . claim H tl c Success T xs (). size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġr cp . claim H tl c Timeout T xs (). size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠBIT CO IN _ F UND ING _ SP ENT Ġ( their Ġnext Ġcommit Ġwith Ġht lc )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 0 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 2 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 0 , Ġpay ee Ġ= Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 0 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġpre image _ alice 2 bob _ 2 , Ġ_) Ġ= Ġadd H tl c ( 1 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 1 , Ġpay ee Ġ= Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġnodes 1 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 2 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 2 , Ġpay ee Ġ= Ġbob 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġbob 3 ) Ġ= Ġnodes 2 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 3 , Ġpre image _ bob 2 alice _ 1 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġbob 3 , Ġpay ee Ġ= Ġalice 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġalice 4 ) Ġ= Ġnodes 3 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 4 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 5 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġbob 4 , Ġpay ee Ġ= Ġalice 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġalice 5 ) Ġ= Ġnodes 4 ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 6 , Ġbob 6 ) Ġ= Ġcross Sign ( alice 5 , Ġbob 5 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 7 , Ġbob 7 ) Ġ= Ġfulfill H tl c ( 1 , Ġpre image _ alice 2 bob _ 2 , Ġpay er Ġ= Ġalice 6 , Ġpay ee Ġ= Ġbob 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 8 , Ġalice 8 ) Ġ= Ġfulfill H tl c ( 0 , Ġpre image _ bob 2 alice _ 1 , Ġpay er Ġ= Ġbob 7 , Ġpay ee Ġ= Ġalice 7 ) ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġsign Ġbut Ġwe Ġintercept Ġbob 's Ġrev ocation ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 9 , Ġactions 8 ) Ġ= Ġalice 8 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions 8 . find Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 9 , Ġ_) Ġ= Ġbob 8 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 9 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 9 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġas Ġfar Ġas Ġalice Ġknows , Ġbob Ġcurrently Ġhas Ġtwo Ġvalid Ġun rev oked Ġcommit ment Ġtransactions ĊĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthis Ġpoint Ġhere Ġis Ġthe Ġsituation Ġfrom Ġbob 's Ġp ov Ġwith Ġthe Ġlatest Ġsig Ġreceived Ġfrom Ġalice , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġwhat Ġalice Ġshould Ġdo Ġwhen Ġbob Ġpub lishes Ġhis Ġcommit Ġtx : ĊĠĠĠĠĠĠĠ Ġ// Ġbalances Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice 's Ġbalance Ġ: Ġ 4 9 9 Ġ 9 9 9 Ġ 9 9 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġnothing Ġto Ġdo ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob 's Ġbalance ĠĠ Ġ: ĠĠ 9 5 Ġ 0 0 0 Ġ 0 0 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġnothing Ġto Ġdo ĊĠĠĠĠĠĠĠ Ġ// Ġht lcs Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: Ġ 2 5 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( bob Ġdoes Ġnot Ġhave Ġthe Ġpre image ) ĠĠ Ġ=> Ġwait Ġfor Ġthe Ġtimeout Ġand Ġspend ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: Ġ 1 0 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( bob Ġhas Ġthe Ġpre image ) ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġif Ġbob Ġdoes Ġnot Ġuse Ġthe Ġpre image , Ġwait Ġfor Ġthe Ġtimeout Ġand Ġspend ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: ĠĠĠĠĠĠ 1 0 Ġ 0 0 0 Ġ( dust ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġwon 't Ġappear Ġin Ġthe Ġcommit ment Ġtx ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob Ġ-> Ġalice ĠĠĠ Ġ: ĠĠ 5 5 Ġ 0 0 0 Ġ 0 0 0 Ġ( alice Ġdoes Ġnot Ġhave Ġthe Ġpre image ) Ġ=> Ġnothing Ġto Ġdo , Ġbob Ġwill Ġget Ġhis Ġmoney Ġback Ġafter Ġthe Ġtimeout ĊĊĠĠĠĠĠĠĠ Ġ// Ġbob Ġpub lishes Ġhis Ġcurrent Ġcommit Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġbob Commit Tx Ġ= Ġbob 9 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 , Ġbob Commit Tx . tx Out . size ) Ġ// Ġ 2 Ġmain Ġoutputs , Ġ 3 Ġpending Ġht lcs Ġand Ġ 2 Ġanchors ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice Closing , Ġactions 9 ) Ġ= Ġalice 9 . process Ex ( Channel Event . Watch Received ( Watch Event Sp ent ( alice 9 . channelId , ĠBIT CO IN _ F UND ING _ SP ENT , Ġbob Commit Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice Closing Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 9 . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġin Ġresponse Ġto Ġthat , Ġalice Ġpub lishes Ġits Ġclaim Ġt xs ĊĠĠĠĠĠĠĠ Ġval Ġclaim T xs Ġ= Ġactions 9 . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). map Ġ{ Ġit . tx Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġclaim T xs . size ) ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġcan Ġonly Ġclaim Ġ 2 Ġout Ġof Ġ 3 Ġht lcs , ĊĠĠĠĠĠĠĠ Ġ// Ġshe Ġcan 't Ġdo Ġanything Ġregarding Ġthe Ġht lc Ġsent Ġby Ġbob Ġfor Ġwhich Ġshe Ġdoes Ġnot Ġhave Ġthe Ġpre image ĊĠĠĠĠĠĠĠ Ġval Ġamount Cl a imed Ġ= Ġclaim T xs . map Ġ{ Ġclaim H tl c Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġclaim H tl c Tx . tx In . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġclaim H tl c Tx . tx Out . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( claim H tl c Tx , ĠlistOf ( bob Commit Tx ), ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclaim H tl c Tx . tx Out [ 0 ]. amount ĊĠĠĠĠĠĠĠ Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġ// Ġat Ġbest Ġwe Ġhave Ġa Ġlittle Ġless Ġthan Ġ 5 0 0 Ġ 0 0 0 Ġ+ Ġ 2 5 0 Ġ 0 0 0 Ġ+ Ġ 1 0 0 Ġ 0 0 0 Ġ= Ġ 8 5 0 Ġ 0 0 0 Ġ( because Ġfees ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 2 5 _ 7 5 0 . sat , Ġamount Cl a imed ) ĊĊĠĠĠĠĠĠĠ Ġval Ġr cp Ġ= Ġalice Closing . next Remote Commit Published !! ĊĠĠĠĠĠĠĠ Ġval Ġwatch Confirmed Ġ= Ġactions 9 . find W atches < Watch Confirmed >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġwatch Confirmed . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( BIT CO IN _ TX _ CON FI R MED ( bob Commit Tx ), Ġwatch Confirmed [ 0 ]. event ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( BIT CO IN _ TX _ CON FI R MED ( rcp . claim Main Output Tx !!. tx ), Ġwatch Confirmed [ 1 ]. event ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġactions 9 . find W atches < Watch Sp ent >(). count Ġ{ Ġit . event Ġis ĠBIT CO IN _ OUTPUT _ SP ENT Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġr cp . claim H tl c T xs . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġr cp . claim H tl c Success T xs (). size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġr cp . claim H tl c Timeout T xs (). size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠBIT CO IN _ F UND ING _ SP ENT Ġ( rev oked Ġcommit )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġ( alice , Ġbob ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġ// Ġinitially Ġwe Ġhave Ġ: ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġ= Ġ 8 0 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġbob Ġ= Ġ 2 0 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ Ġfun Ġsend ( cmd : ĠCMD _ ADD _ HT LC ? Ġ= Ġnull ): ĠPair < Transaction , ĠUpdate Add H tl c > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 , Ġadd ) Ġ= Ġif Ġ( cmd Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd H tl c ( cmd , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalice Ġsends Ġ 1 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġadd ) Ġ= Ġadd H tl c ( 1 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice , Ġpay ee Ġ= Ġbob ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( nodes . first , Ġnodes . second , Ġadd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalice Ġ= Ġalice 1 Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbob Ġ= Ġbob 1 Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcross Sign ( alice , Ġbob ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalice Ġ= Ġfirst Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbob Ġ= Ġsecond Ġas ĠNormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( bob . commit ments . local Commit . publish able T xs . commit Tx . tx , Ġadd ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( tx s , Ġadds ) Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġfirst Ġtwo ĠHT LC s Ġare Ġduplicates Ġ( MP P ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( tx 1 , Ġadd 1 ) Ġ= Ġsend () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( tx 2 , Ġadd 2 ) Ġ= Ġsend ( CMD _ ADD _ HT LC ( add 1 . amount Ms at , Ġadd 1 . payment Hash , Ġadd 1 . cl tv Expiry , Ġadd 1 . on ion Routing Packet , ĠUUID . randomUUID (), Ġcommit Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( other T xs , Ġother Adds ) Ġ= Ġ( 2 Ġuntil Ġ 1 0 ). map Ġ{ Ġsend () Ġ}. unzip () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( listOf ( tx 1 , Ġtx 2 ) Ġ+ Ġother T xs , ĠlistOf ( add 1 , Ġadd 2 ) Ġ+ Ġother Adds ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġbob Ġnow Ġhas Ġ 1 0 Ġspend able Ġtx , Ġ 9 Ġof Ġthem Ġbeing Ġrev oked ĊĠĠĠĠĠĠĠ Ġ// Ġlet 's Ġsay Ġthat Ġbob Ġpublished Ġthis Ġtx ĊĠĠĠĠĠĠĠ Ġval Ġrev oked Tx Ġ= Ġt xs [ 3 ] ĊĠĠĠĠĠĠĠ Ġ// Ġchannel Ġstate Ġfor Ġthis Ġrev oked Ġtx Ġis Ġas Ġfollows : ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġ= Ġ 7 6 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġbob Ġ= Ġ 2 0 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġa -> b Ġ= ĠĠ 1 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġa -> b Ġ= ĠĠ 1 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġa -> b Ġ= ĠĠ 1 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġa -> b Ġ= ĠĠ 1 0 Ġ 0 0 0 Ġsat ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 , Ġrev oked Tx . tx Out . size ) Ġ// Ġ 2 Ġanchor Ġoutputs Ġ+ Ġ 2 Ġmain Ġoutputs Ġ+ Ġ 4 Ġht lc ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice Closing 1 , Ġactions 1 ) Ġ= Ġalice . process Ex ( Channel Event . Watch Received ( Watch Event Sp ent ( alice . channelId , ĠBIT CO IN _ F UND ING _ SP ENT , Ġrev oked Tx ))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice Closing 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġalice Closing 1 . rev oked Commit Published . size ) ĊĠĠĠĠĠĠĠ Ġactions 1 . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( Channel Action . Storage . Get H tl c Infos ( rev oked Tx . tx id , Ġ 4 ), Ġactions 1 . find < Channel Action . Storage . Get H tl c Infos >()) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice Closing 2 , Ġactions 2 ) Ġ= Ġalice Closing 1 . process Ex ( Channel Event . Get H tl c Infos Response ( rev oked Tx . tx id , Ġadds . take ( 4 ). map Ġ{ ĠChannel Action . Storage . H tl c Info ( alice . channelId , Ġ 4 , Ġit . payment Hash , Ġit . cl tv Expiry ) Ġ})) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice Closing 2 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġalice Closing 2 . rev oked Commit Published . size ) ĊĠĠĠĠĠĠĠ ĠassertNull ( actions 2 . find Outgoing Message Opt < Error >()) ĊĠĠĠĠĠĠĠ ĠassertNull ( actions 2 . find Opt < Channel Action . Storage . Get H tl c Infos >()) ĊĊĠĠĠĠĠĠĠ Ġval Ġclaim T xs Ġ= Ġactions 2 . find T xs () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 6 , Ġclaim T xs . size ) ĊĠĠĠĠĠĠĠ Ġval Ġmain Output Tx Ġ= Ġclaim T xs [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġmain Pen alty Tx Ġ= Ġclaim T xs [ 1 ] ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( main Pen alty Tx , Ġrev oked Tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( BIT CO IN _ TX _ CON FI R MED ( rev oked Tx ), ĠBIT CO IN _ TX _ CON FI R MED ( main Output Tx )), Ġactions 2 . find W atches < Watch Confirmed >(). map Ġ{ Ġit . event Ġ}. toSet ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġht lc Pen alty T xs Ġ= Ġclaim T xs . drop ( 2 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ht lc Pen alty T xs . all Ġ{ Ġit . tx In . size Ġ== Ġ 1 Ġ}) ĊĠĠĠĠĠĠĠ Ġht lc Pen alty T xs . forEach Ġ{ ĠTransaction . correct ly Sp ends ( it , Ġrev oked Tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġht lc Inputs Ġ= Ġht lc Pen alty T xs . map Ġ{ Ġit . tx In . first (). out Point Ġ}. toSet () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġht lc Inputs . size ) Ġ// Ġeach Ġht lc - penalty Ġtx Ġsp ends Ġa Ġdifferent Ġoutput ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġactions 2 . find W atches < Watch Sp ent >(). count Ġ{ Ġit . event Ġis ĠBIT CO IN _ OUTPUT _ SP ENT Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ht lc Inputs Ġ+ Ġmain Pen alty Tx . tx In . first (). out Point , Ġactions 2 . find W atches < Watch Sp ent >(). map Ġ{ ĠOut Point ( it . tx Id . reversed (), Ġit . output Index . to Long ()) Ġ}. toSet ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġtwo Ġmain Ġoutputs Ġare Ġ 7 6 0 Ġ 0 0 0 Ġand Ġ 2 0 0 Ġ 0 0 0 Ġ( minus Ġfees ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 4 5 _ 8 6 0 . sat , Ġmain Output Tx . tx Out [ 0 ]. amount ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 9 5 _ 1 6 0 . sat , Ġmain Pen alty Tx . tx Out [ 0 ]. amount ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 _ 5 1 0 . sat , Ġht lc Pen alty T xs [ 0 ]. tx Out [ 0 ]. amount ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 _ 5 1 0 . sat , Ġht lc Pen alty T xs [ 1 ]. tx Out [ 0 ]. amount ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 _ 5 1 0 . sat , Ġht lc Pen alty T xs [ 2 ]. tx Out [ 0 ]. amount ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 _ 5 1 0 . sat , Ġht lc Pen alty T xs [ 3 ]. tx Out [ 0 ]. amount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠNew Block Ġ( no Ġht lc Ġtimed Ġout )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġactions 2 ) Ġ= Ġalice 1 . process Ex ( Channel Event . New Block ( alice 1 . current Block Height Ġ+ Ġ 1 , Ġalice 1 . current Tip . second )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 1 . copy ( current Tip Ġ= Ġalice 2 . current Tip ), Ġalice 2 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 2 . isEmpty ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . Check H tl c Timeout ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 2 , Ġalice 3 ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( actions 3 . isEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠNew Block Ġ( an Ġht lc Ġtimed Ġout )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġ_, Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠNormal ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġrestarted Ġafter Ġthe Ġht lc Ġtimed Ġout ĊĠĠĠĠĠĠĠ Ġval Ġalice 2 Ġ= Ġalice 1 . copy ( current Tip Ġ= Ġalice 1 . current Tip . copy ( first Ġ= Ġht lc . cl tv Expiry . to Long (). toInt ())) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions ) Ġ= Ġalice 2 . process Ex ( Channel Event . Check H tl c Timeout ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 3 . local Commit Published ) ĊĠĠĠĠĠĠĠ Ġactions . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ Ġactions . has < Channel Action . Storage . Store State >() ĊĠĠĠĠĠĠĠ Ġval Ġl cp Ġ= Ġalice 3 . local Commit Published !! ĊĠĠĠĠĠĠĠ Ġactions . has Tx ( l cp . commit Tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġl cp . ht lc Timeout T xs (). size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġl cp . claim H tl c Delayed T xs . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġactions . find T xs (). size ) Ġ// Ġcommit Ġtx Ġ+ Ġmain Ġoutput Ġ+ Ġht lc - timeout Ġ+ Ġclaim - ht lc - delayed ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġactions . find W atches < Watch Confirmed >(). size ) Ġ// Ġcommit Ġtx Ġ+ Ġmain Ġoutput Ġ+ Ġclaim - ht lc - delayed ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġactions . find W atches < Watch Sp ent >(). size ) Ġ// Ġht lc - timeout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Ful fill Timeout ( bob : ĠChannel State , Ġactions : ĠList < Channel Action >) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( bob . local Commit Published ) ĊĠĠĠĠĠĠĠ Ġactions . has Outgoing Message < Error >() ĊĠĠĠĠĠĠĠ Ġactions . has < Channel Action . Storage . Store State >() ĊĊĠĠĠĠĠĠĠ Ġval Ġl cp Ġ= Ġbob . local Commit Published !! ĊĠĠĠĠĠĠĠ ĠassertNotNull ( l cp . claim Main Delayed Output Tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġl cp . ht lc Success T xs (). size ) ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( l cp . ht lc Success T xs (). first (). tx , Ġl cp . commit Tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġl cp . claim H tl c Delayed T xs . size ) ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( l cp . claim H tl c Delayed T xs . first (). tx , Ġl cp . ht lc Success T xs (). first (). tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġt xs Ġ= Ġset Of ( l cp . commit Tx , Ġl cp . claim Main Delayed Output Tx !!. tx , Ġl cp . ht lc Success T xs (). first (). tx , Ġl cp . claim H tl c Delayed T xs . first (). tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx s , Ġactions . find T xs (). toSet ()) ĊĠĠĠĠĠĠĠ Ġval Ġwatch Confirmed Ġ= ĠlistOf ( l cp . commit Tx , Ġl cp . claim Main Delayed Output Tx !!. tx , Ġl cp . claim H tl c Delayed T xs . first (). tx ). map Ġ{ Ġit . tx id Ġ}. toSet () ĊĠĠĠĠĠĠĠ ĠassertEquals ( watch Confirmed , Ġactions . find W atches < Watch Confirmed >(). map Ġ{ Ġit . tx Id Ġ}. toSet ()) ĊĠĠĠĠĠĠĠ Ġval Ġwatch Sp ent Ġ= Ġset Of ( l cp . ht lc Success T xs (). first (). input . out Point ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( watch Sp ent , Ġactions . find W atches < Watch Sp ent >(). map Ġ{ ĠOut Point ( l cp . commit Tx , Ġit . output Index . to Long ()) Ġ}. toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠNew Block Ġ( fulfilled Ġsigned Ġht lc Ġignored Ġby Ġpeer )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġpre image , Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FUL FILL _ HT LC ( ht lc . id , Ġpre image ))) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Outgoing Message < Update Ful fill H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġactions 3 . has Outgoing Message < Commit Sig >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġful filled Ġht lc Ġis Ġclose Ġto Ġtiming Ġout Ġand Ġalice Ġstill Ġhasn 't Ġsigned , Ġso Ġbob Ġcloses Ġthe Ġchannel ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions 4 ) Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( tmp , Ġ_) Ġ= Ġbob 3 . process Ex ( Channel Event . New Block ( ht lc . cl tv Expiry . to Long (). toInt () Ġ- Ġ 3 , Ġbob 3 . current Tip . second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . process Ex ( Channel Event . Check H tl c Timeout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Ful fill Timeout ( bob 4 , Ġactions 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠNew Block Ġ( fulfilled Ġproposed Ġht lc Ġignored Ġby Ġpeer )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġpre image , Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FUL FILL _ HT LC ( ht lc . id , Ġpre image ))) ĊĠĠĠĠĠĠĠ Ġactions 2 . has Outgoing Message < Update Ful fill H tl c >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġbob Ġrestart s Ġwhen Ġthe Ġful filled Ġht lc Ġis Ġclose Ġto Ġtiming Ġout ĊĠĠĠĠĠĠĠ Ġval Ġbob 3 Ġ= Ġ( bob 2 Ġas ĠNormal ). copy ( current Tip Ġ= Ġbob 2 . current Tip . copy ( first Ġ= Ġht lc . cl tv Expiry . to Long (). toInt () Ġ- Ġ 3 )) ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġstill Ġhasn 't Ġsigned , Ġso Ġbob Ġcloses Ġthe Ġchannel ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġactions 4 ) Ġ= Ġbob 3 . process Ex ( Channel Event . Check H tl c Timeout ) ĊĠĠĠĠĠĠĠ Ġcheck Ful fill Timeout ( bob 4 , Ġactions 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠNew Block Ġ( fulfilled Ġproposed Ġht lc Ġack ed Ġbut Ġnot Ġcommitted Ġby Ġpeer )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes , Ġpre image , Ġht lc ) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġalice 0 , Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġcross Sign ( nodes . first , Ġnodes . second ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( bob 2 , Ġactions Bob 2 ) Ġ= Ġbob 1 . process Ex ( Channel Event . ExecuteCommand ( CMD _ FUL FILL _ HT LC ( ht lc . id , Ġpre image ))) ĊĠĠĠĠĠĠĠ Ġval Ġfulfill Ġ= Ġactions Bob 2 . has Outgoing Message < Update Ful fill H tl c >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 3 , Ġactions Bob 3 ) Ġ= Ġbob 2 . process Ex ( Channel Event . ExecuteCommand ( CMD _ SIGN )) ĊĠĠĠĠĠĠĠ Ġval Ġcommit Sig Ġ= Ġactions Bob 3 . has Outgoing Message < Commit Sig >() ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġ_) Ġ= Ġalice 1 . process Ex ( Channel Event . Message Received ( ful fill )) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġactions Alice 3 ) Ġ= Ġalice 2 . process Ex ( Channel Event . Message Received ( commit Sig )) ĊĠĠĠĠĠĠĠ Ġval Ġack Ġ= Ġactions Alice 3 . has Outgoing Message < Re voke And Ack >() ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 4 , Ġ_) Ġ= Ġbob 3 . process Ex ( Channel Event . Message Received ( ack )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġful filled Ġht lc Ġis Ġclose Ġto Ġtiming Ġout Ġand Ġalice Ġhas Ġrev oked Ġher Ġprevious Ġcommit ment Ġbut Ġnot Ġsigned Ġthe Ġnew Ġone , Ġso Ġbob Ġcloses Ġthe Ġchannel ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 5 , Ġactions 5 ) Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( tmp , Ġ_) Ġ= Ġbob 4 . process Ex ( Channel Event . New Block ( ht lc . cl tv Expiry . to Long (). toInt () Ġ- Ġ 3 , Ġbob 3 . current Tip . second )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp . process Ex ( Channel Event . Check H tl c Timeout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Ful fill Timeout ( bob 5 , Ġactions 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠDis connected `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġ_) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġ_) Ġ= Ġalice 0 . process Ex ( Channel Event . Disconnected ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 1 Ġis ĠOff line ) ĊĠĠĠĠĠĠĠ Ġval Ġprevious State Ġ= Ġalice 1 . state ĊĠĠĠĠĠĠĠ ĠassertTrue ( previous State Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 0 . channel Update , Ġprevious State . channel Update ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` recv ĠDis connected Ġ( with Ġht lcs )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 0 , Ġ_, Ġht lc 1 ) Ġ= Ġadd H tl c ( 2 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 0 , Ġpay ee Ġ= Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 1 , Ġbob 1 ) Ġ= Ġnodes 0 ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġ_, Ġht lc 2 ) Ġ= Ġadd H tl c ( 2 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 1 , Ġpay ee Ġ= Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġ_) Ġ= Ġnodes 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġ( alice 3 , Ġactions ) Ġ= Ġalice 2 . process Ex ( Channel Event . Disconnected ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠOff line ) ĊĊĠĠĠĠĠĠĠ Ġval Ġadd Set tled Fail List Ġ= Ġactions . filter Is Instance < Channel Action . Process Cmd Res . Add Set tled Fail >() ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġadd Set tled Fail List . size ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( add Set tled Fail List . all Ġ{ Ġit . result Ġis ĠChannel Action . H tl c Result . Fail . Disconnected Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ht lc 1 . payment Hash , Ġadd Set tled Fail List . first (). ht lc . payment Hash ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ht lc 2 . payment Hash , Ġadd Set tled Fail List . last (). ht lc . payment Hash ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 2 , Ġalice 3 . state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` receive ĠError `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 0 , Ġbob 0 ) Ġ= Ġreach Normal () ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 0 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 2 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġalice 0 , Ġpay ee Ġ= Ġbob 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 1 , Ġra 2 , Ġ_) Ġ= Ġadd H tl c ( 1 0 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġnodes 0 . first , Ġpay ee Ġ= Ġnodes 0 . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 2 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 1 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġnodes 1 . first , Ġpay ee Ġ= Ġnodes 1 . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 3 , Ġrb 1 , Ġ_) Ġ= Ġadd H tl c ( 5 0 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġnodes 2 . second , Ġpay ee Ġ= Ġnodes 2 . first ) ĊĠĠĠĠĠĠĠ Ġval Ġ( nodes 4 , Ġ_, Ġ_) Ġ= Ġadd H tl c ( 5 5 _ 0 0 0 _ 0 0 0 . ms at , Ġpay er Ġ= Ġnodes 3 . first , Ġpay ee Ġ= Ġnodes 3 . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġalice 1 ) Ġ= Ġcross Sign ( nodes 4 . first , Ġnodes 4 . second ) ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 2 , Ġbob 2 ) Ġ= Ġfulfill H tl c ( 1 , Ġra 2 , Ġalice 1 , Ġbob 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġalice 3 ) Ġ= Ġfulfill H tl c ( 0 , Ġrb 1 , Ġbob 2 , Ġalice 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġat Ġthis Ġpoint Ġhere Ġis Ġthe Ġsituation Ġfrom Ġalice Ġp ov Ġand Ġwhat Ġshe Ġshould Ġdo Ġwhen Ġshe Ġpub lishes Ġhis Ġcommit Ġtx : ĊĠĠĠĠĠĠĠ Ġ// Ġbalances Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice 's Ġbalance Ġ: Ġ 4 4 9 Ġ 9 9 9 Ġ 9 9 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġnothing Ġto Ġdo ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob 's Ġbalance ĠĠ Ġ: ĠĠ 9 5 Ġ 0 0 0 Ġ 0 0 0 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġnothing Ġto Ġdo ĊĠĠĠĠĠĠĠ Ġ// Ġht lcs Ġ: ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: Ġ 2 5 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( bob Ġdoes Ġnot Ġhave Ġthe Ġpre image ) ĠĠ Ġ=> Ġwait Ġfor Ġthe Ġtimeout Ġand Ġspend Ġusing Ġ 2 nd Ġstage Ġht lc - timeout ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: Ġ 1 0 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( bob Ġhas Ġthe Ġpre image ) ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġif Ġbob Ġdoes Ġnot Ġuse Ġthe Ġpre image , Ġwait Ġfor Ġthe Ġtimeout Ġand Ġspend Ġusing Ġ 2 nd Ġstage Ġht lc - timeout ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġalice Ġ-> Ġbob ĠĠĠ Ġ: ĠĠĠĠĠĠĠĠĠĠ 1 0 Ġ 0 0 0 Ġ( dust ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġwon 't Ġappear Ġin Ġthe Ġcommit ment Ġtx ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob Ġ-> Ġalice ĠĠĠ Ġ: ĠĠ 5 0 Ġ 0 0 0 Ġ 0 0 0 Ġ( alice Ġhas Ġthe Ġpre image ) ĠĠĠĠĠĠĠĠĠĠ Ġ=> Ġspend Ġimmediately Ġusing Ġthe Ġpre image Ġusing Ġht lc - success ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġbob Ġ-> Ġalice ĠĠĠ Ġ: ĠĠ 5 5 Ġ 0 0 0 Ġ 0 0 0 Ġ( alice Ġdoes Ġnot Ġhave Ġthe Ġpre image ) Ġ=> Ġnothing Ġto Ġdo , Ġbob Ġwill Ġget Ġhis Ġmoney Ġback Ġafter Ġthe Ġtimeout ĊĊĠĠĠĠĠĠĠ Ġ// Ġan Ġerror Ġoccurs Ġand Ġalice Ġpub lishes Ġher Ġcommit Ġtx ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 3 Ġis ĠNormal ) ĊĠĠĠĠĠĠĠ Ġval Ġalice Commit Tx Ġ= Ġalice 3 . commit ments . local Commit . publish able T xs . commit Tx ĊĠĠĠĠĠĠĠ Ġval Ġ( alice 4 , Ġactions ) Ġ= Ġalice 3 . process Ex ( Channel Event . Message Received ( Error ( Byte Vector 3 2 . Zero es , Ġ" o ops "))) ĊĠĠĠĠĠĠĠ ĠassertTrue ( alice 4 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( alice 4 . local Commit Published ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice 4 . local Commit Published !!. commit Tx , Ġalice Commit Tx . tx ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġalice 4 . local Commit Published !!. ht lc T xs . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġalice 4 . local Commit Published !!. ht lc Success T xs (). size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġalice 4 . local Commit Published !!. ht lc Timeout T xs (). size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġalice 4 . local Commit Published !!. claim H tl c Delayed T xs . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġt xs Ġ= Ġactions . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). map Ġ{ Ġit . tx Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 , Ġt xs . size ) ĊĠĠĠĠĠĠĠ Ġ// Ġalice Ġcan Ġonly Ġclaim Ġ 3 Ġout Ġof Ġ 4 Ġht lcs , Ġshe Ġcan 't Ġdo Ġanything Ġregarding Ġthe Ġht lc Ġsent Ġby Ġbob Ġfor Ġwhich Ġshe Ġdoes Ġnot Ġhave Ġthe Ġpre image ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġexpect Ġ 8 Ġtransactions : ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġalice 's Ġcurrent Ġcommit Ġtx ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġ 1 Ġtx Ġto Ġclaim Ġthe Ġmain Ġdelayed Ġoutput ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġ 3 Ġt xs Ġfor Ġeach Ġht lc ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġ 3 Ġt xs Ġfor Ġeach Ġdelayed Ġoutput Ġof Ġthe Ġclaimed Ġht lc ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( alice Commit Tx . tx , Ġt xs [ 0 ]) ĊĠĠĠĠĠĠĠ ĠassertEquals ( alice Commit Tx . tx . tx Out . size , Ġ 8 ) Ġ// Ġ 2 Ġanchor Ġoutputs Ġ+ Ġ 2 Ġmain Ġoutput Ġ+ Ġ 4 Ġpending Ġht lcs ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġmain Ġdelayed Ġoutput Ġsp ends Ġthe Ġcommit ment Ġtransaction ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( tx s [ 1 ], Ġalice Commit Tx . tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 nd Ġstage Ġtransactions Ġspend Ġthe Ġcommit ment Ġtransaction ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( tx s [ 2 ], Ġalice Commit Tx . tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( tx s [ 3 ], Ġalice Commit Tx . tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( tx s [ 4 ], Ġalice Commit Tx . tx , ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 3 rd Ġstage Ġtransactions Ġspend Ġtheir Ġrespective ĠHT LC - Success / HT LC - Timeout Ġtransactions ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( tx s [ 5 ], Ġt xs [ 2 ], ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( tx s [ 6 ], Ġt xs [ 3 ], ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĠĠĠĠĠĠĠ ĠTransaction . correct ly Sp ends ( tx s [ 7 ], Ġt xs [ 4 ], ĠScript Flags . STANDARD _ SCRIPT _ VERIFY _ FLAGS ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions . find W atches < Watch Confirmed >(). map Ġ{ Ġit . tx Id Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt xs [ 0 ]. tx id , Ġ// Ġcommit Ġtx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt xs [ 1 ]. tx id , Ġ// Ġmain Ġdelayed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt xs [ 5 ]. tx id , Ġ// Ġht lc - delayed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt xs [ 6 ]. tx id , Ġ// Ġht lc - delayed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt xs [ 7 ]. tx id Ġ Ġ// Ġht lc - delayed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġactions . find W atches < Watch Sp ent >(). size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` receive ĠError Ġ( nothing Ġat Ġstake )` () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġbob 0 ) Ġ= Ġreach Normal ( push Ms at Ġ= Ġ 0 . ms at ) ĊĠĠĠĠĠĠĠ Ġval Ġbob Commit Tx Ġ= Ġbob 0 . commit ments . local Commit . publish able T xs . commit Tx . tx ĊĠĠĠĠĠĠĠ Ġval Ġ( bob 1 , Ġactions ) Ġ= Ġbob 0 . process Ex ( Channel Event . Message Received ( Error ( Byte Vector 3 2 . Zero es , Ġ" o ops "))) ĊĠĠĠĠĠĠĠ Ġval Ġt xs Ġ= Ġactions . filter Is Instance < Channel Action . Blockchain . Publish Tx >(). map Ġ{ Ġit . tx Ġ} ĊĠĠĠĠĠĠĠ ĠassertEquals ( tx s , ĠlistOf ( bob Commit Tx )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( bob 1 Ġis ĠClosing ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bob 1 . local Commit Published !!. commit Tx , Ġbob Commit Tx ) ĊĠĠĠ Ġ} Ċ } Ċ