/** Ċ Ġ* ĠB read Wallet Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠA hs an ĠBut t Ġ< ah san . but t @ bread wallet . com > Ġon Ġ 1 0 / 0 1 / 1 9 . Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġb read wallet ĠLLC Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . cry ptr on . bread box Ċ Ċ import Ġcom . bread wallet . crypto . Address Scheme Ċ import Ġcom . bread wallet . crypto . Network Ċ import Ġcom . bread wallet . crypto . Network Peer Ċ import Ġcom . bread wallet . crypto . System Ċ import Ġcom . bread wallet . crypto . Wallet Ċ import Ġcom . bread wallet . crypto . Wallet Manager Ċ import Ġcom . bread wallet . crypto . Wallet Manager Mode Ċ import Ġcom . cry ptr on . logger . log Debug Ċ import Ġcom . cry ptr on . tools . manager . BR Shared Prefs Ċ import Ġcom . cry ptr on . tools . security . Br d User Manager Ċ import Ġcom . cry ptr on . util . is Bitcoin Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . channels . Broadcast Channel Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . flow . filter Ċ import Ġkotlinx . coroutines . flow . map Latest Ċ import Ġkotlinx . coroutines . flow . onStart Ċ Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ /** Ċ Ġ* ĠResp ons ible Ġfor Ġtracking Ġ( and Ġun - tracking ) Ġ[ Wallet ] s Ġand Ġall Ġrelated Ġhook - up . Ċ Ġ*/ Ċ class ĠNetwork Manager ( ĊĠĠĠ Ġprivate Ġval Ġsystem : ĠSystem , ĊĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġprivate Ġval Ġnetwork Initial izers : ĠList < Network Initializer > Ċ ) Ġ{ ĊĊĠĠĠ Ġvar Ġenabled Wallet s : ĠList < String > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġvalue ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Wallet s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmanager Modes : ĠMap < String , ĠWallet Manager Mode > Ġ= Ġempty Map () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ== Ġvalue ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscope . launch Ġ{ Ġupdate Manager Modes () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġinitialize Action Channel Ġ= ĠConcurrent HashMap < String , ĠChannel < Unit >>() ĊĠĠĠ Ġprivate Ġval Ġnetwork State Ġ= ĠConcurrent HashMap < String , ĠNetwork State >() ĊĠĠĠ Ġprivate Ġval Ġnetwork State Channel Ġ= ĠBroadcast Channel < Pair < String , ĠNetwork State >>( Channel . BUFFER ED ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsystem . networks . forEach (:: initialize Network ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġa Ġ[ Network ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinitialize Network ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( D ROID - 1 6 5 8 ): ĠRestore Ġmigration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if Ġ( system Evt . migrate Required ( event . network )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġmigrate Network ( system Evt , Ġevent . network , Ġevent . network . currency . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ//} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Network ( network , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEmit s Ġthe Ġ[ Network State ] Ġfor Ġa Ġ[ Network ] Ġspecified Ġby Ġits Ġ[ currency Id ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnetwork State ( currency Id : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġnetwork State Channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . first . equals ( currency Id , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Latest Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onStart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork State [ currency Id ]?. let Ġ{ Ġemit ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp letes Ġthe Ġinitialization Ġprocess Ġfor Ġa Ġ[ Network ] Ġspecified Ġby ĊĠĠĠĠ Ġ* Ġits Ġ[ currency Id ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcomplete Network Initialization ( currency Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠcheckNotNull ( initialize Action Channel [ currency Id ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Network Ġfor Ġ$ currency Id Ġnot Ġwaiting Ġon Ġinitialize Ġaction ." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchannel . offer ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect s Ġa Ġ[ Wallet Manager ] Ġif Ġneeded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconnect Manager ( manager : ĠWallet Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Wallet s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmanager . network Contains Currency ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Peer Ġ= Ġget Network Peer ( manager ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Ġ= Ġmanager . network ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . mode Ġ= Ġnetwork . getManager Mode ( manager Modes [ network . currency . uid s ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . connect ( network Peer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġall Ġneeded Ġc urrencies Ġfor Ġthe Ġgiven Ġ[ Wallet Manager ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister C urrencies ( manager : ĠWallet Manager ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Wallet s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmanager . network Contains Currency ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" Register ing Ġwallet Ġfor : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . register Wallet For ( manager . find Currency ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinitialize Network ( network : ĠNetwork , Ġcreate IfNeeded : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġnetwork Initial izers . get ( network . currency . uid s ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( initializer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" No Ġinitializer Ġfound Ġfor Ġnetwork Ġ'${ network . name }' ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( create IfNeeded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit Network State ( network . currency . uid s , ĠNetwork State . Loading ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġinitializer . initialize ( system , Ġnetwork , Ġcreate IfNeeded ) ĊĠĠĠĠĠĠĠ Ġemit Network State ( network . currency . uid s , Ġstate ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork State . Initialized Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" Network Ġ'${ network . name }' Ġinitialized .") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwm Mode Ġ= Ġnetwork . getManager Mode ( manager Modes [ network . currency . uid s ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsystem . create Wallet Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwm Mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork . getAddress Scheme (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Set () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork State . Action Needed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" Network Ġ'${ network . name }' Ġrequires Ġfurther Ġaction .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Initialize Action ( network ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNetwork State . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Network Ġ'${ network . name }' Ġfailed Ġto Ġinitialize . Ġ${ state . message }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . error ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit Network State ( network . currency . uid s , ĠNetwork State . Action Needed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Initialize Action ( network ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠwaitFor Initialize Action ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize Action Channel . get Safe ( network . currency . uid s ). receive () ĊĠĠĠĠĠĠĠ Ġinitialize Network ( network , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Wallet s () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDis connect Ġun needed Ġwallet Ġmanagers ĊĠĠĠĠĠĠĠ Ġval Ġsystem Wallet s Ġ= Ġsystem . wallet s ĊĠĠĠĠĠĠĠ Ġsystem Wallet s . forEach Ġ{ Ġdisconnect Wallet Manager ( it , Ġenabled Wallet s ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnable Ġwallet s Ġby Ġconnecting Ġand Ġregistering Ġas Ġnecessary ĊĠĠĠĠĠĠĠ Ġenabled Wallet s . forEach Ġ{ Ġenabled Wallet Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Wallet Ġ= Ġsystem Wallet s . find Ġ{ Ġit . currency Id . equals ( enabled Wallet , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwallet Manager Ġ= Ġsystem Wallet ?. wallet Manager Ġ?: Ġsystem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wallet Managers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . network Contains Currency ( enabled Wallet ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wallet Manager Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnect And Register ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Wallet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Manager Modes () Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager Modes . entries . forEach Ġ{ Ġmode Entry : ĠMap . Entry < String , ĠWallet Manager Mode > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwallet Ġ= Ġsystem . wallet s . find Ġ{ Ġit . currency Id . equals ( mode Entry . key , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwallet Manager Ġ= Ġwallet ?. wallet Manager Ġ?: Ġsystem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wallet Managers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit . network Contains Currency ( mode Entry . key ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġwallet Manager ?. network ?. getManager Mode ( mode Entry . value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ!= Ġnull Ġ&& Ġwallet Manager . mode Ġ!= Ġmode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" Re starting ĠWallet ĠManager Ġwith Ġnew Ġmode : Ġ${ wallet Manager . network } Ġ${ mode Entry . value }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager . mode Ġ= Ġwallet Manager . network . getManager Mode ( mode Entry . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager . connect ( get Network Peer ( wallet Manager )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis connect Ġ[ Wallet Manager ] Ġfor Ġ[ system Wallet ], Ġif Ġconnected Ġand Ġnot Ġneeded Ġfor ĊĠĠĠĠ Ġ* Ġanother Ġtracked Ġwallet . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdisconnect Wallet Manager ( system Wallet : ĠWallet , Ġenabled Wallet s : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwallet Manager Ġ= Ġsystem Wallet . wallet Manager ĊĠĠĠĠĠĠĠ Ġval Ġdisconnect Wallet Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager . state . is Tracked () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Wallet s . none Ġ{ Ġwallet Manager . network Contains Currency ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( disconnect Wallet Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" Disconnect ing ĠWallet ĠManager : Ġ${ system Wallet . currency . code }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Wallet . wallet Manager . disconnect () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect Ġ[ Wallet Manager ] Ġfor Ġ[ currency Id ], Ġif Ġnot Ġalready Ġconnected , Ġand Ġregister Ġfor ĊĠĠĠĠ Ġ* Ġ[ currency Id ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconnect And Register ( ĊĠĠĠĠĠĠĠ Ġwallet Manager : ĠWallet Manager , ĊĠĠĠĠĠĠĠ Ġcurrency Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Ġ= Ġwallet Manager . network ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġnetwork . getManager Mode ( manager Modes [ network . currency . uid s ]) ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Peer Ġ= Ġget Network Peer ( wallet Manager ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! wallet Manager . state . is Tracked ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" Connecting ĠWallet ĠManager : Ġ${ wallet Manager . network }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager . mode Ġ= Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager . connect ( network Peer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠOnce ĠCORE - 8 7 1 Ġis Ġfixed , Ġcalling Ġregister Wallet For () Ġhere Ġwill Ġbe Ġredundant , Ġas ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġshould Ġget Ġanother ĠWallet Manager Changed Event Ġafter Ġconnecting Ġabove ĊĠĠĠĠĠĠĠ Ġlog Debug (" Register ing Ġwallet Ġfor : Ġ$ currency Id ") ĊĠĠĠĠĠĠĠ Ġwallet Manager . register Wallet For ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Manager . find Currency ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Network Peer ( manager : ĠWallet Manager ): ĠNetwork Peer ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠBR Shared Prefs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Trust Node ( iso Ġ= Ġmanager . currency . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠ Ġreturn Ġmanager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. network ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Peer OrNull ( address ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġemit Network State ( currency Id : ĠString , Ġstate : ĠNetwork State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork State [ currency Id ] Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġnetwork State Channel . offer ( Pair ( currency Id , Ġstate )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠNetwork . getManager Mode ( preferred Mode : ĠWallet Manager Mode ?): ĠWallet Manager Mode Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġcurrency . is Bitcoin Cash () Ġ-> ĠWallet Manager Mode . API _ ONLY ĊĠĠĠ Ġpreferred Mode Ġ== Ġnull Ġ-> Ġdefault Wallet Manager Mode ĊĠĠĠ Ġsupports Wallet Manager Mode ( preferred Mode ) Ġ-> Ġpreferred Mode ĊĠĠĠ Ġelse Ġ-> Ġdefault Wallet Manager Mode Ċ } Ċ Ċ private Ġfun ĠNetwork . getAddress Scheme (): ĠAddress Scheme Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrency . code . is Bitcoin () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( BR Shared Prefs . getIs Seg wit Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAddress Scheme . BTC _ SE GW IT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAddress Scheme . BTC _ LEG ACY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdefault Address Scheme ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠList < Network Initializer >. get ( currency Id : ĠString ) Ġ= ĊĠĠĠ Ġfirst OrNull Ġ{ Ġit Ġ! is ĠDefault Network Initializer Ġ&& Ġit . is Supported ( currency Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġfirst OrNull Ġ{ Ġit . is Supported ( currency Id ) Ġ} Ċ Ċ private Ġfun ĠConcurrent HashMap < String , ĠChannel < Unit >> . get Safe ( key : ĠString ) Ġ= Ġrun Ġ{ ĊĠĠĠ Ġget OrElse ( key , Ġ{ ĠChannel () Ġ}). also Ġ{ Ġput If Absent ( key , Ġit ) Ġ} Ċ } Ċ