package Ġcash . z . ecc . android . sdk Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġcash . z . ecc . android . sdk . Initializer . Default Birth day Store . Companion . Imported Wallet Birth day Store Ċ import Ġcash . z . ecc . android . sdk . exception . Birth day Exception Ċ import Ġcash . z . ecc . android . sdk . exception . Initializer Exception Ċ import Ġcash . z . ecc . android . sdk . ext . Z cash Sdk Ċ import Ġcash . z . ecc . android . sdk . ext . twig Ċ import Ġcash . z . ecc . android . sdk . jni . Rust Backend Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . util .* Ċ import Ġkotlin . properties . ReadWrite Property Ċ import Ġkotlin . reflect . K Property Ċ Ċ /** Ċ Ġ* ĠResp ons ible Ġfor Ġinitialization , Ġwhich Ġcan Ġbe Ġconsidered Ġas Ġsetup Ġthat Ġmust Ġhappen Ġbefore Ċ Ġ* Ġsynchron izing Ġbegins . ĠThis Ġbegins Ġwith Ġone Ġof Ġthree Ġactions , Ġa Ġcall Ġto Ġeither Ġ[ new ], Ġ[ import ] Ġor Ċ Ġ* Ġ[ open ], Ġwhere Ġthe Ġlast Ġoption Ġis Ġthe Ġmost Ġcommon Ġcase -- when Ġa Ġuser Ġis Ġopening Ġa Ġwallet Ġthey Ġhave Ċ Ġ* Ġused Ġbefore Ġon Ġthis Ġdevice . Ċ Ġ* Ċ Ġ* Ġ@ param Ġapp Context Ġthe Ġapplication Ġcontext , Ġused Ġto Ġextract Ġthe Ġstorage Ġpaths Ġfor Ġthe Ġdatabases Ċ Ġ* Ġand Ġparam Ġfiles . ĠA Ġreference Ġto Ġthe Ġcontext Ġis Ġheld Ġbeyond Ġinitialization Ġin Ġorder Ġto Ġsimplify Ċ Ġ* Ġsynchron izer Ġconstruction Ġso Ġthat Ġan Ġinitializer Ġis Ġall Ġthat Ġis Ġever Ġrequired . Ċ Ġ* Ġ@ param Ġhost Ġthe Ġhost Ġthat Ġthe Ġsynchron izer Ġshould Ġuse . Ċ Ġ* Ġ@ param Ġport Ġthe Ġport Ġthat Ġthe Ġsynchron izer Ġshould Ġuse Ġwhen Ġconnecting Ġto Ġthe Ġhost . Ċ Ġ* Ġ@ param Ġalias Ġthe Ġalias Ġto Ġuse Ġfor Ġthis Ġsynchron izer . ĠThink Ġof Ġit Ġas Ġa Ġunique Ġname Ġthat Ġallows Ċ Ġ* Ġmultiple Ġsynchron izers Ġto Ġfunction Ġin Ġthe Ġsame Ġapp . ĠThe Ġalias Ġis Ġmapped Ġto Ġdatabase Ġnames Ġfor Ġthe Ċ Ġ* Ġcache Ġand Ġdata ĠDB s . ĠThis Ġvalue Ġis Ġoptional Ġand Ġis Ġusually Ġnot Ġrequired Ġbecause Ġmost Ġapps Ġonly Ċ Ġ* Ġneed Ġone Ġsynchron izer . Ċ Ġ*/ Ċ class ĠInitial izer ( ĊĠĠĠ Ġapp Context : ĠContext , ĊĠĠĠ Ġval Ġhost : ĠString Ġ= ĠZ cash Sdk . DEFAULT _ LIGHT WAL LE TD _ HOST , ĊĠĠĠ Ġval Ġport : ĠInt Ġ= ĠZ cash Sdk . DEFAULT _ LIGHT WAL LE TD _ PORT , ĊĠĠĠ Ġprivate Ġval Ġalias : ĠString Ġ= ĠZ cash Sdk . DEFAULT _ DB _ NAME _ PREFIX Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= Ġapp Context . application Context ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvalidate Alias ( alias ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpath Ġthis Ġinitializer Ġwill Ġuse Ġwhen Ġchecking Ġfor Ġand Ġdownloading Ġsap ling Ġparams . ĠThis ĊĠĠĠĠ Ġ* Ġvalue Ġis Ġderived Ġfrom Ġthe Ġapp Context Ġwhen Ġthis Ġclass Ġis Ġconstructed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval ĠpathParams : ĠString Ġ= Ġ"${ context . cacheDir . absolute Path }/ params " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpath Ġused Ġfor Ġstoring Ġcached Ġcompact Ġblocks Ġfor Ġprocessing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġpath Cache Db : ĠString Ġ= Ġcache Db Path ( context , Ġalias ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġpath Ġused Ġfor Ġstoring Ġthe Ġdata Ġderived Ġfrom Ġthe Ġcached Ġcompact Ġblocks . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġpath Data Db : ĠString Ġ= Ġdata Db Path ( context , Ġalias ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBack ing Ġfield Ġfor Ġrust Backend , Ġused Ġfor Ġgiving Ġbetter Ġerror Ġmessages Ġwhenever Ġthe Ġinitializer ĊĠĠĠĠ Ġ* Ġis Ġmist aken ly Ġused Ġprior Ġto Ġbeing Ġproperly Ġloaded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġ_ rust Backend : ĠRust Backend ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġwrapped Ġversion Ġof Ġ[ cash . z . ecc . android . sdk . jni . Rust Backend W el ding ] Ġthat Ġwill Ġbe Ġpassed Ġto Ġthe ĊĠĠĠĠ Ġ* ĠSDK Ġwhen Ġit Ġis Ġconstructed . ĠIt Ġprovides Ġaccess Ġto Ġall ĠLi br ust zc ash Ġfeatures Ġand Ġis Ġconfigured ĊĠĠĠĠ Ġ* Ġbased Ġon Ġthis Ġinitializer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġrust Backend : ĠRust Backend Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck (_ rust Backend Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error : ĠRust Backend Ġmust Ġbe Ġloaded Ġbefore Ġit Ġis Ġaccessed . ĠVerify Ġthat Ġeither " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġthe Ġ' open ', Ġ' new ' Ġor Ġ' import ' Ġfunction Ġhas Ġbeen Ġcalled Ġon Ġthe ĠInitial izer ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ rust Backend !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbirthday Ġthat Ġwas Ġultimately Ġused Ġfor Ġinitializing Ġthe Ġaccounts . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġbirthday : ĠWallet Birth day ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġwhen Ġeither Ġ' open ', Ġ' new ' Ġor Ġ' import ' Ġhave Ġalready Ġbeen Ġcalled . ĠEach Ġof Ġthose ĊĠĠĠĠ Ġ* Ġfunctions Ġcalls Ġ` init Rust Library ` Ġbefore Ġreturning . ĠThe Ġentire Ġpoint Ġof Ġthe Ġinitializer Ġis Ġto ĊĠĠĠĠ Ġ* Ġsetup Ġeverything Ġnecessary Ġfor Ġthe ĠSynchron izer Ġto Ġfunction , Ġwhich Ġmainly Ġbo ils Ġdown Ġto ĊĠĠĠĠ Ġ* Ġloading Ġthe Ġrust Ġbackend . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Initialized : ĠBoolean Ġget () Ġ= Ġ_ rust Backend Ġ!= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġa Ġnew Ġwallet Ġwith Ġthe Ġgiven Ġseed Ġand Ġbirthday . ĠIt Ġcreates Ġthe Ġrequired Ġdatabase ĊĠĠĠĠ Ġ* Ġtables Ġand Ġloads Ġand Ġconfig ures Ġthe Ġ[ rust Backend ] Ġproperty Ġfor Ġuse Ġby Ġall Ġother Ġcomponents . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġseed Ġthe Ġseed Ġto Ġuse Ġfor Ġthe Ġnewly Ġcreated Ġwallet . ĊĠĠĠĠ Ġ* Ġ@ param Ġnew Wallet Birth day Ġthe Ġbirthday Ġto Ġuse Ġfor Ġthe Ġnewly Ġcreated Ġwallet . ĠTypically , Ġthis ĊĠĠĠĠ Ġ* Ġcorresponds Ġto Ġthe Ġmost Ġrecent Ġcheckpoint Ġavailable Ġsince Ġnew Ġwallet s Ġshould Ġnot Ġhave Ġany ĊĠĠĠĠ Ġ* Ġtransactions Ġprior Ġto Ġtheir Ġcreation . ĊĠĠĠĠ Ġ* Ġ@ param ĠnumberOf Accounts Ġthe Ġnumber Ġof Ġaccounts Ġto Ġcreate Ġfor Ġthis Ġwallet . ĠThis Ġis Ġnot Ġfully ĊĠĠĠĠ Ġ* Ġsupported Ġso Ġthe Ġdefault Ġvalue Ġof Ġ 1 Ġis Ġrecommended . ĊĠĠĠĠ Ġ* Ġ@ param Ġclear Cache Db Ġwhen Ġtrue , Ġthis Ġwill Ġdelete Ġcache Db , Ġif Ġit Ġexists , Ġresulting Ġin Ġthe Ġfresh ĊĠĠĠĠ Ġ* Ġdownload Ġof Ġall Ġcompact Ġblocks . ĠOtherwise , Ġdownloading Ġresume s Ġfrom Ġthe Ġlast Ġfetched Ġblock . ĊĠĠĠĠ Ġ* Ġ@ param Ġclear Data Db Ġwhen Ġtrue , Ġthis Ġwill Ġdelete Ġthe Ġdata Db , Ġif Ġit Ġexists , Ġresulting Ġin Ġthe ĊĠĠĠĠ Ġ* Ġfresh Ġscan Ġof Ġall Ġblocks . ĠOtherwise , Ġinitialization Ġcrashes Ġwhen Ġprevious Ġwallet Ġdata Ġexists ĊĠĠĠĠ Ġ* Ġto Ġprevent Ġaccident al Ġover writes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġaccount Ġs pending Ġkeys , Ġcorresponding Ġto Ġthe Ġaccounts Ġthat Ġget Ġinitialized Ġin Ġthe ĊĠĠĠĠ Ġ* ĠDB . ĊĠĠĠĠ Ġ* Ġ@ throws ĠInitial izer Exception . Already Initialized Exception Ġwhen Ġthe Ġblocks Ġtable Ġalready Ġexists ĊĠĠĠĠ Ġ* Ġand Ġ[ clear Data Db ] Ġis Ġfalse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġs pending Ġkey ( s ) Ġassociated Ġwith Ġthis Ġwallet , Ġfor Ġconvenience . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnew ( ĊĠĠĠĠĠĠĠ Ġseed : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġnew Wallet Birth day : ĠWallet Birth day , ĊĠĠĠĠĠĠĠ ĠnumberOf Accounts : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġclear Cache Db : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġclear Data Db : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinitialize Accounts ( seed , Ġnew Wallet Birth day , ĠnumberOf Accounts , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Cache Db Ġ= Ġclear Cache Db , Ġclear Data Db Ġ= Ġclear Data Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġa Ġnew Ġwallet Ġwith Ġthe Ġimported Ġseed Ġand Ġbirthday . ĠIt Ġcreates Ġthe Ġrequired Ġdatabase ĊĠĠĠĠ Ġ* Ġtables Ġand Ġloads Ġand Ġconfig ures Ġthe Ġ[ rust Backend ] Ġproperty Ġfor Ġuse Ġby Ġall Ġother Ġcomponents . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġseed Ġthe Ġseed Ġto Ġuse Ġfor Ġthe Ġimported Ġwallet . ĊĠĠĠĠ Ġ* Ġ@ param Ġprevious Wallet Birth day Ġthe Ġbirthday Ġto Ġuse Ġfor Ġthe Ġimported . ĠTypically , Ġthis ĊĠĠĠĠ Ġ* Ġcorresponds Ġto Ġthe Ġheight Ġwhere Ġthis Ġwallet Ġwas Ġfirst Ġcreated , Ġallowing Ġthe Ġwallet Ġto Ġbe ĊĠĠĠĠ Ġ* Ġoptimized Ġnot Ġto Ġdownload Ġor Ġscan Ġblocks Ġfrom Ġbefore Ġthe Ġwallet Ġexisted . ĊĠĠĠĠ Ġ* Ġ@ param Ġclear Cache Db Ġwhen Ġtrue , Ġthis Ġwill Ġdelete Ġcache Db , Ġif Ġit Ġexists , Ġresulting Ġin Ġthe Ġfresh ĊĠĠĠĠ Ġ* Ġdownload Ġof Ġall Ġcompact Ġblocks . ĠOtherwise , Ġdownloading Ġresume s Ġfrom Ġthe Ġlast Ġfetched Ġblock . ĊĠĠĠĠ Ġ* Ġ@ param Ġclear Data Db Ġwhen Ġtrue , Ġthis Ġwill Ġdelete Ġthe Ġdata Db , Ġif Ġit Ġexists , Ġresulting Ġin Ġthe ĊĠĠĠĠ Ġ* Ġfresh Ġscan Ġof Ġall Ġblocks . ĠOtherwise , Ġthis Ġfunction Ġthrows Ġan Ġexception Ġwhen Ġprevious Ġwallet ĊĠĠĠĠ Ġ* Ġdata Ġexists Ġto Ġprevent Ġaccident al Ġover writes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġaccount Ġs pending Ġkeys , Ġcorresponding Ġto Ġthe Ġaccounts Ġthat Ġget Ġinitialized Ġin Ġthe ĊĠĠĠĠ Ġ* ĠDB . ĊĠĠĠĠ Ġ* Ġ@ throws ĠInitial izer Exception . Already Initialized Exception Ġwhen Ġthe Ġblocks Ġtable Ġalready Ġexists ĊĠĠĠĠ Ġ* Ġand Ġ[ clear Data Db ] Ġis Ġfalse . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġs pending Ġkey ( s ) Ġassociated Ġwith Ġthis Ġwallet , Ġfor Ġconvenience . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġimport ( ĊĠĠĠĠĠĠ Ġseed : ĠByteArray , ĊĠĠĠĠĠĠ Ġprevious Wallet Birth day : ĠWallet Birth day , ĊĠĠĠĠĠĠ Ġclear Cache Db : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠ Ġclear Data Db : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinitialize Accounts ( seed , Ġprevious Wallet Birth day , Ġclear Cache Db Ġ= Ġclear Cache Db , Ġclear Data Db Ġ= Ġclear Data Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoads Ġthe Ġrust Ġlibrary Ġand Ġpreviously Ġused Ġbirthday Ġfor Ġuse Ġby Ġall Ġother Ġcomponents . ĠThis Ġis ĊĠĠĠĠ Ġ* Ġthe Ġmost Ġcommon Ġuse Ġcase Ġfor Ġthe Ġinitializer -- re opening Ġa Ġwallet Ġthat Ġwas Ġpreviously Ġcreated . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġbirthday Ġbirthday Ġheight Ġof Ġthe Ġwallet . ĠThis Ġvalue Ġis Ġpassed Ġto Ġthe ĊĠĠĠĠ Ġ* Ġ[ Compact Block Processor ] Ġand Ġbecomes Ġa Ġfactor Ġin Ġdetermining Ġthe Ġlower Ġbounds Ġheight Ġthat Ġthis ĊĠĠĠĠ Ġ* Ġwallet Ġwill Ġuse . ĠThis Ġheight Ġhelps Ġwith Ġdetermining Ġwhere Ġto Ġstart Ġdownloading Ġas Ġwell Ġas Ġhow ĊĠĠĠĠ Ġ* Ġfar Ġback Ġto Ġgo Ġduring Ġa Ġre wind . ĠEvery Ġwallet Ġhas Ġa Ġbirthday Ġand Ġthe Ġinitializer Ġdepends Ġon ĊĠĠĠĠ Ġ* Ġthis Ġvalue Ġbut Ġdoes Ġnot Ġown Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġinstance Ġof Ġthis Ġclass Ġso Ġthat Ġthe Ġfunction Ġcan Ġbe Ġused Ġfluid ly . ĠS pending Ġkeys Ġare ĊĠĠĠĠ Ġ* Ġnot Ġreturned Ġbecause Ġthe ĠSDK Ġdoes Ġnot Ġstore Ġthem Ġand Ġthis Ġfunction Ġis Ġfor Ġopening Ġa Ġwallet ĊĠĠĠĠ Ġ* Ġthat Ġwas Ġcreated Ġpreviously . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġopen ( birthday : ĠWallet Birth day ): ĠInitial izer Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" Opening Ġwallet Ġwith Ġbirthday Ġ${ birthday . height }") ĊĠĠĠĠĠĠĠ Ġrequire Rust Backend (). birthday Height Ġ= Ġbirthday . height ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġthe Ġdatabases Ġthat Ġthe Ġrust Ġlibrary Ġuses Ġfor Ġmanaging Ġstate . ĠThe Ġ" data Ġdb " Ġis ĊĠĠĠĠ Ġ* Ġcreated Ġand Ġa Ġrow Ġis Ġentered Ġcorresponding Ġto Ġthe Ġgiven Ġbirthday Ġso Ġthat Ġscanning Ġdoes Ġnot ĊĠĠĠĠ Ġ* Ġneed Ġto Ġstart Ġfrom Ġthe Ġbeginning Ġof Ġtime . ĠLast ly , Ġthe Ġaccounts Ġtable Ġis Ġinitialized Ġto ĊĠĠĠĠ Ġ* Ġsimply Ġhold Ġthe Ġaddress Ġand Ġviewing Ġkey Ġfor Ġeach Ġaccount , Ġwhich Ġsimpl ifies Ġthe Ġprocess Ġof ĊĠĠĠĠ Ġ* Ġscanning Ġand Ġdecrypt ing Ġcompact Ġblocks . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġseed Ġthe Ġseed Ġto Ġuse Ġfor Ġinitializing Ġaccounts . ĠWe Ġderive Ġthe Ġaddress Ġand Ġthe Ġviewing ĊĠĠĠĠ Ġ* Ġkey ( s ) Ġfrom Ġthis Ġseed Ġand Ġalso Ġreturn Ġthe Ġrelated Ġs pending Ġkey ( s ). ĠOnly Ġthe Ġviewing Ġkey Ġis ĊĠĠĠĠ Ġ* Ġretained Ġin Ġthe Ġdatabase Ġin Ġorder Ġto Ġsimplify Ġscanning Ġfor Ġthe Ġwallet . ĊĠĠĠĠ Ġ* Ġ@ param Ġbirthday Ġthe Ġbirthday Ġto Ġuse Ġfor Ġthis Ġwallet . ĠThis Ġis Ġused Ġin Ġorder Ġto Ġseed Ġthe Ġdata ĊĠĠĠĠ Ġ* ĠDB Ġwith Ġthe Ġfirst Ġsap ling Ġtree , Ġwhich Ġalso Ġdetermines Ġwhere Ġthe ĠSDK Ġbegins Ġdownloading Ġand ĊĠĠĠĠ Ġ* Ġscanning . ĠAny Ġblocks Ġlower Ġthan Ġthe Ġheight Ġrepresented Ġby Ġthis Ġbirthday Ġcan Ġsafely Ġbe Ġignored ĊĠĠĠĠ Ġ* Ġsince Ġa Ġwallet Ġcannot Ġhave Ġtransactions Ġprior Ġto Ġits Ġcreation . ĊĠĠĠĠ Ġ* Ġ@ param ĠnumberOf Accounts Ġthe Ġnumber Ġof Ġaccounts Ġto Ġcreate . ĠOnly Ġ 1 Ġaccount Ġis Ġtested Ġand ĊĠĠĠĠ Ġ* Ġsupported Ġat Ġthis Ġtime . ĠIt Ġis Ġpossible , Ġalthough Ġunlikely Ġthat Ġmultiple Ġaccounts Ġwould Ġbehave ĊĠĠĠĠ Ġ* Ġas Ġexpected . ĠDue Ġto Ġthe Ġnature Ġof Ġsh ielded Ġaddress , Ġthe Ġofficial ĠZ cash Ġrecommendation Ġis Ġto ĊĠĠĠĠ Ġ* Ġonly Ġuse Ġone Ġaddress Ġfor Ġsh ielded Ġtransactions . ĠUn like Ġtransparent Ġcoins , Ġaddress Ġrotation Ġis ĊĠĠĠĠ Ġ* Ġnot Ġnecessary Ġfor Ġsh ielded ĠZ cash Ġtransactions Ġbecause Ġthe Ġsensitive Ġinformation Ġis Ġprivate . ĊĠĠĠĠ Ġ* Ġ@ param Ġclear Cache Db Ġwhen Ġtrue , Ġthe Ġcache ĠDB Ġwill Ġbe Ġdeleted Ġprior Ġto Ġinitializing Ġaccounts . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġuseful Ġfor Ġprevent ing Ġerrors Ġwhen Ġthe Ġdatabase Ġalready Ġexists , Ġwhich Ġhappens Ġoften ĊĠĠĠĠ Ġ* Ġin Ġtests , Ġde mos Ġand Ġproof Ġof Ġconcepts . ĊĠĠĠĠ Ġ* Ġ@ param Ġclear Data Db Ġwhen Ġtrue , Ġthe Ġcache ĠDB Ġwill Ġbe Ġdeleted Ġprior Ġto Ġinitializing Ġaccounts . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġuseful Ġfor Ġprevent ing Ġerrors Ġwhen Ġthe Ġdatabase Ġalready Ġexists , Ġwhich Ġhappens Ġoften ĊĠĠĠĠ Ġ* Ġin Ġtests , Ġde mos Ġand Ġproof Ġof Ġconcepts . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġs pending Ġkeys Ġfor Ġeach Ġaccount , Ġordered Ġby Ġindex . ĠThese Ġkeys Ġare Ġonly Ġneeded Ġfor ĊĠĠĠĠ Ġ* Ġs pending Ġfunds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinitialize Accounts ( ĊĠĠĠĠĠĠĠ Ġseed : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġbirthday : ĠWallet Birth day , ĊĠĠĠĠĠĠĠ ĠnumberOf Accounts : ĠInt Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġclear Cache Db : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġclear Data Db : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . birthday Ġ= Ġbirthday ĊĠĠĠĠĠĠĠ Ġtw ig (" Initializing Ġaccounts Ġwith Ġbirthday Ġ${ birthday . height }") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Rust Backend (). clear ( clear Cache Db , Ġclear Data Db ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġcreates Ġtables , Ġif Ġthey Ġdon 't Ġexist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Rust Backend (). init Data Db () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Initialized Ġwallet Ġfor Ġfirst Ġrun ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInitial izer Exception . False Start ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Rust Backend (). init Blocks Table ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday . tree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" see ded Ġthe Ġdatabase Ġwith Ġsap ling Ġtree Ġat Ġheight Ġ${ birthday . height }") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t . message ?. contains (" is Ġnot Ġempty ") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInitial izer Exception . Already Initialized Exception ( t , Ġrust Backend . path Data Db ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInitial izer Exception . False Start ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequire Rust Backend (). init Accounts Table ( seed , ĠnumberOf Accounts ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Initialized Ġthe Ġaccounts Ġtable Ġwith Ġ${ numberOf Accounts } Ġaccount ( s )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInitial izer Exception . False Start ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġall Ġlocal Ġdata Ġrelated Ġto Ġthis Ġwallet , Ġas Ġthough Ġthe Ġwallet Ġwas Ġnever Ġcreated Ġon Ġthis ĊĠĠĠĠ Ġ* Ġdevice . ĠSimply Ġput , Ġthis Ġcall Ġdeletes Ġthe Ġ" cache Ġdb " Ġand Ġ" data Ġdb ." ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġrust Backend . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInternal Ġfunction Ġused Ġto Ġinitialize Ġthe Ġ[ rust Backend ] Ġbefore Ġuse . ĠInitialization Ġshould Ġonly ĊĠĠĠĠ Ġ* Ġhappen Ġas Ġa Ġresult Ġof Ġ[ new ], Ġ[ import ] Ġor Ġ[ open ] Ġbeing Ġcalled Ġor Ġas Ġpart Ġof Ġstand - alone Ġkey ĊĠĠĠĠ Ġ* Ġder ivation . ĠThis Ġinvolves Ġloading Ġthe Ġshared Ġobject Ġfile Ġvia Ġ` System . load Library `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġrust Backend Ġthat Ġwas Ġloaded Ġby Ġthis Ġinitializer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrequire Rust Backend (): ĠRust Backend Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Initializing Ġcache : Ġ$ path Cache Db Ġ Ġdata : Ġ$ path Data Db Ġ Ġparams : Ġ$ path Params ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ rust Backend Ġ= ĠRust Backend (). init ( path Cache Db , Ġpath Data Db , ĠpathParams ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrust Backend ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠKey ĠDer ivation ĠHelpers ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġseed Ġand Ġa Ġnumber Ġof Ġaccounts , Ġreturn Ġthe Ġassociated Ġs pending Ġkeys . ĠThese Ġkeys Ġcan ĊĠĠĠĠ Ġ* Ġbe Ġused Ġto Ġderive Ġthe Ġviewing Ġkeys . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġseed Ġthe Ġseed Ġfrom Ġwhich Ġto Ġderive Ġs pending Ġkeys . ĊĠĠĠĠ Ġ* Ġ@ param ĠnumberOf Accounts Ġthe Ġnumber Ġof Ġaccounts Ġto Ġuse . ĠMultiple Ġaccounts Ġare Ġnot Ġfully ĊĠĠĠĠ Ġ* Ġsupported Ġso Ġthe Ġdefault Ġvalue Ġof Ġ 1 Ġis Ġrecommended . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġs pending Ġkeys Ġthat Ġcorrespond Ġto Ġthe Ġseed , Ġformatted Ġas ĠStrings . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġderive S pending Keys ( seed : ĠByteArray , ĠnumberOf Accounts : ĠInt Ġ= ĠĠ 1 ): ĠArray < String > Ġ= ĊĠĠĠĠĠĠĠ Ġrequire Rust Backend (). derive S pending Keys ( seed , ĠnumberOf Accounts ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġseed Ġand Ġa Ġnumber Ġof Ġaccounts , Ġreturn Ġthe Ġassociated Ġviewing Ġkeys . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġseed Ġthe Ġseed Ġfrom Ġwhich Ġto Ġderive Ġviewing Ġkeys . ĊĠĠĠĠ Ġ* Ġ@ param ĠnumberOf Accounts Ġthe Ġnumber Ġof Ġaccounts Ġto Ġuse . ĠMultiple Ġaccounts Ġare Ġnot Ġfully ĊĠĠĠĠ Ġ* Ġsupported Ġso Ġthe Ġdefault Ġvalue Ġof Ġ 1 Ġis Ġrecommended . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġviewing Ġkeys Ġthat Ġcorrespond Ġto Ġthe Ġseed , Ġformatted Ġas ĠStrings . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġderive View ing Keys ( seed : ĠByteArray , ĠnumberOf Accounts : ĠInt Ġ= ĠĠ 1 ): ĠArray < String > Ġ= ĊĠĠĠĠĠĠĠ Ġrequire Rust Backend (). derive View ing Keys ( seed , ĠnumberOf Accounts ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġs pending Ġkey , Ġreturn Ġthe Ġassociated Ġviewing Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġs pending Key Ġthe Ġkey Ġfrom Ġwhich Ġto Ġderive Ġthe Ġviewing Ġkey . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġviewing Ġkey Ġthat Ġcorresponds Ġto Ġthe Ġs pending Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġderive View ing Key ( sp ending Key : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġrequire Rust Backend (). derive View ing Key ( sp ending Key ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġseed Ġand Ġaccount Ġindex , Ġreturn Ġthe Ġassociated Ġaddress . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġseed Ġthe Ġseed Ġfrom Ġwhich Ġto Ġderive Ġthe Ġaddress . ĊĠĠĠĠ Ġ* Ġ@ param Ġaccount Index Ġthe Ġindex Ġof Ġthe Ġaccount Ġto Ġuse Ġfor Ġderiving Ġthe Ġaddress . ĠMultiple ĊĠĠĠĠ Ġ* Ġaccounts Ġare Ġnot Ġfully Ġsupported Ġso Ġthe Ġdefault Ġvalue Ġof Ġ 1 Ġis Ġrecommended . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġaddress Ġthat Ġcorresponds Ġto Ġthe Ġseed Ġand Ġaccount Ġindex . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġderive Address ( seed : ĠByteArray , Ġaccount Index : ĠInt Ġ= Ġ 0 ) Ġ= ĊĠĠĠĠĠĠĠ Ġrequire Rust Backend (). derive Address ( seed , Ġaccount Index ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġa Ġviewing Ġkey Ġstring , Ġreturn Ġthe Ġassociated Ġaddress . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġviewing Key Ġthe Ġviewing Ġkey Ġto Ġuse Ġfor Ġderiving Ġthe Ġaddress . ĠThe Ġviewing Ġkey Ġis Ġtied Ġto ĊĠĠĠĠ Ġ* Ġa Ġspecific Ġaccount Ġso Ġno Ġaccount Ġindex Ġis Ġrequired . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġaddress Ġthat Ġcorresponds Ġto Ġthe Ġviewing Ġkey . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġderive Address ( view ing Key : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġrequire Rust Backend (). derive Address ( view ing Key ) ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠPath ĠHelpers ĊĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġpath Ġto Ġthe Ġcache Ġdatabase Ġthat Ġwould Ġcorrespond Ġto Ġthe Ġgiven Ġalias . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġapp Context Ġthe Ġapplication Ġcontext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġalias Ġthe Ġalias Ġto Ġconvert Ġinto Ġa Ġdatabase Ġpath ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcache Db Path ( app Context : ĠContext , Ġalias : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalias To Path ( app Context , Ġalias , ĠZ cash Sdk . DB _ CACHE _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġpath Ġto Ġthe Ġdata Ġdatabase Ġthat Ġwould Ġcorrespond Ġto Ġthe Ġgiven Ġalias . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġapp Context Ġthe Ġapplication Ġcontext ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġalias Ġthe Ġalias Ġto Ġconvert Ġinto Ġa Ġdatabase Ġpath ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġdata Db Path ( app Context : ĠContext , Ġalias : ĠString ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalias To Path ( app Context , Ġalias , ĠZ cash Sdk . DB _ DATA _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġalias To Path ( app Context : ĠContext , Ġalias : ĠString , Ġdb FileName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Dir : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context . get Database Path (" unused . db "). parent File ?. absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInitial izer Exception . Database Path Exception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( alias . endsWith ('_ ')) Ġalias Ġelse Ġ"${ alias }_ " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile ( parent Dir , Ġ"$ prefix $ db FileName "). absolute Path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠModel Ġobject Ġfor Ġholding Ġa Ġwallet Ġbirthday . ĠIt Ġis Ġonly Ġused Ġby Ġthis Ġclass . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġheight Ġthe Ġheight Ġat Ġthe Ġtime Ġthe Ġwallet Ġwas Ġborn . ĊĠĠĠĠ Ġ* Ġ@ param Ġhash Ġthe Ġhash Ġof Ġthe Ġblock Ġat Ġthe Ġheight . ĊĠĠĠĠ Ġ* Ġ@ param Ġtime Ġthe Ġblock Ġtime Ġat Ġthe Ġheight . ĊĠĠĠĠ Ġ* Ġ@ param Ġtree Ġthe Ġsap ling Ġtree Ġcorresponding Ġto Ġthe Ġheight . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠWallet Birth day ( ĊĠĠĠĠĠĠĠ Ġval Ġheight : ĠInt Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠ Ġval Ġhash : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġval Ġtime : ĠLong Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠ Ġval Ġtree : ĠString Ġ= Ġ"" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInterface Ġfor Ġclasses Ġthat Ġcan Ġhandle Ġbirthday Ġstorage . ĠThis Ġmakes Ġit Ġpossible Ġto Ġbridge Ġinto ĊĠĠĠĠ Ġ* Ġexisting Ġstorage Ġlogic . ĠInstances Ġof Ġthis Ġinterface Ġcan Ġalso Ġbe Ġused Ġas Ġproperty Ġdeleg ates , ĊĠĠĠĠ Ġ* Ġwhich Ġenables Ġthe Ġsyntax Ġ` val Ġbirthday Ġby Ġbirthday Store ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠWallet Birth day Store Ġ: ĠRead Write Property < R , ĠWallet Birth day > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Wallet Birth day : ĠWallet Birth day ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġthe Ġbirthday Ġof Ġthe Ġwallet , Ġsaved Ġin Ġthis Ġstore . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Birth day (): ĠWallet Birth day ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSet Ġthe Ġbirthday Ġof Ġthe Ġwallet Ġto Ġbe Ġsaved Ġin Ġthis Ġstore . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġset Birth day ( value : ĠWallet Birth day ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLoad Ġa Ġbirthday Ġmatching Ġthe Ġgiven Ġheight . ĠThis Ġis Ġmost Ġcommonly Ġused Ġduring Ġimport Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġfind Ġthe Ġfirst Ġavailable Ġcheckpoint Ġthat Ġis Ġlower Ġthan Ġthe Ġrequested Ġheight . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġbirthday Height Ġthe Ġheight Ġto Ġuse Ġas Ġan Ġupper Ġbound Ġfor Ġloading . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġload Birth day ( birthday Height : ĠInt ): ĠWallet Birth day ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturn Ġtrue Ġwhen Ġa Ġbirthday Ġhas Ġbeen Ġstored Ġin Ġthis Ġinstance . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġhas Existing Birth day (): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturn Ġtrue Ġwhen Ġa Ġbirthday Ġwas Ġimported Ġinto Ġthis Ġinstance . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġhas Imported Birth day (): ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġ/* ĠProperty Ġimplementation Ġthat Ġallows Ġthis Ġinterface Ġto Ġbe Ġused Ġas Ġa Ġproperty Ġdelegate Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠImplement Ġreadable Ġinterface Ġin Ġorder Ġto Ġbe Ġable Ġto Ġuse Ġinstances Ġof Ġthis Ġinterface Ġas ĊĠĠĠĠĠĠĠĠ Ġ* Ġproperty Ġdeleg ates . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( this Ref : ĠR , Ġproperty : ĠK Property < *> ): ĠWallet Birth day Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Birth day () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠImplement Ġwritable Ġinterface Ġin Ġorder Ġto Ġbe Ġable Ġto Ġuse Ġinstances Ġof Ġthis Ġinterface Ġas ĊĠĠĠĠĠĠĠĠ Ġ* Ġproperty Ġdeleg ates . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( this Ref : ĠR , Ġproperty : ĠK Property <* >, Ġvalue : ĠWallet Birth day ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Birth day ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġimplementation Ġof Ġthe Ġ[ Wallet Birth day Store ] Ġinterface Ġthat Ġloads Ġcheck points Ġfrom Ġthe ĊĠĠĠĠ Ġ* Ġassets Ġdirectory , Ġin ĠJSON Ġformat Ġand Ġstores Ġthe Ġcurrent Ġbirthday Ġin Ġshared Ġpreferences . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠDefault Birth day Store ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġapp Context : ĠContext , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġimported Birth day Height : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġalias : ĠString Ġ= ĠDEFAULT _ ALIAS ĊĠĠĠ Ġ) Ġ: ĠWallet Birth day Store Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠB irth day Ġthat Ġhelps Ġnew Ġwallet s Ġnot Ġhave Ġto Ġscan Ġfrom Ġthe Ġbeginning , Ġwhich Ġsaves ĊĠĠĠĠĠĠĠĠ Ġ* Ġsignificant Ġamounts Ġof Ġstartup Ġtime . ĠThis Ġvalue Ġis Ġcreated Ġusing Ġthe Ġcontext Ġpassed Ġinto ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġconstructor . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġnew Wallet Birth day : ĠWallet Birth day Ġget () Ġ= Ġload Birth day From Assets ( app Context ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠB irth day Ġto Ġuse Ġwhenever Ġno Ġbirthday Ġis Ġknown , Ġmeaning Ġwe Ġhave Ġto Ġscan Ġfrom Ġthe Ġfirst ĊĠĠĠĠĠĠĠĠ Ġ* Ġtime Ġa Ġtransaction Ġcould Ġhave Ġhappened . ĠThis Ġis Ġthe Ġmost Ġefficient Ġvalue Ġwe Ġcan Ġuse Ġin ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġleast Ġefficient Ġcircum stance . ĠThis Ġvalue Ġis Ġcreated Ġusing Ġthe Ġcontext Ġpassed Ġinto ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġconstructor Ġand Ġit Ġis Ġa Ġdifferent Ġvalue Ġfor Ġmain net Ġand Ġtest net . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsap ling Birth day : ĠWallet Birth day Ġget () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Birth day From Assets ( app Context , ĠZ cash Sdk . SAP LING _ ACTIV ATION _ HEIGHT ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPreferences Ġwhere Ġthe Ġbirthday Ġis Ġstored . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġprefs : ĠSharedPreferences Ġ= ĠShared Prefs ( app Context , Ġalias ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Alias ( alias ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Existing Birth day (): ĠBoolean Ġ= Ġload Birth day From Prefs ( prefs ) Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Imported Birth day (): ĠBoolean Ġ= Ġimported Birth day Height Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Birth day (): ĠInitial izer . Wallet Birth day Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġload Birth day From Prefs ( prefs ). apply Ġ{ Ġtw ig (" Loaded Ġbirthday Ġfrom Ġprefs : Ġ${ this ?. height }") Ġ} Ġ?: Ġsap ling Birth day . apply Ġ{ Ġtw ig (" return ing Ġsap ling Ġbirthday ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Birth day ( value : ĠWallet Birth day ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Setting Ġbirthday Ġto Ġ${ value . height }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Birth day To Prefs ( prefs , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload Birth day ( birthday Height : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Birth day From Assets ( app Context , Ġbirthday Height ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġbirthday - related Ġprimitives Ġfrom Ġthe Ġgiven Ġpreference Ġobject Ġand Ġthen Ġuses ĊĠĠĠĠĠĠĠĠ Ġ* Ġthem Ġto Ġconstruct Ġand Ġreturn Ġa Ġbirthday Ġinstance . ĠIt Ġassumes Ġthat Ġif Ġthe Ġfirst Ġpreference ĊĠĠĠĠĠĠĠĠ Ġ* Ġis Ġthere , Ġthe Ġrest Ġwill Ġbe Ġtoo . ĠIf Ġthat 's Ġnot Ġthe Ġcase , Ġa Ġcall Ġto Ġthis Ġfunction Ġwill ĊĠĠĠĠĠĠĠĠ Ġ* Ġresult Ġin Ġan Ġexception . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġprefs Ġthe Ġshared Ġpreference Ġto Ġuse Ġfor Ġloading Ġthe Ġbirthday . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġbirthday Ġfrom Ġpreferences Ġif Ġone Ġexists Ġand Ġnull , Ġotherwise Ġnull ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Birth day From Prefs ( prefs : ĠSharedPreferences ?): ĠWallet Birth day ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight : ĠInt ? Ġ= Ġprefs [ PRE FS _ B IR TH DAY _ HEIGHT ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġheight ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWallet Birth day ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ PRE FS _ B IR TH DAY _ HASH ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ PRE FS _ B IR TH DAY _ TIME ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ PRE FS _ B IR TH DAY _ TREE ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSave Ġthe Ġgiven Ġbirthday Ġto Ġthe Ġgiven Ġpreferences . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġprefs Ġthe Ġshared Ġpreferences Ġto Ġuse Ġfor Ġsaving Ġthe Ġbirthday . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġbirthday Ġthe Ġbirthday Ġto Ġsave . ĠIt Ġwill Ġbe Ġsplit Ġinto Ġprimitives . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsave Birth day To Prefs ( prefs : ĠSharedPreferences , Ġbirthday : ĠWallet Birth day ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" saving Ġbirthday Ġto Ġprefs Ġ(${ birthday . height }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ PRE FS _ B IR TH DAY _ HEIGHT ] Ġ= Ġbirthday . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ PRE FS _ B IR TH DAY _ HASH ] Ġ= Ġbirthday . hash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ PRE FS _ B IR TH DAY _ TIME ] Ġ= Ġbirthday . time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ PRE FS _ B IR TH DAY _ TREE ] Ġ= Ġbirthday . tree ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠStatic Ġhelper Ġfunctions Ġthat Ġfacilitate Ġinitializing Ġthe Ġbirthday . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPreference ĠKeys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ HAS _ DATA Ġ= Ġ" Initializer . prefs . has Data " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ B IR TH DAY _ HEIGHT Ġ= Ġ" Initializer . prefs . birthday . height " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ B IR TH DAY _ TIME Ġ= Ġ" Initializer . prefs . birthday . time " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ B IR TH DAY _ HASH Ġ= Ġ" Initializer . prefs . birthday . hash " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ B IR TH DAY _ TREE Ġ= Ġ" Initializer . prefs . birthday . tree " ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠDirectory Ġwithin Ġthe Ġassets Ġfolder Ġwhere Ġbirthday Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ( i . e . Ġsap ling Ġtrees Ġfor Ġa Ġgiven Ġheight ) Ġcan Ġbe Ġfound . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠB IR TH DAY _ DIRECTORY Ġ= Ġ" zc ash / sap ling tree " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġdefault Ġalias Ġto Ġuse Ġfor Ġnaming Ġthe Ġpreference Ġfile Ġused Ġfor Ġstorage . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ ALIAS Ġ= Ġ" default _ prefs " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠA Ġconvenience Ġconstructor Ġfunction Ġfor Ġcreating Ġan Ġinstance Ġof Ġthis Ġclass Ġto Ġuse Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġnew Ġwallet s . ĠIt Ġsets Ġthe Ġstored Ġbirthday Ġto Ġmatch Ġthe Ġ` new Wallet Birth day ` Ġcheckpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġwhich Ġis Ġtypically Ġthe Ġmost Ġrecent Ġcheckpoint Ġavailable . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġapp Context Ġthe Ġapplication Ġcontext . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġalias Ġthe Ġalias Ġto Ġuse Ġwhen Ġnaming Ġthe Ġpreferences Ġfile Ġused Ġfor Ġstorage . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠNew Wallet Birth day Store ( app Context : ĠContext , Ġalias : ĠString Ġ= ĠDEFAULT _ ALIAS ): ĠWallet Birth day Store Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDefault Birth day Store ( app Context , Ġalias Ġ= Ġalias ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Birth day ( new Wallet Birth day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠA Ġconvenience Ġconstructor Ġfunction Ġfor Ġcreating Ġan Ġinstance Ġof Ġthis Ġclass Ġto Ġuse Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġimported Ġwallet s . ĠIt Ġsets Ġthe Ġstored Ġbirthday Ġto Ġmatch Ġthe Ġgiven ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ` imported Birth day Height ` Ġby Ġfinding Ġthe Ġhighest Ġcheckpoint Ġthat Ġis Ġbelow Ġthat Ġheight . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġapp Context Ġthe Ġapplication Ġcontext . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġimported Birth day Height Ġthe Ġheight Ġcorresponding Ġto Ġthe Ġbirthday Ġof Ġthe Ġwallet ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbeing Ġimported . ĠA Ġcheckpoint Ġwill Ġbe Ġgenerated Ġthat Ġallows Ġscanning Ġto Ġstart Ġas Ġclose ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto Ġthis Ġheight Ġas Ġpossible Ġbecause Ġany Ġblocks Ġbefore Ġthis Ġheight Ġcan Ġsafely Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġignored Ġsince Ġa Ġwallet Ġcannot Ġhave Ġtransactions Ġbefore Ġit Ġis Ġborn . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġalias Ġthe Ġalias Ġto Ġuse Ġwhen Ġnaming Ġthe Ġpreferences Ġfile Ġused Ġfor Ġstorage . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠImport ed Wallet Birth day Store ( app Context : ĠContext , Ġimported Birth day Height : ĠInt ?, Ġalias : ĠString Ġ= ĠDEFAULT _ ALIAS ): ĠWallet Birth day Store Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDefault Birth day Store ( app Context , Ġalias Ġ= Ġalias ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( imported Birth day Height Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Birth day To Prefs ( prefs , Ġload Birth day From Assets ( app Context , Ġimported Birth day Height )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Birth day ( new Wallet Birth day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠLoad Ġthe Ġgiven Ġbirthday Ġfile Ġfrom Ġthe Ġassets Ġof Ġthe Ġgiven Ġcontext . ĠWhen Ġno Ġheight Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġspecified , Ġwe Ġdefault Ġto Ġthe Ġfile Ġwith Ġthe Ġgreatest Ġname . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġthe Ġcontext Ġfrom Ġwhich Ġto Ġload Ġassets . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġbirthday Height Ġthe Ġheight Ġfile Ġto Ġlook Ġfor Ġamong Ġthe Ġfile Ġnames . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa ĠWallet Birth day Ġthat Ġreflect s Ġthe Ġcontents Ġof Ġthe Ġfile Ġor Ġan Ġexception Ġwhen ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġparsing Ġfails . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġload Birth day From Assets ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday Height : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠWallet Birth day Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" loading Ġbirthday Ġfrom Ġassets : Ġ$ birthday Height ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Files Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . assets . list ( B IR TH DAY _ DIRECTORY )?. apply Ġ{ ĠsortBy Descending Ġ{ ĠfileName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfileName . split ('. '). first (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ cash Sdk . SAP LING _ ACTIV ATION _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tree Files . isNull OrEmpty ()) Ġthrow ĠB irth day Exception . Missing Birth day Files Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB IR TH DAY _ DIRECTORY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" found Ġ${ tree Files . size } Ġsap ling Ġtree Ġcheck points : Ġ${ Arrays . toString ( tree Files )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġif Ġ( birthday Height Ġ== Ġnull ) Ġtree Files . first () Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Files . first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . split (". "). first (). toInt () Ġ<= Ġbirthday Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠB irth day Exception . Birth day FileNotFoundException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB IR TH DAY _ DIRECTORY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbirthday Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠJson Reader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInputStreamReader ( context . assets . open ("${ B IR TH DAY _ DIRECTORY }/ $ file ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGson (). fromJson ( reader , ĠWallet Birth day :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠB irth day Exception . Mal formatted Birth day Files Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB IR TH DAY _ DIRECTORY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Files [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠHelper Ġfunctions Ġfor Ġusing ĠSharedPreferences ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCon ven ient Ġconstructor Ġfunction Ġfor ĠSharedPreferences Ġused Ġby Ġthis Ġclass . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" FunctionName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠShared Prefs ( context : ĠContext , Ġname : ĠString Ġ= Ġ" prefs "): ĠSharedPreferences Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ"${ Build Config . FL AV OR }.${ Build Config . BUILD _ TYPE }. $ name ". toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . get SharedPreferences ( fileName , ĠContext . MODE _ PRIVATE ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun ĠSharedPreferences . edit ( block : Ġ( SharedPreferences . Editor ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġoperator Ġfun ĠSharedPreferences . set ( key : ĠString , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString ? Ġ-> Ġedit Ġ{ Ġit . putString ( key , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġedit Ġ{ Ġit . put Int ( key , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Ġ-> Ġedit Ġ{ Ġit . put Boolean ( key , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Ġ-> Ġedit Ġ{ Ġit . put Float ( key , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġedit Ġ{ Ġit . put Long ( key , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Not Ġyet Ġimplemented ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġinline Ġoperator Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠSharedPreferences . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue : ĠT ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( T :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class Ġ-> ĠgetString ( key , ĠdefaultValue Ġas ? ĠString ) Ġas ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class Ġ-> Ġget Int ( key , ĠdefaultValue Ġas ? ĠInt Ġ?: Ġ- 1 ) Ġas ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: class Ġ-> Ġget Boolean ( key , ĠdefaultValue Ġas ? ĠBoolean Ġ?: Ġfalse ) Ġas ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class Ġ-> Ġget Float ( key , ĠdefaultValue Ġas ? ĠFloat Ġ?: Ġ- 1 f ) Ġas ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class Ġ-> Ġget Long ( key , ĠdefaultValue Ġas ? ĠLong Ġ?: Ġ- 1 ) Ġas ĠT ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Not Ġyet Ġimplemented ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConvenience Ġextension Ġfor Ġimporting Ġfrom Ġan Ġinteger Ġheight , Ġrather Ġthan Ġa Ġwallet Ġbirthday Ġobject . Ċ Ġ* Ċ Ġ* Ġ@ param Ġalias Ġthe Ġprefix Ġto Ġuse Ġfor Ġthe Ġcache Ġof Ġblocks Ġdownloaded Ġand Ġthe Ġdata Ġdecrypted Ġfrom Ċ Ġ* Ġthose Ġblocks . ĠUsing Ġdifferent Ġnames Ġhelps Ġfor Ġuse Ġcases Ġthat Ġinvolve Ġmultiple Ġkeys . Ċ Ġ* Ġ@ param Ġoverwrite Ġwhen Ġtrue , Ġthis Ġwill Ġdelete Ġall Ġexisting Ġdata . ĠUse Ġwith Ġca ution Ġbecause Ġthis Ġcan Ċ Ġ* Ġresult Ġin Ġa Ġloss Ġof Ġfunds , Ġwhen Ġa Ġuser Ġhas Ġnot Ġbacked Ġup Ġtheir Ġseed . ĠThis Ġparameter Ġis Ġmost Ċ Ġ* Ġuseful Ġduring Ġtesting Ġor Ġproof Ġof Ġconcept Ġwork , Ġwhere Ġyou Ġwant Ġto Ġrun Ġthe Ġsame Ġcode Ġeach Ġtime Ġso Ċ Ġ* Ġdata Ġmust Ġbe Ġcleared Ġbetween Ġruns . Ċ Ġ* Ċ Ġ* Ġ@ return Ġthe Ġs pending Ġkeys , Ġderived Ġfrom Ġthe Ġseed , Ġfor Ġconvenience . Ċ Ġ*/ Ċ fun ĠInitial izer . import ( ĊĠĠĠ Ġseed : ĠByteArray , ĊĠĠĠ Ġbirthday Height : ĠInt , ĊĠĠĠ Ġalias : ĠString Ġ= ĠZ cash Sdk . DEFAULT _ DB _ NAME _ PREFIX , ĊĠĠĠ Ġoverwrite : ĠBoolean Ġ= Ġfalse Ċ ): ĠArray < String > Ġ{ ĊĠĠĠ Ġreturn ĠImport ed Wallet Birth day Store ( context , Ġbirthday Height , Ġalias ). get Birth day (). let Ġ{ ĊĠĠĠĠĠĠĠ Ġimport ( seed , Ġit , Ġclear Cache Db Ġ= Ġoverwrite , Ġclear Data Db Ġ= Ġoverwrite ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠValidate Ġthat Ġthe Ġalias Ġdoesn 't Ġcontain Ġm alic ious Ġcharacters Ġby Ġen for cing Ġsimple Ġrules Ġwhich Ċ Ġ* Ġpermit Ġthe Ġalias Ġto Ġbe Ġused Ġas Ġpart Ġof Ġa Ġfile Ġname Ġfor Ġthe Ġpreferences Ġand Ġdatabases . ĠThis Ċ Ġ* Ġenables Ġmultiple Ġwallet s Ġto Ġexist Ġon Ġone Ġdevice , Ġwhich Ġis Ġalso Ġhelpful Ġfor Ġsweep ing Ġfunds . Ċ Ġ* Ċ Ġ* Ġ@ param Ġalias Ġthe Ġalias Ġto Ġvalidate . Ċ Ġ* Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġwhenever Ġthe Ġalias Ġis Ġnot Ġless Ġthan Ġ 1 0 0 Ġcharacters Ġor Ċ Ġ* Ġcontains Ġsomething Ġother Ġthan Ġal phanumeric Ġcharacters . ĠUnd ers cores Ġare Ġallowed Ġbut Ġaliases Ċ Ġ* Ġmust Ġstart Ġwith Ġa Ġletter . Ċ Ġ*/ Ċ internal Ġfun Ġvalidate Alias ( alias : ĠString ) Ġ{ ĊĠĠĠ Ġrequire ( alias . length Ġin Ġ 1 .. 9 9 Ġ&& Ġalias [ 0 ]. is Letter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġalias . all { Ġit . is Letter Or Digit () Ġ|| Ġit Ġ== Ġ'_' Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" ERROR : ĠInvalid Ġalias Ġ($ alias ). ĠFor Ġsecurity , Ġthe Ġalias Ġmust Ġbe Ġshorter Ġthan Ġ 1 0 0 Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" characters Ġand Ġonly Ġcontain Ġletters , Ġdigits Ġor Ġunders cores Ġand Ġstart Ġwith Ġa Ġletter " ĊĠĠĠ Ġ} Ċ } Ċ