package Ġio . horizontal systems . bitcoin core . managers Ċ Ċ import Ġandroid . util . Base 6 4 Ċ import Ġcom . ec lip ses ource . json . Json Ċ import Ġcom . ec lip ses ource . json . JsonArray Ċ import Ġcom . ec lip ses ource . json . JsonObject Ċ import Ġio . horizontal systems . bitcoin core . core . I Initial Sync Api Ċ import Ġio . horizontal systems . bitcoin core . utils . Hash Utils Ċ import Ġjava . util .* Ċ import Ġjava . util . logging . Logger Ċ Ċ class ĠBit no vo Coin Api ( ĊĠĠĠĠĠĠĠ Ġhost : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcoin : ĠString , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠaccessToken : ĠString Ċ ) Ġ: ĠI Initial Sync Api Ġ{ ĊĠĠĠ Ġprivate Ġval Ġapi Manager Ġ= ĠApi Manager ( host ) ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger . getLogger (" Bit no vo Coin Api ") ĊĊĠĠĠ Ġoverride Ġfun Ġget Transactions ( addresses : ĠList < String >): ĠList < Transaction Item > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Request Ġtransactions Ġfor Ġ${ addresses . size } Ġaddresses : Ġ[ ${ addresses . first ()}, Ġ... ]") ĊĊĠĠĠĠĠĠĠ Ġfun Ġmin ( a : ĠInt , Ġb : ĠInt ) Ġ= Ġif Ġ( a Ġ< Ġb ) Ġa Ġelse Ġb ĊĠĠĠĠĠĠĠ Ġval Ġtransactions Ġ= Ġmutable ListOf < Transaction Item >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠmaxSize Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ< Ġaddresses . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin ( maxSize , Ġaddresses . size Ġ- Ġcurrent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġcurrent Ġ+ Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Addresses Ġ= Ġaddresses . slice ( current Ġuntil Ġlimit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= ĠJsonObject (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [" addresses "] Ġ= ĠJson . array (* current Addresses . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi Manager . post (" api / v 1 / wallet s /$ coin / tx /", Ġrequest Data . toString (), Ġauth Token ()). as Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Got Ġ${ response . size ()} Ġtransactions Ġfor Ġrequested Ġaddresses ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Transactions ( response , Ġtransactions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ+= Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtransactions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Transactions ( response : ĠJson Array , Ġtransactions : ĠMutable List < Transaction Item >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( tx Item Ġin Ġresponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġtx Item . as Object () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Hash Json Ġ= Ġtx [" block Hash "] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Hash Ġ= Ġif Ġ( block Hash Json . isString ) Ġblock Hash Json . asString () Ġelse Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġmutable ListOf < Transaction Output Item >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( output Item Ġin Ġtx [" outputs "]. as Array ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Json Ġ= Ġoutput Item . as Object () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Json Ġ= Ġoutput Json [" script "] Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddresses Ġ= Ġoutput Json [" addresses "] Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( script Json . isString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( address Ġin Ġaddresses . as Array ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Json Ġ= Ġif Ġ( address . isString ) Ġaddress . asString () Ġelse Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs . add ( Transaction Output Item ( script Json . asString (), Ġaddress Json )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions . add ( Transaction Item ( block Hash , Ġtx [" block Height "]. as Int (), Ġoutputs )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauth Token (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠDate (). time Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġsecret Hash Ġ= ĠHash Utils . sha 2 5 6 ("$ accessToken $ now ". toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġbase 6 4 Hash Ġ= ĠBase 6 4 . encode ToString ( secret Hash , ĠBase 6 4 . NO _ WRAP ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Token Ġ$ now :$ base 6 4 Hash " ĊĠĠĠ Ġ} Ċ Ċ } Ċ