package Ġorg . erg op l atform . pers istance Ċ Ċ import Ġcom . squareup . sql de light . runtime . coroutines . as Flow Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ class ĠSql Del ight Wallet Provider ( private Ġval Ġapp Db : ĠApp Database ) Ġ: ĠWallet Db Provider Ġ{ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< R > Ġwith Transaction ( block : Ġsuspend Ġ() Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . transaction With Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload Wallet By First Address ( first Address : ĠString ): ĠWallet Config ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . load Wallet By First Address ( first Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute As One OrNull ()?. to Model () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload Wallet Config ById ( id : ĠInt ): ĠWallet Config ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . load Wallet ById ( id . to Long ()). execute As One OrNull ()?. to Model () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate Wallet Config ( wallet Config : ĠWallet Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . insert Or Replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wallet Config . id Ġ> Ġ 0 ) Ġwallet Config . id . to Long () Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Config . displayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Config . first Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Config . encryption Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Config . secret Storage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Config . un fold Tokens ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Wallet DisplayName ( displayName : ĠString , Ġwallet Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . update Wallet DisplayName ById ( displayName , Ġwallet Id . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Wallet Display Tokens ( display Tokens : ĠBoolean , Ġwallet Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . update Wallet Tokens Un fold ( display Tokens , Ġwallet Id . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinsert Wallet Config ( wallet Config : ĠWallet Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsame Ġcode Ġhere ĊĠĠĠĠĠĠĠ Ġupdate Wallet Config ( wallet Config ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġdelete All Wallet Data ( wallet Config : ĠWallet Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Config . first Address ?. let Ġ{ Ġfirst Address Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet State Queries . delete By First Address ( first Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Token Queries . delete Tokens By First Address ( first Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Address Queries . delete Wallet Address By First Address ( first Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . delete Wallet ById ( wallet Config . id . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Wallet Configs S ynchronous (): ĠList < Wallet Config > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapp Db . wallet Config Queries . selectAll (). execute As List (). map Ġ{ Ġit . to Model () Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinsert Wallet States ( wallet States : ĠList < Wallet State >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet States . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet State Queries . insert Or Replace ( it . to Db Entity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete Address State ( public Address : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet State Queries . delete Address State ( public Address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Wallet sWith States Flow (): ĠFlow < List < Wallet >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . observe With State (). as Flow (). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdetected Ġa Ġchange Ġin Ġany Ġof Ġthe Ġdatabase Ġtables Ġ- Ġdo Ġall Ġqueries Ġand Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( get Wallet sWith States ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Wallet sWith States () Ġ= Ġapp Db . wallet Config Queries . selectAll (). execute As List (). map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġit . to Model () ĊĠĠĠĠĠĠĠ Ġfetch State Information ( model ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch State Information ( model : ĠWallet Config ): ĠWallet Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġapp Db . wallet State Queries . load Wallet States ( model . first Address !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute As List (). map Ġ{ Ġit . to Model () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġapp Db . wallet Token Queries . load Wallet Tokens ( model . first Address !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute As List (). map Ġ{ Ġit . to Model () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaddresses Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Address Queries . load Wallet Addresses ( model . first Address !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute As List (). map Ġ{ Ġit . to Model () Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠWallet ( model , Ġstate , Ġtokens , Ġaddresses ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload Wallet With State ById ( id : ĠInt ): ĠWallet ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwallet Config Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . load Wallet ById ( id . to Long ()). execute As One OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to Model () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Config ?. let Ġ{ Ġfetch State Information ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġwallet With State ById As Flow ( id : ĠInt ): ĠFlow < Wallet ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Config Queries . observe With State (). as Flow (). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġdetected Ġa Ġchange Ġin Ġany Ġof Ġthe Ġdatabase Ġtables Ġ- Ġdo Ġall Ġqueries Ġand Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( load Wallet With State ById ( id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload Wallet Addresses ( first Address : ĠString ): ĠList < Wallet Address > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Address Queries . load Wallet Addresses ( first Address ). execute As List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Model () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload Wallet Address ( id : ĠLong ): ĠWallet Address ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Address Queries . load Wallet Address ( id ). execute As One OrNull ()?. to Model () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinsert Wallet Address ( wallet Address : ĠWallet Address ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Address Queries . insert Or Replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wallet Address . id Ġ> Ġ 0 ) Ġwallet Address . id Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Address . wallet First Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Address . der ivation Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Address . public Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Address . label ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate Wallet Address Label ( addr Id : ĠLong , Ġnew Label : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Address Queries . update Label ( new Label , Ġaddr Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete Wallet Address ( addr Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Address Queries . delete Wallet Address ( addr Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete Tokens By Address ( public Address : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Token Queries . delete Tokens By Address ( public Address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinsert Wallet Tokens ( wallet Tokens : ĠList < Wallet Token >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwallet Tokens . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Db . wallet Token Queries . insert Or Replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ> Ġ 0 ) Ġit . id Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . public Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . wallet First Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . tokenId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . amount , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . decimals , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }