package Ġnet . cord a . bn . contracts Ċ Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġnet . cord a . bn . states . Change Request State Ċ 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 . contracts . Command With Part ies Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . security . PublicKey Ċ Ċ /** Ċ Ġ* ĠContract Ġthat Ġverifies Ġan Ġevolution Ġof Ġ[ Change Request State ]. Ċ Ġ*/ Ċ open Ġclass ĠChange Request Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCONTRACT _ NAME Ġ= Ġ" net . cord a . bn . contracts . Change Request Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEach Ġnew Ġ[ Change Request Contract ] Ġcommand Ġmust Ġbe Ġwrapped Ġand Ġextend Ġthis Ġclass . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ property Ġrequired Sign ers ĠList Ġof Ġall Ġrequired Ġpublic Ġkeys Ġof Ġcommand 's Ġsign ers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠCommands ( val Ġrequired Sign ers : ĠList < PublicKey >) Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCommand Ġresponsible Ġfor Ġpending Ġ[ Change Request State ] Ġiss u ance . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequired Sign ers ĠList Ġof Ġall Ġrequired Ġpublic Ġkeys Ġof Ġcommand 's Ġsign ers . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠRequest ( required Sign ers : ĠList < PublicKey >) Ġ: ĠCommands ( required Sign ers ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCommand Ġresponsible Ġfor Ġ[ Change Request State ] Ġapproval . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequired Sign ers ĠList Ġof Ġall Ġrequired Ġpublic Ġkeys Ġof Ġcommand 's Ġsign ers . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠAppro ve ( required Sign ers : ĠList < PublicKey >) Ġ: ĠCommands ( required Sign ers ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCommand Ġresponsible Ġfor Ġ[ Change Request State ] Ġrejection . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequired Sign ers ĠList Ġof Ġall Ġrequired Ġpublic Ġkeys Ġof Ġcommand 's Ġsign ers . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠDe cline ( required Sign ers : ĠList < PublicKey >) Ġ: ĠCommands ( required Sign ers ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCommand Ġresponsible Ġfor Ġ[ Change Request State ] Ġremoval . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequired Sign ers ĠList Ġof Ġall Ġrequired Ġpublic Ġkeys Ġof Ġcommand 's Ġsign ers . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġclass ĠDelete ( required Sign ers : ĠList < PublicKey >) Ġ: ĠCommands ( required Sign ers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEns ures Ġ[ Change Request State ] Ġtransition Ġmakes Ġsense . ĠThrows Ġexception Ġif Ġthere Ġis Ġa Ġproblem Ġthat Ġshould Ġprevent Ġthe Ġtransition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtx ĠLed ger Ġtransaction Ġover Ġwhich Ġcontract Ġperforms Ġverification . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Complex Method ") ĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtx . commands . require Single Command < Commands >() ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġif Ġ( tx . input States . isNotEmpty ()) Ġtx . inputs . single () Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= Ġinput ?. state ?. data Ġas ? ĠChange Request State ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġif Ġ( tx . output States . isNotEmpty ()) Ġtx . outputs . single () Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġoutput ?. data Ġas ? ĠChange Request State ĊĊĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Input Ġstate Ġhas Ġto Ġbe Ġvalidated Ġby Ġ${ contract Name () }" Ġusing Ġ( state . contract Ġ== Ġcontract Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput State ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Input Ġstate 's Ġmodified Ġtimestamp Ġshould Ġbe Ġgreater Ġor Ġequal Ġto Ġissued Ġtimestamp " Ġusing Ġ( iss ued Ġ<= Ġmodified ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Output Ġstate Ġhas Ġto Ġbe Ġvalidated Ġby Ġ${ contract Name () }" Ġusing Ġ( contract Ġ== Ġcontract Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput State ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Output Ġstate 's Ġmodified Ġtimestamp Ġshould Ġbe Ġgreater Ġor Ġequal Ġto Ġissued Ġtimestamp " Ġusing Ġ( iss ued Ġ<= Ġmodified ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input State Ġ!= Ġnull Ġ&& Ġoutput State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġshould Ġhave Ġsame Ġissued Ġtimestamps " Ġusing Ġ( input State . iss ued Ġ== Ġoutput State . iss ued ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Output Ġstate 's Ġmodified Ġtimestamp Ġshould Ġbe Ġgreater Ġor Ġequal Ġthan Ġinput 's " Ġusing Ġ( input State . modified Ġ<= Ġoutput State . modified ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġshould Ġhave Ġsame Ġlinear ĠIDs " Ġusing Ġ( input State . linear Id Ġ== Ġoutput State . linear Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Transaction Ġmust Ġbe Ġsigned Ġby Ġall Ġsign ers Ġspecified Ġinside Ġcommand " Ġusing Ġ( command . sign ers . toSet () Ġ== Ġcommand . value . required Sign ers . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( command . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Request Ġ-> Ġverify Request ( tx , Ġcommand , Ġoutput State !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Approve Ġ-> Ġverify Approval ( tx , Ġcommand , Ġinput State !! , Ġoutput State !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Decl ine Ġ-> Ġverify Rejection ( tx , Ġcommand , Ġinput State !! , Ġoutput State !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Delete Ġ-> Ġverify Removal ( tx , Ġcommand , Ġinput State !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġcommand Ġ${ command . value }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEach Ġcontract Ġextending Ġ[ Change Request Contract ] Ġmust Ġoverride Ġthis Ġmethod Ġproviding Ġassociated Ġcontract Ġname . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġcontract Name () Ġ= ĠCONTRACT _ NAME ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠContract Ġverification Ġcheck Ġspecific Ġto Ġ[ Commands . Request ] Ġcommand . ĠEach Ġcontract Ġextending Ġ[ Change Request Contract ] Ġcan Ġoverride Ġthis ĊĠĠĠĠ Ġ* Ġmethod Ġto Ġimplement Ġtheir Ġown Ġcustom Ġcreated Ġcommand Ġverification Ġlogic . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtx ĠLed ger Ġtransaction Ġover Ġwhich Ġcontract Ġperforms Ġverification . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠCommand Ġwith Ġparties Ġdata Ġabout Ġchange Ġrequest Ġcreation Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput Change Request ĠOutput Ġ[ Change Request State ] Ġof Ġthe Ġtransaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġverify Request ( tx : ĠLed ger Transaction , Ġcommand : ĠCommand With Part ies < Commands >, Ġoutput Change Request : ĠChange Request State ) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Membership Ġchange Ġrequest Ġtransaction Ġshouldn 't Ġcontain Ġany Ġinputs " Ġusing Ġ( tx . inputs . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ" Membership Ġchange Ġrequest Ġtransaction Ġshould Ġcontain Ġoutput Ġstate Ġin ĠP ENDING Ġstatus " Ġusing Ġ( output Change Request . is Pending ()) ĊĠĠĠĠĠĠĠ Ġ" Membership Ġchange Ġrequest Ġtransaction Ġshould Ġissue Ġrequest Ġwith Ġnon - empty Ġroles Ġchange Ġset Ġor Ġnon - empty Ġbusiness Ġidentity Ġchange " Ġusing Ġ( output Change Request . pro posed Role Change Ġ!= Ġnull Ġ|| Ġoutput Change Request . pro posed Business Identity Change Ġ!= Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠContract Ġverification Ġcheck Ġspecific Ġto Ġ[ Commands . Approve ] Ġcommand . ĠEach Ġcontract Ġextending Ġ[ Change Request Contract ] Ġcan Ġoverride Ġthis ĊĠĠĠĠ Ġ* Ġmethod Ġto Ġimplement Ġtheir Ġown Ġcustom Ġcreated Ġcommand Ġverification Ġlogic . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtx ĠLed ger Ġtransaction Ġover Ġwhich Ġcontract Ġperforms Ġverification . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠCommand Ġwith Ġparties Ġdata Ġabout Ġchange Ġrequest Ġapproval Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Change Request ĠInput Ġ[ Change Request State ] Ġof Ġthe Ġtransaction . ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput Change Request ĠOutput Ġ[ Change Request State ] Ġof Ġthe Ġtransaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġverify Approval ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx : ĠLed ger Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand : ĠCommand With Part ies < Commands >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Change Request : ĠChange Request State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Change Request : ĠChange Request State ĊĠĠĠ Ġ) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Input Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshouldn 't Ġbe Ġalready Ġapproved Ġor Ġdecl ined " Ġusing Ġ( input Change Request . is Pending ()) ĊĠĠĠĠĠĠĠ Ġ" Output Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġbe Ġapproved " Ġusing Ġ( output Change Request . is Approved ()) ĊĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġhave Ġsame Ġroles Ġset " Ġusing Ġ( input Change Request . pro posed Role Change Ġ== Ġoutput Change Request . pro posed Role Change ) ĊĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġhave Ġsame Ġbusiness Ġidentity " Ġusing Ġ( input Change Request . pro posed Business Identity Change Ġ== Ġoutput Change Request . pro posed Business Identity Change ) ĊĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġhave Ġsame Ġparticipants " Ġusing Ġ( input Change Request . participants Ġ== Ġoutput Change Request . participants ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠContract Ġverification Ġcheck Ġspecific Ġto Ġ[ Commands . Decl ine ] Ġcommand . ĠEach Ġcontract Ġextending Ġ[ Change Request Contract ] Ġcan Ġoverride Ġthis ĊĠĠĠĠ Ġ* Ġmethod Ġto Ġimplement Ġtheir Ġown Ġcustom Ġcreated Ġcommand Ġverification Ġlogic . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtx ĠLed ger Ġtransaction Ġover Ġwhich Ġcontract Ġperforms Ġverification . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠCommand Ġwith Ġparties Ġdata Ġabout Ġchange Ġrequest Ġapproval Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Change Request ĠInput Ġ[ Change Request State ] Ġof Ġthe Ġtransaction . ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput Change Request ĠOutput Ġ[ Change Request State ] Ġof Ġthe Ġtransaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġverify Rejection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx : ĠLed ger Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand : ĠCommand With Part ies < Commands >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Change Request : ĠChange Request State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Change Request : ĠChange Request State ĊĠĠĠ Ġ) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Input Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshouldn 't Ġbe Ġalready Ġapproved Ġor Ġdecl ined " Ġusing Ġ( input Change Request . is Pending ()) ĊĠĠĠĠĠĠĠ Ġ" Output Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġbe Ġdecl ined " Ġusing Ġ( output Change Request . is Decl ined ()) ĊĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġhave Ġsame Ġroles Ġset " Ġusing Ġ( input Change Request . pro posed Role Change Ġ== Ġoutput Change Request . pro posed Role Change ) ĊĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġhave Ġsame Ġbusiness Ġidentity " Ġusing Ġ( input Change Request . pro posed Business Identity Change Ġ== Ġoutput Change Request . pro posed Business Identity Change ) ĊĠĠĠĠĠĠĠ Ġ" Input Ġand Ġoutput Ġstate Ġof Ġmembership Ġchange Ġrequest Ġtransaction Ġshould Ġhave Ġsame Ġparticipants " Ġusing Ġ( input Change Request . participants Ġ== Ġoutput Change Request . participants ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠContract Ġverification Ġcheck Ġspecific Ġto Ġ[ Commands . Delete ] Ġcommand . ĠEach Ġcontract Ġextending Ġ[ Change Request Contract ] Ġcan Ġoverride Ġthis ĊĠĠĠĠ Ġ* Ġmethod Ġto Ġimplement Ġtheir Ġown Ġcustom Ġcreated Ġcommand Ġverification Ġlogic . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtx ĠLed ger Ġtransaction Ġover Ġwhich Ġcontract Ġperforms Ġverification . ĊĠĠĠĠ Ġ* Ġ@ param Ġcommand ĠCommand Ġwith Ġparties Ġdata Ġabout Ġchange Ġrequest Ġapproval Ġcommand . ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Change Request ĠInput Ġ[ Change Request State ] Ġof Ġthe Ġtransaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġverify Removal ( tx : ĠLed ger Transaction , Ġcommand : ĠCommand With Part ies < Commands >, Ġinput Change Request : ĠChange Request State ) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Membership Ġchange Ġrequest Ġtransaction Ġshouldn 't Ġcontain Ġany Ġoutputs " Ġusing Ġ( tx . outputs . isEmpty ()) ĊĠĠĠ Ġ} Ċ }