package Ġcash . z . ecc . android . sdk Ċ Ċ import Ġandroid . content . Context Ċ import Ġcash . z . ecc . android . sdk . Synchron izer . Status . DIS CONNECTED Ċ import Ġcash . z . ecc . android . sdk . Synchron izer . Status . DOWNLOAD ING Ċ import Ġcash . z . ecc . android . sdk . Synchron izer . Status . EN H AN C ING Ċ import Ġcash . z . ecc . android . sdk . Synchron izer . Status . SCAN NING Ċ import Ġcash . z . ecc . android . sdk . Synchron izer . Status . STOP PED Ċ import Ġcash . z . ecc . android . sdk . Synchron izer . Status . SYNC ED Ċ import Ġcash . z . ecc . android . sdk . Synchron izer . Status . VALID ATING Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Disconnected Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Downloading Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Enh ancing Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Initialized Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Sc anned Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Sc anning Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Stopped Ċ import Ġcash . z . ecc . android . sdk . block . Compact Block Processor . State . Valid ating Ċ import Ġcash . z . ecc . android . sdk . db . entity . Pending Transaction Ċ import Ġcash . z . ecc . android . sdk . db . entity . has Raw Transaction Id Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Cancelled Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Expired Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Failed Submit Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Long Expired Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Marked For Deletion Ċ import Ġcash . z . ecc . android . sdk . db . entity . is M ined Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Safe To Discard Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Submit Success Ċ import Ġcash . z . ecc . android . sdk . db . entity . is Submitted Ċ import Ġcash . z . ecc . android . sdk . exception . Synchron izer Exception Ċ import Ġcash . z . ecc . android . sdk . ext . Consensus Branch Id Ċ import Ġcash . z . ecc . android . sdk . ext . Z cash Sdk Ċ import Ġcash . z . ecc . android . sdk . internal . block . Compact Block Db Store Ċ import Ġcash . z . ecc . android . sdk . internal . block . Compact Block Downloader Ċ import Ġcash . z . ecc . android . sdk . internal . block . Compact Block Store Ċ import Ġcash . z . ecc . android . sdk . internal . ext . to Hex Re versed Ċ import Ġcash . z . ecc . android . sdk . internal . ext . try Null Ċ import Ġcash . z . ecc . android . sdk . internal . service . Light Wallet Grpc Service Ċ import Ġcash . z . ecc . android . sdk . internal . service . Light Wallet Service Ċ import Ġcash . z . ecc . android . sdk . internal . transaction . Outbound Transaction Manager Ċ import Ġcash . z . ecc . android . sdk . internal . transaction . Paged Transaction Repository Ċ import Ġcash . z . ecc . android . sdk . internal . transaction . Persistent Transaction Manager Ċ import Ġcash . z . ecc . android . sdk . internal . transaction . Transaction Encoder Ċ import Ġcash . z . ecc . android . sdk . internal . transaction . Transaction Repository Ċ import Ġcash . z . ecc . android . sdk . internal . transaction . Wallet Transaction Encoder Ċ import Ġcash . z . ecc . android . sdk . internal . twig Ċ import Ġcash . z . ecc . android . sdk . internal . twig Task Ċ import Ġcash . z . ecc . android . sdk . tool . Der ivation Tool Ċ import Ġcash . z . ecc . android . sdk . type . Address Type Ċ import Ġcash . z . ecc . android . sdk . type . Address Type . Sh ielded Ċ import Ġcash . z . ecc . android . sdk . type . Address Type . Transparent Ċ import Ġcash . z . ecc . android . sdk . type . Consensus Match Type Ċ import Ġcash . z . ecc . android . sdk . type . Wallet Balance Ċ import Ġcash . z . ecc . android . sdk . type . Z cash Network Ċ import Ġcash . z . wallet . sdk . rpc . Service Ċ import Ġio . grpc . Managed Channel Ċ import Ġkotlinx . coroutines . Coroutine ExceptionHandler Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Flow Preview Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . cancel Ċ import Ġkotlinx . coroutines . channels . Con fl ated Broadcast Channel Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . flow . as State Flow Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . flow . flatMap Latest Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ Ċ /** Ċ Ġ* ĠA ĠSynchron izer Ġthat Ġattempts Ġto Ġremain Ġoperational , Ġdespite Ġany Ġnumber Ġof Ġerrors Ġthat Ġcan Ġoccur . Ċ Ġ* ĠIt Ġacts Ġas Ġthe Ġglue Ġthat Ġt ies Ġall Ġthe Ġpieces Ġof Ġthe ĠSDK Ġtogether . ĠEach Ġcomponent Ġof Ġthe ĠSDK Ġis Ċ Ġ* Ġdesigned Ġfor Ġthe Ġpotential Ġof Ġstand - alone Ġusage Ġbut Ġcoord in ating Ġall Ġthe Ġinteractions Ġis Ġnon - Ċ Ġ* Ġtrivial . ĠSo Ġthe ĠSynchron izer Ġfacilit ates Ġthis , Ġact ing Ġas Ġreference Ġthat Ġdemonstrates Ġhow Ġall Ġthe Ċ Ġ* Ġpieces Ġcan Ġbe Ġtied Ġtogether . ĠIts Ġgoal Ġis Ġto Ġallow Ġa Ġdeveloper Ġto Ġfocus Ġon Ġtheir Ġapp Ġrather Ġthan Ċ Ġ* Ġthe Ġnu ances Ġof Ġhow ĠZ cash Ġworks . Ċ Ġ* Ċ Ġ* Ġ@ property Ġstorage Ġexposes Ġflows Ġof Ġwallet Ġtransaction Ġinformation . Ċ Ġ* Ġ@ property Ġtx Manager Ġmanages Ġand Ġtracks Ġoutbound Ġtransactions . Ċ Ġ* Ġ@ property Ġprocessor Ġsaves Ġthe Ġdownloaded Ġcompact Ġblocks Ġto Ġthe Ġcache Ġand Ġthen Ġscans Ġthose Ġblocks Ġfor Ċ Ġ* Ġdata Ġrelated Ġto Ġthis Ġwallet . Ċ Ġ*/ Ċ @ Experimental Cor outines Api Ċ @ Flow Preview Ċ class ĠS dk Synchron izer Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġstorage : ĠTransaction Repository , ĊĠĠĠ Ġprivate Ġval Ġtx Manager : ĠOut bound Transaction Manager , ĊĠĠĠ Ġval Ġprocessor : ĠComp act Block Processor Ċ ) Ġ: ĠSynchron izer Ġ{ ĊĊĠĠĠ Ġ// Ġpools ĊĠĠĠ Ġprivate Ġval Ġ_ orch ard Balances Ġ= ĠMutable State Flow ( Wallet Balance ()) ĊĠĠĠ Ġprivate Ġval Ġ_ sap ling Balances Ġ= ĠMutable State Flow ( Wallet Balance ()) ĊĠĠĠ Ġprivate Ġval Ġ_ transparent Balances Ġ= ĠMutable State Flow ( Wallet Balance ()) ĊĊĠĠĠ Ġprivate Ġval Ġ_ status Ġ= ĠCon fl ated Broadcast Channel < Synchron izer . Status >( DIS CONNECTED ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġl if es pan Ġof Ġthis ĠSynchron izer . ĠThis Ġscope Ġis Ġinitialized Ġonce Ġthe ĠSynchron izer Ġstarts ĊĠĠĠĠ Ġ* Ġbecause Ġit Ġwill Ġbe Ġa Ġchild Ġof Ġthe Ġparent Scope Ġthat Ġgets Ġpassed Ġinto Ġthe Ġ[ start ] Ġfunction . ĊĠĠĠĠ Ġ* ĠEverything Ġlaunched Ġby Ġthis ĠSynchron izer Ġwill Ġbe Ġcancelled Ġonce Ġthe ĠSynchron izer Ġor Ġits ĊĠĠĠĠ Ġ* Ġparent Scope Ġstops . ĠThis Ġcoordinates Ġwith Ġ[ is Started ] Ġso Ġthat Ġit Ġfails Ġearly ĊĠĠĠĠ Ġ* Ġrather Ġthan Ġsilently , Ġwhenever Ġthe Ġscope Ġis Ġused Ġbefore Ġthe ĠSynchron izer Ġhas Ġbeen Ġstarted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcoroutine Scope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Empty Coroutine Context ) ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSynchron izer Exception . Not Y et Started ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . coroutine Context Ġ! is ĠEmpty Coroutine Context ) Ġis Started Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġchannel Ġthat Ġthis ĠSynchron izer Ġuses Ġto Ġcommunicate Ġwith Ġlight w alle td . ĠIn Ġmost Ġcases , Ġthis ĊĠĠĠĠ Ġ* Ġshould Ġnot Ġbe Ġneeded Ġor Ġused . ĠInstead , ĠAPIs Ġshould Ġbe Ġadded Ġto Ġthe Ġsynchron izer Ġto ĊĠĠĠĠ Ġ* Ġenable Ġthe Ġdesired Ġbehavior . ĠIn Ġthe Ġrare Ġcase , Ġsuch Ġas Ġtesting , Ġit Ġcan Ġbe Ġhelpful Ġto Ġshare ĊĠĠĠĠ Ġ* Ġthe Ġunderlying Ġchannel Ġto Ġconnect Ġto Ġthe Ġsame Ġservice , Ġand Ġuse Ġother ĠAPIs ĊĠĠĠĠ Ġ* Ġ( such Ġas Ġdark side w alle td ) Ġbecause Ġchannels Ġare Ġheavy weight . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġchannel : ĠManaged Channel Ġget () Ġ= Ġ( processor . downloader . light Wallet Service Ġas ĠLight Wallet Grpc Service ). channel ĊĊĠĠĠ Ġoverride Ġvar Ġis Started Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠBal ances ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġoverride Ġval Ġor chard Balances Ġ= Ġ_ orch ard Balances . as State Flow () ĊĠĠĠ Ġoverride Ġval Ġsap ling Balances Ġ= Ġ_ sap ling Balances . as State Flow () ĊĠĠĠ Ġoverride Ġval Ġtransparent Balances Ġ= Ġ_ transparent Balances . as State Flow () ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠTransactions ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġoverride Ġval Ġcleared Transactions Ġget () Ġ= Ġstorage . all Transactions ĊĠĠĠ Ġoverride Ġval Ġpending Transactions Ġ= Ġtx Manager . getAll () ĊĠĠĠ Ġoverride Ġval Ġsent Transactions Ġget () Ġ= Ġstorage . sent Transactions ĊĠĠĠ Ġoverride Ġval Ġreceived Transactions Ġget () Ġ= Ġstorage . received Transactions ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠStatus ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġoverride Ġval Ġnetwork : ĠZ cash Network Ġget () Ġ= Ġprocessor . network ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġthe Ġstatus Ġof Ġthis ĠSynchron izer . ĠThis Ġimplementation Ġbasically Ġsimpl ifies Ġthe ĊĠĠĠĠ Ġ* Ġstatus Ġof Ġthe Ġprocessor Ġto Ġfocus Ġonly Ġon Ġthe Ġhigh Ġlevel Ġstates Ġthat Ġmatter Ġmost . ĠWh enever Ġthe ĊĠĠĠĠ Ġ* Ġprocessor Ġis Ġfinished Ġscanning , Ġthe Ġsynchron izer Ġupdates Ġtransaction Ġand Ġbalance Ġinfo Ġand ĊĠĠĠĠ Ġ* Ġthen Ġemits Ġa Ġ[ SYNC ED ] Ġstatus . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġstatus Ġ= Ġ_ status . as Flow () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġthe Ġdownload Ġprogress Ġof Ġthe ĠSynchron izer . ĠWhen Ġprogress Ġreaches Ġ 1 0 0 , Ġthat ĊĠĠĠĠ Ġ* Ġsignals Ġthat Ġthe ĠSynchron izer Ġis Ġin Ġsync Ġwith Ġthe Ġnetwork . ĠBal ances Ġshould Ġbe Ġconsidered ĊĠĠĠĠ Ġ* Ġin accur ate Ġand Ġoutbound Ġtransactions Ġshould Ġbe Ġprevent ed Ġuntil Ġthis Ġsync Ġis Ġcomplete . ĠIt Ġis ĊĠĠĠĠ Ġ* Ġa Ġsimplified Ġversion Ġof Ġ[ processor Info ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġprogress : ĠFlow < Int > Ġ= Ġprocessor . progress ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġthe Ġlatest Ġinformation Ġabout Ġthe Ġblocks Ġthat Ġhave Ġbeen Ġprocessed Ġby Ġthe ĠSDK . ĠThis ĊĠĠĠĠ Ġ* Ġis Ġvery Ġhelpful Ġfor Ġcon vey ing Ġdetailed Ġprogress Ġand Ġstatus Ġto Ġthe Ġuser . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġprocessor Info : ĠFlow < Compact Block Processor . Processor Info > Ġ= Ġprocessor . processor Info ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlatest Ġheight Ġseen Ġon Ġthe Ġnetwork Ġwhile Ġprocessing Ġblocks . ĠThis Ġmay Ġdiffer Ġfrom Ġthe ĊĠĠĠĠ Ġ* Ġlatest Ġheight Ġscanned Ġand Ġis Ġuseful Ġfor Ġdetermining Ġblock Ġconfirm ations Ġand Ġexpiration . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġnetwork Height : ĠState Flow < Int > Ġ= Ġprocessor . network Height ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠError ĠHandling ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcallback Ġto Ġinvoke Ġwhenever Ġan Ġun caught Ġerror Ġis Ġencountered . ĠBy Ġdefinition , Ġthe Ġreturn ĊĠĠĠĠ Ġ* Ġvalue Ġof Ġthe Ġfunction Ġis Ġignored Ġbecause Ġthis Ġerror Ġis Ġun recover able . ĠThe Ġonly Ġreason Ġthe ĊĠĠĠĠ Ġ* Ġfunction Ġhas Ġa Ġreturn Ġvalue Ġis Ġso Ġthat Ġall Ġerror Ġhandlers Ġwork Ġwith Ġthe Ġsame Ġsignature Ġwhich ĊĠĠĠĠ Ġ* Ġallows Ġone Ġfunction Ġto Ġhandle Ġall Ġerrors Ġin Ġsimple Ġapps . ĠThis Ġcallback Ġis Ġnot Ġcalled Ġon Ġthe ĊĠĠĠĠ Ġ* Ġmain Ġthread Ġso Ġany ĠUI Ġwork Ġwould Ġneed Ġto Ġswitch Ġcontext Ġto Ġthe Ġmain Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġon Critical ErrorHandler : Ġ(( Throwable ?) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcallback Ġto Ġinvoke Ġwhenever Ġa Ġprocessor Ġerror Ġis Ġencountered . ĠReturn ing Ġtrue Ġsignals Ġthat ĊĠĠĠĠ Ġ* Ġthe Ġerror Ġwas Ġhandled Ġand Ġa Ġretry Ġattempt Ġshould Ġbe Ġmade , Ġif Ġpossible . ĠThis Ġcallback Ġis Ġnot ĊĠĠĠĠ Ġ* Ġcalled Ġon Ġthe Ġmain Ġthread Ġso Ġany ĠUI Ġwork Ġwould Ġneed Ġto Ġswitch Ġcontext Ġto Ġthe Ġmain Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġon Processor ErrorHandler : Ġ(( Throwable ?) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcallback Ġto Ġinvoke Ġwhenever Ġa Ġserver Ġerror Ġis Ġencountered Ġwhile Ġsubmitting Ġa Ġtransaction Ġto ĊĠĠĠĠ Ġ* Ġlight w alle td . ĠReturn ing Ġtrue Ġsignals Ġthat Ġthe Ġerror Ġwas Ġhandled Ġand Ġa Ġretry Ġattempt Ġshould Ġbe ĊĠĠĠĠ Ġ* Ġmade , Ġif Ġpossible . ĠThis Ġcallback Ġis Ġnot Ġcalled Ġon Ġthe Ġmain Ġthread Ġso Ġany ĠUI Ġwork Ġwould Ġneed ĊĠĠĠĠ Ġ* Ġto Ġswitch Ġcontext Ġto Ġthe Ġmain Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġon Submission ErrorHandler : Ġ(( Throwable ?) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcallback Ġto Ġinvoke Ġwhenever Ġa Ġprocessor Ġis Ġnot Ġsetup Ġcorrectly . ĠReturn ing Ġtrue Ġsignals Ġthat ĊĠĠĠĠ Ġ* Ġthe Ġinvalid Ġsetup Ġshould Ġbe Ġignored . ĠIf Ġno Ġhandler Ġis Ġset , Ġthen Ġany Ġsetup Ġerror Ġwill Ġresult ĊĠĠĠĠ Ġ* Ġin Ġa Ġcritical Ġerror . ĠThis Ġcallback Ġis Ġnot Ġcalled Ġon Ġthe Ġmain Ġthread Ġso Ġany ĠUI Ġwork Ġwould Ġneed ĊĠĠĠĠ Ġ* Ġto Ġswitch Ġcontext Ġto Ġthe Ġmain Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġon Setup ErrorHandler : Ġ(( Throwable ?) Ġ-> ĠBoolean )? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġcallback Ġto Ġinvoke Ġwhenever Ġa Ġchain Ġerror Ġis Ġencountered . ĠThese Ġoccur Ġwhenever Ġthe ĊĠĠĠĠ Ġ* Ġprocessor Ġdetect s Ġa Ġmissing Ġor Ġnon - chain - sequential Ġblock Ġ( i . e . Ġa Ġre org ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġon Chain ErrorHandler : Ġ(( error Height : ĠInt , Ġre wind Height : ĠInt ) Ġ-> ĠAny )? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠPublic ĠAPI ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfunction Ġfor Ġthe Ġlatest Ġheight . ĠSpecific ally , Ġthis Ġvalue Ġrepresents Ġthe Ġlast ĊĠĠĠĠ Ġ* Ġheight Ġthat Ġthe Ġsynchron izer Ġhas Ġobserved Ġfrom Ġthe Ġlight w alle td Ġserver . ĠInstead Ġof Ġusing ĊĠĠĠĠ Ġ* Ġthis , Ġa Ġwallet Ġwill Ġmore Ġlikely Ġwant Ġto Ġconsume Ġthe Ġflow Ġof Ġprocessor Ġinfo Ġusing ĊĠĠĠĠ Ġ* Ġ[ processor Info ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġlatest Height : ĠInt Ġget () Ġ= Ġprocessor . current Info . network Block Height ĊĊĠĠĠ Ġoverride Ġval Ġlatest Birth day Height : ĠInt Ġget () Ġ= Ġprocessor . birthday Height ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġprepare (): ĠSynchron izer Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing ; Ġthis Ġcould Ġlikely Ġbe Ġremoved ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthis Ġsynchron izer Ġwithin Ġthe Ġgiven Ġscope . ĠFor Ġsimplicity , Ġattempting Ġto Ġstart Ġan ĊĠĠĠĠ Ġ* Ġinstance Ġthat Ġhas Ġalready Ġbeen Ġstarted Ġwill Ġthrow Ġa Ġ[ Synchron izer Exception . False Start ] ĊĠĠĠĠ Ġ* Ġexception . ĠThis Ġreduces Ġthe Ġcomplexity Ġof Ġmanaging Ġresources Ġthat Ġmust Ġbe Ġre cyc led . ĠInstead , ĊĠĠĠĠ Ġ* Ġeach Ġsynchron izer Ġis Ġdesigned Ġto Ġhave Ġa Ġlong Ġl if es pan Ġand Ġshould Ġbe Ġstarted Ġfrom Ġan Ġactivity , ĊĠĠĠĠ Ġ* Ġapplication Ġor Ġsession . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Scope Ġthe Ġscope Ġto Ġuse Ġfor Ġthis Ġsynchron izer , Ġtypically Ġsomething Ġwith Ġa ĊĠĠĠĠ Ġ* Ġlifecycle Ġsuch Ġas Ġan ĠActivity Ġfor Ġsingle - activity Ġapps Ġor Ġa Ġlogged Ġin Ġuser Ġsession . ĠThis ĊĠĠĠĠ Ġ* Ġscope Ġis Ġonly Ġused Ġfor Ġlaunch ing Ġthis Ġsynchron izer 's Ġjob Ġas Ġa Ġchild . ĠIf Ġno Ġscope Ġis Ġprovided , ĊĠĠĠĠ Ġ* Ġthen Ġthis Ġsynchron izer Ġand Ġall Ġof Ġits Ġcor outines Ġwill Ġrun Ġuntil Ġstop Ġis Ġcalled , Ġwhich Ġis Ġnot ĊĠĠĠĠ Ġ* Ġrecommended Ġsince Ġit Ġcan Ġleak Ġresources . ĠThat Ġtype Ġof Ġbehavior Ġis Ġmore Ġuseful Ġfor Ġtests . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġinstance Ġof Ġthis Ġclass Ġso Ġthat Ġthis Ġfunction Ġcan Ġbe Ġused Ġfluid ly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstart ( parent Scope : ĠCor outine Scope ?): ĠSynchron izer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Started ) Ġthrow ĠSynchron izer Exception . False Start ĊĠĠĠĠĠĠĠ Ġ// Ġbase Ġthis Ġscope Ġon Ġthe Ġparent Ġso Ġthat Ġwhen Ġthe Ġparent 's Ġjob Ġcancel s , Ġeverything Ġhere ĊĠĠĠĠĠĠĠ Ġ// Ġcancel s Ġas Ġwell Ġalso Ġuse Ġa Ġsupervisor Ġjob Ġso Ġthat Ġone Ġfailure Ġdoesn 't Ġbring Ġdown Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġwhole Ġsynchron izer ĊĠĠĠĠĠĠĠ Ġval Ġsupervisor Job Ġ= ĠSuper visor Job ( parent Scope ?. coroutine Context ?. get ( Job )) ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( supervisor Job Ġ+ ĠDispatch ers . Main ). let Ġ{ Ġscope Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ= Ġscope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . on Ready () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġthis Ġsynchron izer Ġand Ġall Ġof Ġits Ġchild Ġjobs . ĠOnce Ġa Ġsynchron izer Ġhas Ġbeen Ġstopped Ġit ĊĠĠĠĠ Ġ* Ġshould Ġnot Ġbe Ġrestarted Ġand Ġattempting Ġto Ġdo Ġso Ġwill Ġresult Ġin Ġan Ġerror . ĠAlso , Ġthis Ġfunction ĊĠĠĠĠ Ġ* Ġwill Ġthrow Ġan Ġexception Ġif Ġthe Ġsynchron izer Ġwas Ġnever Ġpreviously Ġstarted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlog Ġeverything Ġto Ġhelp Ġtro ubleshoot Ġshutdown s Ġthat Ġaren 't Ġgrace ful ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Synchron izer :: stop : ĠSTART ING ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Synchron izer :: stop : Ġprocessor . stop () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Synchron izer :: stop : Ġcoroutine Scope . cancel () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Synchron izer :: stop : Ġ_ status . cancel () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ status . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" Synchron izer :: stop : ĠCOMP LETE ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġfunction Ġthat Ġexposes Ġthe Ġunderlying Ġserver Ġinformation , Ġlike Ġits Ġname Ġand ĊĠĠĠĠ Ġ* Ġconsensus Ġbranch Ġid . ĠMost Ġwallet s Ġshould Ġalready Ġhave Ġa Ġdifferent Ġsource Ġof Ġtruth Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġserver ( s ) Ġwith Ġwhich Ġthey Ġoperate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Server Info (): ĠService . Light d Info Ġ= Ġprocessor . downloader . getServer Info () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġthe Ġserver Ġthat Ġis Ġbeing Ġused Ġto Ġdownload Ġcompact Ġblocks . ĠThis Ġwill Ġthrow Ġan ĊĠĠĠĠ Ġ* Ġexception Ġif Ġit Ġdetect s Ġthat Ġthe Ġserver Ġchange Ġis Ġinvalid Ġe . g . Ġswitching Ġto Ġtest net Ġfrom ĊĠĠĠĠ Ġ* Ġmain net . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġchange Server ( host : ĠString , Ġport : ĠInt , ĠerrorHandler : Ġ( Throwable ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( processor . downloader . light Wallet Service Ġas ĠLight Wallet Grpc Service ). connection Info ĊĠĠĠĠĠĠĠ Ġprocessor . downloader . change Service ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLight Wallet Grpc Service ( info . app Context , Ġhost , Ġport ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorHandler ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Nearest Rew ind Height ( height : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġprocessor . get Nearest Rew ind Height ( height ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġre wind To Nearest Height ( height : ĠInt , Ġalso Clear Block Cache : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . rewind To Nearest Height ( height , Ġalso Clear Block Cache ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġquick Rew ind () Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessor . quick Rew ind () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠStorage ĠAPIs ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġ// ĠTODO : Ġturn Ġthis Ġsection Ġinto Ġthe Ġdata Ġaccess ĠAPI . ĠFor Ġnow , Ġjust Ġaggregate Ġall Ġthe Ġthings Ġthat Ġwe Ġwant Ġto Ġdo Ġwith Ġthe Ġunderlying Ġdata ĊĊĠĠĠ Ġsuspend Ġfun Ġfind Block Hash ( height : ĠInt ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( storage Ġas ? ĠP aged Transaction Repository )?. find Block Hash ( height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfind Block Hash As Hex ( height : ĠInt ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Block Hash ( height )?. to Hex Re versed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Transaction Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( storage Ġas ? ĠP aged Transaction Repository )?. getTransaction Count () Ġ?: Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh Transactions () Ġ{ ĊĠĠĠĠĠĠĠ Ġstorage . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠPrivate ĠAPI ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġsuspend Ġfun Ġrefresh U tx os () Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" refresh ing Ġut x os ", Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġrefresh U tx os ( get Transparent Address ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculate Ġthe Ġlatest Ġbalance , Ġbased Ġon Ġthe Ġblocks Ġthat Ġhave Ġbeen Ġscanned Ġand Ġtransmit Ġthis ĊĠĠĠĠ Ġ* Ġinformation Ġinto Ġthe Ġflow Ġof Ġ[ balances ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġrefresh All Balances () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh S ap ling Balance () ĊĠĠĠĠĠĠĠ Ġrefresh Transparent Balance () ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġrefresh Ġor chard Ġbalance ĊĠĠĠĠĠĠĠ Ġtw ig (" Warning : ĠOr chard Ġbalance Ġdoes Ġnot Ġyet Ġrefresh . ĠOnly Ġsome Ġof Ġthe Ġpl umb ing Ġis Ġin Ġplace .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġrefresh S ap ling Balance () Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" refresh ing Ġsap ling Ġbalance ") ĊĠĠĠĠĠĠĠ Ġ_ sap ling Balances . value Ġ= Ġprocessor . get Balance Info () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġrefresh Transparent Balance () Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" refresh ing Ġtransparent Ġbalance ") ĊĠĠĠĠĠĠĠ Ġ_ transparent Balances . value Ġ= Ġprocessor . get U tx o Cache Balance ( get Transparent Address ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun ĠisValid Address ( address : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ! validate Address ( address ). isNot Valid ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCor outine Scope . on Ready () Ġ= Ġlaunch ( Coroutine ExceptionHandler (:: on Critical Error )) Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" Pre paring Ġto Ġstart ...") ĊĠĠĠĠĠĠĠ Ġprepare () ĊĊĠĠĠĠĠĠĠ Ġtw ig (" Synchron izer Ġ(${ this @ Sdk Synchron izer }) ĠReady . ĠStarting Ġprocessor !") ĊĠĠĠĠĠĠĠ Ġvar Ġlast Scan Time Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprocessor . on Processor Error Listener Ġ= Ġ:: on Processor Error ĊĠĠĠĠĠĠĠ Ġprocessor . on Setup Error Listener Ġ= Ġ:: on Setup Error ĊĠĠĠĠĠĠĠ Ġprocessor . on Chain Error Listener Ġ= Ġ:: on Chain Error ĊĠĠĠĠĠĠĠ Ġprocessor . state . on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSc anned Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdo Ġa Ġbit Ġof Ġhouse keep ing Ġand Ġthen Ġreport Ġsynced Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Scan Complete ( it . sc anned Range , Ġnow Ġ- Ġlast Scan Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Scan Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSY NC ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSto pped Ġ-> ĠSTOP PED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDis connected Ġ-> ĠDIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDownloading , ĠInitialized Ġ-> ĠDOWN LOADING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠValid ating Ġ-> ĠVALID ATING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSc anning Ġ-> ĠSC AN NING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEn h ancing Ġ-> ĠEN H AN C ING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġsynchron izer Status Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġignore Ġen h ancing Ġstatus Ġfor Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġclean Ġthis Ġup Ġand Ġhandle Ġen h ancing Ġgrace fully ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( synchron izer Status Ġ!= ĠEN H AN C ING ) Ġ_ status . send ( synchron izer Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. launch In ( this ) ĊĠĠĠĠĠĠĠ Ġprocessor . start () ĊĠĠĠĠĠĠĠ Ġtw ig (" Synchron izer Ġon Ready Ġcomplete . ĠProcessor Ġstart Ġhas Ġexited !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Critical Error ( unused : ĠCor outine Context ?, Ġerror : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" ******** ") ĊĠĠĠĠĠĠĠ Ġtw ig (" ******** Ġ ĠERROR : Ġ$ error ") ĊĠĠĠĠĠĠĠ Ġtw ig ( error ) ĊĠĠĠĠĠĠĠ Ġif Ġ( error . cause Ġ!= Ġnull ) Ġtw ig (" ******** Ġcaused Ġby Ġ${ error . cause }") ĊĠĠĠĠĠĠĠ Ġif Ġ( error . cause ?. cause Ġ!= Ġnull ) Ġtw ig (" ******** Ġcaused Ġby Ġ${ error . cause ?. cause }") ĊĠĠĠĠĠĠĠ Ġtw ig (" ******** ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( on Critical ErrorHandler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WARNING : Ġa Ġcritical Ġerror Ġoccurred Ġbut Ġno Ġcallback Ġis Ġregistered Ġto Ġbe Ġnotified Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" of Ġcritical Ġerrors ! ĠTHIS ĠIS ĠPRO B AB LY ĠA ĠM IST A KE . ĠTo Ġrespond Ġto Ġthese Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" errors Ġ( per haps Ġto Ġupdate Ġthe ĠUI Ġor Ġalert Ġthe Ġuser ) Ġset Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" synchron izer . on Critical ErrorHandler Ġto Ġa Ġnon - null Ġvalue ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon Critical ErrorHandler ?. invoke ( error ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Failed Send ( error : ĠThrowable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" ERROR Ġwhile Ġsubmitting Ġtransaction : Ġ$ error ") ĊĠĠĠĠĠĠĠ Ġreturn Ġon Submission ErrorHandler ?. invoke ( error )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġtw ig (" submission Ġerror Ġhandler Ġsign aled Ġthat Ġwe Ġshould Ġtry Ġagain !") ĊĠĠĠĠĠĠĠ Ġ} Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Processor Error ( error : ĠThrowable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" ERROR Ġwhile Ġprocessing Ġdata : Ġ$ error ") ĊĠĠĠĠĠĠĠ Ġif Ġ( on Processor ErrorHandler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WARNING : Ġfalling Ġback Ġto Ġthe Ġdefault Ġbehavior Ġfor Ġprocessor Ġerrors . ĠTo Ġadd " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġcustom Ġbehavior , Ġset Ġsynchron izer . on Processor ErrorHandler Ġto " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġa Ġnon - null Ġvalue " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġon Processor ErrorHandler ?. invoke ( error )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" processor Ġerror Ġhandler Ġsign aled Ġthat Ġwe Ġshould Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ if Ġ( it ) Ġ" try Ġagain " Ġelse Ġ" abort "} !" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Setup Error ( error : ĠThrowable ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( on Setup ErrorHandler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WARNING : Ġfalling Ġback Ġto Ġthe Ġdefault Ġbehavior Ġfor Ġsetup Ġerrors . ĠTo Ġadd Ġcustom " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġbehavior , Ġset Ġsynchron izer . on Setup ErrorHandler Ġto Ġa Ġnon - null Ġvalue " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġon Setup ErrorHandler ?. invoke ( error ) Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Chain Error ( error Height : ĠInt , Ġre wind Height : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" Chain Ġerror Ġdetected Ġat Ġheight : Ġ$ error Height . ĠRew ind ing Ġto : Ġ$ rewind Height ") ĊĠĠĠĠĠĠĠ Ġif Ġ( on Chain ErrorHandler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WARNING : Ġa Ġchain Ġerror Ġoccurred Ġbut Ġno Ġcallback Ġis Ġregistered Ġto Ġbe Ġnotified Ġof Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" chain Ġerrors . ĠTo Ġrespond Ġto Ġthese Ġerrors Ġ( per haps Ġto Ġupdate Ġthe ĠUI Ġor Ġalert Ġthe " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġuser ) Ġset Ġsynchron izer . on Chain ErrorHandler Ġto Ġa Ġnon - null Ġvalue " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġon Chain ErrorHandler ?. invoke ( error Height , Ġre wind Height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ param Ġelapsed Millis Ġthe Ġamount Ġof Ġtime Ġthat Ġpassed Ġsince Ġthe Ġlast Ġscan ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġon Scan Complete ( sc anned Range : ĠInt Range , Ġelapsed Millis : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġneed Ġto Ġupdate Ġanything Ġif Ġthere Ġhave Ġbeen Ġno Ġblocks ĊĠĠĠĠĠĠĠ Ġ// Ġrefresh Ġanyway Ġif : ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġif Ġit 's Ġthe Ġfirst Ġtime Ġwe Ġfinished Ġscanning ĊĠĠĠĠĠĠĠ Ġ// Ġ- Ġif Ġwe Ġcheck Ġfor Ġblocks Ġ 5 Ġtimes Ġand Ġfind Ġnothing Ġwas Ġm ined ĊĠĠĠĠĠĠĠ Ġval Ġshould Refresh Ġ= Ġ! sc anned Range . isEmpty () Ġ|| Ġelapsed Millis Ġ> Ġ( Z cash Sdk . POLL _ INTERVAL Ġ* Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġval Ġreason Ġ= Ġif Ġ( sc anned Range . isEmpty ()) Ġ" it 's Ġbeen Ġa Ġwhile " Ġelse Ġ" new Ġblocks Ġwere Ġscanned " ĊĊĠĠĠĠĠĠĠ Ġ// ĠTR ICK Y : ĊĠĠĠĠĠĠĠ Ġ// ĠKeep Ġan Ġeye Ġon Ġthis Ġsection Ġbecause Ġthere Ġis Ġa Ġpotential Ġfor Ġconcurrent ĠDB ĊĠĠĠĠĠĠĠ Ġ// Ġmodification . ĠA Ġchange Ġin Ġtransactions Ġmeans Ġa Ġchange Ġin Ġbalance . ĠCalcul ating Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġbalance Ġrequires Ġtouch ing Ġtransactions . ĠIf Ġboth Ġare Ġdone Ġin Ġseparate Ġthreads , Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġdatabase Ġcan Ġhave Ġissues . ĠOn ĠAndroid , Ġthis Ġwould Ġmanifest Ġas Ġa Ġfalse Ġpositive Ġfor Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġ" mal formed Ġdatabase " Ġexception Ġwhen Ġthe Ġdatabase Ġis Ġnot Ġactually Ġcorrupt Ġbut Ġrather ĊĠĠĠĠĠĠĠ Ġ// Ġlocked Ġ( i . e . Ġit 's Ġa Ġbad Ġerror Ġmessage ). ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġbalance Ġrefresh Ġis Ġdone Ġfirst Ġbecause Ġit Ġis Ġcoroutine - based Ġand Ġwill Ġfully ĊĠĠĠĠĠĠĠ Ġ// Ġcomplete Ġby Ġthe Ġtime Ġthe Ġfunction Ġreturns . ĊĠĠĠĠĠĠĠ Ġ// ĠU lt imately , Ġrefresh ing Ġthe Ġtransactions Ġjust Ġinvalid ates Ġviews Ġof Ġdata Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġalready Ġexists Ġand Ġit Ġcompletes Ġon Ġanother Ġthread Ġso Ġit Ġshould Ġcome Ġafter Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġbalance Ġrefresh Ġis Ġcomplete . ĊĠĠĠĠĠĠĠ Ġif Ġ( should Refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig Task (" Trigger ing Ġut xo Ġrefresh Ġsince Ġ$ reason !", Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh U tx os () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig Task (" Trigger ing Ġbalance Ġrefresh Ġsince Ġ$ reason !", Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh All Balances () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig Task (" Trigger ing Ġpending Ġtransaction Ġrefresh Ġsince Ġ$ reason !", Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Pending Transactions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig Task (" Trigger ing Ġtransaction Ġrefresh Ġsince Ġ$ reason !") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Transactions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrefresh Pending Transactions () Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġbeginning Ġto Ġrefresh Ġand Ġclean Ġup Ġpending Ġtransactions ") ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġwould Ġbe Ġthe Ġplace Ġto Ġclear Ġout Ġany Ġstale Ġpending Ġtransactions . ĠRemove Ġfilter ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġlogic Ġand Ġthen Ġdelete Ġany Ġpending Ġtransaction Ġwith Ġsufficient Ġconfirm ations Ġ( all Ġin Ġone ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġdb Ġtransaction ). ĊĠĠĠĠĠĠĠ Ġval Ġall Pending T xs Ġ= Ġtx Manager . getAll (). first () ĊĠĠĠĠĠĠĠ Ġval Ġlast Sc anned Height Ġ= Ġstorage . last Sc anned Height () ĊĊĠĠĠĠĠĠĠ Ġall Pending T xs . filter Ġ{ Ġit . is Submit Success () Ġ&& Ġ! it . is M ined () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġpending Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig (" checking Ġfor Ġupdates Ġon Ġpending Tx Ġid : Ġ${ pending Tx . id }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Tx . raw Transaction Id ?. let Ġ{ Ġraw Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . find M ined Height ( raw Id )?. let Ġ{ Ġm ined Height Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" found Ġmatching Ġtransaction Ġfor Ġpending Ġtransaction Ġwith Ġid " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ${ pending Tx . id } Ġm ined Ġat Ġheight Ġ$ min ed Height !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Manager . apply M ined Height ( pending Tx , Ġm ined Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġbeginning Ġto Ġcleanup Ġcancelled Ġtransactions ", Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġhas Clean ed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĠExperimental : Ġcleanup Ġcancelled Ġtransactions ĊĠĠĠĠĠĠĠ Ġall Pending T xs . filter Ġ{ Ġit . is Cancelled () Ġ&& Ġit . has Raw Transaction Id () Ġ}. let Ġ{ Ġcancell able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcancell able . forEach Indexed Ġ{ Ġindex , Ġpending Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ cleanup ] ĠFO UND Ġ(${ index Ġ+ Ġ 1 } Ġof Ġ${ c ancellable . size })" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠCANCEL LED Ġpending Tx Id : Ġ${ pending Tx . id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Clean ed Ġ= Ġhas Clean ed Ġ|| Ġcleanup Cancelled Tx ( pending Tx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠExperimental : Ġcleanup Ġfailed Ġtransactions ĊĠĠĠĠĠĠĠ Ġall Pending T xs . filter Ġ{ Ġit . is Submitted () Ġ&& Ġit . is Failed Submit () Ġ&& Ġ! it . is Marked For Deletion () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġfailed Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed . forEach Indexed Ġ{ Ġindex , Ġpending Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ cleanup ] ĠFO UND Ġ(${ index Ġ+ Ġ 1 } Ġof Ġ${ failed . size })" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠFAILED Ġpending Tx Id : Ġ${ pending Tx . id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcleanup Cancelled Tx ( pending Tx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġbeginning Ġto Ġcleanup Ġexpired Ġtransactions ", Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ// ĠExperimental : Ġcleanup Ġexpired Ġtransactions ĊĠĠĠĠĠĠĠ Ġ// Ġnote : Ġdon 't Ġdelete Ġthe Ġpending Tx Ġuntil Ġthe Ġrelated Ġdata Ġhas Ġbeen Ġscr ub bed , Ġor Ġelse Ġyou ĊĠĠĠĠĠĠĠ Ġ// Ġlose Ġthe Ġthing Ġthat Ġidentifies Ġthe Ġother Ġdata Ġas Ġinvalid ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġfirst Ġmark Ġthe Ġdata Ġfor Ġdeletion , Ġduring Ġthe Ġprevious Ġ" cleanup " Ġstep , Ġby Ġremoving ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġthing Ġthat Ġwe 're Ġtrying Ġto Ġpreserve Ġto Ġsignal Ġwe Ġno Ġlonger Ġneed Ġit ĊĠĠĠĠĠĠĠ Ġ// Ġsometimes Ġapps Ġcrash Ġor Ġthings Ġgo Ġwrong Ġand Ġwe Ġget Ġan Ġorphan ed Ġpending Tx Ġthat Ġwe 'll Ġpoll ĊĠĠĠĠĠĠĠ Ġ// Ġforever , Ġso Ġmaybe Ġjust Ġget Ġrid Ġof Ġall Ġof Ġthem Ġafter Ġa Ġlong Ġwhile ĊĠĠĠĠĠĠĠ Ġall Pending T xs . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Expired ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Sc anned Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork . sap ling Activation Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& Ġit . is Marked For Deletion () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Long Expired ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Sc anned Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork . sap ling Activation Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ|| Ġit . is Safe To Discard () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtx Manager . abort ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] ĠFO UND ĠEX PI RED Ġpending TX Ġ( last Scan Height : Ġ$ last Sc anned Height Ġ Ġexpiry Height : Ġ${ it . expiry Height }): Ġand Ġ${ it . id } Ġ${ if Ġ( result Ġ> Ġ 0 ) Ġ" successfully Ġremoved " Ġelse Ġ" failed Ġto Ġremove "} Ġit ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġdeleting Ġexpired Ġtransactions Ġfrom Ġstorage ", Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġexpired Count Ġ= Ġstorage . delete Expired ( last Sc anned Height ) ĊĠĠĠĠĠĠĠ Ġif Ġ( expired Count Ġ> Ġ 0 ) Ġtw ig ("[ cleanup ] Ġdeleted Ġ$ expired Count Ġexpired Ġtransaction ( s ) !") ĊĠĠĠĠĠĠĠ Ġhas Clean ed Ġ= Ġhas Clean ed Ġ|| Ġ( expired Count Ġ> Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Clean ed ) Ġrefresh All Balances () ĊĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġdone Ġrefresh ing Ġand Ġcleaning Ġup Ġpending Ġtransactions ", Ġ- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcleanup Cancelled Tx ( pending Tx : ĠPending Transaction ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( storage . cleanup Cancelled Tx ( pending Tx . raw Transaction Id !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Manager . mark For Deletion ( pending Tx . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġno Ġmatching Ġtx Ġwas Ġcleaned Ġso Ġthe Ġpending Tx Ġwill Ġnot Ġbe Ġmarked Ġfor Ġdeletion ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠSend Ġ/ ĠReceive ĊĠĠĠ Ġ// ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcancel S pend ( pending Id : ĠLong ) Ġ= Ġtx Manager . cancel ( pending Id ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Address ( accountId : ĠInt ): ĠString Ġ= Ġget Sh ielded Address ( accountId ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Sh ielded Address ( accountId : ĠInt ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġprocessor . get Sh ielded Address ( accountId ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Transparent Address ( accountId : ĠInt ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġprocessor . get Transparent Address ( accountId ) ĊĊĠĠĠ Ġoverride Ġfun Ġsend To Address ( ĊĠĠĠĠĠĠĠ Ġs pending Key : ĠString , ĊĠĠĠĠĠĠĠ Ġz atos hi : ĠLong , ĊĠĠĠĠĠĠĠ Ġto Address : ĠString , ĊĠĠĠĠĠĠĠ Ġmemo : ĠString , ĊĠĠĠĠĠĠĠ Ġfrom Account Index : ĠInt ĊĠĠĠ Ġ): ĠFlow < Pending Transaction > Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" Initializing Ġpending Ġtransaction ") ĊĠĠĠĠĠĠĠ Ġ// ĠEmit Ġthe Ġplaceholder Ġtransaction , Ġthen Ġswitch Ġto Ġmonitoring Ġthe Ġdatabase ĊĠĠĠĠĠĠĠ Ġtx Manager . init S pend ( z atos hi , Ġto Address , Ġmemo , Ġfrom Account Index ). let Ġ{ Ġplace Holder Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( place Holder Tx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Manager . encode ( sp ending Key , Ġplace Holder Tx ). let Ġ{ Ġencoded Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġsubmit Ġif Ġit Ġwasn 't Ġcancelled . ĠOtherwise Ġcleanup , Ġimmediately Ġfor Ġbest ĠUX . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoded Tx . is Cancelled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġthis Ġtx Ġhas Ġbeen Ġcancelled Ġso Ġwe Ġwill Ġcleanup Ġinstead Ġof Ġsubmitting ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cleanup Cancelled Tx ( encoded Tx )) Ġrefresh All Balances () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Tx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Manager . submit ( encoded Tx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. flatMap Latest Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġswitch Ġthis Ġflow Ġover Ġto Ġmonitoring Ġthe Ġdatabase Ġfor Ġtransactions ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġemit Ġthe Ġplaceholder ĠTX Ġabove , Ġthen Ġwatch Ġthe Ġdatabase Ġfor Ġall Ġfurther Ġupdates ĊĠĠĠĠĠĠĠ Ġtw ig (" Monitoring Ġpending Ġtransaction Ġ( id : Ġ${ it . id }) Ġfor Ġupdates ...") ĊĠĠĠĠĠĠĠ Ġtx Manager . monitor ById ( it . id ) ĊĠĠĠ Ġ}. distinct Until Changed () ĊĊĠĠĠ Ġoverride Ġfun Ġshield Funds ( ĊĠĠĠĠĠĠĠ Ġs pending Key : ĠString , ĊĠĠĠĠĠĠĠ Ġtransparent SecretKey : ĠString , ĊĠĠĠĠĠĠĠ Ġmemo : ĠString ĊĠĠĠ Ġ): ĠFlow < Pending Transaction > Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" Initializing Ġshield ing Ġtransaction ") ĊĠĠĠĠĠĠĠ Ġval Ġt Addr Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDer ivation Tool . derive Transparent Address From PrivateKey ( transparent SecretKey , Ġnetwork ) ĊĠĠĠĠĠĠĠ Ġval Ġt Balance Ġ= Ġprocessor . get U tx o Cache Balance ( t Addr ) ĊĠĠĠĠĠĠĠ Ġval Ġz Addr Ġ= Ġget Address ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠEmit Ġthe Ġplaceholder Ġtransaction , Ġthen Ġswitch Ġto Ġmonitoring Ġthe Ġdatabase ĊĠĠĠĠĠĠĠ Ġtx Manager . init S pend ( t Balance . available Z atos hi , Ġz Addr , Ġmemo , Ġ 0 ). let Ġ{ Ġplace Holder Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( place Holder Tx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Manager . encode ( sp ending Key , Ġtransparent SecretKey , Ġplace Holder Tx ). let Ġ{ Ġencoded Tx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġsubmit Ġif Ġit Ġwasn 't Ġcancelled . ĠOtherwise Ġcleanup , Ġimmediately Ġfor Ġbest ĠUX . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( encoded Tx . is Cancelled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtw ig ("[ cleanup ] Ġthis Ġshield ing Ġtx Ġhas Ġbeen Ġcancelled Ġso Ġwe Ġwill Ġcleanup Ġinstead Ġof Ġsubmitting ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cleanup Cancelled Tx ( encoded Tx )) Ġrefresh All Balances () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoded Tx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Manager . submit ( encoded Tx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. flatMap Latest Ġ{ ĊĠĠĠĠĠĠĠ Ġtw ig (" Monitoring Ġshield ing Ġtransaction Ġ( id : Ġ${ it . id }) Ġfor Ġupdates ...") ĊĠĠĠĠĠĠĠ Ġtx Manager . monitor ById ( it . id ) ĊĠĠĠ Ġ}. distinct Until Changed () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrefresh U tx os ( address : ĠString , Ġstart Height : ĠInt ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocessor . refresh U tx os ( address , Ġstart Height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Transparent Balance ( t Addr : ĠString ): ĠWallet Balance Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprocessor . get U tx o Cache Balance ( t Addr ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠisValid Sh ielded Addr ( address : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġtx Manager . isValid Sh ielded Address ( address ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠisValid Transparent Addr ( address : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġtx Manager . isValid Transparent Address ( address ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġvalidate Address ( address : ĠString ): ĠAddress Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isValid Sh ielded Addr ( address )) ĠSh ielded Ġelse ĠTr ansparent ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( z Error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage Ġ= Ġz Error . message ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isValid Transparent Addr ( address )) ĠTr ansparent Ġelse ĠSh ielded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t Error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAddress Type . Invalid ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Ġ!= Ġt Error . message ) Ġ"$ message Ġand Ġ${ t Error . message }" Ġelse Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ" Invalid " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġvalidate Consensus Branch (): ĠCons ensus Match Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Branch Id Ġ= Ġtry Null Ġ{ Ġprocessor . downloader . getServer Info (). consensus Branch Id Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsdk Branch Id Ġ= Ġtry Null Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( tx Manager Ġas ĠPersistent Transaction Manager ). encoder . get Consensus Branch Id () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠCons ensus Match Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsdk Branch Id ?. let Ġ{ ĠCons ensus Branch Id . from Id ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Branch Id ?. let Ġ{ ĠCons ensus Branch Id . from Hex ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠE ras able Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠE rase Ġcontent Ġrelated Ġto Ġthis ĠSDK . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġapp Context Ġthe Ġapplication Ġcontext . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġnetwork Ġthe Ġnetwork Ġcorresponding Ġto Ġthe Ġdata Ġbeing Ġer ased . ĠData Ġis Ġsegment ed Ġby ĊĠĠĠĠĠĠĠĠ Ġ* Ġnetwork Ġin Ġorder Ġto Ġprevent Ġcont am ination . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġalias Ġidentifier Ġfor ĠSDK Ġcontent . ĠIt Ġis Ġpossible Ġfor Ġmultiple Ġsynchron izers Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġexist Ġwith Ġdifferent Ġaliases . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġwhen Ġcontent Ġwas Ġfound Ġfor Ġthe Ġgiven Ġalias . ĠFalse Ġotherwise . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġerase ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork : ĠZ cash Network , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalias : ĠString Ġ= ĠZ cash Sdk . DEFAULT _ ALIAS ĊĠĠĠĠĠĠĠ Ġ): ĠBoolean ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠProvides Ġa Ġway Ġof Ġconstructing Ġa Ġsynchron izer Ġwhere Ġdependencies Ġare Ġinjected Ġin . Ċ Ġ* Ċ Ġ* ĠSee Ġthe Ġhelper Ġmethods Ġfor Ġgenerating Ġdefault Ġvalues . Ċ Ġ*/ Ċ object ĠDefault Synchron izer Factory Ġ{ ĊĊĠĠĠ Ġfun Ġnew ( ĊĠĠĠĠĠĠĠ Ġrepository : ĠTransaction Repository , ĊĠĠĠĠĠĠĠ Ġtx Manager : ĠOut bound Transaction Manager , ĊĠĠĠĠĠĠĠ Ġprocessor : ĠComp act Block Processor , ĊĠĠĠ Ġ): ĠSynchron izer Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcall Ġthe Ġactual Ġconstructor Ġnow Ġthat Ġall Ġdependencies Ġhave Ġbeen Ġinjected ĊĠĠĠĠĠĠĠ Ġ// Ġaltern atively , Ġthis Ġentire Ġobject Ġgraph Ġcan Ġbe Ġsupplied Ġby ĠD agger ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġbuilder Ġjust Ġmakes Ġthat Ġeasier . ĊĠĠĠĠĠĠĠ Ġreturn ĠS dk Synchron izer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Manager , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO Ġ[# 2 4 2 ]: ĠDon 't Ġhard Ġcode Ġpage Ġsize . Ġ ĠIt Ġis Ġa Ġworkaround Ġfor ĠUn caught ĠException : Ġandroid . view . View Root Impl $ Called From Wrong Thread Exception : ĠOnly Ġthe Ġoriginal Ġthread Ġthat Ġcreated Ġa Ġview Ġhierarchy Ġcan Ġtouch Ġits Ġviews . Ġand Ġis Ġprobably Ġrelated Ġto ĠFlow Paged List ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ PAGE _ SIZE Ġ= Ġ 1 0 0 0 ĊĠĠĠ Ġsuspend Ġfun Ġdefault Transaction Repository ( initializer : ĠInitial izer ): ĠTransaction Repository Ġ= ĊĠĠĠĠĠĠĠ ĠP aged Transaction Repository . new ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . context , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ PAGE _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . rust Backend , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . birthday , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . view ing Keys , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . overwrite V ks ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġdefault Block Store ( initializer : ĠInitial izer ): ĠComp act Block Store Ġ= ĊĠĠĠĠĠĠĠ ĠComp act Block Db Store . new ( initializer . context , Ġinitializer . rust Backend . path Cache Db ) ĊĊĠĠĠ Ġfun Ġdefault Service ( initializer : ĠInitial izer ): ĠLight Wallet Service Ġ= ĊĠĠĠĠĠĠĠ ĠLight Wallet Grpc Service ( initializer . context , Ġinitializer . host , Ġinitializer . port ) ĊĊĠĠĠ Ġfun Ġdefault Encoder ( ĊĠĠĠĠĠĠĠ Ġinitializer : ĠInitial izer , ĊĠĠĠĠĠĠĠ Ġrepository : ĠTransaction Repository ĊĠĠĠ Ġ): ĠTransaction Encoder Ġ= ĠWallet Transaction Encoder ( initializer . rust Backend , Ġrepository ) ĊĊĠĠĠ Ġfun Ġdefault Downloader ( ĊĠĠĠĠĠĠĠ Ġservice : ĠLight Wallet Service , ĊĠĠĠĠĠĠĠ Ġblock Store : ĠComp act Block Store ĊĠĠĠ Ġ): ĠComp act Block Downloader Ġ= ĠComp act Block Downloader ( service , Ġblock Store ) ĊĊĠĠĠ Ġfun Ġdefault Tx Manager ( ĊĠĠĠĠĠĠĠ Ġinitializer : ĠInitial izer , ĊĠĠĠĠĠĠĠ Ġencoder : ĠTransaction Encoder , ĊĠĠĠĠĠĠĠ Ġservice : ĠLight Wallet Service ĊĠĠĠ Ġ): ĠOut bound Transaction Manager Ġ= ĊĠĠĠĠĠĠĠ ĠPersistent Transaction Manager ( initializer . context , Ġencoder , Ġservice ) ĊĊĠĠĠ Ġfun Ġdefault Processor ( ĊĠĠĠĠĠĠĠ Ġinitializer : ĠInitial izer , ĊĠĠĠĠĠĠĠ Ġdown loader : ĠComp act Block Downloader , ĊĠĠĠĠĠĠĠ Ġrepository : ĠTransaction Repository ĊĠĠĠ Ġ): ĠComp act Block Processor Ġ= ĠComp act Block Processor ( ĊĠĠĠĠĠĠĠ Ġdown loader , ĊĠĠĠĠĠĠĠ Ġrepository , ĊĠĠĠĠĠĠĠ Ġinitializer . rust Backend , ĊĠĠĠĠĠĠĠ Ġinitializer . rust Backend . birthday Height ĊĠĠĠ Ġ) Ċ } Ċ