package Ġnet . cord a . core . contracts Ċ Ċ import Ġnet . cord a . core . crypto . Composite Key Ċ import Ġnet . cord a . core . crypto . Party Ċ import Ġnet . cord a . core . crypto . Secure Hash Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġjava . util .* Ċ Ċ // ĠTODO : ĠConsider Ġmoving Ġthis Ġout Ġof Ġthe Ġcore Ġmodule Ġand Ġproviding Ġa Ġdifferent Ġway Ġfor Ġunit Ġtests Ġto Ġtest Ġcontracts . Ċ Ċ /** Ċ Ġ* ĠA Ġtransaction Ġto Ġbe Ġpassed Ġas Ġinput Ġto Ġa Ġcontract Ġverification Ġfunction . ĠDefines Ġhelper Ġmethods Ġto Ċ Ġ* Ġsimplify Ġverification Ġlogic Ġin Ġcontracts . Ċ Ġ*/ Ċ data Ġclass ĠTransaction For Contract ( val Ġinputs : ĠList < Contract State >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutputs : ĠList < Contract State >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattachments : ĠList < Attachment >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommands : ĠList < Authenticated Object < Command Data >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorig Hash : ĠSecure Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Not ary : ĠParty ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp : ĠTimestamp ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġorig Hash . hashCode () ĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠTransaction For Contract Ġ&& Ġother . orig Hash Ġ== Ġorig Hash ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġtype Ġand Ġa Ġfunction Ġthat Ġreturns Ġa Ġgrouping Ġkey , Ġassoci ates Ġinputs Ġand Ġoutputs Ġtogether Ġso Ġthat Ġthey ĊĠĠĠĠ Ġ* Ġcan Ġbe Ġprocessed Ġas Ġone . ĠThe Ġgrouping Ġkey Ġis Ġany Ġarbitrary Ġobject Ġthat Ġcan Ġact Ġas Ġa Ġmap Ġkey Ġ( so Ġmust Ġimplement ĊĠĠĠĠ Ġ* Ġequals Ġand ĠhashCode ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġpurpose Ġof Ġthis Ġfunction Ġis Ġto Ġsimplify Ġthe Ġwriting Ġof Ġverification Ġlogic Ġfor Ġtransactions Ġthat Ġmay Ġcontain ĊĠĠĠĠ Ġ* Ġsimilar Ġbut Ġunrelated Ġstate Ġevolution s Ġwhich Ġneed Ġto Ġbe Ġchecked Ġindependently . ĠConsider Ġa Ġtransaction Ġthat ĊĠĠĠĠ Ġ* Ġsimultaneously Ġmoves Ġboth Ġdollar s Ġand Ġeu ros Ġ( e . g . Ġis Ġan Ġatomic ĠFX Ġtrade ). ĠThere Ġmay Ġbe Ġmultiple Ġdollar Ġinputs Ġand ĊĠĠĠĠ Ġ* Ġmultiple Ġdollar Ġoutputs , Ġdepending Ġon Ġthings Ġlike Ġhow Ġfragment ed Ġthe Ġowner 's Ġvault Ġis Ġand Ġwhether Ġvarious Ġprivacy ĊĠĠĠĠ Ġ* Ġtechniques Ġare Ġin Ġuse . ĠThe Ġquantity Ġof Ġdollar s Ġon Ġthe Ġoutput Ġside Ġmust Ġsum Ġto Ġthe Ġsame Ġas Ġon Ġthe Ġinput Ġside , Ġto ĊĠĠĠĠ Ġ* Ġensure Ġno Ġmoney Ġis Ġbeing Ġlost Ġtrack Ġof . ĠThis Ġsum m ation Ġand Ġchecking Ġmust Ġbe Ġrepeated Ġindependently Ġfor Ġeach ĊĠĠĠĠ Ġ* Ġcurrency . ĠTo Ġsolve Ġthis , Ġyou Ġwould Ġuse Ġgroup States Ġwith Ġa Ġtype Ġof ĠCash . State Ġand Ġa Ġselector Ġthat Ġreturns Ġthe ĊĠĠĠĠ Ġ* Ġcurrency Ġfield : Ġthe Ġresulting Ġlist Ġcan Ġthen Ġbe Ġiter ated Ġover Ġto Ġperform Ġthe Ġper - currency Ġcalculation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠContract State , ĠK Ġ: ĠAny > Ġgroup States ( of Type : ĠClass < T >, Ġselector : Ġ( T ) Ġ-> ĠK ): ĠList < InOut Group < T , ĠK >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinputs Ġ= Ġinputs . filter Is Instance ( of Type ) ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġoutputs . filter Is Instance ( of Type ) ĊĊĠĠĠĠĠĠĠ Ġval Ġin Groups : ĠMap < K , ĠList < T >> Ġ= Ġinputs . groupBy ( selector ) ĊĠĠĠĠĠĠĠ Ġval Ġout Groups : ĠMap < K , ĠList < T >> Ġ= Ġoutputs . groupBy ( selector ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġreturn Ġgroup States Internal ( in Groups , Ġout Groups ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSee Ġthe Ġdocumentation Ġfor Ġthe Ġreflection - based Ġversion Ġof Ġ[ group States ] Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠContract State , ĠK Ġ: ĠAny > Ġgroup States ( selector : Ġ( T ) Ġ-> ĠK ): ĠList < InOut Group < T , ĠK >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinputs Ġ= Ġinputs . filter Is Instance < T >() ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġoutputs . filter Is Instance < T >() ĊĊĠĠĠĠĠĠĠ Ġval Ġin Groups : ĠMap < K , ĠList < T >> Ġ= Ġinputs . groupBy ( selector ) ĊĠĠĠĠĠĠĠ Ġval Ġout Groups : ĠMap < K , ĠList < T >> Ġ= Ġoutputs . groupBy ( selector ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġreturn Ġgroup States Internal ( in Groups , Ġout Groups ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Deprecated (" Do Ġnot Ġuse Ġthis Ġdirectly : Ġexposed Ġas Ġpublic Ġonly Ġdue Ġto Ġfunction Ġin lining ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠContract State , ĠK Ġ: ĠAny > Ġgroup States Internal ( in Groups : ĠMap < K , ĠList < T >>, Ġout Groups : ĠMap < K , ĠList < T >> ): ĠList < InOut Group < T , ĠK >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < InOut Group < T , ĠK >>() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġin Groups . entries ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( InOut Group ( v , Ġout Groups [ k ] Ġ?: Ġempty List (), Ġk )) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġout Groups . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( in Groups [ k ] Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( InOut Group ( emptyList (), Ġv , Ġk )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUtilities Ġfor Ġcontract Ġwrit ers Ġto Ġincorpor ate Ġinto Ġtheir Ġlogic . Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġset Ġof Ġrelated Ġinputs Ġand Ġoutputs Ġthat Ġare Ġconnected Ġby Ġsome Ġcommon Ġattributes . ĠAn ĠIn Out Group Ġis Ġcalculated ĊĠĠĠĠ Ġ* Ġusing Ġ[ group States ] Ġand Ġis Ġuseful Ġfor Ġhandling Ġcases Ġwhere Ġa Ġtransaction Ġmay Ġcontain Ġsimilar Ġbut Ġunrelated ĊĠĠĠĠ Ġ* Ġstate Ġevolution s , Ġfor Ġexample , Ġa Ġtransaction Ġthat Ġmoves Ġcash Ġin Ġtwo Ġdifferent Ġc urrencies . ĠThe Ġnumbers Ġmust Ġadd ĊĠĠĠĠ Ġ* Ġup Ġon Ġboth Ġsides Ġof Ġthe Ġtransaction , Ġbut Ġthe Ġvalues Ġmust Ġbe Ġsum med Ġindependently Ġper Ġcurrency . ĠGroup ing Ġcan ĊĠĠĠĠ Ġ* Ġbe Ġused Ġto Ġsimplify Ġthis Ġlogic . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠIn Out Group < out ĠT Ġ: ĠContract State , Ġout ĠK Ġ: ĠAny >( val Ġinputs : ĠList < T >, Ġval Ġoutputs : ĠList < T >, Ġval Ġgrouping Key : ĠK ) Ċ } Ċ Ċ class ĠTransaction Resolution Exception ( val Ġhash : ĠSecure Hash ) Ġ: ĠException () Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Transaction Ġresolution Ġfailure Ġfor Ġ$ hash " Ċ } Ċ Ċ class ĠTransaction Conflict Exception ( val Ġconflict Ref : ĠState Ref , Ġval Ġtx 1 : ĠLed ger Transaction , Ġval Ġtx 2 : ĠLed ger Transaction ) Ġ: ĠException () Ċ Ċ sealed Ġclass ĠTransaction Verification Exception ( val Ġtx : ĠLed ger Transaction , Ġcause : ĠThrowable ?) Ġ: ĠException ( cause ) Ġ{ ĊĠĠĠ Ġclass ĠContract Rejection ( tx : ĠLed ger Transaction , Ġval Ġcontract : ĠContract , Ġcause : ĠThrowable ?) Ġ: ĠTransaction Verification Exception ( tx , Ġcause ) ĊĠĠĠ Ġclass ĠMore Than One Not ary ( tx : ĠLed ger Transaction ) Ġ: ĠTransaction Verification Exception ( tx , Ġnull ) ĊĠĠĠ Ġclass ĠSign ers Missing ( tx : ĠLed ger Transaction , Ġval Ġmissing : ĠList < Composite Key >) Ġ: ĠTransaction Verification Exception ( tx , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Sign ers Ġmissing : Ġ${ missing . join ToString () }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠInvalid Not ary Change ( tx : ĠLed ger Transaction ) Ġ: ĠTransaction Verification Exception ( tx , Ġnull ) ĊĠĠĠ Ġclass ĠNot ary Change In Wrong Transaction Type ( tx : ĠLed ger Transaction , Ġval Ġoutput Not ary : ĠParty ) Ġ: ĠTransaction Verification Exception ( tx , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Found Ġunexpected Ġnot ary Ġchange Ġin Ġtransaction . ĠTx Ġnot ary : Ġ${ tx . not ary }, Ġfound : Ġ${ output Not ary }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTransaction Missing Enc um br ance Exception ( tx : ĠLed ger Transaction , Ġval Ġmissing : ĠInt , Ġval Ġin Out : ĠDirection ) Ġ: ĠTransaction Verification Exception ( tx , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġmessage : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Missing Ġrequired Ġenc um br ance Ġ${ missing } Ġin Ġ${ in Out }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠDirection Ġ{ ĊĠĠĠĠĠĠĠ ĠINPUT , ĊĠĠĠĠĠĠĠ ĠOUTPUT ĊĠĠĠ Ġ} Ċ } Ċ