package Ġnet . cord a . testing Ċ Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . crypto .* Ċ import Ġnet . cord a . core . node . Service Hub Ċ import Ġnet . cord a . core . serialization . serialize Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . transactions . Transaction Builder Ċ import Ġnet . cord a . core . transactions . Wire Transaction Ċ import Ġnet . cord a . core . utilities . D UMMY _ NOT ARY _ KEY Ċ import Ġjava . io . InputStream Ċ import Ġjava . security . KeyPair Ċ import Ġjava . security . PublicKey Ċ import Ġjava . util .* Ċ Ċ //////////////////////////////////////////////////////////////// //////////////////////////////////////////////// //// Ċ // Ċ // ĠHere Ġis Ġa Ġsimple ĠDSL Ġfor Ġbuilding Ġpseudo - transactions Ġ( not Ġthe Ġsame Ġas Ġthe Ġwire Ġprotocol ) Ġfor Ġtesting Ġpurposes . Ċ // Ċ // ĠDefine Ġa Ġtransaction Ġlike Ġthis : Ċ // Ċ // Ġledger Ġ{ Ċ // ĠĠĠĠ Ġtransaction Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġinput Ġ{ Ġsome Expression Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġoutput Ġ{ Ġsome Expression Ġ} Ċ // ĠĠĠĠĠĠĠĠ Ġcommand Ġ{ Ġsome Expression Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġtweak Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ... Ġsame Ġthing Ġbut Ġworks Ġwith Ġa Ġcopy Ġof Ġthe Ġparent , Ġcan Ġadd Ġinputs / outputs / commands Ġjust Ġwithin Ġthis Ġscope . Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠ Ġcontract . ver ifies () Ġ-> Ġverify () Ġshould Ġpass Ċ // ĠĠĠĠĠĠĠĠ Ġcontract Ġ` fails Ġwith ` Ġ" some Ġsubstring Ġof Ġthe Ġerror Ġmessage " Ċ // ĠĠĠĠ Ġ} Ċ // Ġ} Ċ // Ċ Ċ /** Ċ Ġ* ĠHere Ġfollows Ġimplementations Ġof Ġthe Ġ[ Ledger DSL Interpreter ] Ġand Ġ[ Transaction DSL Interpreter ] Ġinterfaces Ġto Ġbe Ġused Ġin Ċ Ġ* Ġtests . ĠTop Ġlevel Ġprimitives Ġ[ ledger ] Ġand Ġ[ transaction ] Ġthat Ġbind Ġthe Ġinterpreter Ġtypes Ġare Ġalso Ġdefined Ġhere . Ċ Ġ*/ Ċ Ċ @ Deprecated ( ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" ledger Ġdoesn 't Ġnest , Ġuse Ġtweak ", ĊĠĠĠĠĠĠĠ Ġreplace With Ġ= ĠReplace With (" tweak "), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ) Ċ @ Suppress (" UNUSED _ PARAMETER ", Ġ" unused ") Ċ fun ĠTransaction DSL Interpreter . ledger ( ĊĠĠĠĠĠĠĠ Ġd sl : ĠLed ger DSL < Test Transaction DSL Interpreter , ĠTest Ledger DSL Interpreter >. () Ġ-> ĠUnit ) Ġ{ Ċ } Ċ Ċ @ Deprecated ( ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" transaction Ġdoesn 't Ġnest , Ġuse Ġtweak ", ĊĠĠĠĠĠĠĠ Ġreplace With Ġ= ĠReplace With (" tweak "), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ) Ċ @ Suppress (" UNUSED _ PARAMETER ", Ġ" unused ") Ċ fun ĠTransaction DSL Interpreter . transaction ( ĊĠĠĠĠĠĠĠ Ġd sl : ĠTransaction DSL < Transaction DSL Interpreter >. () Ġ-> ĠEn force Verify OrFail ) Ġ{ Ċ } Ċ Ċ @ Deprecated ( ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" ledger Ġdoesn 't Ġnest , Ġuse Ġtweak ", ĊĠĠĠĠĠĠĠ Ġreplace With Ġ= ĠReplace With (" tweak "), ĊĠĠĠĠĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . ERROR ) Ċ @ Suppress (" UNUSED _ PARAMETER ", Ġ" unused ") Ċ fun ĠLed ger DSL Interpreter < Transaction DSL Interpreter >. ledger ( ĊĠĠĠĠĠĠĠ Ġd sl : ĠLed ger DSL < Test Transaction DSL Interpreter , ĠTest Ledger DSL Interpreter >. () Ġ-> ĠUnit ) Ġ{ Ċ } Ċ Ċ /** Ċ Ġ* ĠIf Ġyou Ġjump ed Ġhere Ġfrom Ġa Ġcompiler Ġerror Ġmake Ġsure Ġthe Ġlast Ġline Ġof Ġyour Ġtest Ġtests Ġfor Ġa Ġtransaction Ġverify Ġor Ġfail . Ċ Ġ* ĠThis Ġis Ġa Ġdummy Ġtype Ġthat Ġcan Ġonly Ġbe Ġinstantiated Ġby Ġfunctions Ġin Ġthis Ġmodule . ĠThis Ġway Ġwe Ġcan Ġensure Ġthat Ġall Ġtests Ċ Ġ* Ġwill Ġhave Ġas Ġthe Ġlast Ġline Ġeither Ġan Ġaccept Ġor Ġa Ġfailure Ġtest . ĠThe Ġname Ġis Ġdeli ber ately Ġlong Ġto Ġhelp Ġmake Ġsense Ġof Ċ Ġ* Ġthe Ġtriggered Ġdiagnostic . Ċ Ġ*/ Ċ sealed Ġclass ĠEn force Verify OrFail Ġ{ ĊĠĠĠ Ġinternal Ġobject ĠToken Ġ: ĠEn force Verify OrFail () Ċ } Ċ Ċ class ĠDuplicate Output Label ( label : ĠString ) Ġ: ĠException (" Output Ġlabel Ġ'$ label ' Ġalready Ġused ") Ċ class ĠDouble Sp ent Inputs ( ids : ĠList < Secure Hash >) Ġ: ĠException (" Transactions Ġspend Ġthe Ġsame Ġinput . ĠConflict ing Ġtransactions Ġids : Ġ'$ ids '") Ċ class ĠAttachment Resolution Exception ( attachment Id : ĠSecure Hash ) Ġ: ĠException (" Attachment Ġwith Ġid Ġ$ attachment Id Ġnot Ġfound ") Ċ Ċ /** Ċ Ġ* ĠThis Ġinterpreter Ġbuilds Ġa Ġtransaction , Ġand Ġ[ Transaction DSL . ver ifies ] Ġthat Ġthe Ġresolved Ġtransaction Ġis Ġcorrect . ĠNote Ċ Ġ* Ġthat Ġtransactions Ġcorresponding Ġto Ġinput Ġstates Ġare Ġnot Ġverified . ĠUse Ġ[ Ledger DSL . ver ifies ] Ġfor Ġthat . Ċ Ġ*/ Ċ data Ġclass ĠTest Transaction DSL Interpreter Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġledger Interpreter : ĠTest Ledger DSL Interpreter , ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Builder : ĠTransaction Builder , ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġlabel To Index Map : ĠHashMap < String , ĠInt > Ċ ) Ġ: ĠTransaction DSL Interpreter , ĠOutput State Lookup Ġby Ġledger Interpreter Ġ{ ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġledger Interpreter : ĠTest Ledger DSL Interpreter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Builder : ĠTransaction Builder ĊĠĠĠ Ġ) Ġ: Ġthis ( ledger Interpreter , Ġtransaction Builder , ĠHashMap ()) ĊĊĠĠĠ Ġval Ġservices Ġ= Ġobject Ġ: ĠService Hub Ġby Ġledger Interpreter . services Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload State ( state Ref : ĠState Ref ) Ġ= Ġledger Interpreter . resolve State Ref < Contract State >( state Ref ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy (): ĠTest Transaction DSL Interpreter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Transaction DSL Interpreter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġledger Interpreter Ġ= Ġledger Interpreter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Builder Ġ= Ġtransaction Builder . copy (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel To Index Map Ġ= ĠHashMap ( label To Index Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġinternal Ġfun Ġto Wire Transaction () Ġ= Ġtransaction Builder . to Wire Transaction () ĊĊĠĠĠ Ġoverride Ġfun Ġinput ( state Ref : ĠState Ref ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġledger Interpreter . resolve State Ref < Contract State >( state Ref ) ĊĠĠĠĠĠĠĠ Ġtransaction Builder . add Input State ( State And Ref ( state , Ġstate Ref )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ_ output ( label : ĠString ?, Ġnot ary : ĠParty , Ġenc um br ance : ĠInt ?, Ġcontract State : ĠContract State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Index Ġ= Ġtransaction Builder . add Output State ( contract State , Ġnot ary , Ġenc um br ance ) ĊĠĠĠĠĠĠĠ Ġif Ġ( label Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Ġin Ġlabel To Index Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate Output Label ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel To Index Map [ label ] Ġ= Ġoutput Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġattachment ( attachment Id : ĠSecure Hash ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction Builder . add Attachment ( attachment Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ_ command ( sign ers : ĠList < Composite Key >, Ġcommand Data : ĠCommand Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠCommand ( command Data , Ġsign ers ) ĊĠĠĠĠĠĠĠ Ġtransaction Builder . add Command ( command ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġverifies (): ĠEn force Verify OrFail Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġon Ġa Ġcopy Ġof Ġthe Ġtransaction Ġbuilder , Ġso Ġif Ġit 's Ġthen Ġfurther Ġmodified Ġit Ġdoesn 't Ġerror Ġdue Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġexisting Ġsignature ĊĠĠĠĠĠĠĠ Ġtransaction Builder . copy (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign With ( D UMMY _ NOT ARY _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Wire Transaction (). to Ledger Transaction ( services ). verify () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠEn force Verify OrFail . Token ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtimestamp ( data : ĠTimestamp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction Builder . setTime ( data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtweak ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl : ĠTransaction DSL < Transaction DSL Interpreter >. () Ġ-> ĠEn force Verify OrFail ĊĠĠĠ Ġ) Ġ= Ġd sl ( Transaction DSL ( copy ())) Ċ } Ċ Ċ data Ġclass ĠTest Ledger DSL Interpreter Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġservices : ĠService Hub , ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġlabel To Output State And Refs : ĠHashMap < String , ĠState And Ref < Contract State >> Ġ= ĠHashMap (), ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtransaction With Locations : ĠHashMap < Secure Hash , ĠWire Transaction With Location > Ġ= ĠLinkedHashMap (), ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnon Verified Transaction With Locations : ĠHashMap < Secure Hash , ĠWire Transaction With Location > Ġ= ĠHashMap () Ċ ) Ġ: ĠLed ger DSL Interpreter < Test Transaction DSL Interpreter > Ġ{ ĊĠĠĠ Ġval Ġwire Transactions : ĠList < Wire Transaction > Ġget () Ġ= Ġtransaction With Locations . values . map Ġ{ Ġit . transaction Ġ} ĊĊĠĠĠ Ġ// ĠWe Ġspecify Ġ[ label To Output State And Refs ] Ġjust Ġso Ġthat ĠKotlin Ġp icks Ġthe Ġprimary Ġconstructor Ġinstead Ġof Ġcy cl ing ĊĠĠĠ Ġconstructor ( services : ĠService Hub ) Ġ: Ġthis ( services , Ġlabel To Output State And Refs Ġ= ĠHashMap ()) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Caller Location (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Trace Ġ= ĠThread . currentThread (). stack Trace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. stack Trace . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Trace Element Ġ= Ġstack Trace [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! stack Trace Element . fileName . contains (" DSL ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstack Trace Element . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġdata Ġclass ĠWire Transaction With Location ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction : ĠWire Transaction , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation : ĠString ? ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġclass ĠVerifies Failed ( transaction Name : ĠString , Ġcause : ĠThrowable ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException (" Transaction Ġ($ transaction Name ) Ġdidn 't Ġverify : Ġ$ cause ", Ġcause ) ĊĊĠĠĠ Ġclass ĠType Mismatch ( requested : ĠClass <* >, Ġactual : ĠClass <* >) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠException (" Actual Ġtype Ġ$ actual Ġis Ġnot Ġa Ġsubtype Ġof Ġrequested Ġtype Ġ$ requested ") ĊĊĠĠĠ Ġinternal Ġfun Ġcopy (): ĠTest Ledger DSL Interpreter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Ledger DSL Interpreter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel To Output State And Refs Ġ= ĠHashMap ( label To Output State And Refs ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction With Locations Ġ= ĠHashMap ( transaction With Locations ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Verified Transaction With Locations Ġ= ĠHashMap ( non Verified Transaction With Locations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġinternal Ġinline Ġfun Ġ< re ified ĠS Ġ: ĠContract State > Ġresolve State Ref ( state Ref : ĠState Ref ): ĠTransaction State < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction With Location Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction With Locations [ state Ref . tx hash ] Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Verified Transaction With Locations [ state Ref . tx hash ] Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTransaction Resolution Exception ( state Ref . tx hash ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġtransaction With Location . transaction . outputs [ state Ref . index ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( S :: class . java . isAssignableFrom ( output . data . java Class )) Ġ@ Suppress (" UN CHECK ED _ CAST ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġas ĠTransaction State < S > ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠType Mismatch ( requested Ġ= ĠS :: class . java , Ġactual Ġ= Ġoutput . data . java Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġresolve Attachment ( attachment Id : ĠSecure Hash ): ĠAttachment Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . storage Service . attachments . open Attachment ( attachment Id ) Ġ?: Ġthrow ĠAttachment Resolution Exception ( attachment Id ) ĊĊĠĠĠ Ġprivate Ġfun Ġ< R > Ġinterpret Transaction Dsl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Builder : ĠTransaction Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl : ĠTransaction DSL < Test Transaction DSL Interpreter >. () Ġ-> ĠR ĊĠĠĠ Ġ): ĠTest Transaction DSL Interpreter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Interpreter Ġ= ĠTest Transaction DSL Interpreter ( this , Ġtransaction Builder ) ĊĠĠĠĠĠĠĠ Ġd sl ( Transaction DSL ( transaction Interpreter )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction Interpreter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtransaction Name ( transaction Hash : ĠSecure Hash ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction With Location Ġ= Ġtransaction With Locations [ transaction Hash ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( transaction With Location Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction With Location . label Ġ?: Ġ" TX [ ${ transaction With Location . location }] " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoutput To Label ( state : ĠContract State ): ĠString ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel To Output State And Refs . filter Ġ{ Ġit . value . state . data Ġ== Ġstate Ġ}. keys . first OrNull () ĊĊĠĠĠ Ġprivate Ġfun Ġ< R > Ġrecord Transaction With Transaction Map ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Label : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Builder : ĠTransaction Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl : ĠTransaction DSL < Test Transaction DSL Interpreter >. () Ġ-> ĠR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Map : ĠHashMap < Secure Hash , ĠWire Transaction With Location > Ġ= ĠHashMap () ĊĠĠĠ Ġ): ĠWire Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Location Ġ= Ġget Caller Location () ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Interpreter Ġ= Ġinterpret Transaction Dsl ( transaction Builder , Ġd sl ) ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe ĠWire Transaction ĊĠĠĠĠĠĠĠ Ġval Ġwire Transaction Ġ= Ġtransaction Interpreter . to Wire Transaction () ĊĠĠĠĠĠĠĠ Ġ// ĠRecord Ġthe Ġoutput Ġstates ĊĠĠĠĠĠĠĠ Ġtransaction Interpreter . label To Index Map . forEach Ġ{ Ġlabel , Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Ġin Ġlabel To Output State And Refs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDuplicate Output Label ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel To Output State And Refs [ label ] Ġ= Ġwire Transaction . out Ref ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtransaction Map [ wire Transaction . id ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWire Transaction With Location ( transaction Label , Ġwire Transaction , Ġtransaction Location ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwire Transaction ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ_ transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Label : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Builder : ĠTransaction Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl : ĠTransaction DSL < Test Transaction DSL Interpreter >. () Ġ-> ĠEn force Verify OrFail ĊĠĠĠ Ġ) Ġ= Ġrecord Transaction With Transaction Map ( transaction Label , Ġtransaction Builder , Ġd sl , Ġtransaction With Locations ) ĊĊĠĠĠ Ġoverride Ġfun Ġ_ un verified Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Label : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Builder : ĠTransaction Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl : ĠTransaction DSL < Test Transaction DSL Interpreter >. () Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ= Ġrecord Transaction With Transaction Map ( transaction Label , Ġtransaction Builder , Ġd sl , Ġnon Verified Transaction With Locations ) ĊĊĠĠĠ Ġoverride Ġfun Ġtweak ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl : ĠLed ger DSL < Test Transaction DSL Interpreter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger DSL Interpreter < Test Transaction DSL Interpreter >> . () Ġ-> ĠUnit ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl ( Ledger DSL ( copy ())) ĊĊĠĠĠ Ġoverride Ġfun Ġattachment ( attachment : ĠInputStream ): ĠSecure Hash Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġservices . storage Service . attachments . import Attachment ( attachment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġverifies (): ĠEn force Verify OrFail Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġused Inputs Ġ= Ġmutable Set Of < State Ref >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservices . record Transactions ( transactions Un verified . map Ġ{ ĠSigned Transaction ( it . serialized , ĠlistOf ( Null Signature )) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġvalue ) Ġin Ġtransaction With Locations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw tx Ġ= Ġvalue . transaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl tx Ġ= Ġw tx . to Ledger Transaction ( services ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl tx . verify () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdouble S pend Ġ= Ġw tx . inputs . intersect ( used Inputs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! double S pend . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Ids Ġ= Ġmutable ListOf ( w tx . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdouble S pend . map To ( tx Ids ) Ġ{ Ġit . tx hash Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDouble Sp ent Inputs ( tx Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġused Inputs . addAll ( w tx . inputs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservices . record Transactions ( Signed Transaction ( w tx . serialized , ĠlistOf ( Null Signature ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEn force Verify OrFail . Token ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠTransaction Verification Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction With Location Ġ= Ġtransaction With Locations [ exception . tx . id ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Name Ġ= Ġtransaction With Location ?. label Ġ?: Ġtransaction With Location ?. location Ġ?: Ġ"< unknown >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠVerifies Failed ( transaction Name , Ġexception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< S Ġ: ĠContract State > Ġretrieve Output State And Ref ( clazz : ĠClass < S >, Ġlabel : ĠString ): ĠState And Ref < S > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate And Ref Ġ= Ġlabel To Output State And Refs [ label ] ĊĠĠĠĠĠĠĠ Ġif Ġ( state And Ref Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" State Ġwith Ġlabel Ġ'$ label ' Ġwas Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! clazz . isAssignableFrom ( state And Ref . state . data . java Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠType Mismatch ( requested Ġ= Ġclazz , Ġactual Ġ= Ġstate And Ref . state . data . java Class ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstate And Ref Ġas ĠState And Ref < S > ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtransactions To Verify : ĠList < Wire Transaction > Ġget () Ġ= Ġtransaction With Locations . values . map Ġ{ Ġit . transaction Ġ} ĊĠĠĠ Ġval Ġtransactions Un verified : ĠList < Wire Transaction > Ġget () Ġ= Ġnon Verified Transaction With Locations . values . map Ġ{ Ġit . transaction Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSign s Ġall Ġtransactions Ġpassed Ġin . Ċ Ġ* Ġ@ param Ġtransactions To Sign ĠTransactions Ġto Ġbe Ġsigned . Ċ Ġ* Ġ@ param Ġextra Keys Ġextra Ġkeys Ġto Ġsign Ġtransactions Ġwith . Ċ Ġ* Ġ@ return ĠList Ġof Ġ[ Signed Transaction ] s . Ċ Ġ*/ Ċ fun Ġsign All ( transactions To Sign : ĠList < Wire Transaction >, Ġextra Keys : ĠList < KeyPair >) Ġ= Ġtransactions To Sign . map Ġ{ Ġw tx Ġ-> ĊĠĠĠ Ġcheck ( w tx . must Sign . isNotEmpty ()) ĊĠĠĠ Ġval Ġbits Ġ= Ġw tx . serialize () ĊĠĠĠ Ġrequire ( bits Ġ== Ġw tx . serialized ) ĊĠĠĠ Ġval Ġsignatures Ġ= ĠArrayList < Digital Signature . With Key >() ĊĠĠĠ Ġval Ġkey Lookup Ġ= ĠHashMap < PublicKey , ĠKey Pair >() ĊĊĠĠĠ Ġ( ALL _ TEST _ KEYS Ġ+ Ġextra Keys ). forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġkey Lookup [ it . public ] Ġ= Ġit ĊĠĠĠ Ġ} ĊĠĠĠ Ġw tx . must Sign . keys . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġkey Lookup [ it ] Ġ?: Ġthrow ĠIllegalArgumentException (" Missing Ġrequired Ġkey Ġfor Ġ${ it . toString Short () }") ĊĠĠĠĠĠĠĠ Ġsignatures Ġ+= Ġkey . sign With ECD SA ( w tx . id ) ĊĠĠĠ Ġ} ĊĠĠĠ ĠSigned Transaction ( bits , Ġsignatures ) Ċ } Ċ Ċ /** Ċ Ġ* ĠSign s Ġall Ġtransactions Ġin Ġthe Ġledger . Ċ Ġ* Ġ@ param Ġextra Keys Ġextra Ġkeys Ġto Ġsign Ġtransactions Ġwith . Ċ Ġ* Ġ@ return ĠList Ġof Ġ[ Signed Transaction ] s . Ċ Ġ*/ Ċ fun ĠLed ger DSL < Test Transaction DSL Interpreter , ĠTest Ledger DSL Interpreter >. sign All ( ĊĠĠĠĠĠĠĠ Ġvar arg Ġextra Keys : ĠKey Pair ) Ġ= Ġsign All ( this . interpreter . wire Transactions , Ġextra Keys . toList ()) Ċ