package Ġnet . cord a . core . transactions Ċ Ċ import Ġcom . es ot eric software . k ry o . K ry o Ċ import Ġ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 . indexOf OrThrow Ċ import Ġnet . cord a . core . node . Service Hub Ċ import Ġnet . cord a . core . serialization . Serialized Bytes Ċ import Ġnet . cord a . core . serialization . THREAD _ LOCAL _ KR YO Ċ import Ġnet . cord a . core . serialization . deserialize Ċ import Ġnet . cord a . core . serialization . serialize Ċ import Ġnet . cord a . core . utilities . Emoji Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . security . PublicKey Ċ Ċ /** Ċ Ġ* ĠA Ġtransaction Ġready Ġfor Ġserial isation , Ġwithout Ġany Ġsignatures Ġattached . ĠA ĠWire Transaction Ġis Ġusually Ġwrapped Ċ Ġ* Ġby Ġa Ġ[ Signed Transaction ] Ġthat Ġcar ries Ġthe Ġsignatures Ġover Ġthis Ġpayload . ĠThe Ġhash Ġof Ġthe Ġwire Ġtransaction Ġis Ċ Ġ* Ġthe Ġidentity Ġof Ġthe Ġtransaction , Ġthat Ġis , Ġit 's Ġpossible Ġfor Ġtwo Ġ[ Signed Transaction ] s Ġwith Ġdifferent Ġsets Ġof Ċ Ġ* Ġsignatures Ġto Ġhave Ġthe Ġsame Ġidentity Ġhash . Ċ Ġ*/ Ċ class ĠWire Transaction ( ĊĠĠĠĠĠĠĠ Ġ/** ĠPointer s Ġto Ġthe Ġinput Ġstates Ġon Ġthe Ġledger , Ġidentified Ġby Ġ( tx Ġidentity Ġhash , Ġoutput Ġindex ). Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġinputs : ĠList < State Ref >, ĊĠĠĠĠĠĠĠ Ġ/** ĠHas hes Ġof Ġthe ĠZIP / JAR Ġfiles Ġthat Ġare Ġneeded Ġto Ġinterpret Ġthe Ġcontents Ġof Ġthis Ġwire Ġtransaction . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġattachments : ĠList < Secure Hash >, ĊĠĠĠĠĠĠĠ Ġoutputs : ĠList < Transaction State < Contract State >>, ĊĠĠĠĠĠĠĠ Ġ/** ĠOrdered Ġlist Ġof Ġ([ Command Data ], Ġ[ PublicKey ]) Ġpairs Ġthat Ġinstruct Ġthe Ġcontracts Ġwhat Ġto Ġdo . Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġcommands : ĠList < Command >, ĊĠĠĠĠĠĠĠ Ġnot ary : ĠParty ?, ĊĠĠĠĠĠĠĠ Ġsign ers : ĠList < Composite Key >, ĊĠĠĠĠĠĠĠ Ġtype : ĠTransaction Type , ĊĠĠĠĠĠĠĠ Ġtimestamp : ĠTimestamp ? Ċ ) Ġ: ĠBase Transaction ( inputs , Ġoutputs , Ġnot ary , Ġsign ers , Ġtype , Ġtimestamp ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck In variants () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCache Ġthe Ġserial ised Ġform Ġof Ġthe Ġtransaction Ġand Ġits Ġhash Ġto Ġgive Ġus Ġfast Ġaccess Ġto Ġit . ĊĠĠĠ Ġ@ Volatile Ġ@ Transient Ġprivate Ġvar Ġcached Bytes : ĠSerialized Bytes < Wire Transaction >? Ġ= Ġnull ĊĠĠĠ Ġval Ġserialized : ĠSerialized Bytes < Wire Transaction > Ġget () Ġ= Ġcached Bytes Ġ?: Ġserialize (). apply Ġ{ Ġcached Bytes Ġ= Ġthis Ġ} ĊĊĠĠĠ Ġ// We Ġneed Ġcas hed Ġleaves Ġhashes Ġand Ġwhole Ġtree Ġfor Ġan Ġid Ġand ĠPartial ĠMer kle ĠTree Ġcalculation . ĊĠĠĠ Ġ@ Volatile Ġ@ Transient Ġprivate Ġvar Ġcached Le aves Hashes : ĠList < Secure Hash >? Ġ= Ġnull ĊĠĠĠ Ġval Ġall Le aves Hashes : ĠList < Secure Hash > Ġget () Ġ= Ġcached Le aves Hashes Ġ?: Ġcalculate Le aves Hashes (). apply Ġ{ Ġcached Le aves Hashes Ġ= Ġthis Ġ} ĊĊĠĠĠ Ġ@ Volatile Ġ@ Transient Ġvar Ġcached Tree : ĠMer kle Tree ? Ġ= Ġnull ĊĠĠĠ Ġval Ġmer kle Tree : ĠMer kle Tree Ġget () Ġ= Ġcached Tree Ġ?: ĠMer kle Tree . get Mer kle Tree ( all Le aves Hashes ). apply Ġ{ Ġcached Tree Ġ= Ġthis Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġid : ĠSecure Hash Ġget () Ġ= Ġmer kle Tree . hash ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdeserialize ( data : ĠSerialized Bytes < Wire Transaction >, Ġk ry o : ĠK ry o Ġ= ĠTHREAD _ LOCAL _ KR YO . get ()): ĠWire Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw tx Ġ= Ġdata . bytes . deserialize < Wire Transaction >( k ry o ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw tx . cached Bytes Ġ= Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġw tx ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġ[ State And Ref ] Ġfor Ġthe Ġgiven Ġoutput Ġindex . Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠContract State > Ġout Ref ( index : ĠInt ): ĠState And Ref < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( index Ġ>= Ġ 0 Ġ&& Ġindex Ġ< Ġoutputs . size ) ĊĠĠĠĠĠĠĠ Ġreturn ĠState And Ref ( outputs [ index ] Ġas ĠTransaction State < T >, ĠState Ref ( id , Ġindex )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġ[ State And Ref ] Ġfor Ġthe Ġrequested Ġoutput Ġstate , Ġor Ġthrows Ġ[ IllegalArgumentException ] Ġif Ġnot Ġfound . Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠContract State > Ġout Ref ( state : ĠContract State ): ĠState And Ref < T > Ġ= Ġout Ref ( outputs . map Ġ{ Ġit . data Ġ}. indexOf OrThrow ( state )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLooks Ġup Ġident ities Ġand Ġattachments Ġfrom Ġstorage Ġto Ġgenerate Ġa Ġ[ Ledger Transaction ]. ĠA Ġtransaction Ġis Ġexpected Ġto ĊĠĠĠĠ Ġ* Ġhave Ġbeen Ġfully Ġresolved Ġusing Ġthe Ġresolution Ġflow Ġby Ġthis Ġpoint . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠFileNotFoundException Ġif Ġa Ġrequired Ġattachment Ġwas Ġnot Ġfound Ġin Ġstorage . ĊĠĠĠĠ Ġ* Ġ@ throws ĠTransaction Resolution Exception Ġif Ġan Ġinput Ġpoints Ġto Ġa Ġtransaction Ġnot Ġfound Ġin Ġstorage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( FileNotFoundException :: class , ĠTransaction Resolution Exception :: class ) ĊĠĠĠ Ġfun Ġto Ledger Transaction ( services : ĠService Hub ): ĠLed ger Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLook Ġup Ġpublic Ġkeys Ġto Ġauthenticated Ġident ities . ĠThis Ġis Ġjust Ġa Ġstub Ġplaceholder Ġand Ġwill Ġall Ġchange Ġin Ġfuture . ĊĠĠĠĠĠĠĠ Ġval Ġauthenticated Args Ġ= Ġcommands . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparties Ġ= Ġit . sign ers . map NotNull Ġ{ Ġpk Ġ-> Ġservices . identity Service . party From Key ( pk ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth enticated Object ( it . sign ers , Ġparties , Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠOpen Ġattachments Ġspecified Ġin Ġthis Ġtransaction . ĠIf Ġwe Ġhaven 't Ġdownloaded Ġthem , Ġwe Ġfail . ĊĠĠĠĠĠĠĠ Ġval Ġattachments Ġ= Ġattachments . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . storage Service . attachments . open Attachment ( it ) Ġ?: Ġthrow ĠFileNotFoundException ( it . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresolved Inputs Ġ= Ġinputs . map Ġ{ ĠState And Ref ( services . load State ( it ), Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠLed ger Transaction ( resolved Inputs , Ġoutputs , Ġauthenticated Args , Ġattachments , Ġid , Ġnot ary , Ġmust Sign , Ġtimestamp , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġbuf . append ln (" Transaction Ġ$ id :") ĊĠĠĠĠĠĠĠ Ġfor Ġ( input Ġin Ġinputs ) Ġbuf . append ln ("${ Emoji . right Arrow } INPUT : ĠĠĠĠĠ Ġ$ input ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( output Ġin Ġoutputs ) Ġbuf . append ln ("${ Emoji . left Arrow } OUTPUT : ĠĠĠĠ Ġ$ output ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( command Ġin Ġcommands ) Ġbuf . append ln ("${ Emoji . di amond } COMMAND : ĠĠĠ Ġ$ command ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( attachment Ġin Ġattachments ) Ġbuf . append ln ("${ Emoji . paper clip } ATTACHMENT : Ġ$ attachment ") ĊĠĠĠĠĠĠĠ Ġreturn Ġbuf . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : ĠWhen ĠKotlin Ġ 1 . 1 Ġcomes Ġout Ġwe Ġcan Ġmake Ġthis Ġclass Ġa Ġdata Ġclass Ġagain , Ġand Ġhave Ġthese Ġbe Ġautogenerated . ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other ?. java Class Ġ!= Ġjava Class ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! super . equals ( other )) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġother Ġas ĠWire Transaction ĊĊĠĠĠĠĠĠĠ Ġif Ġ( inputs Ġ!= Ġother . inputs ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( attachments Ġ!= Ġother . attachments ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( outputs Ġ!= Ġother . outputs ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( commands Ġ!= Ġother . commands ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġsuper . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġinputs . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġattachments . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġoutputs . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġcommands . hashCode () ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ