package Ġcom . template Ċ Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . crypto . Secure Hash Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . serialization . C ord a Serializable Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġnet . cord a . finance . PO UN DS Ċ import Ġnet . cord a . finance . contracts . asset . Cash Ċ import Ġjava . time . LocalDate Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġjob Ġorgan ised Ġby Ġa Ġ[ developer ] Ġand Ġcarried Ġout Ġby Ġa Ġ[ contract or ]. ĠThe Ġjob Ġis Ġsplit Ġinto Ġa Ġset Ġof Ċ Ġ* Ġ[ m ilestones ]. Ċ Ġ* Ċ Ġ* Ġ@ param Ġdeveloper Ġthe Ġdeveloper Ġin Ġcharge Ġof Ġthe Ġjob . Ċ Ġ* Ġ@ param Ġcontract or Ġthe Ġcontract or Ġcarry ing Ġout Ġthe Ġjob . Ċ Ġ* Ġ@ param Ġm ilestones Ġthe Ġset Ġof Ġtasks Ġto Ġbe Ġcompleted . Ċ Ġ*/ Ċ data Ġclass ĠJob State ( ĊĠĠĠĠĠĠĠ Ġval Ġdeveloper : ĠParty , ĊĠĠĠĠĠĠĠ Ġval Ġcontract or : ĠParty , ĊĠĠĠĠĠĠĠ Ġval Ġcontract Amount : ĠDouble , Ġ Ġ// the Ġtotal Ġagreement Ġamount Ġto Ġcomplete Ġthe Ġjob ĊĠĠĠĠĠĠĠ Ġval Ġretention Percentage : ĠDouble , Ġ// how Ġmuch Ġmust Ġbe Ġretained Ġbased Ġon Ġthe Ġinvoice Ġsubmitted ĊĠĠĠĠĠĠĠ Ġval Ġallow Payment On Account : ĠBoolean , Ġ// does Ġthe Ġjob Ġallow Ġfor Ġpayment Ġon Ġaccounts Ġto Ġbe Ġmade ĊĠĠĠĠĠĠĠ Ġ/** ĠWhich Ġvariables Ġare Ġconstant Ġand Ġwhich Ġchange Ġover Ġtime / event */ ĊĠĠĠĠĠĠĠ Ġval Ġg ross C umulative Amount : ĠDouble Ġ= Ġ 0 . 0 , Ġ// total Ġamount Ġof Ġmoney Ġwe Ġval ued Ġso Ġfar Ġfor Ġcompleted Ġm ilestones Ġor Ġm ilestones Ġwith Ġpayment Ġon Ġaccounts ĊĠĠĠĠĠĠĠ Ġval Ġretention Amount : ĠDouble Ġ= Ġ 0 . 0 , Ġ// amount Ġretained Ġso Ġfar ĊĠĠĠĠĠĠĠ Ġval Ġnet C umulative Value : ĠDouble Ġ= Ġ 0 . 0 , Ġ// Ġg ross C umulative Amount Ġminus Ġretention Amount ĊĠĠĠĠĠĠĠ Ġval Ġprevious C umulative Value : ĠDouble Ġ= Ġ 0 . 0 , Ġ// Ġnet C umulative Value Ġ( previous ) Ġ- Ġnet C umulative Value Ġ( current ) Ġ( Val uation ) ĊĠĠĠĠĠĠĠ Ġval Ġm ilestones : ĠList < M ilestone >, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġlinear Id : ĠUnique Identifier Ġ= ĠUnique Identifier ()) Ġ: ĠLinear State Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m ilestones . map Ġ{ Ġit . amount . token Ġ}. toSet (). size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" All Ġm ilestones Ġmust Ġbe Ġbudget ed Ġin Ġthe Ġsame Ġcurrency .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġparticipants Ġ= ĠlistOf ( developer , Ġcontract or ) Ċ } Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġmilestone Ġin Ġa Ġjob . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdescription Ġthe Ġdescription Ġof Ġthe Ġwork Ġto Ġbe Ġcarried Ġout Ġas Ġpart Ġof Ġthe Ġmilestone . Ċ Ġ* Ġ@ param Ġamount Ġthe Ġamount Ġpaid Ġfor Ġcomplet ing Ġthe Ġmilestone . Ċ Ġ* Ġ@ param Ġstatus Ġthe Ġcurrent Ġstatus Ġof Ġthe Ġmilestone . Ċ Ġ*/ Ċ @ C ord a Serializable Ċ data Ġclass ĠM ilestone ( ĊĠĠĠĠĠĠĠ Ġ/** ĠWhich Ġvariables Ġare Ġconstant Ġand Ġwhich Ġchange Ġover Ġtime / event */ ĊĠĠĠĠĠĠĠ Ġval Ġreference : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġamount : ĠAmount < Currency >, Ġ// milestone Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġexpected EndDate : ĠLocalDate , ĊĠĠĠĠĠĠĠ Ġval Ġpercentage Complete : ĠDouble Ġ= Ġ 0 . 0 , ĊĠĠĠĠĠĠĠ Ġval Ġrequested Amount : ĠAmount < Currency > Ġ= Ġ 0 . PO UN DS , Ġ// amount Ġas Ġper Ġinvoice / payment Ġapplication Ġfrom Ġthe Ġcontract or ĊĠĠĠĠĠĠĠ Ġval Ġpayment On Account : ĠAmount < Currency > Ġ= Ġ 0 . PO UN DS , Ġ// how Ġmuch Ġpayment Ġon Ġaccount Ġhas Ġbeen Ġpaid Ġout Ġ( payment Ġval uation ) ĊĠĠĠĠĠĠĠ Ġval Ġnet M ilestone Payment : ĠAmount < Currency > Ġ= Ġ 0 . PO UN DS , Ġ// calculated Ġbased Ġon Ġmilestone Ġamount / payment Ġon Ġaccount Ġless Ġretention Ġpercentage ĊĠĠĠĠĠĠĠ Ġval Ġdocuments Required Ġ: ĠList < Secure Hash > Ġ= ĠlistOf < Secure Hash >(), ĊĠĠĠĠĠĠĠ Ġval Ġre marks : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġstatus : ĠM ilestone Status Ġ= ĠM ilestone Status . NOT _ STARTED ) Ċ Ċ @ C ord a Serializable Ċ enum Ġclass ĠM ilestone Status Ġ{ ĠNOT _ STARTED , ĠSTART ED , ĠCOMP LETED , ĠAC CEPT ED , ĠPA ID , ĠON _ ACCOUNT _ PAYMENT Ġ} Ċ Ċ @ C ord a Serializable Ċ data Ġclass ĠDocument State ( ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ: ĠĠ ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġdescription : Ġ ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ: Ġ ĠDocument Type , ĊĠĠĠĠĠĠĠ Ġval Ġissuer Ġ: ĠParty , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġlinear Id : ĠUnique Identifier Ġ= ĠUnique Identifier ()) Ġ: ĠLinear State Ġ{ ĊĠĠĠ Ġoverride Ġval Ġparticipants Ġ= ĠlistOf ( issuer ) Ċ } Ċ Ċ @ C ord a Serializable Ċ enum Ġclass ĠDocument Type Ġ{ ĠS UR VE Y Ġ} Ċ Ċ class ĠDocument Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDOCUMENT _ CONTRACT _ ID Ġ= Ġ" com . template . Document Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠAdd Document Ġ: ĠCommands ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocument Command Ġ= Ġtx . commands OfType < Document Contract . Commands >(). single () ĊĠĠĠĠĠĠĠ Ġval Ġdocument Inputs Ġ= Ġtx . inputs OfType < Job State >() ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( document Command . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Add Document Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġinput Ġstates Ġconsumed " Ġusing Ġ( document Inputs . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġone Ġoutput Ġstate " Ġusing Ġ( tx . outputs OfType < Document State >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠG over ns Ġthe Ġevolution Ġof Ġ[ Job State ] s . Ċ Ġ*/ Ċ class ĠJob Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠID Ġ= Ġ" com . template . Job Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠAg ree Job Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġ// Ġ` milestone Index ` Ġis Ġthe Ġindex Ġof Ġthe Ġmilestone Ġbeing Ġupdated Ġin Ġthe Ġlist Ġof Ġm ilestones . ĊĠĠĠĠĠĠĠ Ġclass ĠStart M ilestone ( val Ġmilestone Index : ĠInt ) Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠFinish M ilestone ( val Ġmilestone Index : ĠInt ) Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠReject M ilestone ( val Ġmilestone Index : ĠInt ) Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠAccept M ilestone ( val Ġmilestone Index : ĠInt ) Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠPay M ilestone ( val Ġmilestone Index : ĠInt ) Ġ: ĠCommands ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjob Inputs Ġ= Ġtx . inputs OfType < Job State >() ĊĠĠĠĠĠĠĠ Ġval Ġjob Outputs Ġ= Ġtx . outputs OfType < Job State >() ĊĠĠĠĠĠĠĠ Ġval Ġjob Command Ġ= Ġtx . commands OfType < Job Contract . Commands >(). single () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( job Command . value ) Ġ{ Ġ// constraints Ġ-- Ġ// test Ġper Ġconstraint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Ag ree Job Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No ĠJob State Ġinputs Ġshould Ġbe Ġconsumed ." Ġusing Ġ( job Inputs . isEmpty ()) Ġ// create Ġa Ġnew Ġledger Ġentry Ġ/ Ġnew Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġoutput Ġshould Ġbe Ġproduced ." Ġusing Ġ( job Outputs . size Ġ== Ġ 1 ) Ġ// single Ġentry ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Output Ġ= Ġjob Outputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġdeveloper Ġand Ġthe Ġcontract or Ġshould Ġbe Ġdifferent Ġparties ." Ġusing Ġ( job Output . contract or Ġ!= Ġjob Output . developer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġthe Ġm ilestones Ġshould Ġbe Ġun started ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( job Output . m ilestones . all Ġ{ Ġit . status Ġ== ĠM ilestone Status . NOT _ STARTED Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġdeveloper Ġand Ġcontract or Ġshould Ġbe Ġrequired Ġsign ers ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( job Command . sign ers . contains All ( listOf ( job Output . contract or . own ing Key , Ġjob Output . developer . own ing Key ))) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Contract ĠAmount Ġmust Ġbe Ġgreater Ġzero " Ġusing Ġ( job Output . contract Amount Ġ> Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Start M ilestone Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġinput Ġshould Ġbe Ġconsumed ." Ġusing Ġ( job Inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġoutput Ġshould Ġbe Ġproduced ." Ġusing Ġ( job Outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Input Ġ= Ġjob Inputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Output Ġ= Ġjob Outputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone Index Ġ= Ġ( job Command . value Ġas ĠCommands . Start M ilestone ). milestone Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Modified M ilestone Ġ= Ġjob Input . m ilestones [ milestone Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Modified M ilestone Ġ= Ġjob Output . m ilestones [ milestone Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġinput Ġstatus Ġof ĠNOT _ STARTED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . status Ġ== ĠM ilestone Status . NOT _ STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġoutput Ġstatus Ġof ĠSTART ED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( output Modified M ilestone . status Ġ== ĠM ilestone Status . STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone 's Ġdescription Ġand Ġamount Ġshouldn 't Ġchange ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . copy ( status Ġ= ĠM ilestone Status . STARTED ) Ġ== Ġoutput Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Input M ilestones Ġ= Ġjob Input . m ilestones . minus Element ( input Modified M ilestone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Output M ilestones Ġ= Ġjob Output . m ilestones . minus Element ( output Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġthe Ġother Ġm ilestones Ġshould Ġbe Ġun modified ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( other Input M ilestones Ġ== Ġother Output M ilestones ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġdeveloper Ġand Ġcontract or Ġshould Ġbe Ġrequired Ġsign ers ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( job Command . sign ers . contains All ( listOf ( job Output . contract or . own ing Key , Ġjob Output . developer . own ing Key ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Finish M ilestone Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġinput Ġshould Ġbe Ġconsumed ." Ġusing Ġ( job Inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġoutput Ġshould Ġbe Ġproduced ." Ġusing Ġ( job Outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Input Ġ= Ġjob Inputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Output Ġ= Ġjob Outputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone Index Ġ= Ġ( job Command . value Ġas ĠCommands . Finish M ilestone ). milestone Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Modified M ilestone Ġ= Ġjob Input . m ilestones [ milestone Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Modified M ilestone Ġ= Ġjob Output . m ilestones [ milestone Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġinput Ġstatus Ġof ĠSTART ED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . status Ġ== ĠM ilestone Status . STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġoutput Ġstatus Ġof ĠCOMP LETED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( output Modified M ilestone . status Ġ== ĠM ilestone Status . COMPLETED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone 's Ġdescription Ġand Ġamount Ġshouldn 't Ġchange ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . copy ( status Ġ= ĠM ilestone Status . COMPLETED ) Ġ== Ġoutput Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Input M ilestones Ġ= Ġjob Input . m ilestones . minus Element ( input Modified M ilestone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Output M ilestones Ġ= Ġjob Output . m ilestones . minus Element ( output Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġthe Ġother Ġm ilestones Ġshould Ġbe Ġun modified ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( other Input M ilestones Ġ== Ġother Output M ilestones ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" g ross C umulative Amount Ġshould Ġbe Ġgreater Ġor Ġequal Ġthe Ġmilestone Ġamount " Ġusing Ġ( job Output . g ross C umulative Amount Ġ Ġ>= Ġoutput Modified M ilestone . amount . quantity . toDouble ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġcontract or Ġshould Ġbe Ġa Ġrequired Ġsigner ." Ġusing Ġ( job Command . sign ers . contains ( job Outputs . single (). contract or . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Reject M ilestone Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġinput Ġshould Ġbe Ġconsumed ." Ġusing Ġ( job Inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġoutput Ġshould Ġbe Ġproduced ." Ġusing Ġ( job Outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Input Ġ= Ġjob Inputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Output Ġ= Ġjob Outputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone Index Ġ= Ġ( job Command . value Ġas ĠCommands . Reject M ilestone ). milestone Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Modified M ilestone Ġ= Ġjob Input . m ilestones [ milestone Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Modified M ilestone Ġ= Ġjob Output . m ilestones [ milestone Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġinput Ġstatus Ġof ĠCOMP LETED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . status Ġ== ĠM ilestone Status . COMPLETED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġoutput Ġstatus Ġof ĠSTART ED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( output Modified M ilestone . status Ġ== ĠM ilestone Status . STARTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone 's Ġdescription Ġand Ġamount Ġshouldn 't Ġchange ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . copy ( status Ġ= ĠM ilestone Status . STARTED ) Ġ== Ġoutput Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Input M ilestones Ġ= Ġjob Input . m ilestones . minus Element ( input Modified M ilestone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Output M ilestones Ġ= Ġjob Output . m ilestones . minus Element ( output Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġthe Ġother Ġm ilestones Ġshould Ġbe Ġun modified ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( other Input M ilestones Ġ== Ġother Output M ilestones ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġdeveloper Ġshould Ġbe Ġa Ġrequired Ġsigner ." Ġusing Ġ( job Command . sign ers . contains ( job Output . developer . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Accept M ilestone Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġinput Ġshould Ġbe Ġconsumed ." Ġusing Ġ( job Inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġoutput Ġshould Ġbe Ġproduced ." Ġusing Ġ( job Outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Input Ġ= Ġjob Inputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Output Ġ= Ġjob Outputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone Index Ġ= Ġ( job Command . value Ġas ĠCommands . Accept M ilestone ). milestone Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Modified M ilestone Ġ= Ġjob Input . m ilestones [ milestone Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Modified M ilestone Ġ= Ġjob Output . m ilestones [ milestone Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġinput Ġstatus Ġof ĠCOMP LETED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . status Ġ== ĠM ilestone Status . COMPLETED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġoutput Ġstatus Ġof ĠAC CEPT ED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( output Modified M ilestone . status Ġ== ĠM ilestone Status . ACCEPT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone 's Ġdescription Ġand Ġamount Ġshouldn 't Ġchange ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . copy ( status Ġ= ĠM ilestone Status . ACCEPT ED ) Ġ== Ġoutput Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Input M ilestones Ġ= Ġjob Input . m ilestones . minus Element ( input Modified M ilestone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Output M ilestones Ġ= Ġjob Output . m ilestones . minus Element ( output Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġthe Ġother Ġm ilestones Ġshould Ġbe Ġun modified ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( other Input M ilestones Ġ== Ġother Output M ilestones ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġdeveloper Ġshould Ġbe Ġa Ġrequired Ġsigner ." Ġusing Ġ( job Command . sign ers . contains ( job Output . developer . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Pay M ilestone Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġinput Ġshould Ġbe Ġconsumed ." Ġusing Ġ( job Inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One ĠJob State Ġoutput Ġshould Ġbe Ġproduced ." Ġusing Ġ( job Outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Input Ġ= Ġjob Inputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Output Ġ= Ġjob Outputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmilestone Index Ġ= Ġ( job Command . value Ġas ĠCommands . Pay M ilestone ). milestone Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Modified M ilestone Ġ= Ġjob Input . m ilestones [ milestone Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Modified M ilestone Ġ= Ġjob Output . m ilestones [ milestone Index ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġinput Ġstatus Ġof ĠAC CEPT ED ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . status Ġ== ĠM ilestone Status . ACCEPT ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone Ġshould Ġhave Ġan Ġoutput Ġstatus Ġof ĠPA ID ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( output Modified M ilestone . status Ġ== ĠM ilestone Status . PA ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġmodified Ġmilestone 's Ġdescription Ġand Ġamount Ġshouldn 't Ġchange ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( input Modified M ilestone . copy ( status Ġ= ĠM ilestone Status . PA ID ) Ġ== Ġoutput Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Input M ilestones Ġ= Ġjob Input . m ilestones . minus Element ( input Modified M ilestone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother Output M ilestones Ġ= Ġjob Output . m ilestones . minus Element ( output Modified M ilestone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġthe Ġother Ġm ilestones Ġshould Ġbe Ġun modified ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( other Input M ilestones Ġ== Ġother Output M ilestones ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcash Inputs Ġ= Ġtx . inputs OfType < Cash . State >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcash Outputs Ġ= Ġtx . outputs OfType < Cash . State >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠCash Ġcommand Ġshould Ġbe ĠMove " Ġusing Ġ( tx . commands OfType < Cash . Commands . Move >(). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Output Cash Ġ= Ġcash Outputs . map Ġ{ Ġit . amount . quantity Ġ}. sum () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Contract or Cash Ġ= Ġcash Outputs . filter Ġ{ Ġit . owner Ġ== Ġjob Output . contract or Ġ}. map Ġ{ Ġit . amount . quantity Ġ}. sum () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġcash Ġinputs Ġand Ġoutputs Ġshould Ġall Ġbe Ġin Ġthe Ġsame Ġcurrency Ġas Ġthe Ġmodified Ġmilestone " Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( cash Inputs Ġ+ Ġcash Outputs ). all Ġ{ Ġit . amount . token . product Ġ== Ġinput Modified M ilestone . amount . token Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġcash Ġinputs Ġand Ġoutputs Ġshould Ġhave Ġthe Ġsame Ġvalue " Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( cash Inputs . map Ġ{ Ġit . amount . quantity Ġ}. sum () Ġ== Ġtotal Output Cash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// No Ġlonger Ġapplies Ġas Ġadded Ġretention Ġfunctionality ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġcash Ġoutputs Ġowned Ġby Ġthe Ġcontract or Ġshould Ġbe Ġless Ġthan Ġor Ġequal Ġto Ġthe Ġvalue Ġof Ġthe Ġmodified Ġmilestone " Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( output Contract or Cash Ġ<= Ġoutput Modified M ilestone . amount . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcannot Ġcheck Ġthat Ġthe Ġremaining Ġcash Ġis Ġreturned Ġto Ġthe Ġdeveloper , Ġas Ġthe Ġchange Ġoutputs Ġuse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġanonymous Ġpublic Ġkeys . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġdeveloper Ġshould Ġbe Ġa Ġrequired Ġsigner ." Ġusing Ġ( job Command . sign ers . contains ( job Input . developer . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Un re cogn ised Ġcommand Ġ${ job Command . value }. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }