/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 . ĠLorem Ġipsum Ġdolor Ġsit Ġamet , Ġconsectetur Ġadipiscing Ġelit . Ċ Ġ* ĠMor bi Ġnon Ġlorem Ġport t itor Ġneque Ġfe ugiat Ġbland it . ĠUt Ġvitae Ġipsum Ġeget Ġquam Ġlac in ia Ġaccum san . Ċ Ġ* ĠE ti am Ġsed Ġturpis Ġac Ġipsum Ġcon dim ent um Ġf ring illa . ĠMa ec enas Ġmagna . Ċ Ġ* ĠPro in Ġd ap ibus Ġsapi en Ġvel Ġante . ĠAli quam Ġerat Ġvol ut pat . ĠP ellentesque Ġsag itt is Ġlig ula Ġeget Ġmetus . Ċ Ġ* ĠV estibulum Ġcommodo . ĠUt Ġr hon cus Ġgrav ida Ġarcu . Ċ Ġ*/ Ċ Ċ package Ġcom . value management . contract Ċ Ċ import Ġcom . value management . state . Create Service Credit State Ċ import Ġcom . value management . validation . Value Art ic ulation Validation Ċ import Ġnet . cord a . core . contracts . Command Data Ċ import Ġnet . cord a . core . contracts . Contract Ċ import Ġnet . cord a . core . contracts . require Single Command Ċ import Ġnet . cord a . core . contracts . require That Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ Ċ /** Ċ Ġ* ĠA Ġimplementation Ġof Ġa Ġbasic Ġsmart Ġcontract Ġin ĠC ord a . ĊĊ Ġ* ĠThis Ġcontract Ġen forces Ġrules Ġregarding Ġthe Ġcreation Ġof Ġa Ġvalid Ġ[ Create Service Credit State ], Ġwhich Ġin Ġturn Ġencaps ulates Ġan Ġ[ Service Credit ]. ĊĊ Ġ* ĠFor Ġa Ġnew Ġ[ Service Credit ] Ġto Ġbe Ġissued Ġonto Ġthe Ġledger , Ġa Ġtransaction Ġis Ġrequired Ġwhich Ġtakes : Ċ Ġ* Ġ- ĠZero Ġinput Ġstates . Ċ Ġ* Ġ- ĠOne Ġoutput Ġstate : Ġthe Ġnew Ġ[ Service Credit ]. Ċ Ġ* Ġ- ĠAn ĠCreate () Ġcommand Ġwith Ġthe Ġpublic Ġkeys Ġof Ġboth Ġthe Ġl ender Ġand Ġthe Ġborrow er . Ċ Ġ* Ċ Ġ* ĠAll Ġcontracts Ġmust Ġsub - class Ġthe Ġ[ Contract ] Ġinterface . Ċ Ġ*/ Ċ open Ġclass ĠService Credit Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠSERVICE _ CRED IT _ CONTRACT _ ID Ġ= Ġ" com . value management . contract . Service Credit Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġverify () Ġfunction Ġof Ġall Ġthe Ġstates ' Ġcontracts Ġmust Ġnot Ġthrow Ġan Ġexception Ġfor Ġa Ġtransaction Ġto Ġbe ĊĠĠĠ Ġconsidered Ġvalid . ĊĊĠĠĠĠ Ġ* ĠDep ends Ġon Ġthe Ġcontract Ġcommands Ġcall , Ġit Ġll Ġdo Ġsome Ġconstraint Ġvalidations . ĊĊ ĊĠĠĠĠ Ġ*/ ĊĊĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtx . commands . require Single Command < Service Credit Contract . Commands >() ĊĊĠĠĠĠĠĠĠ Ġif ( command . value Ġis ĠCommands . Create ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe ĠService ĠCredit Ġtransaction . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġinputs Ġshould Ġbe Ġconsumed Ġwhen Ġiss uing Ġan ĠService ĠCredit ." Ġusing Ġ( tx . inputs . isEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . outputs OfType < Create Service Credit State >(). single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only ĠS DM Ġcan Ġcreate ĠSmart ĠContract " Ġusing Ġ( out . init iator Ġ!= Ġout . accept or . get ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġof Ġthe Ġparticipants Ġmust Ġbe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( out . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠService ĠCred its - specific Ġconstraints . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( out . service Credit VO . service Credit Commit ted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠService ĠCredit 's Ġvalue Ġmust Ġbe Ġnon - negative ." Ġusing Ġ( out . service Credit VO . service Credit Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd = ĠValue Art ic ulation Validation () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" End ĠYear Ġshould Ġbe Ġfuture ĠDate ." Ġusing Ġ( d . validate EndDate ( out . service Credit VO . end Year )== true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( command . value Ġis ĠCommands . Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe ĠService ĠCredit Ġtransaction . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inputs Ġshould Ġbe Ġconsumed Ġwhen ĠAuthor izing Ġa ĠService ĠCredit ." Ġusing Ġ( tx . inputs . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . outputs OfType < Create Service Credit State >(). single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only ĠS DD / Bu ĠHead / Cp Ġcan Ġauthorize Ġthe ĠSmart ĠContract ." Ġusing Ġ(( out . init iator Ġ!= Ġout . accept or . get ( 0 )) Ġ&& Ġ( out . init iator Ġ!= Ġout . accept or . get ( 1 ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġof Ġthe Ġparticipants Ġmust Ġbe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( out . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠService ĠCred its - specific Ġconstraints . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠService ĠCredit 's Ġvalue Ġmust Ġbe Ġnon - negative ." Ġusing Ġ( out . service Credit VO . service Credit Ġ> Ġ 0 Ġ&& Ġout . service Credit VO . service Credit Ġ<= 9 9 9 9 9 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( command . value Ġis ĠCommands . Approve ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe ĠService ĠCredit Ġtransaction . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inputs Ġshould Ġbe Ġconsumed Ġwhen Ġappro ving Ġa ĠService ĠCredit ." Ġusing Ġ( tx . inputs . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . outputs OfType < Create Service Credit State >(). single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only ĠCustomer Ġcan Ġapprove Ġthe ĠSmart ĠContract ." Ġusing Ġ(( out . init iator Ġ!= Ġout . accept or . get ( 0 )) Ġ&& Ġ( out . init iator Ġ!= Ġout . accept or . get ( 1 ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġof Ġthe Ġparticipants Ġmust Ġbe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( out . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠService ĠCred its - specific Ġconstraints . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠService ĠCredit 's Ġvalue Ġmust Ġbe Ġnon - negative ." Ġusing Ġ( out . service Credit VO . service Credit > Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ// ĠIteration Ġ 2 Ġchange ĊĠĠĠĠĠĠĠ Ġ// ĠRev ise ĠA UV Ġ-- ton i ya ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( command . value Ġis ĠCommands . Rev ise ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe ĠService ĠCredit Ġtransaction . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inputs Ġshould Ġbe Ġconsumed Ġwhen Ġappro ving Ġa ĠService ĠCredit ." Ġusing Ġ( tx . inputs . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . outputs OfType < Create Service Credit State >(). single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only ĠS DM Ġcan Ġcreate ĠSmart ĠContract " Ġusing Ġ( out . init iator Ġ!= Ġout . accept or . get ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġof Ġthe Ġparticipants Ġmust Ġbe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( out . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠService ĠCred its - specific Ġconstraints . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠService ĠCredit 's Ġvalue Ġmust Ġbe Ġnon - negative ." Ġusing Ġ( out . service Credit VO . service Credit Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd = ĠValue Art ic ulation Validation () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" End ĠYear Ġshould Ġbe Ġfuture ĠDate ." Ġusing Ġ( d . validate EndDate ( out . service Credit VO . end Year )== true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ// ĠRev ise ĠA UV Ġ-- ton i ya ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( command . value Ġis ĠCommands . Implement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGeneric Ġconstraints Ġaround Ġthe ĠService ĠCredit Ġtransaction . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Inputs Ġshould Ġbe Ġconsumed Ġwhen Ġimplementing Ġa ĠService ĠCredit ." Ġusing Ġ( tx . inputs . isNotEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . outputs OfType < Create Service Credit State >(). single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only ĠS DM Ġcan Ġcreate Ġa Ġimplemented ĠSmart ĠContract " Ġusing Ġ( out . init iator Ġ!= Ġout . accept or . get ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" All Ġof Ġthe Ġparticipants Ġmust Ġbe Ġsign ers ." Ġusing Ġ( command . sign ers . contains All ( out . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠService ĠCred its - specific Ġconstraints . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠService ĠCredit 's Ġvalue Ġmust Ġbe Ġnon - negative ." Ġusing Ġ( out . service Credit VO . service Credit Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd = ĠValue Art ic ulation Validation () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" End ĠYear Ġshould Ġbe Ġfuture ĠDate ." Ġusing Ġ( d . validate EndDate ( out . service Credit VO . end Year )== true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ// ĠIteration Ġ 2 Ġchange ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġcontract Ġimplements Ġcommands , ĠCreate , ĠUpdate , ĠAppro ve . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠCreate Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠUpdate Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠAppro ve Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠImplement Ġ: ĠCommands Ġ// ĠIteration Ġ 2 Ġchange ĊĠĠĠĠĠĠĠ Ġclass ĠRev ise Ġ: ĠCommands Ġ// ĠRev ise ĠA UV Ġ-- Ġt oni ya ĊĠĠĠ Ġ} Ċ } Ċ