package Ġco . nil in . op ex . bc gateway . core . service Ċ Ċ import Ġco . nil in . op ex . bc gateway . core . api . Assign Address Service Ċ import Ġco . nil in . op ex . bc gateway . core . model . Address Type Ċ import Ġco . nil in . op ex . bc gateway . core . model . Assigned Address Ċ import Ġco . nil in . op ex . bc gateway . core . model . Chain Ċ import Ġco . nil in . op ex . bc gateway . core . model . Currency Ċ import Ġco . nil in . op ex . bc gateway . core . spi . Assigned Address Handler Ċ import Ġco . nil in . op ex . bc gateway . core . spi . Currency Loader Ċ import Ġco . nil in . op ex . bc gateway . core . spi . Reserved Address Handler Ċ import Ġco . nil in . op ex . utility . error . data . Op ex Error Ċ import Ġco . nil in . op ex . utility . error . data . Op ex Exception Ċ Ċ class ĠAssign Address ServiceImpl ( ĊĠĠĠ Ġval Ġcurrency Loader : ĠCurrency Loader , ĊĠĠĠ Ġval Ġassigned Address Handler : ĠAssigned Address Handler , ĊĠĠĠ Ġval Ġreserved Address Handler : ĠReserved Address Handler Ċ ) Ġ: ĠAssign Address Service Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġassign Address ( user : ĠString , Ġcurrency : ĠCurrency ): ĠList < Assigned Address > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrency Info Ġ= Ġcurrency Loader . fetch Currency Info ( currency . symbol ) ĊĠĠĠĠĠĠĠ Ġval Ġchains Ġ= Ġcurrency Info . implement ations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġimp Ġ-> Ġimp . chain Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaddress Types Ġ= Ġchains ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġchain Ġ-> Ġchain . address Types Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠ Ġval Ġchain Address TypeMap Ġ= ĠHashMap < Address Type , ĠMutable List < Chain >>() ĊĠĠĠĠĠĠĠ Ġchains . forEach Ġ{ Ġchain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchain . address Types . forEach Ġ{ Ġaddress Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain Address TypeMap . put If Absent ( address Type , Ġmutable ListOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain Address TypeMap . get ( address Type ) !!. add ( chain ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġuser Assigned Addresses Ġ= Ġ( assigned Address Handler . fetch Assigned Addresses ( user , Ġaddress Types )). to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Set Of < Assigned Address >() ĊĠĠĠĠĠĠĠ Ġaddress Types . forEach Ġ{ Ġaddress Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġassigned Ġ= Ġuser Assigned Addresses . first OrNull Ġ{ Ġassign Address Ġ-> Ġassign Address . type . equals ( address Type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( assigned Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain Address TypeMap . get ( address Type )?. forEach Ġ{ Ġchain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! assigned . chains . contains ( chain )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassigned . chains . add ( chain ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( assigned ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreserved Address Ġ= Ġreserved Address Handler . peek Reserved Address ( address Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reserved Address Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Assigned Ġ= ĠAssigned Address ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreserved Address . address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreserved Address . memo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain Address TypeMap . get ( address Type ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreserved Address Handler . remove ( reserved Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( new Assigned ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOp ex Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOp ex Error . Reserved Address Not Available , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġreserved Ġaddress Ġavailable Ġfor Ġ$ address Type " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . forEach Ġ{ Ġaddress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassigned Address Handler . persist ( address ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . to Mutable List () ĊĠĠĠ Ġ} Ċ }