package Ġnet . cord a . flows Ċ Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . crypto . Composite Key Ċ import Ġnet . cord a . core . crypto . Party Ċ 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 . flows . Not ary Change Flow . Accept or Ċ import Ġnet . cord a . flows . Not ary Change Flow . Inst ig ator Ċ Ċ /** Ċ Ġ* ĠA Ġflow Ġto Ġbe Ġused Ġfor Ġchanging Ġa Ġstate 's ĠNot ary . ĠThis Ġis Ġrequired Ġsince Ġall Ġinput Ġstates Ġto Ġa Ġtransaction Ċ Ġ* Ġmust Ġpoint Ġto Ġthe Ġsame Ġnot ary . Ċ Ġ* Ċ Ġ* ĠThe Ġ[ Inst ig ator ] Ġassemb les Ġthe Ġtransaction Ġfor Ġnot ary Ġreplacement Ġand Ġsends Ġout Ġchange Ġproposals Ġto Ġall Ġparticipants Ċ Ġ* Ġ([ Accept or ]) Ġof Ġthat Ġstate . ĠIf Ġparticipants Ġagree Ġto Ġthe Ġproposed Ġchange , Ġthey Ġeach Ġsign Ġthe Ġtransaction . Ċ Ġ* ĠFinally , Ġ[ Inst ig ator ] Ġsends Ġthe Ġtransaction Ġcontaining Ġall Ġsignatures Ġback Ġto Ġeach Ġparticipant Ġso Ġthey Ġcan Ġrecord Ġit Ġand Ċ Ġ* Ġuse Ġthe Ġnew Ġupdated Ġstate Ġfor Ġfuture Ġtransactions . Ċ Ġ*/ Ċ object ĠNot ary Change Flow Ġ: ĠAbstract State Replacement Flow () Ġ{ ĊĊĠĠĠ Ġclass ĠInst ig ator < out ĠT Ġ: ĠContract State >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal State : ĠState And Ref < T >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Not ary : ĠParty , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Tracker : ĠProgress Tracker Ġ= Ġtracker ()) Ġ: ĠAbstract State Replacement Flow . Inst ig ator < T , ĠT , ĠParty >( original State , Ġnew Not ary , Ġprogress Tracker ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġassemble Tx (): ĠPair < Signed Transaction , ĠIterable < Composite Key >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġoriginal State . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Ġ= ĠTransaction Type . Not ary Change . Builder ( original State . state . not ary ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparticipants : ĠIterable < Composite Key > ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . enc um br ance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodified State Ġ= ĠTransaction State ( state . data , Ġmodification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . add Input State ( original State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . add Output State ( modified State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparticipants Ġ= Ġstate . data . participants ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparticipants Ġ= Ġresolve Enc um br ances ( tx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Key Ġ= Ġservice Hub . legal Identity Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx . sign With ( my Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst x Ġ= Ġtx . to Signed Transaction ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( st x , Ġparticipants ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdds Ġthe Ġnot ary Ġchange Ġstate Ġtransitions Ġto Ġthe Ġ[ tx ] Ġbuilder Ġfor Ġthe Ġ[ original State ] Ġand Ġits Ġenc um br ance ĊĠĠĠĠĠĠĠĠ Ġ* Ġstate Ġchain Ġ( enc um br ance Ġstates Ġmight Ġbe Ġthemselves Ġenc umber ed Ġby Ġother Ġstates ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġunion Ġof Ġall Ġadded Ġstates ' Ġparticipants ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġresolve Enc um br ances ( tx : ĠTransaction Builder ): ĠIterable < Composite Key > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ref Ġ= Ġoriginal State . ref ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Id Ġ= Ġstate Ref . tx hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiss uing Tx Ġ= Ġservice Hub . storage Service . validated Transactions . getTransaction ( tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠState Replacement Exception (" Transaction Ġ$ tx Id Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġiss uing Tx . tx . outputs ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparticipants Ġ= Ġmutable Set Of < Composite Key >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext State Index Ġ= Ġstate Ref . index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnew Output Position Ġ= Ġtx . output States (). size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext State Ġ= Ġoutputs [ next State Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . add Input State ( State And Ref ( next State , ĠState Ref ( tx Id , Ġnext State Index ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparticipants . addAll ( next State . data . participants ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next State . enc um br ance Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodified State Ġ= ĠTransaction State ( next State . data , Ġmodification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . add Output State ( modified State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodified State Ġ= ĠTransaction State ( next State . data , Ġmodification , Ġnew Output Position Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . add Output State ( modified State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext State Index Ġ= Ġnext State . enc um br ance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Output Position ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparticipants ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠAc ceptor ( other Side : ĠParty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġprogress Tracker : ĠProgress Tracker Ġ= Ġtracker ()) Ġ: ĠAbstract State Replacement Flow . Accept or < Party >( other Side ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCheck Ġthe Ġnot ary Ġchange Ġproposal . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġexample , Ġif Ġthe Ġproposed Ġnew Ġnot ary Ġhas Ġthe Ġsame Ġbehaviour Ġ( e . g . Ġboth Ġare Ġnon - valid ating ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġis Ġalso Ġin Ġa Ġgeo graph ically Ġconvenient Ġlocation Ġwe Ġcan Ġjust Ġautomatically Ġapprove Ġthe Ġchange . ĊĠĠĠĠĠĠĠĠ Ġ* ĠTODO : ĠIn Ġmore Ġdifficult Ġcases Ġthis Ġshould Ġcall Ġfor Ġhuman Ġattention Ġto Ġmanually Ġverify Ġand Ġapprove Ġthe Ġproposal ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġverify Proposal ( proposal : ĠAbstract State Replacement Flow . Proposal < Party >): ĠUnit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġproposal . state Ref ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproposed Tx Ġ= Ġproposal . st x . tx ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pro posed Tx . type Ġ! is ĠTransaction Type . Not ary Change ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠState Replacement Exception (" The Ġproposed Ġtransaction Ġis Ġnot Ġa Ġnot ary Ġchange Ġtransaction .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Not ary Ġ= Ġproposal . modification ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Not ary Ġ= Ġservice Hub . network Map Cache . not ary Nodes . any Ġ{ Ġit . not ary Identity Ġ== Ġnew Not ary Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isNot ary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠState Replacement Exception (" The Ġproposed Ġnode Ġ$ new Not ary Ġdoes Ġnot Ġrun Ġa ĠNot ary Ġservice ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ! in Ġproposed Tx . inputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠState Replacement Exception (" The Ġproposed Ġstate Ġ$ state Ġis Ġnot Ġin Ġthe Ġproposed Ġtransaction Ġinputs ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAn Ġexample Ġrequirement Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblacklist Ġ= ĠlistOf (" Ev il ĠNot ary ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Proposal ( new Not ary . name Ġ! in Ġblacklist ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġproposed Ġnew Ġnot ary Ġ$ new Not ary Ġis Ġnot Ġtrusted Ġby Ġthe Ġparty " Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ