package Ġnet . cord a . node . services . vault . schemas Ċ Ċ import Ġio . re query . Persist able Ċ import Ġio . re query . Transaction Isolation Ċ import Ġio . re query . kotlin .` in ` Ċ import Ġio . re query . kotlin . eq Ċ import Ġio . re query . kotlin . invoke Ċ import Ġio . re query . kotlin . isNull Ċ import Ġio . re query . query . Row Expression Ċ import Ġio . re query . rx . Kotlin Rx Entity Store Ċ import Ġio . re query . sql .* Ċ import Ġio . re query . sql . platform . Generic Ċ import Ġnet . cord a . core . contracts .* Ċ import Ġnet . cord a . core . crypto .* Ċ import Ġnet . cord a . core . node . services . Vault Ċ import Ġnet . cord a . core . schemas . re query . converters . Instant Converter Ċ import Ġnet . cord a . core . schemas . re query . converters . Vault State Status Converter Ċ import Ġnet . cord a . core . serialization . deserialize Ċ import Ġnet . cord a . core . serialization . serialize Ċ import Ġnet . cord a . core . transactions . Ledger Transaction Ċ import Ġnet . cord a . core . utilities . D UMMY _ NOT ARY Ċ import Ġnet . cord a . core . utilities . D UMMY _ NOT ARY _ KEY Ċ import Ġnet . cord a . core . utilities . D UMMY _ PUB KEY _ 1 Ċ import Ġnet . cord a . core . utilities . D UMMY _ PUB KEY _ 2 Ċ import Ġorg . h 2 . jdbc x . Jdbc DataSource Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġrx . Observable Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . assertNull Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠVault Schema Test Ġ{ ĊĊĠĠĠ Ġvar Ġinstance Ġ: ĠKotlin Entity DataStore < Persist able >? Ġ= Ġnull ĊĠĠĠ Ġval Ġdata Ġ: ĠKotlin Entity DataStore < Persist able > Ġget () Ġ= Ġinstance !! ĊĊĠĠĠ Ġvar Ġo instance Ġ: ĠKotlin Rx Entity Store < Persist able >? Ġ= Ġnull ĊĠĠĠ Ġval Ġo data Ġ: ĠKotlin Rx Entity Store < Persist able > Ġget () Ġ= Ġo instance !! ĊĊĠĠĠ Ġvar Ġtransaction Ġ: ĠLed ger Transaction ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠdataSource Ġ= ĠJdbc DataSource () ĊĠĠĠĠĠĠĠ ĠdataSource . set URL (" jdbc : h 2 : mem : vault _ persistence ; DB _ CLOSE _ ON _ EXIT = FALSE ; DB _ CLOSE _ DELAY =- 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠKotlin Configuration ( dataSource Ġ= ĠdataSource , Ġmodel Ġ= ĠModels . VA ULT , Ġmapping Ġ= Ġsetup Custom Mapping ()) ĊĠĠĠĠĠĠĠ Ġinstance Ġ= ĠKotlin Entity DataStore < Persist able >( configuration ) ĊĠĠĠĠĠĠĠ Ġo instance Ġ= ĠKotlin Rx Entity Store ( Kotlin Entity DataStore < Persist able >( configuration )) ĊĠĠĠĠĠĠĠ Ġval Ġtables Ġ= ĠSchema Modifier ( configuration ) ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= ĠTable Creation Mode . DROP _ CREATE ĊĠĠĠĠĠĠĠ Ġtables . create Tables ( mode ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġdummy Ġtest Ġdata ĊĠĠĠĠĠĠĠ Ġsetup Dummy Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ Ġsetup Custom Mapping (): ĠMapping ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapping Ġ= ĠGeneric Mapping ( Generic ()) ĊĠĠĠĠĠĠĠ Ġval Ġinstant Converter Ġ= ĠInstant Converter () ĊĠĠĠĠĠĠĠ Ġmapping . add Converter ( instant Converter , Ġinstant Converter . mapped Type ) ĊĠĠĠĠĠĠĠ Ġval Ġvault State Status Converter Ġ= ĠVault State Status Converter () ĊĠĠĠĠĠĠĠ Ġmapping . add Converter ( vault State Status Converter , Ġvault State Status Converter . mapped Type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmapping ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠVault No op Contract () Ġ: ĠContract Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġlegal Contract Reference Ġ= ĠSecure Hash . sha 2 5 6 ("") ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠVault No op State ( override Ġval Ġowner : ĠComposite Key ) Ġ: ĠOwn able State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġcontract Ġ= ĠVault No op Contract () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġparticipants : ĠList < Composite Key > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠlistOf ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwith New Owner ( new Owner : ĠComposite Key ) Ġ= ĠPair ( Commands . Create (), Ġcopy ( owner Ġ= Ġnew Owner )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinterface ĠCommands Ġ: ĠCommand Data Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠCreate Ġ: ĠType Only Command Data (), ĠCommands ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġverify ( tx : ĠTransaction For Contract ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlways Ġaccepts . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Dummy Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdummy ĠTransaction ĊĠĠĠĠĠĠĠ Ġval Ġnot ary : ĠParty Ġ= ĠD UMMY _ NOT ARY ĊĠĠĠĠĠĠĠ Ġval Ġin State 1 Ġ= ĠTransaction State ( Dummy Contract . Single Owner State ( 0 , ĠD UMMY _ PUB KEY _ 1 ), Ġnot ary ) ĊĠĠĠĠĠĠĠ Ġval Ġin State 2 Ġ= ĠTransaction State ( Dummy Contract . Multi Owner State ( 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( D UMMY _ PUB KEY _ 1 , ĠD UMMY _ PUB KEY _ 2 )), Ġnot ary ) ĊĠĠĠĠĠĠĠ Ġval Ġin State 3 Ġ= ĠTransaction State ( Vault No op Contract . Vault No op State ( D UMMY _ PUB KEY _ 1 ), Ġnot ary ) ĊĠĠĠĠĠĠĠ Ġval Ġout State 1 Ġ= Ġin State 1 . copy () ĊĠĠĠĠĠĠĠ Ġval Ġout State 2 Ġ= Ġin State 2 . copy () ĊĠĠĠĠĠĠĠ Ġval Ġout State 3 Ġ= Ġin State 3 . copy () ĊĠĠĠĠĠĠĠ Ġval Ġinputs Ġ= ĠlistOf ( State And Ref ( in State 1 , ĠState Ref ( Secure Hash . random SHA 2 5 6 (), Ġ 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState And Ref ( in State 2 , ĠState Ref ( Secure Hash . random SHA 2 5 6 (), Ġ 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState And Ref ( in State 3 , ĠState Ref ( Secure Hash . random SHA 2 5 6 (), Ġ 0 ))) ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= ĠlistOf ( out State 1 , Ġout State 2 , Ġout State 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġcommands Ġ= Ġempty List < Authenticated Object < Command Data >>() ĊĠĠĠĠĠĠĠ Ġval Ġattachments Ġ= Ġempty List < Attachment >() ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠSecure Hash . random SHA 2 5 6 () ĊĠĠĠĠĠĠĠ Ġval Ġsign ers Ġ= ĠlistOf ( D UMMY _ NOT ARY _ KEY . public . composite ) ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp : ĠTimestamp ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtransaction Ġ= ĠLed ger Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinputs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommands , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign ers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Type . General () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Txn With Two State Types (): ĠLed ger Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnot ary : ĠParty Ġ= ĠD UMMY _ NOT ARY ĊĠĠĠĠĠĠĠ Ġval Ġin State 1 Ġ= ĠTransaction State ( Dummy Contract . Single Owner State ( 0 , ĠD UMMY _ PUB KEY _ 1 ), Ġnot ary ) ĊĠĠĠĠĠĠĠ Ġval Ġin State 2 Ġ= ĠTransaction State ( Dummy Contract . Multi Owner State ( 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( D UMMY _ PUB KEY _ 1 , ĠD UMMY _ PUB KEY _ 2 )), Ġnot ary ) ĊĠĠĠĠĠĠĠ Ġval Ġout State 1 Ġ= Ġin State 1 . copy () ĊĠĠĠĠĠĠĠ Ġval Ġout State 2 Ġ= Ġin State 2 . copy () ĊĠĠĠĠĠĠĠ Ġval Ġstate 1 Tx Hash Ġ= ĠSecure Hash . random SHA 2 5 6 () ĊĠĠĠĠĠĠĠ Ġval Ġstate 2 Tx Hash Ġ= ĠSecure Hash . random SHA 2 5 6 () ĊĠĠĠĠĠĠĠ Ġval Ġinputs Ġ= ĠlistOf ( State And Ref ( in State 1 , ĠState Ref ( state 1 Tx Hash , Ġ 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState And Ref ( in State 1 , ĠState Ref ( state 1 Tx Hash , Ġ 1 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState And Ref ( in State 2 , ĠState Ref ( state 2 Tx Hash , Ġ 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState And Ref ( in State 1 , ĠState Ref ( state 1 Tx Hash , Ġ 2 ))) Ġ Ġ// Ġb og us Ġstate Ġnot Ġin Ġdb ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= ĠlistOf ( out State 1 , Ġout State 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġcommands Ġ= Ġempty List < Authenticated Object < Command Data >>() ĊĠĠĠĠĠĠĠ Ġval Ġattachments Ġ= Ġempty List < Attachment >() ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠSecure Hash . random SHA 2 5 6 () ĊĠĠĠĠĠĠĠ Ġval Ġsign ers Ġ= ĠlistOf ( D UMMY _ NOT ARY _ KEY . public . composite ) ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp : ĠTimestamp ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠLed ger Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinputs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommands , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattachments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign ers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransaction Type . General () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdummy States Insert ( txn : ĠLed ger Transaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġinserting Ġthe Ġlast Ġtxn Ġstate Ġ( to Ġm imic Ġspend Ġattempt Ġof Ġnon Ġexist ent Ġun consumed Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxn . inputs . sub List ( 0 Ġ, Ġtxn . inputs . last Index ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( create State Entity ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġadditional Ġstate Ġentities Ġwith Ġidx Ġ> 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 3 .. 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcreateState Entity ( it , Ġidx Ġ= Ġi ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġadditional Ġstate Ġentities Ġwith Ġdifferent Ġtxn Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcreateState Entity ( it , Ġtx Hash Ġ= ĠSecure Hash . random SHA 2 5 6 (). toString ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinsert Ġan Ġadditional ĠMulti Owner State Ġwith Ġidx Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( create State Entity ( txn . inputs [ 2 ], Ġidx Ġ= Ġ 1 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinsert Ġentities Ġwith Ġother Ġstate Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVault States Entity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Id Ġ= ĠSecure Hash . random SHA 2 5 6 (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontract State ClassName Ġ= ĠVault No op Contract . Vault No op State :: class . java . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Status Ġ= ĠVault . State Status . UN CON SU MED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġtotal Ġn umn er Ġof Ġinserted Ġstates ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 + 4 + 9 + 1 + 5 , Ġdata . select ( Vault Schema . Vault States :: class ). get (). count ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠVault ĠSchema : ĠVault States ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠVault States Entity () ĊĠĠĠĠĠĠĠ Ġstate . tx Id Ġ= Ġ" 1 2 3 4 5 " ĊĠĠĠĠĠĠĠ Ġstate . index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) Ġwhere Ġ( Vault Schema . Vault States :: tx Id Ġeq Ġstate . tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( state , Ġresult (). first ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Up sert Un consumed State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( transaction !!. inputs [ 0 ]) ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( state Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) Ġwhere Ġ( Vault Schema . Vault States :: tx Id Ġeq Ġstate Entity . tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( state Entity , Ġresult (). first ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Up sert Cons umed State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( transaction !!. inputs [ 0 ]) ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( state Entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġmap Of ( Vault States Entity . TX _ ID Ġto Ġstate Entity . tx Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVault States Entity . INDEX Ġto Ġstate Entity . index ) ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġio . re query . proxy . Composite Key ( keys ) ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġfind ByKey ( Vault States Entity :: class , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Status Ġ= ĠVault . State Status . CON SU MED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumed Time Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) Ġwhere Ġ( Vault Schema . Vault States :: tx Id Ġeq Ġstate . tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Vault . State Status . CON SU MED , Ġresult (). first (). state Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cash Balance Update () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcash Balance Entity Ġ= ĠVault Cash Balances Entity () ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . currency Ġ= Ġ" USD " ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . amount Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġfind ByKey ( Vault Cash Balances Entity :: class , Ġcash Balance Entity . currency ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( cash Balance Entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġfind ByKey ( Vault Cash Balances Entity :: class , Ġcash Balance Entity . currency ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . amount Ġ-= Ġ 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 , Ġstate !!. amount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Transactional Up sert State () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . with Transaction ( Transaction Isolation . REPEAT ABLE _ READ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction !!. inputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( state Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( 3 , Ġresult (). toList (). size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( 3 , Ġresult (). toList (). size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠcreateState Entity ( state And Ref : ĠState And Ref <* >, Ġidx : ĠInt ? Ġ= Ġnull , Ġtx Hash : ĠString ? Ġ= Ġnull ): ĠVault States Entity Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ref Ġ= Ġstate And Ref . ref ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstate And Ref . state ĊĠĠĠĠĠĠĠ Ġreturn ĠVault States Entity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Id Ġ= Ġtx Hash Ġ?: Ġstate Ref . tx hash . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġidx Ġ?: Ġstate Ref . index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Status Ġ= ĠVault . State Status . UN CON SU MED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract State ClassName Ġ= Ġstate . data . java Class . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract State Ġ= Ġstate . serialize (). bytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Name Ġ= Ġstate . not ary . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Key Ġ= Ġstate . not ary . own ing Key . to Base 5 8 String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorded Time Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠVault ĠSchema : ĠTransaction ĠNotes ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert Txn Note () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtxn Note Entity Ġ= ĠVault Txn Note Entity () ĊĠĠĠĠĠĠĠ Ġtxn Note Entity . tx Id Ġ= Ġ" 1 2 3 4 5 " ĊĠĠĠĠĠĠĠ Ġtxn Note Entity . note Ġ= Ġ" Sample Ġtransaction Ġnote " ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( txn Note Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault Txn Note :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( txn Note Entity , Ġresult (). first ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Find Txn Note () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtxn Note Entity Ġ= ĠVault Txn Note Entity () ĊĠĠĠĠĠĠĠ Ġtxn Note Entity . tx Id Ġ= Ġ" 1 2 3 4 5 " ĊĠĠĠĠĠĠĠ Ġtxn Note Entity . note Ġ= Ġ" Sample Ġtransaction Ġnote Ġ# 1 " ĊĠĠĠĠĠĠĠ Ġval Ġtxn Note Entity 2 Ġ= ĠVault Txn Note Entity () ĊĠĠĠĠĠĠĠ Ġtxn Note Entity 2 . tx Id Ġ= Ġ" 2 3 4 5 6 " ĊĠĠĠĠĠĠĠ Ġtxn Note Entity 2 . note Ġ= Ġ" Sample Ġtransaction Ġnote Ġ# 2 " ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( txn Note Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( txn Note Entity 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault Txn Note :: class ) Ġwhere Ġ( Vault Schema . Vault Txn Note :: tx Id Ġeq Ġtxn Note Entity 2 . tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( result (). count (), Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( txn Note Entity 2 , Ġresult (). first ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠVault ĠSchema : ĠCash ĠBal ances ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Insert Cash Balance () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcash Balance Entity Ġ= ĠVault Cash Balances Entity () ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . currency Ġ= Ġ" GP B " ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . amount Ġ= Ġ 1 2 3 4 5 ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( cash Balance Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault Cash Balances :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( cash Balance Entity , Ġresult (). first ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Update Cash Balance () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcash Balance Entity Ġ= ĠVault Cash Balances Entity () ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . currency Ġ= Ġ" GP B " ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . amount Ġ= Ġ 1 2 3 4 5 ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( cash Balance Entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġfind ByKey ( Vault Cash Balances Entity :: class , Ġcash Balance Entity . currency ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . amount Ġ+= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Cash Balances Entity :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 2 3 4 5 , Ġresult (). first (). amount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Up sert Cash Balance () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcash Balance Entity Ġ= ĠVault Cash Balances Entity () ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . currency Ġ= Ġ" GP B " ĊĠĠĠĠĠĠĠ Ġcash Balance Entity . amount Ġ= Ġ 1 2 3 4 5 ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġfind ByKey ( Vault Cash Balances Entity :: class , Ġcash Balance Entity . currency ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . amount Ġ+= Ġ 1 0 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġupsert ( state Ġ?: Ġcash Balance Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 3 4 5 , Ġresult . amount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest All Un consumed States () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction !!. inputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( create State Entity ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate And Refs Ġ= Ġun consumed States < Contract State >() ĊĠĠĠĠĠĠĠ ĠassertNotNull ( state And Refs ) ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġstate And Refs . size Ġ== Ġ 3 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtes Un consumed Dummy States () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction !!. inputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( create State Entity ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate And Refs Ġ= Ġun consumed States < Dummy Contract . State >() ĊĠĠĠĠĠĠĠ ĠassertNotNull ( state And Refs ) ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġstate And Refs . size Ġ== Ġ 2 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtes Un consumed Dummy Single Owner States () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction !!. inputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( create State Entity ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate And Refs Ġ= Ġun consumed States < Dummy Contract . Single Owner State >() ĊĠĠĠĠĠĠĠ ĠassertNotNull ( state And Refs ) ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġstate And Refs . size Ġ== Ġ 1 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT : ĠContract State > Ġun consumed States (): ĠList < State And Ref < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate And Refs Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where ( Vault Schema . Vault States :: state Status Ġeq ĠVault . State Status . UN CON SU MED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ref Ġ= ĠState Ref ( Secure Hash . parse ( it . tx Id ), Ġit . index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġit . contract State . deserialize < Transaction State < T >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠState And Ref ( state , Ġstate Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT :: class . java . isAssignableFrom ( it . state . data . java Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstate And Refs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠObservable s Ġtesting ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġtest Insert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( transaction !!. inputs [ 0 ]) ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġo data . insert ( state Entity ). subscribe Ġ{ Ġstate Entity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( state Entity . tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertTrue ( state Entity . tx Id . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Ġ= Ġdata . select ( Vault Schema . Vault States :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where ( Vault Schema . Vault States :: tx Id . eq ( state Entity . tx Id )). get (). first () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( cached , Ġstate Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġl atch . await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġtest Insert Count () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( transaction !!. inputs [ 0 ]) ĊĠĠĠĠĠĠĠ ĠObservable . just ( state Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat Map Ġ{ Ġperson Ġ-> Ġo data . insert ( person ). to Observable () Ġ} ĊĠĠĠĠĠĠĠ Ġo data . insert ( state Entity ). to Blocking (). value () ĊĠĠĠĠĠĠĠ ĠAssert . assertNotNull ( state Entity . tx Id ) ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( state Entity . tx Id . isNotEmpty ()) ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġdata . count ( Vault Schema . Vault States :: class ). get (). value () ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 1 , Ġcount . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġtest Query Empty () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġo data . select ( Vault Schema . Vault States :: class ). get (). to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĠAssert . fail () Ġ}, Ġ{ ĠAssert . fail () Ġ}) Ġ{ Ġl atch . count Down () Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! latch . await ( 1 , ĠTimeUnit . SECONDS )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . fail () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġtest Query Observable () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction !!. inputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo data . insert ( state Entity ). to Blocking (). value () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstates Ġ= ĠArrayList < Vault States Entity >() ĊĠĠĠĠĠĠĠ Ġo data . select ( Vault Schema . Vault States :: class ). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġit Ġ-> Ġstates . add ( it Ġas ĠVault States Entity ) Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 , Ġstates . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠRe query Ġcomposite Ġkey Ġtests Ġ( using ĠRow Expression Ġintroduced Ġin Ġ 1 . 2 . 1 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Query With Composite Key () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtxn Ġentity Ġwith Ġ 4 Ġinput Ġstates Ġ( Single Owner State Ġx Ġ 3 , ĠMulti Owner State Ġx Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtxn Ġ= Ġcreate Txn With Two State Types () ĊĠĠĠĠĠĠĠ Ġdummy States Insert ( txn ) ĊĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Composite Key Ġ= ĠlistOf ( Vault States Entity . TX _ ID , ĠVault States Entity . INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= ĠRow Expression . of ( primary Composite Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Refs Ġ= Ġtxn . inputs . map Ġ{ ĠlistOf ("' ${ it . ref . tx hash }' ", Ġit . ref . index ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault States Entity :: class ) Ġwhere Ġ( expression .` in `( state Refs )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġresult . get (). count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Update With Composite Key () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġtxn Ġentity Ġwith Ġ 4 Ġinput Ġstates Ġ( Single Owner State Ġx Ġ 3 , ĠMulti Owner State Ġx Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtxn Ġ= Ġcreate Txn With Two State Types () ĊĠĠĠĠĠĠĠ Ġdummy States Insert ( txn ) ĊĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Composite Key Ġ= ĠlistOf ( Vault States Entity . TX _ ID , ĠVault States Entity . INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= ĠRow Expression . of ( primary Composite Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Refs Ġ= Ġtxn . inputs . map Ġ{ ĠlistOf ("' ${ it . ref . tx hash }' ", Ġit . ref . index ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġupdate ( Vault States Entity :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( Vault States Entity . LOCK _ ID , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( Vault States Entity . LOCK _ UPDATE _ TIME , ĠInstant . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Ġ( Vault States Entity . STATE _ STATUS Ġeq ĠVault . State Status . UN CON SU MED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Ġ( expression .` in `( state Refs )). get () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġupdate . value ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ĠSoft Ġlocking Ġtests ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Single Soft Lock Update () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġinsert Ġun consumed Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( transaction !!. inputs [ 0 ]) ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( state Entity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġreserve Ġsoft Ġlock Ġon Ġstate ĊĠĠĠĠĠĠĠ Ġstate Entity . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lock Id Ġ= Ġ" LOCK # 1 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lock UpdateTime Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( state Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġselect Ġun locked Ġstates ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) Ġwhere Ġ( Vault Schema . Vault States :: tx Id Ġeq Ġstate Entity . tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Ġ( Vault Schema . Vault States :: lock Id . isNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresult . get (). count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġrelease Ġsoft Ġlock Ġon Ġstate ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġupdate ( Vault States Entity :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( Vault States Entity . LOCK _ ID , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( Vault States Entity . LOCK _ UPDATE _ TIME , ĠInstant . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Ġ( Vault States Entity . STATE _ STATUS Ġeq ĠVault . State Status . UN CON SU MED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Ġ( Vault States Entity . LOCK _ ID Ġeq Ġ" LOCK # 1 "). get () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġupdate . value ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġselect Ġun locked Ġstates ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) Ġwhere Ġ( Vault Schema . Vault States :: tx Id Ġeq Ġstate Entity . tx Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Ġ( Vault Schema . Vault States :: lock Id . isNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresult . get (). count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple Soft Locks Update () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġinsert Ġun consumed Ġstate ĊĠĠĠĠĠĠĠ Ġdata . with Transaction ( Transaction Isolation . REPEAT ABLE _ READ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction !!. inputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert ( state Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAssert . assertSame ( 3 , Ġresult (). toList (). size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġreserve Ġsoft Ġlocks Ġon Ġstates ĊĠĠĠĠĠĠĠ Ġtransaction !!. inputs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Entity Ġ= ĠcreateState Entity ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Entity . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lock Id Ġ= Ġ" LOCK # 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . lock UpdateTime Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( state Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġselect Ġun locked Ġstates ĊĠĠĠĠĠĠĠ Ġval Ġtxn Ids Ġ= Ġtransaction !!. inputs . map Ġ{ Ġit . ref . tx hash . toString () Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) Ġwhere Ġ( Vault Schema . Vault States :: tx Id Ġ` in ` Ġtxn Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Ġ( Vault Schema . Vault States :: lock Id Ġeq Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresult . get (). count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġrelease Ġsoft Ġlock Ġon Ġstates ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Composite Key Ġ= ĠlistOf ( Vault States Entity . TX _ ID , ĠVault States Entity . INDEX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= ĠRow Expression . of ( primary Composite Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Refs Ġ= Ġtransaction !!. inputs . map Ġ{ ĠlistOf ("' ${ it . ref . tx hash }' ", Ġit . ref . index ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= Ġupdate ( Vault States Entity :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( Vault States Entity . LOCK _ ID , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( Vault States Entity . LOCK _ UPDATE _ TIME , ĠInstant . now ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Ġ( Vault States Entity . STATE _ STATUS Ġeq ĠVault . State Status . UN CON SU MED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Ġ( expression .` in `( state Refs )). get () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġupdate . value ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġselect Ġun locked Ġstates ĊĠĠĠĠĠĠĠ Ġdata . invoke Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselect ( Vault Schema . Vault States :: class ) Ġwhere Ġ( Vault Schema . Vault States :: tx Id Ġ` in ` Ġtxn Ids ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Ġ( Vault Schema . Vault States :: lock Id Ġeq Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġresult . get (). count ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġinsert With Big Composite Key () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġ( 1 .. 3 1 4 ). map Ġ{ Ġgenerate KeyPair (). public . composite Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbig Not ary Key Ġ= ĠComposite Key . Builder (). add Keys ( keys ). build () ĊĠĠĠĠĠĠĠ Ġval Ġvault St Entity Ġ= ĠVault States Entity (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Id Ġ= ĠSecure Hash . random SHA 2 5 6 (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 3 1 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Status Ġ= ĠVault . State Status . UN CON SU MED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract State ClassName Ġ= ĠVault No op Contract . Vault No op State :: class . java . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Name Ġ= Ġ" H uge Ġdistributed Ġnot ary " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot ary Key Ġ= Ġbig Not ary Key . to Base 5 8 String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorded Time Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . insert ( vault St Entity ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdata . select ( Vault Schema . Vault States :: class ). get (). count ()) ĊĠĠĠ Ġ} Ċ }