package Ġcom . rar ible . blockchain . scanner . flow Ċ Ċ import Ġcom . nft co . flow . sdk . Flow Block Ċ import Ġcom . rar ible . blockchain . scanner . util . log Time Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Obsolete Cor outines Api Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util . concurrent . atomic . Atomic Long Ċ Ċ @ Obsolete Cor outines Api Ċ @ Experimental Cor outines Api Ċ @ Component Ċ class ĠFlow Net New Block Poller ( ĊĠĠĠ Ġ@ Value ("\ ${ blockchain . scanner . flow . pol ler . delay : 1 0 0 0 }") ĊĠĠĠ Ġprivate Ġval Ġpol led Delay : ĠLong , ĊĠĠĠ Ġprivate Ġval Ġapi : ĠFlow Grpc Api Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Flow Net New Block Poller :: class . java ) ĊĊĠĠĠ Ġprivate Ġval Ġstart : ĠAtomic Long Ġ= ĠAtomic Long ( 0 L ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġpolling Ġfrom Ġdetermined Ġblock Ġheight ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġpoll ( from Height : ĠLong ): ĠFlow < Flow Block > Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" Poll Ġ... Ġfrom : Ġ$ from Height ") ĊĠĠĠĠĠĠĠ Ġstart . set ( from Height ) ĊĠĠĠĠĠĠĠ Ġreturn Ġchannel Flow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! is Closed For Send ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Number Ġ= Ġstart . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" try Ġto Ġread Ġblock Ġ$ start Number ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatest Ġ= Ġapi . latest Block () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( latest . height Ġ<= Ġstart Number ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Latest Ġheight Ġon Ġchain Ġgreater Ġthan Ġneed Ġ[ ${ latest . height } Ġ<= Ġ$ start Number ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( pol led Delay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġ( start Number Ġ.. Ġlatest . height ). as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" read Ġblock Ġrange Ġ${ ( start Number Ġ.. Ġlatest . height )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Time (" Collect Ġblock Ġ[$ it ]") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġapi . block By Height ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Send Ġto Ġflow Ġ${ b . height }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( b ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart . set ( latest . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Set Ġ${ latest . height } Ġas Ġnext Ġstart Ġvalue Ġ... ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( pol led Delay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. retry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log . isDebugEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Error Ġin Ġpoll Ġfunction : Ġ${ it . message }", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( pol led Delay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ