package Ġcom . accent ure . inter oper ability . contracts Ċ Ċ import Ġcom . accent ure . inter oper ability . states . Asset State Ċ import Ġcom . accent ure . inter oper ability . states . Verify State Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ Ċ /** Ċ Ġ* ĠAsset Ġcontract . Ċ Ġ*/ Ċ class ĠAsset Contract Ġ: ĠContract Ġ{ ĊĊĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠCreate Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠCopy Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠĠĠĠĠ Ġclass ĠLock Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġtransaction Ġis Ġvalid Ġif Ġthe Ġverify () Ġfunction Ġof Ġthe Ġcontract Ġof Ġall Ġthe Ġtransaction 's Ġinput Ġand Ġoutput Ġstates ĊĠĠĠ Ġ// Ġdoes Ġnot Ġthrow Ġan Ġexception . ĊĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġtx . commands . require Single Command ( Commands :: class . java ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( cmd . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Copy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Copy Asset ( cmd , Ġtx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Lock Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Lock Asset ( cmd , Ġtx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommands . Create Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Create Asset ( cmd , Ġtx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Un re cogn ised Ġcommand Ġ${ cmd . value }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Lock Asset ( cmd : ĠCommand With Part ies < Commands >, Ġtx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( tx . inputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ{ Ġ" Input Ġstate Ġmust Ġbe Ġone " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ{ Ġ" Output Ġstate Ġmust Ġbe Ġone " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtx . inputs OfType ( Asset State :: class . java ). single () ĊĠĠĠĠĠĠĠ Ġwith ( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire (! locked ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Input Ġstate Ġmust Ġbe Ġun locked " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġtx . outputs OfType ( Asset State :: class . java ). single () ĊĠĠĠĠĠĠĠ Ġwith ( output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( linear Id Ġ== Ġinput . linear Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" linear Id Ġfor Ġinput Ġand Ġoutput Ġstates Ġmust Ġbe Ġsame " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( locked ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Input Ġstate Ġmust Ġbe Ġlocked " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticipants . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . own ing Key Ġin Ġcmd . sign ers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Need Ġsignatures Ġfrom Ġall Ġparticipants " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Create Asset ( cmd : ĠCommand With Part ies < Commands >, Ġtx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( tx . inputs . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ{ Ġ" Input Ġmust Ġbe Ġempty " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( tx . outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ{ Ġ" Output Ġstate Ġmust Ġbe Ġone " Ġ} ĊĠĠĠĠĠĠĠ Ġwith ( tx . outputs OfType ( Asset State :: class . java ). single ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparticipants . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . own ing Key Ġin Ġcmd . sign ers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Need Ġsignatures Ġfrom Ġall Ġparticipants " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Copy Asset ( cmd : ĠCommand With Part ies < Commands >, Ġtx : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġverify Create Asset ( cmd , Ġtx ) ĊĠĠĠĠĠĠĠ Ġval Ġverify State Ġ= Ġtx . reference Input Refs OfType ( Verify State :: class . java ). single OrNull ()?. state ?. data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Transaction Ġmust Ġhave Ġone Ġreference Ġto ĠVerify State ") ĊĊĠĠĠĠĠĠĠ Ġval Ġaccepted Ġ= Ġverify State . ver ifications . count Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( accepted Ġ== Ġverify State . ver ifications . size ) ĊĠĠĠĠĠĠĠ Ġ{ Ġ" All Ġsignatures Ġmust Ġbe Ġvalid " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( accepted Ġ>= ĠForeign Asset Factory . Min NumberOf Signatures Permit s Copy ) ĊĠĠĠĠĠĠĠ Ġ{ Ġ" Request Ġto Ġcopy Ġasset Ġmust Ġhave Ġat Ġleast Ġ${ Foreign Asset Factory . Min NumberOf Signatures Permit s Copy } Ġvalid Ġsignature " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġasset Ġ= Ġtx . outputs OfType ( Asset State :: class . java ). single () ĊĠĠĠĠĠĠĠ Ġrequire ( Foreign Asset Factory . parse Message ( verify State . message ) Ġ== ĠForeign Asset Factory . message From State ( asset )) ĊĠĠĠĠĠĠĠ Ġ{ Ġ" Verify State Ġnot Ġmatched Ġto ĠAs setState " Ġ} ĊĠĠĠ Ġ} Ċ }