/* Ċ Ġ* ĠCopyright Ġ( C ) Ġby ĠM inter Team . Ġ 2 0 2 1 Ċ Ġ* Ġ@ link Ġ< a Ġhref =" https :// github . com / M inter Team "> Org ĠGithub </ a > Ċ Ġ* Ġ@ link Ġ< a Ġhref =" https :// github . com / ed ward stock "> Maint ainer ĠGithub </ a > Ċ Ġ* Ċ Ġ* ĠThe ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* Ġ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 Ġnetwork . min ter . bip wallet . coins Ċ Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġnetwork . min ter . bip wallet . internal . Wallet Ċ import Ġnetwork . min ter . bip wallet . internal . helpers . data . Collections Helper . toMap Ċ import Ġnetwork . min ter . bip wallet . internal . helpers . data . Collections Helper . unique Ċ import Ġnetwork . min ter . blockchain . models . operation al .* Ċ import Ġnetwork . min ter . core . M inter SDK Ċ import Ġnetwork . min ter . explorer . models . Coin Item Ċ import Ġnetwork . min ter . explorer . repo . Gate Coin Repository Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . math . BigInteger Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ Ċ /** Ċ Ġ* Ġm inter - android - wallet . Ġ 2 0 2 0 Ċ Ġ* Ġ@ author ĠE du ard ĠMax im ov ich Ġ( ed ward . v stock @ gmail . com ) Ċ Ġ* Ġ@ todo Ġre - work Ġthis Ġhelper Ċ Ġ*/ Ċ class ĠCoin Mapper ( ĊĠĠĠĠĠĠĠ Ġval Ġcoins Repo : ĠRepo Coins , ĊĠĠĠĠĠĠĠ Ġval Ġcoins Gate Repo : ĠGate Coin Repository Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLock Ġobject Ġfor Ġsynchron izations ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Lock : ĠAny Ġ= ĠAny () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMemory Ġcache Ġfor Ġall Ġcoins Ġ{ id Ġ-> Ġcoin } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġid Cache : ĠMutable Map < BigInteger , ĠCoin Item > Ġ= ĠHashMap () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe versed Ġcache Ġ{ symbol Ġ-> Ġcoin } ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġname Cache : ĠMutable Map < String , ĠCoin Item > Ġ= ĠHashMap () ĊĊĠĠĠ Ġprivate Ġvar Ġresolved All Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcoins Repo . observe () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Comp letable Ġ{ Ġresolve All Coins () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Coin Ġmapper Ġcache Ġhas Ġbeen Ġauto - updated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcoins Repo . update () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresolve All Coins (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcoins Repo . entity . getAll Db () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠHashMap < BigInteger , ĠCoin Item >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout [ item . id ] Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( m Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Cache Ġ= Ġout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġid Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Cache [ entry . value . symbol ] Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolved All Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp letable . complete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresolve Coins ( ids : ĠList < BigInteger >): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġul ist Ġ= Ġids . unique () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoins Repo . entity . getAll ById s ( ul ist ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcoins Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Mapped Ġ% d Ġcoins ", Ġcoins . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġcoins . toMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair < BigInteger , ĠCoin Item >( it . id , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( m Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġtmp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! id Cache . containsKey ( entry . key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Cache [ entry . key ] Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġid To Symbol ( id : ĠBigInteger ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== ĠM inter SDK . DEFAULT _ CO IN _ ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM inter SDK . DEFAULT _ CO IN ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! id Cache . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġid Cache [ id ]?. symbol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġid To Symbol Def ( id : ĠBigInteger ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġid To Symbol ( id ) Ġ?: Ġ" coin ĠID : Ġ$ id " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġid To Symbol Def ( id : ĠBigInteger , Ġformat : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġid To Symbol ( id ) Ġ?: ĠString . format ( format , Ġid . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( id : ĠBigInteger ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġid To Symbol ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( name : ĠString ): ĠBigInteger ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsymbol To Id ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsymbol To Id ( symbol : ĠString ): ĠBigInteger ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġsymbol . uppercase ( Wallet . LC _ EN ) ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ== ĠM inter SDK . DEFAULT _ CO IN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM inter SDK . DEFAULT _ CO IN _ ID ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġhas Ġlocal Ġcache Ġ, Ġget Ġfrom Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( name Cache . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġname Cache [ name ] !!. id ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġtry Ġto Ġfind Ġin Ġglobal Ġlist ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Cache . values . first Ġ{ Ġit . symbol . uppercase ( Wallet . LC _ EN ) Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġsomething Ġwas Ġfound , Ġstore Ġto Ġcache ĊĠĠĠĠĠĠĠ Ġif Ġ( out Ġ!= Ġnull Ġ&& Ġ! name Cache . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Cache [ name ] Ġ= Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġout ?. id ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ById ( id : ĠBigInteger ): ĠCoin Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! id Cache . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġid Cache [ id ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ByName ( name : ĠString ): ĠCoin Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! name Cache . containsKey ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġname Cache [ name ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexist Multiple ( ext Tx : ĠExternal Transaction ): ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcoin sTo Search : ĠMutable List < BigInteger > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ext Tx . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Send Coin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( ext Tx . getData < Tx Send Coin >(). coin Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Sell Coin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Coin Sell >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id To Buy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id ToS ell ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Sell All Coins Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Coin Sell All >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id To Buy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id ToS ell ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Buy Coin Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Coin Buy >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id To Buy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id ToS ell ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Declare C andid acy Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Declare C andid acy >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Delegate Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Delegate >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Un bound Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Un bound >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . coin Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Re deem Check Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Re deem Check >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( data . decoded Check . coin Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOperation Type . Mult is end Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġext Tx . getData < Tx Mult is end >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . items . map Ġ{ Ġit . coin Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġdata . items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! coins To Search . contains ( item . coin Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin sTo Search . add ( item . coin Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ch ill ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( coins To Search . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġresolve Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġcoin sTo Search ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! id Cache . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! resolve ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTim ber . d (" Unable Ġto Ġfind Ġsome Ġcoins . ĠTrying Ġto Ġrefresh Ġcache Ġfrom Ġlocal Ġdb ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresolve All Coins () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsearch Ġagain Ġafter Ġre loading ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( id Ġin Ġcoin sTo Search ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! id Cache . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexist ( name : ĠString ): ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resolved All Ġ&& Ġget ( name ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresolve All Coins () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Ġ{ Ġget ( name ) Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ switch Map Ġcoins Gate Repo . coin Exists ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. single ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexist ( id : ĠBigInteger ): ĠSingle < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resolved All Ġ&& Ġget ( id ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSingle . just ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresolve All Coins () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Single Ġ{ Ġget ( id ) Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ switch Map Ġcoins Gate Repo . coin Exists ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. single ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠ Ġ} Ċ }