package Ġcom . template . workflows Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġcom . template . contracts . Example Contract Ċ import Ġcom . template . states . Example State Ċ import Ġcom . template . states . Example State Status Ċ import Ġnet . cord a . core . contracts . Requirements . using Ċ import Ġnet . cord a . core . contracts . State Ref Ċ import Ġnet . cord a . core . contracts . require That Ċ import Ġnet . cord a . core . flows .* Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . node . services . query By Ċ import Ġnet . cord a . core . node . services . vault . Query Criteria Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . transactions . Transaction Builder Ċ import Ġnet . cord a . core . utilities . Progress Tracker Ċ Ċ // Ġ********* Ċ // Ġ* ĠFlow s Ġ* Ċ // Ġ********* ĊĊ Ċ // ĠCreate Draft Flows Ċ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠCreate Draft Flow ( val Ġother Party : ĠParty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġagreement Details : ĠString ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= ĠProgress Tracker () ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ: ĠSigned Transaction { ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġoutput Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġme Ġ= Ġservice Hub . my Info . legal Id entities . first () ĊĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= ĠExample State ( me , Ġother Party , Ġagreement Details ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġcommand ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠExample Contract . Commands . Create Draft () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġtransaction ĊĊĠĠĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder () ĊĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities . first () ĊĠĠĠĠĠĠĠ Ġtx Builder . not ary Ġ= Ġnot ary ĊĠĠĠĠĠĠĠ Ġtx Builder . add Output State ( output State ) ĊĠĠĠĠĠĠĠ Ġtx Builder . add Command ( command , Ġme . own ing Key ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify ĊĠĠĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsign ĊĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠFinal ise ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġ Ġinitiate Flow ( other Party ) ĊĠĠĠĠĠĠĠ Ġval Ġf tx Ġ= Ġsub Flow (( Final ity Flow ( st x , session ))) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġf tx ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Initi ated By ( Create Draft Flow :: class ) Ċ class ĠCreate Draft Responder Flow ( val Ġother Party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRes pon der Ġflow Ġlogic Ġgoes Ġhere . ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( Receive Final ity Flow ( other Party Session )) ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠAm end Draft Flows ĊĊ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠAm end Draft Flow ( val Ġexisting State Ref : ĠState Ref , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Agreement Details : ĠString ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= ĠProgress Tracker () ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ: ĠSigned Transaction { ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġexisting Ġstate Ġdetails ĊĠĠĠĠĠĠĠ Ġval Ġinput State And Ref Ġ= Ġservice Hub . to State And Ref < Example State >( existing State Ref ) ĊĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= Ġinput State And Ref . state . data Ġas ĠExample State ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġoutput Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġinput State . copy ( agreement Details Ġ= Ġnew Agreement Details ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġcommand ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠExample Contract . Commands . Am end Draft () ĊĊĠĠĠĠĠĠĠ Ġ// Ġidentify Ġother Party ĊĠĠĠĠĠĠĠ Ġval Ġme Ġ= Ġservice Hub . my Info . legal Id entities . first () ĊĠĠĠĠĠĠĠ Ġval Ġparties Ġ= ĠlistOf ( input State . seller , Ġinput State . buyer ) ĊĠĠĠĠĠĠĠ Ġval Ġother Party Ġ= Ġparties . filter Ġ{ it Ġ!= Ġme }. single () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġtransaction ĊĠĠĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder () ĊĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities . first () ĊĊĠĠĠĠĠĠĠ Ġtx Builder . not ary Ġ= Ġnot ary ĊĠĠĠĠĠĠĠ Ġtx Builder . add Input State ( input State And Ref ) ĊĠĠĠĠĠĠĠ Ġtx Builder . add Output State ( output State ) ĊĠĠĠĠĠĠĠ Ġtx Builder . add Command ( command , Ġme . own ing Key ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify ĊĠĠĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsign ĊĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFinal ise ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġ Ġinitiate Flow ( other Party ) ĊĠĠĠĠĠĠĠ Ġval Ġf tx Ġ= Ġsub Flow (( Final ity Flow ( st x , session ))) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġf tx ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Initi ated By ( Am end Draft Flow :: class ) Ċ class ĠAm end Draft Responder Flow ( val Ġother Party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRes pon der Ġflow Ġlogic Ġgoes Ġhere . ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( Receive Final ity Flow ( other Party Session )) ĊĊĠĠĠ Ġ} Ċ } ĊĊ Ċ // ĠAg ree ĠFlow s Ċ Ċ @ Initi ating Flow Ċ @ Start able By RPC Ċ class ĠAg ree Flow ( val Ġexisting State Ref : ĠState Ref ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ ĊĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= ĠProgress Tracker () ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall () Ġ: ĠSigned Transaction { ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġexisting Ġstate Ġdetails ĊĠĠĠĠĠĠĠ Ġval Ġinput State And Ref Ġ= Ġservice Hub . to State And Ref < Example State >( existing State Ref ) ĊĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= Ġinput State And Ref . state . data Ġas ĠExample State ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġoutput Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġinput State . copy ( status Ġ= ĠExample State Status . AG RE ED ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġcommand ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠExample Contract . Commands . Ag ree () ĊĊĠĠĠĠĠĠĠ Ġ// Ġidentify Ġother Party ĊĠĠĠĠĠĠĠ Ġval Ġme Ġ= Ġservice Hub . my Info . legal Id entities . first () ĊĠĠĠĠĠĠĠ Ġval Ġparties Ġ= ĠlistOf ( input State . seller , Ġinput State . buyer ) ĊĠĠĠĠĠĠĠ Ġval Ġother Party Ġ= Ġparties . filter Ġ{ it Ġ!= Ġme }. single () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġtransaction ĊĠĠĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder () ĊĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities . first () ĊĊĠĠĠĠĠĠĠ Ġtx Builder . not ary Ġ= Ġnot ary ĊĠĠĠĠĠĠĠ Ġtx Builder . add Input State ( input State And Ref ) ĊĠĠĠĠĠĠĠ Ġtx Builder . add Output State ( output State ) ĊĠĠĠĠĠĠĠ Ġtx Builder . add Command ( command , Ġme . own ing Key , Ġother Party . own ing Key ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify ĊĠĠĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsign Ġand Ġgather Ġsignatures ĊĠĠĠĠĠĠĠ Ġval Ġpst x Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder ) ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġ Ġinitiate Flow ( other Party ) ĊĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġsub Flow ( Collect Signatures Flow ( pst x , listOf ( session ))) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFinal ise ĊĠĠĠĠĠĠĠ Ġval Ġf tx Ġ= Ġsub Flow (( Final ity Flow ( st x , session ))) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġf tx ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Initi ated By ( Ag ree Flow :: class ) Ċ class ĠAg ree Responder Flow ( val Ġother Party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRes pon der Ġflow Ġlogic Ġgoes Ġhere . ĊĊĠĠĠĠĠĠĠ Ġval Ġsign Transaction Flow Ġ= Ġobject : ĠSign Transaction Flow ( other Party Session ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġst x . tx . outputs . single (). data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ" output Ġis Ġan ĠExample State " Ġusing Ġ Ġ( output Ġis ĠExample State ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtx Id Ġ= Ġsub Flow ( sign Transaction Flow ). id ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( Receive Final ity Flow ( other Party Session , Ġexpected Tx Id Ġ= Ġtx Id )) ĊĊĠĠĠ Ġ} Ċ } ĊĊĊ