package Ġorg . ke thereum . rpc . min 3 Ċ Ċ import Ġcom . squareup . mos hi . M oshi Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . RequestBody Ċ import Ġorg . ke thereum . model . Chain Id Ċ import Ġorg . ke thereum . rpc . Base E thereum RPC Ċ import Ġorg . ke thereum . rpc . JSON MediaType Ċ import Ġorg . ke thereum . rpc . RPC Transport Ċ import Ġorg . ke thereum . rpc . min 3 . model . IN 3 NodeList Response Ċ Ċ val ĠMAIN NET _ BOOT NODES Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ" https :// in 3 - v 2 . s lock . it / main net / nd - 1 ", ĊĠĠĠĠĠĠĠ Ġ" https :// in 3 - v 2 . s lock . it / main net / nd - 2 ", ĊĠĠĠĠĠĠĠ Ġ" https :// in 3 - v 2 . s lock . it / main net / nd - 3 " Ċ ) Ċ Ċ val ĠGO ER LI _ BOOT NODES Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ" https :// in 3 - v 2 . s lock . it / go er li / nd - 1 ", ĊĠĠĠĠĠĠĠ Ġ" https :// in 3 - v 2 . s lock . it / go er li / nd - 2 " Ċ ) Ċ Ċ fun Ġget Min 3 Boot n N des By Chain Id ( chain Id : ĠChain Id ) Ġ= Ġwhen Ġ( chain Id . value . to Long ()) Ġ{ ĊĠĠĠĠ 1 L Ġ-> ĠMAIN NET _ BOOT NODES ĊĠĠĠĠ 5 L Ġ-> ĠGO ER LI _ BOOT NODES ĊĠĠĠ Ġelse Ġ-> Ġnull Ċ } Ċ Ċ internal Ġval Ġin 3 node ListResponse Adapter Ġ= ĠM oshi . Builder (). build (). adapter < IN 3 NodeList Response >( IN 3 NodeList Response :: class . java ) Ċ Ċ fun Ġget Min 3 RPC ( boot Nodes : ĠList < String > Ġ= ĠMAIN NET _ BOOT NODES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok HttpClient : ĠOk HttpClient Ġ= ĠOk HttpClient . Builder (). build () Ċ ) Ġ= ĠBase E thereum RPC ( MIN 3 Transport ( boot Nodes , Ġok HttpClient )) Ċ Ċ fun Ġget Min 3 RPC ( chain Id : ĠChain Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġok HttpClient : ĠOk HttpClient Ġ= ĠOk HttpClient . Builder (). build () Ċ ) Ġ= Ġget Min 3 Boot n N des By Chain Id ( chain Id )?. let Ġ{ Ġnodes Ġ-> ĊĠĠĠ Ġget Min 3 RPC ( nodes , Ġok HttpClient ) Ċ } Ċ Ċ class ĠMIN 3 Transport ( private Ġval Ġboot Nodes : ĠList < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġok HttpClient : ĠOk HttpClient Ġ= ĠOk HttpClient . Builder (). build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmax _ retries : ĠInt Ġ= Ġ 4 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdebug : ĠBoolean Ġ= Ġfalse Ċ ) Ġ: ĠRPC Transport Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġnodes Ġ= Ġmutable Map Of < String , ĠInt >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġnodes . put All ( boot Nodes . associate With Ġ{ Ġ 0 Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcall ( payload : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġmaybe Update NodeList () ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest With Repeat ( payload ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest With Repeat ( payload : ĠString ): ĠString ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrepeat ( max _ retries ) Ġ{ Ġretry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġnodes . max By Ġ{ Ġit . value Ġ} ?. key !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" MIN 3 Transport > Ġrequest Ġpayload Ġ$ payload Ġ- Ġretry Ġ$ retry ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" MIN 3 Transport > Ġtrying Ġto Ġfetch Ġfrom Ġ$ url ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġbuild Request ( payload , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaybe Result Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecute Ġ= Ġok HttpClient . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse String Ġ= Ġexecute . body ()?. use Ġ{ Ġit . string () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" MIN 3 Transport > Ġresponse Ġcode : Ġ${ execute . code ()} Ġ- Ġbody : Ġ$ response String ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( execute . code () Ġ== Ġ 2 0 0 Ġ&& Ġresponse String ?. startsWith ("{ ") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" MIN 3 Transport > Ġexception Ġcode : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maybe Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes [ url ] Ġ= Ġ( nodes [ url ] Ġ?: Ġ 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmaybe Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnodes [ url ] Ġ= Ġ( nodes [ url ] Ġ?: Ġ 0 ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull Ġ// Ġno Ġresult Ġafter Ġ 5 Ġattempts ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmaybe Update NodeList () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( boot Nodes . size Ġ== Ġnodes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewNode URLs Ġ= Ġrequest With Repeat (""" {" jsonrpc ":" 2 . 0 "," method ":" in 3 _ node List "," params ":[ ]," id ": 1 } """) ?. let Ġ{ Ġjson Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin 3 node ListResponse Adapter . fromJson ( json )?. result ?. nodes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. map Ġ{ Ġit . url Ġ} ?. filter Ġ{ Ġ! nodes . containsKey ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Node URLs Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes . put All ( new Node URLs . associate With Ġ{ Ġ 0 Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Request ( body : ĠRequest Body , Ġurl : ĠString ) Ġ= ĠRequest . Builder (). url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. method (" POST ", Ġbody ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Request ( payload : ĠString , Ġurl : ĠString ) Ġ= Ġbuild Request ( RequestBody . create ( JSON MediaType , Ġpayload ), Ġurl ) Ċ }