package Ġnet . cord a . training . contract Ċ Ċ import Ġnet . cord a . contracts . asset . Cash Ċ import Ġnet . cord a . contracts . asset . sum Cash Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . contracts . Requirements . by Ċ import Ġnet . cord a . core . crypto . Composite Key Ċ import Ġnet . cord a . core . crypto . Secure Hash Ċ import Ġnet . cord a . training . state . IO U State Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġwhere Ġyou 'll Ġadd Ġthe Ġcontract Ġcode Ġwhich Ġdefines Ġhow Ġthe Ġ[ IO U State ] Ġbehaves . ĠLooks Ġat Ġthe Ġunit Ġtests Ġin Ċ Ġ* Ġ[ IO U Contract Tests ] Ġfor Ġinstructions Ġon Ġhow Ġto Ġcomplete Ġthe Ġ[ IO U Contract ] Ġclass . Ċ Ġ*/ Ċ class ĠIO U Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLeg al Ġpro se Ġreference . ĠThis Ġis Ġjust Ġa Ġdummy Ġstring Ġfor Ġthe Ġtime Ġbeing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġlegal Contract Reference : ĠSecure Hash Ġ= ĠSecure Hash . sha 2 5 6 (" Pro se Ġcontract .") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġany Ġcommands Ġrequired Ġfor Ġthis Ġcontract Ġas Ġclasses Ġwithin Ġthis Ġinterface . ĊĠĠĠĠ Ġ* ĠIt Ġis Ġuseful Ġto Ġencaps ulate Ġyour Ġcommands Ġinside Ġan Ġinterface , Ġso Ġyou Ġcan Ġuse Ġthe Ġ[ require Single Command ] ĊĠĠĠĠ Ġ* Ġfunction Ġto Ġcheck Ġfor Ġa Ġrange Ġof Ġcommands Ġwhich Ġimplement Ġthis Ġinterface . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcommands Ġhere . ĊĠĠĠĠĠĠĠ Ġ// ĠE . g ĊĠĠĠĠĠĠĠ Ġ// Ġclass ĠDo Something Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠIssue Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠTransfer Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcontract Ġcode Ġfor Ġthe Ġ[ IO U Contract ]. ĊĠĠĠĠ Ġ* ĠThe Ġconstraints Ġare Ġself Ġdocument ing Ġso Ġdon 't Ġrequire Ġany Ġadditional Ġexplanation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠTransaction For Contract ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcontract Ġcode Ġhere . ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtx . commands . require Single Command < Commands >() ĊĠĠĠĠĠĠĠ Ġwhen Ġ( command . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Issue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġinputs Ġshould Ġbe Ġconsumed Ġwhen Ġiss uing Ġan ĠIO U ." Ġby Ġtx . inputs . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated Ġwhen Ġiss uing Ġan ĠIO U ." Ġby Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġtx . outputs . first () Ġas ĠIO U State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWith Ġover loaded Ġ> Ġoperator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġnewly Ġissued ĠIO U Ġmust Ġhave Ġa Ġpositive Ġamount ." Ġby Ġ( output . amount Ġ> ĠAmount ( 0 , Ġoutput . amount . token )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġnewly Ġissued ĠIO U Ġmust Ġhave Ġa Ġpositive Ġamount ." Ġby Ġ( output . amount . quantity Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġl ender Ġand Ġborrow er Ġcannot Ġbe Ġthe Ġsame Ġidentity ." Ġby Ġ( output . l ender . own ing Key Ġ!= Ġoutput . borrow er . own ing Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġl ender Ġand Ġborrow er Ġtogether Ġonly Ġmay Ġsign ĠIO U Ġissue Ġtransaction ." Ġby Ġ( command . sign ers . toSet () Ġ== Ġoutput . participants . toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Transfer Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" An ĠIO U Ġtransfer Ġtransaction Ġshould Ġonly Ġconsume Ġone Ġinput Ġstate ." Ġby Ġ( tx . inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" An ĠIO U Ġtransfer Ġtransaction Ġshould Ġonly Ġcreate Ġone Ġoutput Ġstate ." Ġby Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtx . inputs . first () Ġas ĠIO U State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġtx . outputs . first () Ġas ĠIO U State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġl ender Ġproperty Ġmay Ġchange ." Ġby Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . amount Ġ== Ġoutput . amount Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . borrow er . own ing Key Ġ== Ġoutput . borrow er . own ing Key Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . paid Ġ== Ġoutput . paid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġl ender Ġproperty Ġmay Ġchange ." Ġby Ġ( input Ġ== Ġoutput . with New L ender ( input . l ender )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġl ender Ġproperty Ġmust Ġchange Ġin Ġa Ġtransfer ." Ġby Ġ( input . l ender != Ġoutput . l ender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġborrow er , Ġold Ġl ender Ġand Ġnew Ġl ender Ġonly Ġmust Ġsign Ġan ĠIO U Ġtransfer Ġtransaction " Ġby ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( command . sign ers . toSet () Ġ== Ġinput . participants . toSet () Ġ+ Ġoutput . participants ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġcommand Ġ$ command .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ