package Ġco . nil in . op ex . chain scan . bitcoin . service Ċ Ċ import Ġco . nil in . op ex . chain scan . bitcoin . Get Block Proxy Ċ import Ġco . nil in . op ex . chain scan . bitcoin . data . Transaction Response Ċ import Ġco . nil in . op ex . chain scan . bitcoin . utils . just Try Ċ import Ġco . nil in . op ex . chain scan . bitcoin . utils . just Try OrNull Ċ import Ġco . nil in . op ex . chain scan . core . model . Transfer Ċ import Ġco . nil in . op ex . chain scan . core . model . Trans fers Result Ċ import Ġco . nil in . op ex . chain scan . core . spi . Chain Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Service Ċ Ċ @ Service Ċ class ĠRest Chain Service ( private Ġval Ġproxy : ĠGet Block Proxy ) Ġ: ĠChain Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Rest Chain Service :: class . java ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Trans fers ( start Block : ĠLong , Ġend Block : ĠLong ?, Ġaddresses : ĠList < String >? ): ĠTrans fers Result Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Requested Ġblocks : Ġstart Block =$ start Block , Ġend Block =$ end Block ") ĊĊĠĠĠĠĠĠĠ Ġval Ġblock Hash Ġ= ĠArrayList < String ?> () ĊĊĠĠĠĠĠĠĠ Ġval Ġnetwork Height Ġ= Ġproxy . getInfo ()?. blocks Ġ?: Ġthrow ĠIllegalStateException (" Could Ġnot Ġfetch Ġlatest Ġblock ") ĊĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġif Ġ( end Block Ġ== Ġnull Ġ|| Ġend Block Ġ> Ġnetwork Height ) Ġnetwork Height Ġelse Ġend Block ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġif Ġ( start Block Ġ== Ġ 0 L Ġ|| Ġstart Block Ġ> Ġlast ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ- Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( last Ġ- Ġstart Block Ġ> Ġ 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ- Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġelse Ġstart Block ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Start Ġfetching Ġbitcoin Ġtransfers : Ġstart Block =$ first , Ġend Block =$ last ") ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfirst Ġuntil Ġlast Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjust Try Ġ{ Ġblock Hash . add ( proxy . getBlock Hash ( i )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtransactions Ġ= ĠArrayList < Transaction Response >() ĊĠĠĠĠĠĠĠ Ġblock Hash . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġjust Try OrNull Ġ{ Ġproxy . getBlock Data ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ Ġd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" F etched Ġblock Ġ${ d . height } Ġwith Ġ${ d . tx . size } Ġtransactions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions . addAll ( d . tx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtransfers Ġ= ĠArrayList < Transfer >() ĊĠĠĠĠĠĠĠ Ġtransactions . forEach Ġ{ Ġtx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx . v out . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransfers . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTransfer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ tx . hash }_${ it . script PubKey ?. hex }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . script PubKey ?. address Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" Finished Ġfetching Ġtransactions : Ġlast Block =$ last Ġtransfers =${ trans fers . size }") ĊĠĠĠĠĠĠĠ Ġreturn ĠTrans fers Result ( last , Ġtransfers ) ĊĠĠĠ Ġ} Ċ }