/* Ċ Ġ* ĠCopyright ĠIBM ĠCorp . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . cord a Simple Application . contract Ċ Ċ import Ġcom . cord a Simple Application . state . Simple 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 . transactions . Ledger Transaction Ċ Ċ /** Ċ Ġ* ĠSimple Contract Ġdefines Ġthe Ġrules Ġfor Ġmanaging Ġ[ Simple State ]. Ċ Ġ* Ċ Ġ* ĠImplements Ġthe ĠContract Ġinterface Ġthat Ġis Ġpart Ġof ĠC ord a Ġcore . Ċ Ġ* Ċ Ġ* Ġ[ Simple State ] Ġissue Ġtransaction Ġrules : Ċ Ġ* Ġ- ĠThe ĠCreate () Ġcommand Ġwith Ġthe Ġpublic Ġkey Ġof Ġthe Ġowner Ġnode . Ċ Ġ* Ġ- ĠNo Ġinput Ġstates . Ċ Ġ* Ġ- ĠOne Ġoutput Ġstate Ġof Ġtype Ġ[ Simple State ]. Ċ Ġ* Ċ Ġ* Ġ[ Simple State ] Ġupdate Ġtransaction Ġrules : Ċ Ġ* Ġ- ĠThe ĠUpdate () Ġcommand Ġwith Ġthe Ġpublic Ġkey Ġof Ġthe Ġowner Ġnode . Ċ Ġ* Ġ- ĠOne Ġinput Ġstate Ġof Ġtype Ġ[ Simple State ]. Ċ Ġ* Ġ- ĠOne Ġoutput Ġstate Ġof Ġtype Ġ[ Simple State ]. Ċ Ġ* Ċ Ġ* Ġ Ġ[ Simple State ] Ġdelete Ġtransaction Ġrules : Ċ Ġ* Ġ- ĠThe ĠDelete () Ġcommand Ġwith Ġthe Ġpublic Ġkey Ġof Ġthe Ġowner Ġnode . Ċ Ġ* Ġ- ĠOne Ġinput Ġstate Ġof Ġtype Ġ[ Simple State ]. Ċ Ġ* Ġ- ĠNo Ġoutput Ġstates . Ċ Ġ*/ Ċ class ĠSimple Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠID Ġ= Ġ" com . cord a Simple Application . contract . Simple Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġverify () Ġfunction Ġdetermines Ġa Ġtransaction Ġis Ġvalid Ġif Ġit Ġdoes Ġnot Ġthrow Ġand Ġexception . ĊĠĠĠĠ Ġ* ĠIt Ġtakes Ġa Ġledger Ġtransaction Ġthat Ġrepresents Ġa Ġstate Ġtransition , Ġand Ġensures Ġthe Ġinputs / outputs / commands Ġmake Ġsense . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtx . commands . require Single Command < Commands >() ĊĠĠĠĠĠĠĠ Ġwhen Ġ( command . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Create Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġinputs Ġshould Ġbe Ġconsumed Ġwhen Ġiss uing Ġa ĠSimple State ." Ġusing Ġ( tx . inputs . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . outputs OfType < Simple State >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġparticipant Ġmust Ġbe Ġthe Ġsigner ." Ġusing Ġ( command . sign ers . contains All ( out . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Update Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġone Ġinput Ġstate " Ġusing Ġ( tx . inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġstate Ġshould Ġbe Ġof Ġtype ĠSimple State " Ġusing Ġ( tx . inputs [ 0 ]. state . data Ġis ĠSimple State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġone Ġoutput Ġstate " Ġusing Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġoutput Ġstate Ġshould Ġbe Ġof Ġtype ĠSimple State " Ġusing Ġ( tx . outputs [ 0 ]. data Ġis ĠSimple State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . outputs OfType < Simple State >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġparticipant Ġmust Ġbe Ġthe Ġsigner ." Ġusing Ġ( command . sign ers . contains All ( out . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Delete Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġone Ġinput Ġstate " Ġusing Ġ( tx . inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġstate Ġshould Ġbe Ġof Ġtype ĠSimple State " Ġusing Ġ( tx . inputs [ 0 ]. state . data Ġis ĠSimple State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtx . inputs [ 0 ]. state . data Ġas ĠSimple State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġoutput Ġstate " Ġusing Ġ( tx . outputs . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġparticipant Ġmust Ġbe Ġthe Ġsigner ." Ġusing Ġ( command . sign ers . contains All ( input . participants . map Ġ{ Ġit . own ing Key Ġ})) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommands Ġare Ġused Ġto Ġindicate Ġthe Ġintent Ġof Ġa Ġtransaction . ĊĠĠĠĠ Ġ* ĠCommands Ġfor ĠExternal State Contract Ġare : ĊĠĠĠĠ Ġ* Ġ- ĠCreate ĊĠĠĠĠ Ġ* Ġ- ĠUpdate ĊĠĠĠĠ Ġ* Ġ- ĠDelete ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠCreate Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠUpdate Ġ: ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠDelete Ġ: ĠCommands ĊĠĠĠ Ġ} Ċ } Ċ