package Ġnet . cord a . workbench . asset Transfer . contract Ċ Ċ import Ġnet . cord a . workbench . asset Transfer . keys From Participants Ċ import Ġnet . cord a . workbench . asset Transfer . state . Asset State Ċ import Ġnet . cord a . workbench . asset Transfer . state . State Type Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġjava . security . PublicKey Ċ import Ġjava . time . Instant ĊĊ Ċ class ĠAsset Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠID Ġ= Ġ" net . cord a . workbench . asset Transfer . contract . Asset Contract " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Command Ġ= Ġtx . commands . require Single Command < Commands >() ĊĠĠĠĠĠĠĠ Ġval Ġset Of Sign ers Ġ= Ġitem Command . sign ers . toSet () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( item Command . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCreate Ġ-> Ġverify Create ( tx , Ġset Of Sign ers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPlace Offer Ġ-> verify Offer ( tx , set Of Sign ers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValidate Offer -> verify Validate Offer ( tx , set Of Sign ers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Un re cogn ised Ġcommand .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Create ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠ Ġ" No Ġinputs Ġshould Ġbe Ġconsumed Ġwhen Ġcreating Ġan Ġitem ." Ġusing Ġ( tx . input States . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ" Only Ġone Ġitem Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . output States . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġ_ asset Ġ= Ġtx . output States . single () Ġas ĠAs setState ĊĠĠĠĠĠĠĠ Ġ" A Ġnew Ġitem Ġmust Ġhave Ġvalue " Ġusing Ġ(_ asset . value != 0 . 0 || _ asset . value != null ) ĊĠĠĠĠĠĠĠ Ġ" Item Ġmust Ġbe Ġset Ġon Ġactive " Ġusing Ġ(_ asset . state == State Type . active ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Offer ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Only Ġone Ġitem Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . output States . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠ Ġ// Ġ" Incorrect Ġnumber Ġof Ġsign ers ." Ġusing Ġ( sign ers . size Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġ_ asset Ġ= Ġtx . output States . single () Ġas ĠAs setState ĊĠĠĠĠĠĠĠ Ġ" Item Ġmust Ġbe Ġset Ġon Ġactive " Ġusing Ġ(_ asset . state == State Type . Accepted ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Validate Offer ( tx : ĠLed ger Transaction , Ġsign ers : ĠSet < PublicKey >) Ġ= Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Only Ġone Ġitem Ġstate Ġshould Ġbe Ġcreated ." Ġusing Ġ( tx . output States . size Ġ== Ġ 1 ) ĊĊĠĠĠĠĠĠ Ġ// Ġ Ġ" Incorrect Ġnumber Ġof Ġsign ers ." Ġusing Ġ( sign ers . size Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġ_ asset Ġ= Ġtx . output States . single () Ġas ĠAs setState ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data ĊĠĠĠĠĠĠĠ Ġclass ĠCreate Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠPlace Offer Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠValidate Offer Ġ: ĠType Only Command Data (), ĠCommands Ċ } Ċ