/* Ċ Ġ* ĠCopyright ĠD 3 ĠLed ger , ĠInc . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . d 3 . btc . storage Ċ Ċ import Ġcom . d 3 . btc . model . Btc Address Ċ import Ġcom . d 3 . btc . provider . Btc Change Address Provider Ċ import Ġcom . d 3 . btc . provider . Btc Registered Addresses Provider Ċ import Ġcom . github . kit tin un f . result . fan out Ċ import Ġcom . github . kit tin un f . result . map Ċ import Ġmu . K Logging Ċ Ċ /** Ċ Ġ* ĠIn - memory ĠBTC Ġaddress Ġstorage . Ċ Ġ* ĠCreated Ġto Ġreduce ĠI ro ha Ġquerying . Ċ Ġ*/ Ċ open Ġclass ĠB tc Address Storage ( ĊĠĠĠ Ġbtc Registered Addresses Provider : ĠB tc Registered Addresses Provider , ĊĠĠĠ Ġbtc Change Address Provider : ĠB tc Change Address Provider Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclient Addresses Storage Ġ= ĠHashMap < String , ĠString >() ĊĊĠĠĠ Ġprivate Ġval Ġchange Addresses Storage Ġ= ĠHashSet < String >() ĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠ ĠIt 's Ġcr uc ial Ġto Ġinit Ġthis Ġstorage Ġon Ġstart ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġchange Ġaddresses ĊĠĠĠĠĠĠĠ Ġbtc Change Address Provider . getAll Change Addresses (). fan out Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġregistered Ġaddresses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtc Registered Addresses Provider . get Registered Addresses () ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġ( change Addresses , Ġregistered Addresses ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Change Addresses ( change Addresses ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Client Addresses ( registered Addresses ) ĊĠĠĠĠĠĠĠ Ġ}. fold ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" BTC Ġaddress Ġstorage Ġhas Ġbeen Ġinitialized ") ĊĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġex Ġ-> Ġthrow Ġex Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġclient Ġaddress ĊĠĠĠĠ Ġ* Ġ@ param Ġaddress Ġ- ĠBTC Ġaddress Ġof Ġa Ġclient ĊĠĠĠĠ Ġ* Ġ@ param ĠaccountId Ġ- Ġaccount Ġid Ġof Ġa Ġclient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġadd Client Address ( address : ĠString , ĠaccountId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Addresses Storage [ address ] Ġ= ĠaccountId ĊĠĠĠĠĠĠĠ Ġlogger . info (" Address Ġ$ address Ġhas Ġbeen Ġadded Ġto Ġthe Ġclient Ġaddress Ġstorage ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġclient Ġaddress ĊĠĠĠĠ Ġ* Ġ@ param Ġaddress Ġ- ĠB tc Address Ġobject Ġwith Ġall Ġinformation Ġabout Ġan Ġaddress ( address Ġitself , Ġaccount Ġid , Ġetc ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġadd Client Address ( address : ĠB tc Address ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Client Address ( address . address , Ġaddress . info . iro ha Client !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġmultiple Ġclient Ġaddresses Ġin Ġstorage ĊĠĠĠĠ Ġ* Ġ@ param Ġaddresses Ġ- Ġaddresses Ġto Ġadd ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġadd Client Addresses ( addresses : ĠIterable < Btc Address >) Ġ{ ĊĠĠĠĠĠĠĠ Ġaddresses . forEach Ġ{ Ġaddress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Client Address ( address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġchange Ġaddress Ġto Ġstorage ĊĠĠĠĠ Ġ* Ġ@ param Ġaddress Ġ- Ġchange Ġaddress Ġto Ġadd ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġadd Change Address ( address : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchange Addresses Storage . add ( address ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Address Ġ$ address Ġhas Ġbeen Ġadded Ġto Ġthe Ġchange Ġaddress Ġstorage ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġmultiple Ġchange Ġaddresses Ġto Ġstorage ĊĠĠĠĠ Ġ* Ġ@ param Ġaddresses Ġ- Ġaddresses Ġto Ġadd ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġadd Change Addresses ( addresses : ĠIterable < Btc Address >) Ġ{ ĊĠĠĠĠĠĠĠ Ġaddresses . forEach Ġ{ Ġaddress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Change Address ( address . address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġaddress Ġis Ġa Ġchange Ġaddress ĊĠĠĠĠ Ġ* Ġ@ param Ġaddress Ġ- Ġaddress Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġaddress Ġis Ġa Ġchange Ġaddress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġis Change Address ( address : ĠString ) Ġ= Ġchange Addresses Storage . contains ( address ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġaddress Ġis Ġa Ġclient Ġaddress ĊĠĠĠĠ Ġ* Ġ@ param Ġaddress Ġ- Ġaddress Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġaddress Ġis Ġa Ġclient Ġaddress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġis Our Client ( address : ĠString ) Ġ= Ġclient Addresses Storage . contains ( address ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġaddress Ġis Ġa Ġclient Ġaddress Ġor Ġa Ġchange Ġaddress ĊĠĠĠĠ Ġ* Ġ@ param Ġaddress Ġ- Ġaddress Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġaddress Ġis Ġa Ġclient Ġaddress Ġor Ġa Ġchange Ġaddress ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġis W atched Address ( address : ĠString ) Ġ= Ġis Change Address ( address ) Ġ|| Ġis Our Client ( address ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġaccount Ġid Ġrelated Ġto Ġaddress ĊĠĠĠĠ Ġ* Ġ@ param Ġaddress Ġ- Ġaddress Ġthat Ġis Ġrelated Ġto Ġsome Ġclient ĊĠĠĠĠ Ġ* Ġ@ return Ġaccount Ġid Ġor Ġnull Ġif Ġthere Ġis Ġno Ġsuch Ġaddress Ġamong Ġclient Ġaddresses ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠgetClient AccountId ( address : ĠString ) Ġ= Ġclient Addresses Storage [ address ] ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġchange Ġaddresses ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġget Change Addresses (): ĠSet < String > Ġ= ĠHashSet ( change Addresses Storage ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġclient Ġaddresses ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠgetClient Addresses (): ĠSet < String > Ġ= ĠHashSet ( client Addresses Storage . keys ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ċ } Ċ