/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠE mer ald Pay , ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġio . em eral dp ay . d sh ack le . upstream . ethereum Ċ Ċ import Ġio . em eral dp ay . d sh ack le . upstream . Api Source Ċ import Ġio . em eral dp ay . d sh ack le . upstream . Head Ċ import Ġio . em eral dp ay . d sh ack le . upstream . Selector Ċ import Ġio . em eral dp ay . d sh ack le . upstream . rp cc lient . Json Rpc Request Ċ import Ġio . em eral dp ay . d sh ack le . upstream . rp cc lient . Json Rpc Response Ċ import Ġio . em eral dp ay . ether jar . domain . Address Ċ import Ġio . em eral dp ay . ether jar . erc 2 0 . ERC 2 0 Token Ċ import Ġio . em eral dp ay . ether jar . hex . Hex 3 2 Ċ import Ġio . em eral dp ay . ether jar . hex . Hex Quantity Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ import Ġjava . math . BigInteger Ċ Ċ /** Ċ Ġ* ĠQuery Ġfor Ġa ĠERC 2 0 Ġtoken Ġbalance Ġfor Ġan Ġaddress Ċ Ġ*/ Ċ open Ġclass ĠERC 2 0 Balance Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( ERC 2 0 Balance :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġget Balance ( up streams : ĠEthereum Mult istream , Ġtoken : ĠERC 2 0 Token , Ġaddress : ĠAddress ): ĠMono < BigInteger > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġup streams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġuse Ġonly Ġup - to - date Ġup streams ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Api Source ( Selector . Height Matcher ( up streams . get Head (). getCurrent Height () Ġ?: Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġget Balance ( it , Ġtoken , Ġaddress ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġget Balance ( apis : ĠApi Source , Ġtoken : ĠERC 2 0 Token , Ġaddress : ĠAddress ): ĠMono < BigInteger > Ġ{ ĊĠĠĠĠĠĠĠ Ġap is . request ( 1 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠFlux . from ( apis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Balance ( it . cast ( E thereum Upstream :: class . java ), Ġtoken , Ġaddress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġap is . resolve () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġget Balance ( upstream : ĠEthereum Upstream , Ġtoken : ĠERC 2 0 Token , Ġaddress : ĠAddress ): ĠMono < BigInteger > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġupstream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Api () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. read ( prepare Eth Call ( token , Ġaddress , Ġupstream . get Head ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap ( Json Rpc Response :: require String Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠHex 3 2 . from ( it ). as Quantity (). value Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprepare Eth Call ( token : ĠERC 2 0 Token , Ġtarget : ĠAddress , Ġhead : ĠHead ): ĠJson Rpc Request Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. read Balance Of ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toJson () ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġhead . getCurrent Height ()?. let Ġ{ ĠHex Quantity . from ( it ). to Hex () Ġ} Ġ?: Ġ" latest " ĊĠĠĠĠĠĠĠ Ġreturn ĠJson Rpc Request (" eth _ call ", ĠlistOf ( call , Ġheight )) ĊĠĠĠ Ġ} Ċ } Ċ