// package Ġcom . ledger blocks . p oc . flow Ċ // Ċ // import Ġco . parallel universe . fib ers . Suspend able Ċ // import Ġcom . ledger blocks . p oc . contract . Loan Contract Ċ // import Ġcom . ledger blocks . p oc . contract . Token Contract Ċ // import Ġcom . ledger blocks . p oc . state . Identity State Ċ // import Ġcom . ledger blocks . p oc . state . Token State Ċ // import Ġnet . cord a . accounts . flows . Request Key For Account Flow Ċ // import Ġnet . cord a . accounts . service . Key Management Back ed Account Service Ċ // import Ġnet . cord a . core . contracts . State And Ref Ċ // import Ġnet . cord a . core . flows .* Ċ // import Ġnet . cord a . core . node . services . query By Ċ // import Ġnet . cord a . core . transactions . Signed Transaction Ċ // import Ġnet . cord a . core . transactions . Transaction Builder Ċ // import Ġjava . time . LocalDate Ċ // import Ġjava . util .* Ċ // Ċ // Ċ //@ Start able By RPC Ċ //@ Initi ating Flow Ċ // class ĠAdd Tokens To Merchant Flow ( private Ġval Ġb UUID : ĠUUID , private Ġval Ġm UUID : ĠUUID , private Ġval Ġamt To Pay : ĠInt ): ĠFlow Logic < Signed Transaction >() Ġ{ Ċ // Ċ // ĠĠĠ Ġ@ Suspend able Ċ // ĠĠĠ Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities . first () Ċ // ĠĠĠĠĠĠĠ Ġval Ġaccount Service Ġ= Ġservice Hub . cord a Service ( Key Management Back ed Account Service :: class . java ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġb Account Info = account Service . account Info ( b UUID ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġm Account Info = account Service . account Info ( m UUID ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġpurpose : String Ċ // Ċ // ĠĠĠĠĠĠĠ Ġpurpose Ġ= Ġ" add tokens " Ċ // ĠĠĠĠĠĠĠ Ġvar Ġdate Ġ= ĠLocalDate . now (). toString () Ċ // ĠĠĠĠĠĠĠ Ġprintln (" Date Ġ: Ġ${ date }") Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġfresh key For b Account Info = Ġsub Flow ( Request Key For Account Flow ( b Account Info !!. state . data )) Ċ // ĠĠĠĠĠĠĠ Ġval Ġow ning Key For b Account Ġ= account Service . account Info ( fresh key For b Account Info . own ing Key ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġfresh key Form Account Info = Ġsub Flow ( Request Key For Account Flow ( m Account Info !!. state . data )) Ċ // ĠĠĠĠĠĠĠ Ġval Ġow ning Key Form Account Ġ= account Service . account Info ( fresh key Form Account Info . own ing Key ) Ċ // ĠĠĠĠĠĠĠ Ġ// val Ġb input Token State Reference Ġ= Ġservice Hub . vault Service . query By < Token State >(). states . filter Ġ{ Ġit . state . data . from AccountId !!. equals ( b UUID )} Ċ // ĠĠĠĠĠĠĠ Ġval Ġb input Token State Reference Ġ= Ġservice Hub . vault Service . query By < Token State >(). states . filter Ġ{ Ġit . state . data . to AccountId !!. equals ( b UUID )} Ċ // ĠĠĠĠĠĠ Ġ// Ġval Ġm input Token State Reference Ġ= Ġservice Hub . vault Service . query By < Token State >(). states . filter Ġ{ Ġit . state . data . to AccountId !!. equals ( m UUID )} Ċ // Ċ // ĠĠĠĠĠĠ Ġ// Ġval Ġm input Token State Reference Ġ= Ġservice Hub . vault Service . query By < Token State >(). states . filter Ġ{ Ġit . state . data . from AccountId !!. equals ( m UUID )} Ċ // Ċ // ĠĠĠĠĠĠ Ġ// Ġprintln (" min put Token State Reference =${ min put Token State Reference }") Ċ // Ċ // ĠĠĠĠĠĠĠ Ġprintln (" b input Token State Reference =${ b input Token State Reference }") Ċ // ĠĠĠĠĠĠĠ Ġval Ġparty 2 Ġ= Ġm Account Info !!. state . data . account Host Ċ // ĠĠĠĠĠĠĠ Ġval Ġb Token = Ġb input Token State Reference . get ( b input Token State Reference . size - 1 ). state . data Ċ // ĠĠĠĠĠĠ Ġ// Ġval Ġm Token = Ġm input Token State Reference . get ( min put Token State Reference . size - 1 ). state . data Ċ // ĠĠĠĠĠĠĠ Ġ// println (" borrow er Token - Amount =${ m Token . tx Amount }") Ċ // ĠĠĠĠĠĠĠ Ġ// input Token State Reference . forEach { token State : State And Ref < Token State > Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġstate Amount Ġ= Ġtoken State . state . data . tx Amount Ċ // ĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġprintln (" amount =$ state Amount ") Ċ // ĠĠĠĠĠ Ġ// Ġ Ġ} Ċ // ĠĠĠĠĠĠ Ġ// Ġval Ġupdated Input Token State Ġ= Ġm Token . copy ( participants Ġ= ĠlistOf ( m Account Info . state . data . account Host ), Ġtx Amount Ġ= Ġm Token . tx Amount Ġ+ Ġamt To Pay ) Ċ // ĠĠĠĠĠĠĠ Ġ// val Ġupdated Output Token State Ġ= Ġm Token . copy ( participants Ġ= ĠlistOf ( m Account Info . state . data . account Host ), Ġtx Amount Ġ= Ġamt To Pay ) Ċ // ĠĠĠĠĠĠ Ġ// Ġval Ġ( command , Ġupdated Owner State ) Ġ= Ġupdated Output Token State . with New Owner ( fresh key Form Account Info ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġsigning Accounts Ġ= ĠlistOf NotNull ( own ing Key For b Account , Ġow ning Key Form Account ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġrequired Sign ers Ġ= Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Accounts . map Ġ{ Ġit . state . data . account Host . own ing Key Ġ} Ġ+ ĠlistOf NotNull ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfresh key For b Account Info . own ing Key , Ġfresh key Form Account Info . own ing Key , our Identity . own ing Key ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġupdated Input Token State Ġ= Ġb Token . copy ( participants Ġ= ĠlistOf ( b Account Info . state . data . account Host ), token Balance Ġ= Ġb Token . token Balance Ġ- Ġamt To Pay , tx Amount Ġ= Ġamt To Pay , Ġto AccountId Ġ= Ġb UUID , Ġpurpose Ġ= Ġpurpose , Ġdate = date ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġupdated Output Token State Ġ= Ġm Token . copy ( participants Ġ= ĠlistOf ( m Account Info . state . data . account Host ), Ġtoken Balance Ġ= Ġm Token . token Balance + amt To Pay , from AccountId Ġ= Ġb UUID , Ġto AccountId Ġ= Ġm UUID , owner Ġ= Ġparty 2 , own ing Key Ġ= Ġfresh key Form Account Info . own ing Key , Ġtx Amount Ġ= Ġamt To Pay , Ġpurpose Ġ= purpose , Ġdate Ġ= Ġdate ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġm Output Token State Ġ= Ġb Token . copy ( participants Ġ= ĠlistOf ( m Account Info . state . data . account Host ), Ġtoken Balance Ġ= Ġm Token . token Balance + amt To Pay , Ġtx Amount Ġ= Ġamt To Pay , Ġfrom AccountId Ġ= Ġb UUID , Ġto AccountId Ġ= Ġm UUID , Ġow ning Key Ġ= Ġfresh key Form Account Info . own ing Key , Ġpurpose Ġ= Ġpurpose ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġ( command , Ġupdated Owner State ) Ġ= Ġupdated Input Token State . with New Owner ( fresh key Form Account Info ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġtransaction Builder Ġ= ĠTransaction Builder ( not ary ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Output State ( updated Owner State , ĠToken Contract . ID ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Output State ( updated Input Token State , ĠToken Contract . ID ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Command ( command , Ġrequired Sign ers ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Reference State ( own ing Key For b Account !!. referenced ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Reference State ( own ing Key Form Account !!. referenced ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġ. add Reference State ( own ing Key Form Account !!. referenced ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ. add Command ( Loan Contract . Commands . Loan (), service Hub . my Info . legal Id entities . first (). own ing Key ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġpartially Signed Transaction Ġ= Ġservice Hub . sign Initial Transaction ( transaction Builder , listOf NotNull ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġour Identity . own ing Key Ċ // ĠĠĠĠĠĠĠ Ġ)) Ċ // ĠĠĠĠĠĠĠ Ġval Ġsigned Transaction Ġ= Ġservice Hub . sign Initial Transaction ( transaction Builder ) Ċ // ĠĠĠĠĠĠĠ Ġtransaction Builder . verify ( service Hub ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġaccount Session Ġ= Ġinitiate Flow ( m Account Info !!. state . data . account Host ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġsessions Ġ= Ġif Ġ(! service Hub . my Info . is Legal Identity ( m Account Info . state . data . account Host )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . singletonList ( account Session ) Ċ // ĠĠĠĠĠĠĠ Ġelse Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . emptyList () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( Final ity Flow ( signed Transaction , Ġsessions )) // . core Transaction . out Refs OfType ( Token State :: class . java ). filter Ġ{ it . state . data . to AccountId . equals ( m UUID )}. get ( 0 ) Ċ // ĠĠĠ Ġ} Ċ //} Ċ // Ċ //@ Initi ated By ( Add Tokens To Merchant Flow :: class ) Ċ // class ĠAdd Tokens To Merchant Flow Responder Flow ( val Ġother Party Session : ĠFlow Session ): ĠFlow Logic < Signed Transaction > (){ Ċ // Ċ // ĠĠĠ Ġ@ Suspend able Ċ // ĠĠĠ Ġfinal Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġsub Flow ( object Ġ: ĠSign Transaction Flow ( other Party Session ) Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// extra Transaction Validation ( st x ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ}) Ċ // ĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġsub Flow ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReceive Final ity Flow ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Side Session Ġ= Ġother Party Session , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Tx Id Ġ= Ġst x . id Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠ Ġlogger . info (" Received Ġtransaction Ġfrom Ġfinal ity ") Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġtx Ċ // ĠĠĠ Ġ} Ċ //} Ċ