// package Ġnet . cord a . iou . flow Ċ // Ċ // import Ġco . parallel universe . fib ers . Suspend able Ċ // import Ġnet . cord a . core . contracts . Command Ċ // import Ġnet . cord a . core . contracts . Transaction Type Ċ // import Ġnet . cord a . core . flows . Flow Logic Ċ // import Ġnet . cord a . core . flows . Initi ated By Ċ // import Ġnet . cord a . core . flows . Initi ating Flow Ċ // import Ġnet . cord a . core . flows . Start able By RPC Ċ // import Ġnet . cord a . core . identity . Party Ċ // import Ġnet . cord a . core . node . services . linear Head s OfType Ċ // import Ġnet . cord a . core . transactions . Signed Transaction Ċ // import Ġnet . cord a . core . utilities . Progress Tracker Ċ // import Ġnet . cord a . flows . Collect Signatures Flow Ċ // import Ġnet . cord a . flows . Final ity Flow Ċ // import Ġnet . cord a . flows . Sign Transaction Flow Ċ // import Ġnet . cord a . iou . contract . IO U Contract Ċ // import Ġnet . cord a . iou . state . IO U State Ċ // import Ġnet . cord a . iou . state . Wallet Ċ // import Ġjava . util .* Ċ // Ċ // object ĠBlock Cash Flow Ġ{ Ċ // ĠĠĠ Ġ@ Start able By RPC Ċ // ĠĠĠ Ġ@ Initi ating Flow Ċ // ĠĠĠ Ġclass ĠInit iator ( val Ġcash : ĠString , val Ġcurrency : String ) Ġ: ĠFlow Logic < String >() Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġoverride Ġval Ġprogress Tracker : ĠProgress Tracker Ġ= ĠInit iator . tracker () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠPRE PAR ATION Ġ: ĠProgress Tracker . Step (" Ob t aining ĠIO U Ġfrom Ġvault ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠBUILD ING Ġ: ĠProgress Tracker . Step (" Building Ġand Ġverify ing Ġtransaction .") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠSIGN ING Ġ: ĠProgress Tracker . Step (" signing Ġtransaction .") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠCOL LECT ING Ġ: ĠProgress Tracker . Step (" Collect ing Ġcounter party Ġsignature .") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠCollect Signatures Flow . tracker () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠFIN AL ISING Ġ: ĠProgress Tracker . Step (" Final ising Ġtransaction ") Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠFinal ity Flow . tracker () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtracker () Ġ= ĠProgress Tracker ( PRE PAR ATION , ĠBUILD ING , ĠSIGN ING , ĠCOL LECT ING , ĠFIN AL ISING ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ@ Suspend able Ċ // ĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠString Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġme Ġ= Ġservice Hub . my Info . legal Identity Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 1 . ĠRetrieve Ġthe ĠIO U Ġstate Ġfrom Ġthe Ġvault . Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠPRE PAR ATION Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwallet s Ġ= Ġservice Hub . vault Service . linear Head s OfType < Wallet >() Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġwallet s ) Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwallet Ġ= Ġwallet s [ i . key ] Ġ?: Ġthrow ĠIllegalArgumentException (" Could Ġnot Ġmap ĠWallet ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwallet Data Ġ= Ġwallet . state . data Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Currency Ġ= Ġwallet Data . currency Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currency Ġ== Ġw Currency ) Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcounter party Ġ= Ġwallet . state . data . cash CC P Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠBUILD ING Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġwallet . state . not ary Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠTransaction Type . General . Builder ( not ary ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset tle Command Ġ= ĠCommand ( IO U Contract . Commands . Set tle (), ĠlistOf ( counter party . own ing Key , Ġme . own ing Key )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Command ( set tle Command ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Input State ( wallet ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// System . out . print ( ky c Status . toString ()+" Ġh j jk h "); Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Output State ( final State ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 8 . ĠVerify Ġand Ġsign Ġthe Ġtransaction . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . to Wire Transaction (). to Ledger Transaction ( service Hub ). verify () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠSIGN ING Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp tx Ġ= Ġservice Hub . sign Initial Transaction ( builder ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 9 . ĠGet Ġcounter party Ġsignature . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠCOL LECT ING Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġsub Flow ( Collect Signatures Flow ( pt x , ĠCOL LECT ING . child Progress Tracker ())) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// st x G Ġ= Ġst x Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 1 0 . ĠFinal ize Ġthe Ġtransaction . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠFIN AL ISING Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Flow ( Final ity Flow ( st x , ĠFIN AL ISING . child Progress Tracker ())). single () Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" done "; Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Wallet ĠNo Ġfound " Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠ Ġ@ Initi ated By ( Block Cash Flow . Init iator :: class ) Ċ // ĠĠĠ Ġclass ĠRes pon der ( val Ġother Party : ĠParty ) Ġ: ĠFlow Logic < String >() Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġ@ Suspend able Ċ // ĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠString Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Ġ= Ġobject Ġ: ĠSign Transaction Flow ( other Party ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suspend able Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġsome Ġchecking . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġsub Flow ( flow ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Ledger Commit ( st x . id ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" done " Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ //}