package Ġorg . kin . sdk . base . storage Ċ Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġcom . google . protobuf . InvalidProtocolBufferException Ċ import Ġorg . kin . ag ora . gen . common . v 3 . Model Ċ import Ġorg . kin . sdk . base . models . Invoice List Ċ import Ġorg . kin . sdk . base . models . Key Ċ import Ġorg . kin . sdk . base . models . Kin Account Ċ import Ġorg . kin . sdk . base . models . Kin Balance Ċ import Ġorg . kin . sdk . base . models . Qu ark Amount Ċ import Ġorg . kin . sdk . base . models . SHA 2 2 4 Hash Ċ import Ġorg . kin . sdk . base . models . get Ag ora Memo Ċ import Ġorg . kin . sdk . base . models . merge Ċ import Ġorg . kin . sdk . base . models . to Kin Ċ import Ġorg . kin . sdk . base . models . to Qu ark s Ċ import Ġorg . kin . sdk . base . network . api . ag ora . to Invoice List Ċ import Ġorg . kin . sdk . base . network . api . ag ora . to Proto Ċ import Ġorg . kin . sdk . base . stell ar . models . Kin Transaction Ċ import Ġorg . kin . sdk . base . stell ar . models . Kin Transactions Ċ import Ġorg . kin . sdk . base . stell ar . models . Network Environment Ċ import Ġorg . kin . sdk . base . tools . Executor Services Ċ import Ġorg . kin . sdk . base . tools . Optional Ċ import Ġorg . kin . sdk . base . tools . Promise Ċ import Ġorg . kin . stell ar fork . codec . Hex Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . util . UUID Ċ import Ġorg . kin . gen . storage . v 1 . Storage . Kin Account Ġas ĠStorage Kin Account Ċ import Ġorg . kin . gen . storage . v 1 . Storage . Kin Balance Ġas ĠStorage Kin Balance Ċ import Ġorg . kin . gen . storage . v 1 . Storage . Kin Config Ġas ĠStorage Kin Config Ċ import Ġorg . kin . gen . storage . v 1 . Storage . Kin Transaction Ġas ĠStorage Kin Transaction Ċ import Ġorg . kin . gen . storage . v 1 . Storage . Kin Transactions Ġas ĠStorage Kin Transactions Ċ import Ġorg . kin . gen . storage . v 1 . Storage . PrivateKey Ġas ĠStorage PrivateKey Ċ import Ġorg . kin . gen . storage . v 1 . Storage . PublicKey Ġas ĠStorage PublicKey Ċ Ċ class ĠKin File Storage Ġ@ Jvm Over loads Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġfiles Dir : ĠString , ĊĠĠĠ Ġprivate Ġval Ġnetwork Environment : ĠNetwork Environment , ĊĠĠĠ Ġprivate Ġval Ġexec utors : ĠExecutor Services Ġ= ĠExecutor Services () Ċ ) Ġ: ĠStorage Ġ{ ĊĠĠĠ Ġclass ĠBuilder ( private Ġval Ġfiles Dir : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġnetwork Environment : ĠNetwork Environment ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġexec utors : ĠExecutor Services ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Network Environment ( network Environment : ĠNetwork Environment ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . network Environment Ġ= Ġnetwork Environment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Executors ( exec utors : ĠExecutor Services ): ĠBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . exec utors Ġ= Ġexec utors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠKin File Storage Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Environment Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Require Ġa Ġvalid ĠNetwork Environment ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exec utors Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec utors Ġ= ĠExecutor Services () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠKin File Storage ( files Dir , Ġnetwork Environment !! , Ġexec utors !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠfileName For Account Info Ġ= Ġ" account _ info " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġdirectory Name ForAll Accounts Ġ= Ġ" kin _ accounts " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠfileName For Config Ġ= Ġ" config " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Account ( account : ĠKin Account ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrite ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory For Account ( account . id ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName For Account Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . to Storage Kin Account (). toByteArray () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Account ( account : ĠKin Account ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġaccount Ġis Ġalready Ġstored Ġwith Ġprivate Ġkey , Ġwhen Ġupdating Ġthis Ġaccount Ġwith Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġpublic Ġkey , Ġkeep Ġthe Ġprivate Ġkey . ĊĠĠĠĠĠĠĠ Ġval Ġexisting Account Ġ= Ġget Account ( account . id ) ĊĠĠĠĠĠĠĠ Ġval Ġmerged Account Ġ= Ġif Ġ( existing Account Ġ!= Ġnull Ġ&& Ġexisting Account . key Ġis ĠKey . PrivateKey ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKin Account ( existing Account . key , Ġbalance Ġ= Ġaccount . balance , Ġstatus Ġ= Ġaccount . status ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwrite ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory For Account ( account . id ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName For Account Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Account . to Storage Kin Account (). toByteArray () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Account ( accountId : ĠKin Account . Id ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġremove File ( directory For Account ( accountId ), ĠfileName For Account Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Account ( accountId : ĠKin Account . Id ): ĠKin Account ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Account From Account Directory ( directory For Account ( accountId )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadvance Sequence ( id : ĠKin Account . Id ): ĠKin Account ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstored Account Ġ= Ġget Account ( id ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġstored Status Ġ= Ġstored Account . status Ġas ? ĠKin Account . Status . Registered Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Status Ġ= ĠKin Account . Status . Registered ( stored Status . sequence Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġupdated Account Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKin Account ( key Ġ= Ġstored Account . key , Ġbalance Ġ= Ġstored Account . balance , Ġstatus Ġ= Ġnew Status ) ĊĊĠĠĠĠĠĠĠ Ġupdate Account ( updated Account ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdated Account ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Account Ids (): ĠList < Kin Account . Id > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccount Directories Ġ= Ġsub directories ( directory ForAll Accounts ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġname Ġ-> Ġdirectory ForAll Accounts () Ġ+ Ġname Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaccount Ids Ġ= Ġaccount Directories ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdirectory Ġ-> Ġget Account From Account Directory ( directory ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġaccount Ġ-> Ġaccount . id Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġaccount Ids ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġput Transactions ( key : ĠKin Account . Id , Ġtransactions : ĠKin Transactions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory For Transactions ( key ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName For Transactions ( key ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions . to Kin Transactions (). toByteArray () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove All Transactions ( key : ĠKin Account . Id ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransactions Dir Ġ= Ġdirectory For Transactions ( key ) ĊĠĠĠĠĠĠĠ Ġval Ġtransaction File Names Ġ= Ġsub directories ( transactions Dir ) ĊĊĠĠĠĠĠĠĠ Ġtransaction File Names . forEach Ġ{ ĠfileName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġremove File ( transactions Dir , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! removed ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove All In voices ( account : ĠKin Account . Id ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġin voices Dir Ġ= Ġdirectory For In voices ( account ) ĊĠĠĠĠĠĠĠ Ġval Ġin voices File Names Ġ= Ġsub directories ( invoices Dir ) ĊĊĠĠĠĠĠĠĠ Ġin voices File Names . forEach Ġ{ ĠfileName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoved Ġ= Ġremove File ( invoices Dir , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! removed ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Transactions ( key : ĠKin Account . Id ): ĠKin Transactions ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransactions Dir Ġ= Ġdirectory For Transactions ( key ) ĊĠĠĠĠĠĠĠ Ġval Ġtransactions File Ġ= ĠfileName For Transactions ( key ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtransactions Ġ= Ġget Transactions FromFile ( transactions Dir , Ġtransactions File ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtransactions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Kin Config ( kin Config : ĠStorage Kin Config ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrite ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory For Config (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName For Config , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkin Config . toByteArray () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Kin Config (): ĠOptional < Storage Kin Config > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠreadFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory For Config (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName For Config ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( bytes . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOptional . empty () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOptional . of Nullable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Config . parseFrom ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid ProtocolBufferException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget OrCreate CID (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġex ising kin Config Ġ= Ġget Kin Config () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( ex ising kin Config . isPresent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġex ising kin Config . get () !!. cid ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Cid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Kin Config Ġ= ĠStorage Kin Config . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cid ( new Cid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Kin Config ( new Kin Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Cid ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Stored Transactions ( accountId : ĠKin Account . Id ): ĠPromise < Kin Transactions ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Invoice Lists Map For AccountId ( accountId ). flatMap Ġ{ Ġinvoice List Map Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPromise . create < Kin Transactions ?> Ġ{ Ġresolve , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransactions Ġ= Ġget Transactions ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransactions With In voices Ġ= Ġtransactions ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġtransactions . items . map Ġ{ Ġtransaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . memo . get Ag ora Memo ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice List Map [ Invoice List . Id ( SHA 2 2 4 Hash . just ( it . foreign Key Bytes ))] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( transactions With In voices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. work On ( exec utors . sequential IO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore Transactions ( ĊĠĠĠĠĠĠĠ ĠaccountId : ĠKin Account . Id , ĊĠĠĠĠĠĠĠ Ġtransactions : ĠList < Kin Transaction > ĊĠĠĠ Ġ): ĠPromise < List < Kin Transaction >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( transactions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise . of ( transactions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġadd Invoice Lists ( accountId , Ġtransactions . map NotNull Ġ{ Ġit . invoice List Ġ}). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPromise . create < List < Kin Transaction >> Ġ{ Ġresolve , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Transactions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaccountId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKin Transactions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions . find Head H istorical Transaction (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions . find Tail H istorical Transaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( transactions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. work On ( exec utors . sequential IO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupsert New Transactions In Storage ( ĊĠĠĠĠĠĠĠ ĠaccountId : ĠKin Account . Id , ĊĠĠĠĠĠĠĠ Ġnew Transactions : ĠList < Kin Transaction > ĊĠĠĠ Ġ): ĠPromise < List < Kin Transaction >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Stored Transactions ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġstored Transactions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Transactions Ġ+ Ġ( stored Transactions ?. items Ġ?: Ġempty List ()). filter Ġ{ Ġstored Txn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Transactions . find Ġ{ Ġnew Txn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstored Txn . transaction Hash Ġ== Ġnew Txn . transaction Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġstore Transactions ( accountId , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupsert Old Transactions In Storage ( ĊĠĠĠĠĠĠĠ ĠaccountId : ĠKin Account . Id , ĊĠĠĠĠĠĠĠ Ġold Transactions : ĠList < Kin Transaction > ĊĠĠĠ Ġ): ĠPromise < List < Kin Transaction >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Stored Transactions ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġstored Transactions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( stored Transactions ?. items Ġ?: Ġempty List ()). filter Ġ{ Ġstored Txn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Transactions . find Ġ{ Ġnew Txn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstored Txn . transaction Hash Ġ== Ġnew Txn . transaction Hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ Ġold Transactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġstore Transactions ( accountId , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinsert New Transaction In Storage ( ĊĠĠĠĠĠĠĠ ĠaccountId : ĠKin Account . Id , ĊĠĠĠĠĠĠĠ Ġnew Transaction : ĠKin Transaction ĊĠĠĠ Ġ): ĠPromise < List < Kin Transaction >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Stored Transactions ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit ?. items Ġ?: Ġempty List () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠlistOf ( new Transaction ) Ġ+ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġstore Transactions ( accountId , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Invoice Lists Map For AccountId ( account : ĠKin Account . Id ): ĠPromise < Map < Invoice List . Id , ĠInvoice List >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPromise . create Ġ{ Ġresolve , Ġreject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠreadFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory For In voices ( account ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileName For In voices ( account ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġif Ġ( bytes . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin voices : Ġorg . kin . gen . storage . v 1 . Storage . In voices Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorg . kin . gen . storage . v 1 . Storage . In voices . parseFrom ( bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin voices . invoice Lists Map ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Keys Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvoice List . Id ( SHA 2 2 4 Hash ( it . key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModel . Invoice List . parseFrom ( it . value . network Invoice List . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Invoice List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( map ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreject ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Invoice Lists ( ĊĠĠĠĠĠĠĠ ĠaccountId : ĠKin Account . Id , ĊĠĠĠĠĠĠĠ Ġinvoice Lists : ĠList < Invoice List > ĊĠĠĠ Ġ): ĠPromise < List < Invoice List >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġput Invoice Lists For AccountId ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount : ĠKin Account . Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Lists : ĠMap < Invoice List . Id , ĠInvoice List > ĊĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ= Ġwrite ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory For In voices ( account ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName For In voices ( account ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Lists . to In voices (). toByteArray () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( invoice Lists . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPromise . of ( emptyList ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget Invoice Lists Map For AccountId ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Invoice Lists Ġ= Ġit . to Mutable Map (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvoice Lists . forEach Ġ{ Ġinvoice List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( invoice List . id , Ġinvoice List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Invoice Lists For AccountId ( accountId , Ġupdated Invoice Lists ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Invoice Lists . values . toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Stored Account ( accountId : ĠKin Account . Id ): ĠPromise < Optional < Kin Account >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPromise . create < Optional < Kin Account >> Ġ{ Ġresolve , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( Optional . of Nullable ( get Account ( accountId ))) ĊĠĠĠĠĠĠĠ Ġ}. work On ( exec utors . sequential IO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Account In Storage ( account : ĠKin Account ): ĠPromise < Kin Account > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Stored Account ( account . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġaccount In Storage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPromise . create < Kin Account > Ġ{ Ġresolve , Ġreject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount To Store Ġ= Ġaccount In Storage . map Ġ{ Ġit . merge ( account ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( account To Store . isPresent Ġ&& Ġupdate Account ( account To Store . get () !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( account To Store . get () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreject ( Exception (" Failed Ġto Ġupdate ĠAccount Ġin Ġstorage ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Account Balance ( ĊĠĠĠĠĠĠĠ ĠaccountId : ĠKin Account . Id , ĊĠĠĠĠĠĠĠ Ġbalance : ĠKin Balance ĊĠĠĠ Ġ): ĠPromise < Optional < Kin Account >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Stored Account ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġstored Account Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstored Account . map Ġ{ Ġaccount Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ= Ġbalance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġupdate Account ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Min Fee ( min Fee : ĠQu ark Amount ): ĠPromise < Optional < Qu ark Amount >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPromise . create < Optional < Qu ark Amount >> Ġ{ Ġresolve , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Kin Config Ġ= Ġget Kin Config () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orElse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Config . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Min Fee ( min Fee . value . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set Kin Config ( updated Kin Config )) ĠOptional . of ( min Fee ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠOptional . empty < Qu ark Amount >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. work On ( exec utors . sequential IO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Min Fee (): ĠPromise < Optional < Qu ark Amount >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPromise . create < Optional < Qu ark Amount >> Ġ{ Ġresolve , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( get Kin Config (). map Ġ{ ĠQu ark Amount ( it . min Fee ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. work On ( exec utors . sequential IO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete All Storage ( accountId : ĠKin Account . Id ): ĠPromise < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPromise . create < Boolean > Ġ{ Ġresolve , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove All In voices ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġremove All Transactions ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġremove Account ( accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. work On ( exec utors . sequential IO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Account From Account Directory ( directory : ĠString ): ĠKin Account ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠreadFile ( directory , ĠfileName For Account Info ) ĊĠĠĠĠĠĠĠ Ġif Ġ( bytes . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Kin Account Ġ= ĠStorage Kin Account . parseFrom ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstorage Kin Account . to Kin Account () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid ProtocolBufferException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Transactions FromFile ( directory : ĠString , ĠfileName : ĠString ): ĠKin Transactions ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠreadFile ( directory , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ( bytes . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Transaction Ġ= ĠStorage Kin Transactions . parseFrom ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstorage Transaction . to Kin Transactions () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid ProtocolBufferException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Kin Transaction >. find Head H istorical Transaction (): ĠKin Transaction . Paging Token ? Ġ= ĊĠĠĠĠĠĠĠ Ġ( find Ġ{ Ġit . record Type Ġis ĠKin Transaction . Record Type . H istorical Ġ} ?. record Type Ġas ? ĠKin Transaction . Record Type . H istorical )?. paging Token ĊĊĠĠĠ Ġprivate Ġfun ĠList < Kin Transaction >. find Tail H istorical Transaction (): ĠKin Transaction . Paging Token ? Ġ= ĊĠĠĠĠĠĠĠ Ġ( reversed (). find Ġ{ Ġit . record Type Ġis ĠKin Transaction . Record Type . H istorical Ġ} ?. record Type Ġas ? ĠKin Transaction . Record Type . H istorical )?. paging Token ĊĊĊĠĠĠ Ġ// Ġregion ĠFile ĠAccess ĊĠĠĠ Ġ// Ġ------------------------------------------------------------------------ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFile ĠStructure ĊĠĠĠĠ Ġ* ĠEnvironment ĠDirectory : Ġ< context . get Files Dir >/ env /< env Ġpass code Ġin Ġhex >/ ĊĠĠĠĠ Ġ* ĠConfig : Ġ< Environment ĠDirectory >/ config ĊĠĠĠĠ Ġ* ĠAccount ĠDirectory : Ġ< Environment ĠDirectory >/ kin _ accounts /< public Ġkey > ĊĠĠĠĠ Ġ* ĠKin Account Ġobject : Ġ< Account ĠDirectory >/ account _ info ĊĠĠĠĠ Ġ* ĠKin Transactions : Ġ< Account ĠDirectory >/< account _ id >_ transactions /< account _ id >_ transactions ĊĠĠĠĠ Ġ* ĠIn voices : Ġ< Account ĠDirectory >/< account _ id >_ invoices /< account _ id >_ invoices ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġprivate Ġfun Ġenv Directory (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"$ files Dir / env /${ Hex . encode HexString ( network Environment . network Pass phrase . toByteArray ()) }" ĊĊĠĠĠ Ġprivate Ġfun Ġdirectory For Config (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"${ env Directory () }/ " ĊĊĠĠĠ Ġprivate Ġfun Ġdirectory ForAll Accounts (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"${ env Directory () }/ $ directory Name ForAll Accounts /" ĊĊĠĠĠ Ġprivate Ġfun Ġdirectory For Account ( accountId : ĠKin Account . Id ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdirectory ForAll Accounts () Ġ+ ĠaccountId . hashCode () Ġ+ Ġ"/" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdirectory For Transactions ( accountId : ĠKin Account . Id ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ directory For Account ( accountId )} _ transactions " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdirectory For In voices ( accountId : ĠKin Account . Id ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ directory For Account ( accountId )} _ invoices " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠfileName For Transactions ( accountId : ĠKin Account . Id ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"${ accountId . hashCode ()} _ transactions " ĊĊĠĠĠ Ġprivate Ġfun ĠfileName For In voices ( accountId : ĠKin Account . Id ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġ"${ accountId . hashCode ()} _ invoices " ĊĊĠĠĠ Ġprivate Ġfun Ġwrite ToFile ( directory : ĠString , ĠfileName : ĠString , Ġbody : ĠByteArray ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠoutputStream : ĠFileOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( directory , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . parent File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( body ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove File ( directory : ĠString , ĠfileName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( directory , ĠfileName ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠreadFile ( directory : ĠString , ĠfileName : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠinputStream : ĠFileInputStream ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( directory , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠByteArray ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream Ġ= ĠFileInputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . read Bytes () ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠByteArray ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsub directories ( directory : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( directory ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists () Ġ|| Ġ! file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfile . list (). asList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ------------------------------------------------------------------------ ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠModel To Proto ĠExtensions ĊĠĠĠ Ġ// Ġ------------------------------------------------------------------------ ĊĊĠĠĠ Ġprivate Ġfun ĠKin Account . to Storage Kin Account (): ĠStorage Kin Account Ġ= ĊĠĠĠĠĠĠĠ ĠStorage Kin Account . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Balance ( balance . to Storage Kin Balance ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this @ to Storage Kin Account . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKin Account . Status . Un registered Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setStatus ( Storage Kin Account . Status . UN REGISTER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKin Account . Status . Registered Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setStatus ( Storage Kin Account . Status . REGISTER ED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set SequenceNumber ( this @ to Storage Kin Account . status . sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this @ to Storage Kin Account . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey . PublicKey Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠStorage PublicKey . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ByteString . copyFrom ( this @ to Storage Kin Account . key . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set PublicKey ( publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey . PrivateKey Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= ĠStorage PrivateKey . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setValue ( ByteString . copyFrom ( this @ to Storage Kin Account . key . value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set PrivateKey ( privateKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun ĠKin Balance . to Storage Kin Balance (): ĠStorage Kin Balance Ġ= ĊĠĠĠĠĠĠĠ ĠStorage Kin Balance . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġask Ġabout Ġqu ark Ġconversion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Qu ark Amount ( amount . to Qu ark s (). value . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Pending Qu ark Amount ( pending Amount . to Qu ark s (). value . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun ĠKin Transaction . to Storage Kin Transaction (): ĠStorage Kin Transaction Ġ= ĊĠĠĠĠĠĠĠ ĠStorage Kin Transaction . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Envelope X dr ( ByteString . copyFrom ( this . envelope X dr Bytes )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this @ to Storage Kin Transaction . record Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKin Transaction . Record Type . In Flight Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setStatus ( Storage Kin Transaction . Status . IN FL IGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Timestamp ( this @ to Storage Kin Transaction . record Type . timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKin Transaction . Record Type . Ack nowled ged Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setStatus ( Storage Kin Transaction . Status . ACK NOW LED GED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Timestamp ( this @ to Storage Kin Transaction . record Type . timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Result X dr ( ByteString . copyFrom ( this @ to Storage Kin Transaction . record Type . result X dr Bytes )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKin Transaction . Record Type . H istorical Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setStatus ( Storage Kin Transaction . Status . HIST OR ICAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Timestamp ( this @ to Storage Kin Transaction . record Type . timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Result X dr ( ByteString . copyFrom ( this @ to Storage Kin Transaction . record Type . result X dr Bytes )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . set Paging Token ( this @ to Storage Kin Transaction . record Type . paging Token . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun ĠKin Transactions . to Kin Transactions (): ĠStorage Kin Transactions Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStorage Kin Transactions . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Items ( items . map Ġ{ Ġit . to Storage Kin Transaction () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġbuilder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead Paging Token ?. let Ġ{ Ġbuilder . set Head Paging Token ( it . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtail Paging Token ?. let Ġ{ Ġbuilder . set Tail Paging Token ( it . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠMap < Invoice List . Id , ĠInvoice List >. to In voices (): Ġorg . kin . gen . storage . v 1 . Storage . In voices Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġorg . kin . gen . storage . v 1 . Storage . In voices . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ to In voices . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ apply . put Invoice Lists ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key . invoice Hash . encoded Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorg . kin . gen . storage . v 1 . Storage . Invoice List Blob . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Network Invoice List ( it . value . to Proto (). to ByteString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ------------------------------------------------------------------------ ĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠProto To Model ĠExtensions ĊĠĠĠ Ġ// Ġ------------------------------------------------------------------------ ĊĊĠĠĠ Ġ@ Throws ( InvalidProtocolBufferException :: class ) ĊĠĠĠ Ġprivate Ġfun ĠStorage Kin Account . to Kin Account (): ĠKin Account Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey : ĠKey ĊĠĠĠĠĠĠĠ Ġif Ġ( this . has PrivateKey ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġthis . privateKey . to PrivateKey () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( this . has PublicKey ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġthis . publicKey . to PublicKey () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid ProtocolBufferException (" account Ġis Ġmissing Ġkey ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= Ġthis . balance . to Kin Balance () ĊĠĠĠĠĠĠĠ Ġval Ġsequence Ġ= Ġthis . sequence Number ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġwhen Ġ( this . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Account . Status . REGISTER ED Ġ-> ĠKin Account . Status . Registered ( sequence ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Account . Status . UN REGISTER ED Ġ-> ĠKin Account . Status . Un registered ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Account . Status . UN RE CO GN IZED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġthrow ĠInvalid ProtocolBufferException (" Unrecognized Ġaccount Ġstatus .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠKin Account ( key Ġ= Ġkey , Ġbalance Ġ= Ġbalance , Ġstatus Ġ= Ġstatus ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStorage PublicKey . to PublicKey (): ĠKey Ġ= ĊĠĠĠĠĠĠĠ ĠKey . PublicKey ( this . value . toByteArray ()) ĊĊĠĠĠ Ġprivate Ġfun ĠStorage PrivateKey . to PrivateKey (): ĠKey Ġ= ĊĠĠĠĠĠĠĠ ĠKey . PrivateKey ( this . value . toByteArray ()) ĊĊĠĠĠ Ġprivate Ġfun ĠStorage Kin Balance . to Kin Balance (): ĠKin Balance Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġamount Ġ= ĠQu ark Amount ( this . quark Amount ). to Kin () ĊĠĠĠĠĠĠĠ Ġval Ġpending Amount Ġ= ĠQu ark Amount ( this . pending Qu ark Amount ). to Kin () ĊĠĠĠĠĠĠĠ Ġreturn ĠKin Balance ( amount , Ġpending Amount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InvalidProtocolBufferException :: class ) ĊĠĠĠ Ġprivate Ġfun ĠStorage Kin Transaction . to Kin Transaction (): ĠKin Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrecord Type Ġ= Ġwhen Ġ( this . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Transaction . Status . IN FL IGHT Ġ-> ĠKin Transaction . Record Type . In Flight ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Transaction . Status . ACK NOW LED GED Ġ-> ĠKin Transaction . Record Type . Ack nowled ged ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result X dr . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Kin Transaction . Status . HIST OR ICAL Ġ-> ĠKin Transaction . Record Type . H istorical ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . result X dr . toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKin Transaction . Paging Token ( this . paging Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠInvalid ProtocolBufferException (" Unrecognized Ġrecord Ġtype .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠKin Transaction ( this . envelope X dr . toByteArray (), Ġrecord Type , Ġnetwork Environment ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( InvalidProtocolBufferException :: class ) ĊĠĠĠ Ġprivate Ġfun ĠStorage Kin Transactions . to Kin Transactions (): ĠKin Transactions Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠKin Transactions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems List . map Ġ{ Ġit . to Kin Transaction () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKin Transaction . Paging Token ( head Paging Token ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKin Transaction . Paging Token ( tail Paging Token ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ------------------------------------------------------------------------ ĊĠĠĠ Ġ// Ġend region Ċ } Ċ