package Ġnet . cord a . auction house . contract Ċ Ċ import Ġnet . cord a . auction house . state . Auction Item State Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġnet . cord a . finance . contracts . asset . Cash Ċ import Ġnet . cord a . finance . contracts . utils . sum Cash Ċ import Ġnet . cord a . auction house . state . Auction State Ċ import Ġjava . security . PublicKey Ċ Ċ /** Ċ Ġ* ĠTransactions Ġinvol ving Ġone Ġor Ġmore ĠA uction States Ġwill Ġuse Ġthis Ġcontract Ġto Ċ Ġ* Ġverify Ġthat Ġthe Ġtransactions Ġare Ġvalid . Ċ Ġ* Ċ Ġ*/ Ċ class ĠA uction Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠA UCTION _ CONTRACT _ ID Ġ= Ġ" net . cord a . auction house . contract . Auction Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdding Ġmore Ġcommands Ġwill Ġrequire Ġimplementation Ġof Ġthe Ġcorresponding ĊĠĠĠĠ Ġ* Ġverification Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġverify Command ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) ĊĊĠĠĠĠĠĠĠ Ġclass ĠList Ġ: ĠType Only Command Data (), ĠCommands Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġverify Command ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Window : ĠTime Window ? Ġ= Ġtx . time Window ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġinput Ġshould Ġbe Ġconsumed Ġwhen Ġlisting Ġan Ġauction " Ġusing Ġ( 1 Ġ== Ġtx . input States . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġstate Ġtype Ġshould Ġbe ĠA uction Item State " Ġusing Ġ( tx . input States . single () Ġis ĠA uction Item State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġtwo Ġoutput Ġstates Ġshould Ġbe Ġcreated Ġwhen Ġlisting Ġan Ġauction " Ġusing Ġ( 2 Ġ== Ġtx . output States . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauction State Ġ= Ġtx . outputs OfType ( Auction State :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauction Item State In Ġ= Ġtx . inputs OfType ( Auction Item State :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġnewly Ġissued Ġauction Ġmust Ġhave Ġa Ġstarting Ġprice Ġgreater Ġthan Ġzero " Ġusing Ġ( auction State . price . quantity Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġtime Window ?. from Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Auction Ġlist ings Ġmust Ġbe Ġtimestamp ed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġexpiry Ġdate Ġcannot Ġbe Ġin Ġthe Ġpast " Ġusing Ġ( time Ġ< Ġauction State . expiry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġsell er Ġneeds Ġto Ġsign Ġthe Ġtransaction " Ġusing Ġ( sign ers Ġ== Ġset Of ( auction State . seller . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġauction Ġmust Ġhave Ġno Ġbid der Ġwhen Ġlisted " Ġusing Ġ( auction State . bid der Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġowner Ġof Ġthe Ġauction Ġitem Ġcan Ġlist Ġit Ġin Ġan Ġauction " Ġusing Ġ( auction Item State In . owner Ġ== Ġauction State . seller ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Command Ġ= Ġtx . commands OfType ( Auction Item Contract . Commands :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Item Ġmust Ġbe Ġlisted " Ġusing Ġ( item Command . value Ġis ĠA uction Item Contract . Commands . List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠBid : ĠType Only Command Data (), ĠCommands Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġverify Command ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Window : ĠTime Window ? Ġ= Ġtx . time Window ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġtime Window ?. from Time Ġ?: Ġthrow ĠIllegalArgumentException (" Auction Ġb ids Ġmust Ġbe Ġtimestamp ed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġbid Ġtransaction Ġshould Ġonly Ġhave Ġone Ġinput Ġstate " Ġusing Ġ( 1 Ġ== Ġtx . input States . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġbid Ġtransaction Ġshould Ġonly Ġhave Ġone Ġoutput Ġstate " Ġusing Ġ( 1 Ġ== Ġtx . output States . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġinput Ġstate Ġmust Ġbe Ġan ĠA uction State " Ġusing Ġ( tx . input States . single () Ġis ĠA uction State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġoutput Ġstate Ġmust Ġbe Ġan ĠA uction State " Ġusing Ġ( tx . output States . single () Ġis ĠA uction State ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput State Ġ= Ġtx . input States . single () Ġas ĠA uction State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput State Ġ= Ġtx . output States . single () Ġas ĠA uction State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġauction Ġmust Ġnot Ġbe Ġexpired " Ġusing Ġ( time Ġ< Ġinput State . expiry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġbid der Ġcannot Ġbe Ġ' null '" Ġusing Ġ( output State . bid der Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġ' bid der ' Ġand Ġ' price ' Ġmay Ġchange " Ġusing Ġ( input State Ġ== Ġoutput State . copy ( bid der Ġ= Ġinput State . bid der , Ġprice Ġ= Ġinput State . price )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġ' bid der ' Ġproperty Ġmust Ġchange Ġin Ġa Ġbid " Ġusing Ġ( output State . bid der Ġ!= Ġinput State . bid der ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġ' price ' Ġproperty Ġmust Ġchange Ġin Ġa Ġbid " Ġusing Ġ( output State . price Ġ!= Ġinput State . price ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġnew Ġbid Ġprice Ġmust Ġbe Ġgreater Ġthan Ġthe Ġcurrent Ġbid Ġprice " Ġusing Ġ( output State . price Ġ> Ġinput State . price ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġsell er , Ġprevious Ġbid der Ġand Ġnew Ġbid der Ġonly Ġmust Ġsign Ġa Ġbid Ġtransaction " Ġusing Ġ( sign ers Ġ== ĠlistOf NotNull ( output State . seller . own ing Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( output State . bid der ). own ing Key , Ġinput State . bid der ?. own ing Key ). toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Item Ġmust Ġnot Ġchange " Ġusing Ġ( tx . commands OfType ( Auction Item Contract . Commands :: class . java ). none ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠSet tle : ĠType Only Command Data (), ĠCommands Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġverify Command ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Window : ĠTime Window ? Ġ= Ġtx . time Window ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġonly Ġone ĠA uction State Ġinput " Ġusing Ġ( tx . inputs OfType ( Auction State :: class . java ). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Auction Ġ= Ġtx . inputs OfType ( Auction State :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġnot Ġbe Ġany ĠA uction State Ġoutputs " Ġusing Ġtx . outputs OfType ( Auction State :: class . java ). none () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġtime Window ?. from Time Ġ?: Ġthrow ĠIllegalArgumentException (" Auction Ġset tlement s Ġmust Ġbe Ġtimestamp ed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Auction Ġcannot Ġbe Ġset tled Ġbefore Ġit Ġexpires " Ġusing Ġ( time Ġ> Ġinput Auction . expiry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Auction . bid der Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcash Outputs Ġ= Ġtx . outputs OfType ( Cash . State :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġoutput Ġcash " Ġusing Ġcash Outputs . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsell er Cash Amount Ġ= Ġcash Outputs . filter Ġ{ Ġit . owner Ġ== Ġinput Auction . seller Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġoutput Ġcash Ġpaid Ġto Ġthe Ġsell er " Ġusing Ġ( seller Cash Amount . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset tled Ġ= Ġsell er Cash Amount . sum Cash (). without Issuer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġinput Auction . price ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġamount Ġset tled Ġmust Ġbe Ġequal Ġto Ġthe Ġprice Ġof Ġthe Ġauction " Ġusing Ġ( total . compareTo ( set tled ) Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġsell er Ġand Ġbid der Ġonly Ġmust Ġsign Ġthe Ġauction Ġset tlement Ġtransaction " Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( sign ers Ġ== Ġset Of ( input Auction . seller . own ing Key , Ġinput Auction . bid der . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Command Ġ= Ġtx . commands OfType ( Auction Item Contract . Commands :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Item Ġmust Ġbe Ġtransferred " Ġusing Ġ( item Command . value Ġis ĠA uction Item Contract . Commands . Transfer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġcash Ġinputs " Ġusing Ġtx . inputs OfType ( Cash . State :: class . java ). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġcash Ġoutputs " Ġusing Ġtx . outputs OfType ( Cash . State :: class . java ). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġsell er Ġmust Ġsign Ġthe Ġauction Ġset tlement Ġtransaction " Ġusing Ġ( sign ers Ġ== Ġset Of ( input Auction . seller . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Command Ġ= Ġtx . commands OfType ( Auction Item Contract . Commands :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Item Ġmust Ġbe Ġde listed " Ġusing Ġ( item Command . value Ġis ĠA uction Item Contract . Commands . Del ist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠEnd : ĠType Only Command Data (), ĠCommands Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġverify Command ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Window : ĠTime Window ? Ġ= Ġtx . time Window ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġbe Ġonly Ġone ĠA uction State Ġinput " Ġusing Ġ( tx . inputs OfType ( Auction State :: class . java ). size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Auction Ġ= Ġtx . inputs OfType ( Auction State :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġmust Ġnot Ġbe Ġany ĠA uction State Ġoutputs " Ġusing Ġtx . outputs OfType ( Auction State :: class . java ). none () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Window ?. from Time Ġ?: Ġthrow ĠIllegalArgumentException (" Transaction Ġmust Ġbe Ġtimestamp ed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġcash Ġinputs " Ġusing Ġtx . inputs OfType ( Cash . State :: class . java ). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" There Ġshould Ġbe Ġno Ġcash Ġoutputs " Ġusing Ġtx . outputs OfType ( Cash . State :: class . java ). isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Command Ġ= Ġtx . commands OfType ( Auction Item Contract . Commands :: class . java ). single () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Item Ġmust Ġbe Ġde listed " Ġusing Ġ( item Command . value Ġis ĠA uction Item Contract . Commands . Del ist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Auction . bid der Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Both Ġsell er Ġand Ġbid der Ġonly Ġmust Ġsign Ġthe Ġauction Ġend Ġtransaction " Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( sign ers Ġ== ĠlistOf ( input Auction . seller . own ing Key , Ġinput Auction . bid der . own ing Key ). toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġthe Ġsell er Ġmust Ġsign Ġthe Ġauction Ġend Ġtransaction " Ġusing Ġ( sign ers Ġ== Ġset Of ( input Auction . seller . own ing Key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcontract Ġcode Ġfor Ġthe Ġ[ Auction Contract ]. ĊĠĠĠĠ Ġ* ĠThe Ġconstraints Ġare Ġself Ġdocument ing Ġso Ġdon 't Ġrequire Ġany Ġadditional Ġexplanation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtx . commands . require Single Command < Commands >() ĊĠĠĠĠĠĠĠ Ġcommand . value . verify Command ( tx , Ġcommand . sign ers . toSet ()) ĊĠĠĠ Ġ} Ċ }