package Ġcom . sec L end Model . flow . se cur ities L ending Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġcom . sec L end Model . contract . Security Loan Ċ import Ġcom . sec L end Model . flow . Coll ateral Pre paration Flow Ċ import Ġcom . sec L end Model . flow . Sec ur ities Pre paration Flow Ċ import Ġcom . sec L end Model . flow . se cur ities L ending . Loan Checks . is L ender Ċ import Ġcom . sec L end Model . flow . se cur ities L ending . Loan Checks . state To Loan Terms Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . flows .* Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . transactions . Transaction Builder Ċ import Ġnet . cord a . core . transactions . Wire Transaction Ċ import Ġnet . cord a . core . utilities . unwrap Ċ import Ġnet . cord a . flows . Final ity Flow Ċ import Ġnet . cord a . flows . Resolve Transactions Flow Ċ Ċ /** Ċ Ġ* ĠFlow Ġto Ġmodel Ġthe Ġcon clusion Ġof Ġa Ġsecurity Ġloan , Ġcreating Ġa ĠTX N Ġwith Ġthe Ġfollowing Ġstructure : Ċ Ġ* Ċ Ġ* Ġ ĠCommands : ĠExit / Terminate Ċ Ġ* Ġ ĠInputs : Ġ Ġ- Cash ĠColl ateral Ġ+ ĠMargin Ġ( from Ġl ender ), Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ- Sec ur ities Ġ( from Ġborrow er ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ- Security Loan Ġ( owned Ġby Ġl ender ) Ċ Ġ* Ġ ĠOutputs : Ġ- Cash Ġ( owned Ġby Ġborrow er ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠ Ġ- Sec ur ities Ġ( owned Ġby Ġl ender ) Ċ Ġ*/ Ċ Ċ object ĠLo an Termination Flow Ġ{ ĊĠĠĠ Ġ@ Start able By RPC ĊĠĠĠ Ġ@ Initi ating Flow ĊĠĠĠ Ġopen Ġclass ĠTermin ator ( val Ġloan ID Ġ: ĠUnique Identifier ) Ġ: ĠFlow Logic < Unit >() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suspend able ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Nodes . single (). not ary Identity ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// STEP Ġ 1 ĠRetrieve Ġloan Ġbeing Ġterminated Ġfrom Ġthe Ġvault , Ġand Ġnotify Ġthe Ġcounter Party Ġabout Ġthe Ġloan Ġwe 're Ġterminating ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsec Loan Ġ= Ġsub Flow ( Loan Retrie val Flow ( loan ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsec Loan Terms Ġ= Ġstate To Loan Terms ( sec Loan . state . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcounter Party Ġ= ĠLo an Checks . get Counter Party ( sec Loan Terms , Ġservice Hub . my Info . legal Identity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( counter Party , Ġloan ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Coll ateral ĠType : Ġ${ sec Loan . state . data . terms . coll ateral Type }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// STEP Ġ 2 : ĠPrepare Ġthe Ġtx Builder Ġfor Ġthe Ġexit Ġ-> Ġadd Ġthe Ġsecurity Loan Ġinput Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl ender Ġ= Ġsec Loan . state . data . l ender ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġborrow er Ġ= Ġsec Loan . state . data . borrow er ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠTransaction Type . General . Builder ( not ary Ġ= Ġnot ary ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSecurity Loan (). generate Exit ( builder , Ġsec Loan , Ġl ender , Ġborrow er ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// STEP Ġ 3 : ĠReturn Ġeither Ġcash Ġor Ġse cur ities , Ġdepending Ġon Ġwhich Ġparty Ġwe Ġare Ġin Ġthe Ġdeal . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp tx Ġ: ĠTransaction Builder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġwe Ġare Ġthe Ġl ender , Ġthen Ġwe Ġare Ġreturning Ġcoll ateral ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is L ender ( sec Loan Terms , Ġservice Hub . my Info . legal Identity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// coll ateral Ġprep Ġflow Ġis Ġused Ġto Ġget Ġthe Ġrequired Ġcoll ateral Ġand Ġadd Ġto Ġthe Ġtxn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ(( sec Loan . state . data . stock Price . quantity Ġ* Ġsec Loan Terms . quantity ) Ġ* Ġ( 1 . 0 Ġ+ Ġsec Loan Terms . margin )). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp tx Ġ= Ġsub Flow ( Coll ateral Pre paration Flow ( builder , Ġsec Loan . state . data . terms . coll ateral Type , Ġvalue , Ġcounter Party Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse { Ġ Ġ// If Ġwe Ġare Ġthe Ġborrow er , Ġthen Ġwe Ġare Ġreturning Ġstock Ġto Ġthe Ġl ender ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Add Ġthe Ġoriginal Ġse cur ities Ġthat Ġwere Ġloan ed Ġout Ġto Ġthe Ġtx . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp tx Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Flow ( Sec ur ities Pre paration Flow ( builder , Ġsec Loan Terms . code , Ġsec Loan Terms . quantity , Ġcounter Party )). first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIns ufficient Balance Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Ins ufficient Ġholding : Ġ${ e . message }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// STEP Ġ 4 : ĠSend Ġoff Ġthe Ġtxn Ġto Ġthe Ġother Ġparty . ĠRec ieve Ġback Ġafter Ġthey Ġhave Ġadded Ġthe Ġrequired Ġstates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġsend And Receive < Signed Transaction >( counter Party , Ġp tx ). unwrap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw tx : ĠWire Transaction Ġ= Ġit . verify Signatures ( service Hub . my Info . legal Identity . own ing Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub . network Map Cache . not ary Nodes . single (). not ary Identity . own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġtxn Ġdependency Ġchain Ġ(" resolution ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Flow ( Resolve Transactions Flow ( w tx , Ġcounter Party )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun not ar ised TX Ġ= Ġservice Hub . add Signature ( st x , Ġservice Hub . my Info . legal Identity . own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinished TX Ġ= Ġsub Flow ( Final ity Flow ( un not ar ised TX , Ġset Of ( counter Party ))). single () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// return Ġfinished TX . tx . outputs . map Ġ{ Ġit . data Ġ}. filter Is Instance < Security Loan . State >(). single (). linear Id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Start able By RPC ĊĠĠĠ Ġ@ Initi ated By ( Termin ator :: class ) ĊĠĠĠ Ġclass ĠTermin ation Accept or ( val Ġcounter Party Ġ: ĠParty ) Ġ: ĠFlow Logic < Unit >() Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suspend able ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// STEP Ġ 5 : ĠReceive Ġinformation Ġabout Ġthe Ġloan Ġbeing Ġterminated Ġfrom Ġborrow er ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloan ID Ġ= Ġreceive < Unique Identifier >( counter Party ). Ġunwrap Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsec Loan Ġ= Ġsub Flow ( Loan Retrie val Flow ( loan ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsec Loan Terms Ġ= Ġstate To Loan Terms ( sec Loan . state . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// STEP Ġ 6 : Receive Ġthe Ġtx Ġbuilder Ġand Ġand Ġadd Ġthe Ġrequired Ġcash Ġstates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp tx Ġ= Ġreceive < Transaction Builder >( counter Party ). unwrap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : ĠCheck Ġwe Ġwant Ġto Ġset tle Ġthis Ġloan / the Ġtotal Ġloan Ġtime Ġhas Ġelapsed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Ġ: ĠTransaction Builder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is L ender ( sec Loan Terms , Ġservice Hub . my Info . legal Identity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// We Ġare Ġl ender Ġ-> Ġshould Ġsend Ġback Ġcoll ateral Ġto Ġthe Ġborrow er ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ(( sec Loan . state . data . stock Price . quantity * Ġsec Loan Terms . quantity ) Ġ* Ġ( 1 . 0 Ġ+ Ġsec Loan Terms . margin )). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Ġ= Ġsub Flow ( Coll ateral Pre paration Flow ( pt x , Ġsec Loan . state . data . terms . coll ateral Type , Ġvalue , Ġcounter Party Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse { Ġ// We Ġare Ġthe Ġborrow er Ġ-> Ġshould Ġsend Ġback Ġstock Ġto Ġthe Ġl ender ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Flow ( Sec ur ities Pre paration Flow ( pt x , Ġsec Loan Terms . code , Ġsec Loan Terms . quantity , Ġcounter Party )). first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIns ufficient Balance Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSecurity Exception (" Ins ufficient Ġholding : Ġ${ e . message }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// STEP Ġ 7 : ĠSend Ġthis Ġtx Ġback Ġto Ġthe Ġborrow er ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġservice Hub . sign Initial Transaction ( tx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( counter Party , Ġst x ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUnit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }