package Ġcom . example . flow čĊč Ċ import Ġco . parallel universe . fib ers . Suspend able č Ċ import Ġcom . example . contract . Message Contract č Ċ import Ġcom . example . state . Black list State č Ċ import Ġcom . example . state . MessageState čĊč Ċ import Ġnet . cord a . core . contracts . Command č Ċ import Ġnet . cord a . core . contracts . Unique Identifier č Ċ 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 . Vault č Ċ import Ġnet . cord a . core . node . services . query By č Ċ import Ġnet . cord a . core . node . services . vault .* č Ċ import Ġnet . cord a . core . transactions . Signed Transaction č Ċ import Ġnet . cord a . core . transactions . Transaction Builder č Ċ import Ġnet . cord a . core . utilities . Progress Tracker č Ċ import Ġnet . cord a . core . utilities . Progress Tracker . Step č Ċ import Ġjava . time . Instant č Ċ import Ġjava . util .* čĊč Ċ object ĠMessage Flow Ġ{ čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* ĠCreate ĠMessage ĠFlow Ġ-------------------------------------------------------------------------------- ---- čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ*/ čĊĠĠĠ Ġ@ Initi ating Flow čĊĠĠĠ Ġ@ Start able By RPC čĊĠĠĠ Ġclass ĠSt arter ( val Ġdest in at ario : ĠParty , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg ol atore : ĠParty , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg : ĠString , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsic ure zza : ĠInt ) Ġ: ĠFlow Logic < MessageState >() Ġ{ čĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġprogress Ġtracker Ġcheck points Ġeach Ġstage Ġof Ġthe Ġflow Ġand Ġoutputs Ġthe Ġspecified Ġmessages Ġwhen Ġeach čĊĠĠĠĠĠĠĠĠ Ġ* Ġcheckpoint Ġis Ġreached Ġin Ġthe Ġcode . ĠSee Ġthe Ġ' progress Tracker . current Step ' Ġexpressions Ġwithin Ġthe Ġcall () Ġfunction . čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠGENER ATING _ TRANSACTION Ġ: ĠStep (" Generating Ġtransaction Ġbased Ġon Ġnew ĠMessage .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠVERIFY ING _ TRANSACTION Ġ: ĠStep (" Verify ing Ġcontract Ġconstraints .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠSIGN ING _ TRANSACTION Ġ: ĠStep (" Signing Ġtransaction Ġwith Ġour Ġprivate Ġkey .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠG ATHER ING _ SIG S Ġ: ĠStep (" Gather ing Ġthe Ġdest in at ario 's Ġsignature .") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠCollect Signatures Flow . tracker () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠFIN AL ISING _ TRANSACTION Ġ: ĠStep (" Ob t aining Ġnot ary Ġsignature Ġand Ġrecording Ġtransaction .") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠFinal ity Flow . tracker () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtracker () Ġ= ĠProgress Tracker ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGENER ATING _ TRANSACTION , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERIFY ING _ TRANSACTION , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIGN ING _ TRANSACTION , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG ATHER ING _ SIG S , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFIN AL ISING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= Ġtracker () čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġflow Ġlogic Ġis Ġencaps ulated Ġwithin Ġthe Ġcall () Ġmethod . čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġ@ Suspend able čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠMessage State Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠObtain Ġa Ġreference Ġto Ġthe Ġnot ary Ġwe Ġwant Ġto Ġuse . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities [ 0 ] čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 1 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠGENER ATING _ TRANSACTION čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠControl ĠBlack list Rule . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcriteria : ĠQuery Criteria Ġ= ĠQuery Criteria . Vault Query Criteria ( Vault . State Status . UN CON SU MED ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Black list States Ġ= Ġservice Hub . vault Service . query By < Black list State >( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage Specification ( 1 , ĠMAX _ PAGE _ SIZE ), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort ( set Of ( Sort . Sort Column ( Sort Attribute . Standard ( Sort . Vault State Attribute . REC OR DED _ TIME ), ĠSort . Direction . DESC ))) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). states čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Black list States . isEmpty ()) Ġthrow ĠFlow Exception (" No ĠBlack list Ġstate Ġin Ġthe Ġledger . ĠF CA Ġmust Ġcreate Ġfirst Ġthe ĠBlack list Ġconfiguration .") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblacklist State Ref Ġ= Ġlast Black list States [ 0 ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblacklist State Ġ= Ġblacklist State Ref . state . data čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! Res pect Rule ( service Hub . my Info . legal Id entities . first (), Ġdest in at ario , Ġblacklist State )) Ġthrow ĠFlow Exception (" F CA 's ĠBlack list Ġcannot Ġpermit Ġthis Ġoperation .") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġan Ġunsigned Ġtransaction . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage State Ġ= ĠMessage State ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub . my Info . legal Id entities . first (), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest in at ario , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreg ol atore , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstant . now (), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsic ure zza , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnique Identifier ( id Ġ= ĠUUID . randomUUID ())) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Command Ġ= ĠCommand ( Message Contract . Commands . Create (), Ġmessage State . participants . map Ġ{ Ġit . own ing Key Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder ( not ary ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Output State ( message State , ĠMessage Contract . ID ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Command ( tx Command ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 2 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠVERIFY ING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġthe Ġtransaction Ġis Ġvalid . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 3 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠSIGN ING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSign Ġthe Ġtransaction . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart Signed Tx Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 4 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠG ATHER ING _ SIG S čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġthe Ġstate Ġto Ġthe Ġcounter party , Ġand Ġreceive Ġit Ġback Ġwith Ġtheir Ġsignature . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest in at ario Session Ġ= Ġinitiate Flow ( dest in at ario ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg ol atore Session Ġ= Ġinitiate Flow ( reg ol atore ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfully Signed Tx Ġ= Ġsub Flow ( Collect Signatures Flow ( part Signed Tx , Ġset Of ( dest in at ario Session , Ġreg ol atore Session ), ĠG ATHER ING _ SIG S . child Progress Tracker ())) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 5 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠFIN AL ISING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot ar ise Ġand Ġrecord Ġthe Ġtransaction Ġin Ġboth Ġparties ' Ġvault s . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Flow ( Final ity Flow ( fully Signed Tx , Ġset Of ( dest in at ario Session , Ġreg ol atore Session ), ĠFIN AL ISING _ TRANSACTION . child Progress Tracker ())) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmessage State čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ@ Initi ated By ( Starter :: class ) čĊĠĠĠ Ġclass ĠReceiver ( val Ġother Party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ čĊĠĠĠĠĠĠĠ Ġ@ Suspend able čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Transaction Flow Ġ= Ġobject Ġ: ĠSign Transaction Flow ( other Party Session ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ= Ġrequire That Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġst x . tx . outputs . single (). data čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" This Ġmust Ġbe Ġan Ġmessage Ġtransaction ." Ġusing Ġ( output Ġis ĠMessage State ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġoutput Ġas ĠMessage State čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ" other Ġrule Ġmessage " Ġusing Ġ( output Ġis Ġreg ola _ nu ova ) Ġ*/ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Id Ġ= Ġsub Flow ( sign Transaction Flow ). id čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( Receive Final ity Flow ( other Party Session , Ġexpected Tx Id Ġ= Ġtx Id )) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** * čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* ĠMessage ĠDelete ĠFlow Ġ-------------------------------------------------------------------------------- --- čĊĠĠĠĠ Ġ* čĊĠĠĠĠ Ġ* Ġ*/ čĊĠĠĠ Ġ@ Initi ating Flow čĊĠĠĠ Ġ@ Start able By RPC čĊĠĠĠ Ġclass ĠDe leter ( val Ġmessage Linear Id : ĠString ) Ġ: ĠFlow Logic < MessageState >() Ġ{ čĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġprogress Ġtracker Ġcheck points Ġeach Ġstage Ġof Ġthe Ġflow Ġand Ġoutputs Ġthe Ġspecified Ġmessages Ġwhen Ġeach čĊĠĠĠĠĠĠĠĠ Ġ* Ġcheckpoint Ġis Ġreached Ġin Ġthe Ġcode . ĠSee Ġthe Ġ' progress Tracker . current Step ' Ġexpressions Ġwithin Ġthe Ġcall () Ġfunction . čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠGENER ATING _ TRANSACTION Ġ: ĠProgress Tracker . Step (" Generating Ġtransaction Ġbased Ġon Ġdelete ĠMessage .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠVERIFY IGN _ TRANSACTION Ġ: ĠProgress Tracker . Step (" Verify ing Ġcontract Ġconstraints .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠSIGN ING _ TRANSACTION Ġ: ĠProgress Tracker . Step (" Signing Ġtransaction Ġwith Ġour Ġprivate Ġkey .") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠG ATHER ING _ SIG S Ġ: ĠProgress Tracker . Step (" Gather ing Ġthe Ġother party 's Ġsignature .") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠCollect Signatures Flow . tracker () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject ĠFIN AL ISING _ TRANSACTION Ġ: ĠStep (" Ob t aining Ġnot ary Ġsignature Ġand Ġrecording Ġtransaction .") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild Progress Tracker () Ġ= ĠFinal ity Flow . tracker () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġtracker () Ġ= ĠProgress Tracker ( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGENER ATING _ TRANSACTION , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERIFY IGN _ TRANSACTION , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIGN ING _ TRANSACTION , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG ATHER ING _ SIG S , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFIN AL ISING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= Ġtracker () čĊčĊĠĠĠĠĠĠĠ Ġ/** čĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġflow Ġlogic Ġis Ġencaps ulated Ġwithin Ġthe Ġcall () Ġmethod . čĊĠĠĠĠĠĠĠĠ Ġ*/ čĊĠĠĠĠĠĠĠ Ġ@ Suspend able čĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠMessage State Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠObtain Ġa Ġreference Ġto Ġthe Ġnot ary Ġwe Ġwant Ġto Ġuse . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot ary Ġ= Ġservice Hub . network Map Cache . not ary Id entities [ 0 ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Legal Identity Ġ= Ġservice Hub . my Info . legal Id entities . first () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Legal Identity . name . organisation Ġ== Ġ" F CA ") Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFlow Exception (" node Ġ" Ġ+ Ġservice Hub . my Info . legal Id entities . first () Ġ+ Ġ" Ġcannot Ġstart Ġthe Ġissue Ġflow ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 1 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠGENER ATING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġan Ġunsigned Ġtransaction . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcriteria : ĠQuery Criteria Ġ= ĠQuery Criteria . Vault Query Criteria ( Vault . State Status . UN CON SU MED ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcustom Criteria Ġ= ĠQuery Criteria . Linear State Query Criteria ( uuid Ġ= ĠlistOf ( UUID . fromString ( message Linear Id ))) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria Ġ= Ġcriteria . and ( custom Criteria ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold MessageState List Ġ= Ġservice Hub . vault Service . query By < MessageState >( čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcriteria , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage Specification ( 1 , ĠMAX _ PAGE _ SIZE ), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort ( set Of ( Sort . Sort Column ( Sort Attribute . Standard ( Sort . Vault State Attribute . REC OR DED _ TIME ), ĠSort . Direction . DESC ))) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). states čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old MessageState List . size Ġ> Ġ 1 Ġ|| Ġold MessageState List . isEmpty ()) Ġthrow ĠFlow Exception (" No Ġmessage Ġstate Ġwith ĠUUID : Ġ" Ġ+ ĠUUID . fromString ( message Linear Id ) Ġ+ Ġ" Ġfound .") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold MessageState Ref Ġ= Ġold MessageState List [ 0 ] čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold MessageState Ġ= Ġold MessageState Ref . state . data čĊčĊč ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Command Ġ= ĠCommand ( Message Contract . Commands . Delete (), Ġold MessageState . participants . map Ġ{ Ġit . own ing Key Ġ}) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Builder Ġ= ĠTransaction Builder ( not ary ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Input State ( old MessageState Ref ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Command ( tx Command ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 2 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠVERIFY IGN _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġthe Ġtransaction Ġis Ġvalid . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Builder . verify ( service Hub ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 3 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠSIGN ING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSign Ġthe Ġtransaction . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart Signed Tx Ġ= Ġservice Hub . sign Initial Transaction ( tx Builder ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 4 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠG ATHER ING _ SIG S čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSend Ġthe Ġstate Ġto Ġthe Ġcounter party , Ġand Ġreceive Ġit Ġback Ġwith Ġtheir Ġsignature . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest in at ario Session Ġ= Ġinitiate Flow ( old MessageState . dest in at ario ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg ol atore Session Ġ= Ġinitiate Flow ( old MessageState . reg ol atore ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfully Signed Tx Ġ= Ġsub Flow ( Collect Signatures Flow ( part Signed Tx , Ġset Of ( dest in at ario Session , Ġreg ol atore Session ), ĠG ATHER ING _ SIG S . child Progress Tracker ())) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStage Ġ 5 . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠFIN AL ISING _ TRANSACTION čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot ar ise Ġand Ġrecord Ġthe Ġtransaction Ġin Ġboth Ġparties ' Ġvault s . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub Flow ( Final ity Flow ( fully Signed Tx , Ġset Of ( dest in at ario Session , Ġreg ol atore Session ), ĠFIN AL ISING _ TRANSACTION . child Progress Tracker ())) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold MessageState čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ@ Initi ated By ( De leter :: class ) čĊĠĠĠĠĠĠĠ Ġclass ĠDe leter Accept or ( val Ġother Party Session : ĠFlow Session ) Ġ: ĠFlow Logic < Signed Transaction >() Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suspend able čĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠSigned Transaction Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsign Transaction Flow Ġ= Ġobject Ġ: ĠSign Transaction Flow ( other Party Session ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Transaction ( st x : ĠSigned Transaction ) Ġ= Ġrequire That Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġhave Ġoutput Ġmessage " Ġusing Ġ( st x . tx . outputs . isEmpty ()) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ" other Ġrule Ġmessage " Ġusing Ġ( output Ġis Ġreg ola _ nu ova ) Ġ*/ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Id Ġ= Ġsub Flow ( sign Transaction Flow ). id čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsub Flow ( Receive Final ity Flow ( other Party Session , Ġexpected Tx Id Ġ= Ġtx Id )) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun ĠRes pect Rule ( mitt ente : ĠParty , Ġdest in at ario : ĠParty , Ġrule : ĠBlack list State ) Ġ: ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( mitt ente . name . organisation Ġ== Ġ" Member A " Ġ&& Ġdest in at ario . name . organisation Ġ== Ġ" Member B "){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrule . m 1 _ m 2 čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( mitt ente . name . organisation Ġ== Ġ" Member A " Ġ&& Ġdest in at ario . name . organisation Ġ== Ġ" Member C "){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrule . m 1 _ m 3 čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( mitt ente . name . organisation Ġ== Ġ" Member B " Ġ&& Ġdest in at ario . name . organisation Ġ== Ġ" Member A "){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrule . m 2 _ m 1 čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( mitt ente . name . organisation Ġ== Ġ" Member B " Ġ&& Ġdest in at ario . name . organisation Ġ== Ġ" Member C "){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrule . m 2 _ m 3 čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( mitt ente . name . organisation Ġ== Ġ" Member C " Ġ&& Ġdest in at ario . name . organisation Ġ== Ġ" Member A "){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrule . m 3 _ m 1 čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( mitt ente . name . organisation Ġ== Ġ" Member C " Ġ&& Ġdest in at ario . name . organisation Ġ== Ġ" Member B "){ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrule . m 3 _ m 2 čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġelse Ġreturn Ġfalse čĊĠĠĠ Ġ} č Ċ } čĊ