package Ġnet . cord a . training . contract Ċ Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġnet . cord a . finance . AMOUNT Ċ import Ġnet . cord a . finance . contracts . asset . Cash Ċ import Ġnet . cord a . finance . contracts . utils . sum Cash Ċ import Ġnet . cord a . training . state . IO U State Ċ import Ġjava . lang . IllegalArgumentException Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġwhere Ġyou 'll Ġadd Ġthe Ġcontract Ġcode Ġwhich Ġdefines Ġhow Ġthe Ġ[ IO U State ] Ġbehaves . ĠLook Ġ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 Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠIO U _ CONTRACT _ ID Ġ= Ġ" net . cord a . training . contract . IO U 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 Ġnumber Ġ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 ĊĊĠĠĠĠĠĠĠ Ġclass ĠSet tle Ġ: Ġ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 : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ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 ." Ġusing Ġ( tx . inputs . size Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated Ġwhen Ġiss uing Ġan ĠIO U ." Ġusing Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġtx . outputs OfType < IO U State >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġnewly Ġissued ĠIO U Ġmust Ġhave Ġa Ġpositive Ġamount ." Ġusing Ġ( output State . amount . quantity Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġl ender Ġand Ġborrow er Ġcannot Ġhave Ġthe Ġsame Ġidentity ." Ġusing Ġ( output State . l ender Ġ!= Ġoutput State . borrow er ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġl ender Ġand Ġborrow er Ġtogether Ġonly Ġmay Ġsign ĠIO U Ġissue Ġtransaction ." Ġusing Ġ( command . sign ers . toSet () Ġ== Ġoutput State . participants . map Ġ{ Ġit . own ing Key Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Transfer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" An ĠIO U Ġtransfer Ġtransaction Ġshould Ġonly Ġconsume Ġone Ġinput Ġstate ." Ġusing Ġ( tx . inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" An ĠIO U Ġtransfer Ġtransaction Ġshould Ġonly Ġcreate Ġone Ġoutput Ġstate ." Ġusing Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= Ġtx . inputs OfType < IO U State >(). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġtx . outputs OfType < IO U State >(). single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġl ender Ġproperty Ġmay Ġchange ." Ġusing Ġ( output State Ġ== Ġinput State . copy ( l ender Ġ= Ġoutput State . l ender )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġl ender Ġproperty Ġmust Ġchange Ġin Ġa Ġtransfer ." Ġusing Ġ( output State . l ender Ġ!= Ġinput State . l ender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġborrow er , Ġold Ġl ender Ġand Ġnew Ġl ender Ġonly Ġmust Ġsign Ġan ĠIO U Ġtransfer Ġtransaction " Ġusing Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( output State . participants Ġ+ Ġinput State . participants ). map Ġ{ Ġit . own ing Key Ġ}. toSet () Ġ== Ġcommand . sign ers . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Set tle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstates Ġ= Ġtx . group States < IO U State , ĠUnique Identifier > Ġ{ Ġit . linear Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrouped State Ġ= Ġstates . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġshould Ġbe Ġone Ġinput Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġone Ġinput ĠIO U ." Ġusing Ġ( grouped State . inputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Cash Ġ= Ġtx . outputs OfType < Cash . State >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput IO U Ġ= Ġgrouped State . inputs . single () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġoutput Ġcash ." Ġusing Ġ( output Cash . size Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcash To L ender Ġ= Ġoutput Cash . filter Ġ{ Ġit . owner Ġ== Ġinput IO U . l ender Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Output Ġcash Ġmust Ġbe Ġpaid Ġto Ġthe Ġl ender ." Ġusing Ġ( cash To L ender . size Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Cash Ġ= Ġoutput Cash . sum Cash (). without Issuer () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġamount Ġset tled Ġcannot Ġbe Ġmore Ġthan Ġthe Ġamount Ġoutstanding ." Ġusing Ġ( total Cash Ġ<= Ġinput IO U . amount Ġ- Ġinput IO U . paid ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Cash Ġ== Ġinput IO U . amount Ġ- Ġinput IO U . paid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġno Ġoutput ĠIO U Ġas Ġit Ġhas Ġbeen Ġfully Ġset tled ." Ġusing Ġ( grouped State . outputs . size Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġone Ġoutput ĠIO U ." Ġusing Ġ( grouped State . outputs . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput IO U Ġ= Ġgrouped State . outputs . single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġpaid Ġamount Ġcan Ġchange ." Ġusing Ġ( output IO U Ġ== Ġinput IO U . copy ( paid Ġ= Ġoutput IO U . paid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġl ender Ġand Ġborrow er Ġtogether Ġonly Ġmust Ġsign Ġthe ĠIO U Ġset tle Ġtransaction ." Ġusing Ġ( command . sign ers . toSet () Ġ== Ġinput IO U . participants . map Ġ{ Ġit . own ing Key Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }