package Ġnetwork . o 3 . o 3 wallet . Portfolio Ċ Ċ import Ġandroid . arch . lifecycle . LiveData Ċ import Ġandroid . arch . lifecycle . Mutable LiveData Ċ import Ġandroid . arch . lifecycle . ViewModel Ċ import Ġnetwork . o 3 . o 3 wallet .* Ċ import Ġnetwork . o 3 . o 3 wallet . API . O 3 . O 3 API Ċ import Ġnetwork . o 3 . o 3 wallet . API . O 3 . Portfolio Ċ import Ġnetwork . o 3 . o 3 wallet . API . O 3 . Price Data Ċ import Ġnetwork . o 3 . o 3 wallet . API . O 3 Platform . O 3 Platform Client Ċ import Ġnetwork . o 3 . o 3 wallet . API . O 3 Platform . Transfer able Asset Ċ import Ġnetwork . o 3 . o 3 wallet . API . O 3 Platform . Transfer able Assets Ċ import Ġorg . jetbrains . ank o . coroutines . experimental . bg Ċ import Ġjava . text . ParseException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Count DownLatch Ċ Ċ class ĠHome ViewModel V 2 : ĠViewModel () Ġ{ ĊĠĠĠ Ġenum Ġclass ĠDisplay Type ( val Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠO 3 ADDR ( 0 ), ĠW ATCH ADDR ( 1 ), ĠCOMB IN ED ( 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġassets ReadOnly Intermediate : ĠArrayList < Transfer able Asset > Ġ= Ġarray ListOf () ĊĊĊĠĠĠ Ġvar Ġassets ReadOnly : ĠMutable Map < NE P 6 . Account , ĠArrayList < Transfer able Asset >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġvar Ġassets Writable : ĠArrayList < Transfer able Asset >? Ġ= Ġnull ĊĠĠĠ Ġvar Ġdisplayed Assets : ĠMutable LiveData < ArrayList < Transfer able Asset >> ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġportfolio : ĠMutable LiveData < Portfolio >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġinitial Price : ĠPrice Data ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlatest Price : ĠPrice Data ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġcurrency : ĠCurrency Type Ġ= ĠCurrency Type . FI AT ĊĠĠĠ Ġprivate Ġvar Ġinterval : ĠString Ġ= ĠO 3 Wallet . app Context !!. resources . getString ( R . string . PORT FO LI O _ one _ day ) ĊĠĠĠ Ġ// private Ġvar Ġdisplay Type : ĠDisplay Type Ġ= ĠDisplay Type . O 3 ADDR ĊĊĠĠĠ Ġvar Ġhas Watch Address Ġ= ĠN EP 6 . has Multiple Accounts () ĊĊĠĠĠ Ġprivate Ġvar Ġposition : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġlateinit Ġvar Ġdelegate : ĠHome ViewModel Protocol ĊĊĠĠĠ Ġvar Ġlatest Prices Ġ= Ġfloat ArrayOf () ĊĊĠĠĠ Ġfun Ġset Currency ( currency : ĠCurrency Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . currency Ġ= Ġcurrency ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Currency (): ĠCurrency Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrency ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetInterval ( interval : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . interval Ġ= Ġinterval ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Interval (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . interval ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Position ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . position Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġget Displayed Assets ( false ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġget Position (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġposition ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Assets ReadOnly ( refresh : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( assets ReadOnly . isEmpty () Ġ|| Ġrefresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Assets ReadOnly () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets ?. post Value ( assets ReadOnly [ NE P 6 . get From FileSystem (). get Wallet Accounts ()[ position Ġ- Ġ 1 ]]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Assets Writable ( refresh : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( assets Writable Ġ== Ġnull Ġ|| Ġrefresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Assets Writable () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets ?. post Value ( assets Writable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ReadOnly Asset ( account : ĠN EP 6 . Account , Ġasset : ĠTransfer able Asset ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! assets ReadOnly . keys . contains ( account )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassets ReadOnly [ account ] Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassets ReadOnly [ account ]?. add ( asset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ReadOnly Balances ( address : ĠN EP 6 . Account , Ġassets : ĠTransfer able Assets ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( asset Ġin Ġassets . assets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ReadOnly Asset ( address , Ġasset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( token Ġin Ġassets . tokens ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ReadOnly Asset ( address , Ġtoken ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcombine ReadOnly And Writable (){ ĊĠĠĠĠĠĠĠ Ġvar Ġassets Ġ= Ġarray ListOf < Transfer able Asset >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( asset Ġin Ġassets Writable Ġ?: Ġarray ListOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassets . add ( asset . deep Copy ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// var Ġassets Ġ= Ġassets Writable ĊĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġassets ReadOnly . keys ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( asset Ġin Ġassets ReadOnly [ key ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġassets . indices . find Ġ{ Ġassets [ it ]. name Ġ== Ġasset . name Ġ} Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets . add ( asset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets [ index ] Ġ= Ġassets [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets [ index ]. value Ġ+= Ġasset . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdisplayed Assets ?. post Value ( assets ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Assets ReadOnly () Ġ{ ĊĠĠĠĠĠĠĠ Ġbg Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddresses Ġ= ĠN EP 6 . get From FileSystem (). get ReadOnly Accounts () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( addresses . count () Ġ== Ġ 0 Ġ&& Ġposition Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets ?. post Value ( array ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ bg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Address Ġ= ĠN EP 6 . get From FileSystem (). get ReadOnly Accounts ()[ position Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Assets Ġ= ĠPersistent Store . get Saved Address Balances ( cached Address . address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġaddress Ġ= Ġaddresses [ position Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Assets Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets !!. post Value ( cached Assets ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠO 3 Platform Client (). get Transfer able Assets ( address . address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . second Ġ!= Ġnull Ġ|| Ġit . first Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ get Transfer able Assets ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets ReadOnly ! ![ address ]?. clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ReadOnly Balances ( address , Ġit . first !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets ?. post Value ( assets ReadOnly ! ![ NE P 6 . get From FileSystem (). get ReadOnly Accounts ()[ position Ġ- Ġ 1 ]]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPersistent Store . set Saved Address Balances ( address . address , Ġassets ReadOnly ! ![ NE P 6 . get From FileSystem (). get ReadOnly Accounts ()[ position Ġ- Ġ 1 ]]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . hide Asset Loading Indicator () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Assets Writable () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcached Assets Ġ= ĠPersistent Store . get Latest Balances () ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Assets Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassets Writable Ġ= Ġ( cached Assets . assets Ġ+ Ġcached Assets . tokens ). to Collection ( ArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets !!. post Value (( cached Assets . assets Ġ+ Ġcached Assets . tokens ). to Collection ( ArrayList ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbg Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO 3 Platform Client (). get Transfer able Assets ( Account . get Wallet (). address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPersistent Store . set Latest Balances ( it . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġit . first ?. tokens Ġ?: Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġassets Ġ= Ġit . first ?. assets Ġ?: Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassets Writable Ġ= Ġ( assets Ġ+ Ġtokens ). to Collection ( ArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets ?. post Value (( assets Ġ+ Ġtokens ). to Collection ( ArrayList ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate . hide Asset Loading Indicator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreload Displayed Assets () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġget Assets Writable ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EP 6 . get From FileSystem (). accounts . count () Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Watch Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombine ReadOnly And Writable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Assets ReadOnly ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġget Assets ReadOnly ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Displayed Assets ( refresh : ĠBoolean ): ĠLive Data < ArrayList < Transfer able Asset >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( display ed Assets Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplayed Assets Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġget Assets Writable ( refresh ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠN EP 6 . get From FileSystem (). accounts . count () Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Watch Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcombine ReadOnly And Writable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Assets ReadOnly ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġget Assets ReadOnly ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdisplayed Assets !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Price Float s (): ĠFloat Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlatest Prices ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Initial Price (): ĠPrice Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinitial Price !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Latest Price (): ĠPrice Data Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlatest Price !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Price Float s ( portfolio : ĠPortfolio ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠArray < Double >? Ġ= Ġwhen Ġ( currency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Type . FI AT Ġ-> Ġportfolio . data . map Ġ{ Ġit . average USD Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Type . BTC Ġ-> Ġportfolio . data . map Ġ{ Ġit . average BTC Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Prices Ġ= ĠFloat Array ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġfloats Ġ= ĠFloat Array ( data !!. count ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġdata . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloats [ i ] Ġ= Ġdata [ i ]. toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlatest Prices Ġ= Ġfloats . reversed Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetCurrent Portfolio Value (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( currency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Type . BTC Ġ-> Ġlatest Price ?. average BTC Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Type . FI AT Ġ-> Ġlatest Price ?. average USD Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Initial Portfolio Value (): ĠDouble Ġ Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( currency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Type . BTC Ġ-> Ġinitial Price ?. average BTC Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Type . FI AT Ġ-> Ġinitial Price ?. average USD Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Initial Date (): ĠDate Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdf 1 Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ' T ' HH : mm : ss ' Z '") ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdf 1 . parse ( initial Price ?. time Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Percent Change (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( get Initial Portfolio Value () Ġ== Ġ 0 . 0 ) Ġreturn Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġ(( getCurrent Portfolio Value () Ġ- Ġget Initial Portfolio Value ()) Ġ/ Ġget Initial Portfolio Value () Ġ* Ġ 1 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Portfolio (): ĠLive Data < Portfolio > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( portfolio Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġportfolio Ġ= ĠMutable LiveData () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġportfolio !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Portfolio Value ( assets : ĠArrayList < Transfer able Asset >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelegate . show Portfolio Loading Indicator () ĊĠĠĠĠĠĠĠ Ġbg Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO 3 API (). get Portfolio ( assets , Ġthis . interval ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . second Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ get Portfolio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Price Float s ( it . first !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Price Ġ= Ġit . first !!. data . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Price Ġ= Ġit . first !!. data . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġportfolio ?. post Value ( it . first !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }