package Ġi an m organ . c andy coins . contract Ċ Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġi an m organ . c andy coins . state . C andy Bag State ĊĊ Ċ /** Ċ Ġ* ĠThe Ġthings Ġwe Ġcan Ġdo Ġwith Ġa Ġk andy Ġbag Ċ Ġ*/ Ċ @ Legal Pro se Reference ( uri Ġ= Ġ"< pro se _ contract _ uri >") Ċ class ĠC andy Bag Contract Ġ: ĠContract Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠC AND Y _ CONTRACT _ ID Ġ= Ġ" ian m organ . c andy coins . contract . C andy Bag 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 Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠK andy Ġcomes Ġinto Ġexistence Ġwhen Ġsomeone Ġgives Ġout Ġa Ġbag . ĊĠĠĠĠĠĠĠ Ġclass ĠGive Ġ: ĠType Only Command Data (), ĠCommands ĊĊĠĠĠĠĠĠĠ Ġ// ĠI Ġcan Ġeat Ġsome Ġor Ġall Ġof Ġmy Ġk andy . ĠIf Ġthere Ġis Ġnothing Ġleft Ġ, Ġthe Ġbag Ġis Ġno Ġmore ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠE at Ġ( val Ġcho col ates : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg ob stop pers : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjel ly beans : ĠInt ) Ġ: ĠCommands ĊĊĠĠĠĠĠĠĠ Ġ// ĠI Ġcan Ġoffer Ġmy Ġbag Ġ Ġor Ġall Ġof Ġmy Ġk andy Ġto Ġsomeone Ġelse Ġto Ġeat . ĊĠĠĠĠĠĠĠ Ġclass ĠOffer Ġ: ĠType Only Command Data (), ĠCommands ĊĊĠĠĠĠĠĠĠ Ġ// ĠI Ġcan Ġtrade Ġsome Ġof Ġmy Ġk andy Ġwith Ġsomeone Ġelse . ĠThe Ġrelative Ġvalues Ġof Ġch ocs , Ġg ob stop pers Ġand Ġjel ly beans ĊĠĠĠĠĠĠĠ Ġ// Ġmust Ġbe Ġo bey ed ĊĠĠĠĠĠĠĠ Ġclass ĠTrade Ġ: ĠType Only Command Data (), ĠCommands ĊĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtx . commands . require Single Command < Commands >() ĊĠĠĠĠĠĠĠ Ġwhen Ġ( command . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Give Ġ-> Ġrequire That Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġinputs Ġshould Ġbe Ġconsumed Ġwhen Ġgiving Ġa ĠK andy ĠBag ." Ġusing Ġ( tx . inputs . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated Ġwhen Ġgiving Ġa ĠK andy ĠBag ." Ġusing Ġ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbag Ġ= Ġtx . output States . single () Ġas ĠC andy Bag State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġnewly Ġgift ed Ġbag Ġmust Ġhave Ġk andy ." Ġusing Ġ( bag . isEmpty () Ġ== Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" The Ġl ender Ġand Ġborrow er Ġcannot Ġhave Ġthe Ġsame Ġidentity ." Ġusing Ġ( iou . borrow er Ġ!= Ġi ou . l ender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" Both Ġl ender Ġand Ġborrow er Ġtogether Ġonly Ġmay Ġsign ĠIO U Ġissue Ġtransaction ." Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġ( command . sign ers . toSet () Ġ== Ġi ou . participants . map Ġ{ Ġit . own ing Key Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . E at Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ Ġ" A ĠK andy ĠBag Ġeat Ġtransaction Ġshould Ġonly Ġconsume Ġone Ġinput Ġstate ." Ġusing Ġ( tx . inputs . size Ġ== Ġ 1 )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ Ġ" A ĠK andy ĠBag Ġeat Ġtransaction Ġshould Ġcreate Ġno Ġmore Ġthan Ġone Ġoutput Ġstate ." Ġusing Ġ( tx . outputs . size Ġ<= Ġ 1 )} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbag Ġ= Ġtx . input States . single () Ġas ĠC andy Bag State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġcommand . value Ġas ĠCommands . E at ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ" Only Ġthe Ġowner Ġmay Ġeat Ġsome ĠK andy ." Ġusing Ġ( command . sign ers . toSet () Ġ== Ġbag . participants . map Ġ{ Ġit . own ing Key Ġ}. toSet ()) } ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bag . has En ough ( cmd . cho col ates , cmd . gob stop pers , cmd . jel ly beans )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Bag Ġ= Ġbag . take ( cmd . cho col ates , cmd . gob stop pers , cmd . jel ly beans ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( updated Bag . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ Ġ" A ĠK andy ĠBag Ġeat Ġtransaction Ġshould Ġnot Ġcreate Ġan Ġoutput Ġif Ġbag Ġis Ġe mpt ied ." Ġusing Ġ( tx . outputs . isEmpty ()) } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ Ġ" A ĠK andy ĠBag Ġeat Ġtransaction Ġshould Ġcreate Ġan Ġoutput Ġstate ." Ġusing Ġ( tx . outputs . size Ġ<= Ġ 1 )} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtx . output States . single () Ġas ĠC andy Bag State ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ Ġ" A ĠK andy ĠBag Ġeat Ġtransaction Ġshould Ġleave Ġthe Ġcorrect Ġamount Ġin Ġthe Ġoutput Ġstate ." Ġusing Ġ( out Ġ== Ġupdated Bag )} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire That Ġ{ Ġ Ġ" A ĠK andy ĠBag Ġmust Ġhave Ġsufficient Ġcontents Ġto Ġeat ." Ġusing Ġ( false )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĊ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġinputs Ġshould Ġbe Ġconsumed Ġwhen Ġgiving Ġa ĠK andy ĠBag ." Ġusing Ġ( tx . inputs . isEmpty ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġone Ġoutput Ġstate Ġshould Ġbe Ġcreated Ġwhen Ġgiving Ġa ĠK andy ĠBag ." Ġusing Ġ( tx . outputs . size Ġ== Ġ 1 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbag Ġ= Ġtx . output States . single () Ġas ĠC andy Bag State Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A Ġnewly Ġgift ed Ġbag Ġmust Ġhave Ġk andy ." Ġusing Ġ( bag . isEmpty () Ġ== Ġfalse ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" The Ġl ender Ġand Ġborrow er Ġcannot Ġhave Ġthe Ġsame Ġidentity ." Ġusing Ġ( iou . borrow er Ġ!= Ġi ou . l ender ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ" Both Ġl ender Ġand Ġborrow er Ġtogether Ġonly Ġmay Ġsign ĠIO U Ġissue Ġtransaction ." Ġusing Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠ Ġ( command . sign ers . toSet () Ġ== Ġi ou . participants . map Ġ{ Ġit . own ing Key Ġ}. toSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ