package Ġfund . cyber . mark ets . connector . trade Ċ Ċ import Ġfund . cyber . mark ets . common . M ILL IS _ TO _ MIN UTES Ċ import Ġfund . cyber . mark ets . common . convert Ċ import Ġfund . cyber . mark ets . common . model . Token Ċ import Ġfund . cyber . mark ets . common . model . Tokens Pair Ċ import Ġfund . cyber . mark ets . common . model . Trade Ċ import Ġfund . cyber . mark ets . common . model . Trade Type Ċ import Ġfund . cyber . mark ets . connector . Connector Ċ import Ġfund . cyber . mark ets . connector . configuration . EX CHANGE _ TAG Ċ import Ġfund . cyber . mark ets . connector . configuration . N INE _ H UND RED _ NING TH Y _ FI VE _ PERCENT Ċ import Ġfund . cyber . mark ets . connector . configuration . NING TH Y _ FI VE _ PERCENT Ċ import Ġfund . cyber . mark ets . connector . configuration . TOKEN S _ PAIR _ TAG Ċ import Ġfund . cyber . mark ets . connector . configuration . TOKEN _ TAG Ċ import Ġfund . cyber . mark ets . connector . configuration . TRA DES _ TOPIC _ PREFIX Ċ import Ġfund . cyber . mark ets . connector . configuration . TRA DE _ COUNT _ BY _ TOKEN _ METRIC Ċ import Ġfund . cyber . mark ets . connector . configuration . TRA DE _ COUNT _ METRIC Ċ import Ġfund . cyber . mark ets . connector . configuration . TRA DE _ LAT ENCY _ METRIC Ċ import Ġfund . cyber . mark ets . connector . ether delta . Ether delta Contract Ċ import Ġfund . cyber . mark ets . connector . ether delta . Ether delta Token Ċ import Ġfund . cyber . mark ets . connector . ether delta . Ether delta Token Resolver Ċ import Ġio . micro meter . core . instrument . Meter Registry Ċ import Ġio . micro meter . core . instrument . Tags Ċ import Ġio . micro meter . core . instrument . Timer Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . kafka . core . Kafka Template Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġorg . web 3 j . protocol . Web 3 j Ċ import Ġorg . web 3 j . protocol . core . Default Block ParameterName Ċ import Ġorg . web 3 j . protocol . core . methods . response . Eth Block Ċ import Ġorg . web 3 j . tx . Readonly Transaction Manager Ċ import Ġorg . web 3 j . tx . gas . Contract Gas Provider Ċ import Ġorg . web 3 j . tx . gas . Default Gas Provider Ċ import Ġorg . web 3 j . utils . Numeric Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġjava . math . Round ingMode Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ private Ġconst Ġval ĠE THER DELTA _ CONTRACT _ ADDRESS Ġ= Ġ" 0 x 8 d 1 2 a 1 9 7 cb 0 0 d 4 7 4 7 a 1 fe 0 3 3 9 5 0 9 5 ce 2 a 5 cc 6 8 1 9 " Ċ private Ġconst Ġval ĠETH _ SYMBOL Ġ= Ġ" ETH " Ċ private Ġconst Ġval ĠE THER DELTA _ CONNECTION _ TIMEOUT _ MS : ĠLong Ġ= Ġ 5 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 Ċ Ċ @ Component Ċ class ĠE ther delta Trade Connector ( ĊĠĠĠ Ġprivate Ġval Ġweb 3 j : ĠWeb 3 j , ĊĠĠĠ Ġprivate Ġval Ġether delta Token Resolver : ĠE ther delta Token Resolver , ĊĠĠĠ Ġprivate Ġval Ġkafka Template : ĠKafka Template < String , ĠAny >, ĊĠĠĠ Ġprivate Ġval Ġmonitoring : ĠMeter Registry Ċ ) Ġ: ĠConnector Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Ether delta Trade Connector :: class . java ) !! ĊĊĠĠĠ Ġprivate Ġval Ġexchange Name Ġ= Ġ" ETHER DELTA " ĊĠĠĠ Ġprivate Ġval Ġtr ades Topic Name Ġby Ġlazy Ġ{ ĠTR A DES _ TOPIC _ PREFIX Ġ+ Ġexchange Name Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġether delta Contract : ĠE ther delta Contract ĊĠĠĠ Ġprivate Ġvar Ġlast Trade Timestamp : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġgas Provider : ĠContract Gas Provider Ġ= ĠDefault Gas Provider () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect Ġto Ġether delta Ġand Ġparity Ġtoken Ġregistry Ġsmart Ġcontracts Ġusing Ġweb 3 j ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Connecting Ġto Ġ$ exchange Name Ġexchange ") ĊĊĠĠĠĠĠĠĠ Ġval Ġether delta Transaction Manager Ġ= ĠReadonly Transaction Manager ( web 3 j , ĠE THER DELTA _ CONTRACT _ ADDRESS ) ĊĠĠĠĠĠĠĠ Ġether delta Contract Ġ= ĠE ther delta Contract . load ( ETHER DELTA _ CONTRACT _ ADDRESS , Ġweb 3 j , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġether delta Transaction Manager , Ġgas Provider . get Gas Price ( null ), Ġgas Provider . get Gas Limit ( null )) ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Connected Ġto Ġ$ exchange Name Ġexchange ") ĊĠĠĠĠĠĠĠ Ġupdate Tokens Pairs () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Dis con ected Ġfrom Ġ$ exchange Name Ġexchange ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Tokens Pairs () Ġ{ ĊĠĠĠĠĠĠĠ Ġether delta Token Resolver . update Tokens Pairs () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Alive (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Timestamp Ġ= ĠDate (). time ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlast Trade Timestamp Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Timestamp Ġ- Ġlast Trade Timestamp !! Ġ< ĠE THER DELTA _ CONNECTION _ TIMEOUT _ MS ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubscribe Ġto Ġnew Ġtr ades Ġfrom Ġether delta Ġusing Ġsmart Ġcontract . ĊĠĠĠĠ Ġ* ĠFor Ġfirst , Ġcheck Ġif Ġthere Ġare Ġtokens Ġwith Ġaddresses Ġfrom Ġthe Ġtrade Event Ġin Ġour Ġmap Ġof Ġtokens . ĊĠĠĠĠ Ġ* ĠIf Ġboth Ġtokens Ġare Ġpresent Ġin Ġour Ġdictionary , Ġthen Ġwe Ġconvert ĠTrade Event Ġfrom Ġsmart Ġcontract Ġto Ġa ĠTrade Ġobject ĊĠĠĠĠ Ġ* Ġthat Ġwe Ġsend Ġto Ġkafka Ġtopic . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġsubscribe () Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Sub scri bing Ġfor Ġtr ades Ġfrom Ġ$ exchange Name Ġexchange ") ĊĊĠĠĠĠĠĠĠ Ġval Ġexchange Tag Ġ= ĠTags . of ( EX CHANGE _ TAG , Ġexchange Name ) ĊĠĠĠĠĠĠĠ Ġval Ġtrade Latency Monitor Ġ= ĠTimer . builder ( TRA DE _ LAT ENCY _ METRIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. tags ( exchange Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. publish Percent iles ( NING TH Y _ FI VE _ PERCENT , ĠN INE _ H UND RED _ NING TH Y _ FI VE _ PERCENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register ( monitoring ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġblock Ġ= Ġweb 3 j . eth Get Block By Number ( Default Block ParameterName . LATE ST , Ġfalse ). send () ĊĊĠĠĠĠĠĠĠ Ġether delta Contract ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trade Event Observable ( Default Block ParameterName . LATE ST , ĠDefault Block ParameterName . LATE ST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe { Ġtrade Event Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( block . block . hash Ġ!= Ġtrade Event . log !!. block Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= Ġweb 3 j . eth Get Block By Hash ( trade Event . log !!. block Hash !! , Ġfalse ). send () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrade Ġ= Ġconvert Trade ( trade Event , Ġblock ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trade Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexchange Pair Tag Ġ= Ġexchange Tag . and ( Tags . of ( TOKEN S _ PAIR _ TAG , Ġtrade . pair . base Ġ+ Ġ"_" Ġ+ Ġtrade . pair . quote )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Token Tag Ġ= Ġexchange Tag . and ( Tags . of ( TOKEN _ TAG , Ġtrade . pair . base )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquote Token Tag Ġ= Ġexchange Tag . and ( Tags . of ( TOKEN _ TAG , Ġtrade . pair . quote )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrade Count Monitor Ġ= Ġmonitoring . counter ( TRA DE _ COUNT _ METRIC , Ġexchange Pair Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Token Monitor Ġ= Ġmonitoring . counter ( TRA DE _ COUNT _ BY _ TOKEN _ METRIC , Ġbase Token Tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquote Token Monitor Ġ= Ġmonitoring . counter ( TRA DE _ COUNT _ BY _ TOKEN _ METRIC , Ġquote Token Tag ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrade Latency Monitor . record ( System . currentTimeMillis () Ġ- Ġtrade . timestamp , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrade Count Monitor . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Token Monitor . increment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquote Token Monitor . increment () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkafka Template . send ( tr ades Topic Name , Ġtrade ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Trade Ġfrom Ġ$ exchange Name : Ġ$ trade ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert ĠTrade Event Ġfrom Ġsmart Ġcontract Ġto Ġa ĠTrade Ġobject ĊĠĠĠĠ Ġ* ĠFor Ġfirst Ġconvert Ġamounts Ġfrom ĠBigInteger Ġtype Ġto ĠBigDecimal Ġusing ĊĠĠĠĠ Ġ* Ġ@ see ĠE ther delta Token . base Ġand Ġ@ see ĠE ther delta Token . decimals ĊĠĠĠĠ Ġ* ĠThen Ġget Ġa Ġtimestamp Ġfrom Ġe thereum Ġblock Ġand Ġcreate Ġa Ġtrade Ġobject ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtrade Event Ġa Ġtrade Ġfrom Ġether delta Ġsmart Ġcontract ĊĠĠĠĠ Ġ* Ġ@ param Ġblock Ġa Ġe thereum Ġblock Ġwhich Ġ@ param Ġtrade Event Ġwas Ġm ined ĊĠĠĠĠ Ġ* Ġ@ return Ġtrade Ġobject ĊĠĠĠĠ Ġ* Ġ@ see ĠTrade ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconvert Trade ( trade Event : ĠE ther delta Contract . Trade Event Response , Ġblock : ĠE th Block ): ĠTrade ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Get Ġ= Ġether delta Token Resolver . resolve Token ( trade Event . token Get ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken Give Ġ= Ġether delta Token Resolver . resolve Token ( trade Event . token Give ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( token Get Ġ== Ġnull Ġ|| Ġtoken Give Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġamount Get Ġ= Ġif Ġ( token Get . base Ġ> ĠBigInteger . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( trade Event . amount Get ). divide ( BigDecimal ( token Get . base )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( trade Event . amount Get ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġamount Give Ġ= Ġif Ġ( token Give . base Ġ> ĠBigInteger . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( trade Event . amount Give ). divide ( BigDecimal ( token Give . base )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( trade Event . amount Give ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( amount Get Ġ== ĠBigDecimal . ZERO Ġ|| Ġamount Give Ġ== ĠBigDecimal . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= ĠNumeric . to BigInt ( block . block . timestamp Raw ). multiply ( BigInteger . valueOf ( 1 0 0 0 )). to Long () ĊĠĠĠĠĠĠĠ Ġlast Trade Timestamp Ġ= Ġtimestamp ĊĊĠĠĠĠĠĠĠ Ġif Ġ( token Give . symbol Ġ== ĠETH _ SYMBOL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprice Ġ= Ġamount Give . divide ( amount Get , Ġtoken Give . decimals , ĠRound ingMode . HALF _ E VEN ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrade ( exchange Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTokens Pair ( token Get . symbol , Ġtoken Give . symbol ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrade Type . BID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġconvert ĠM ILL IS _ TO _ MIN UTES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrade Event . log !!. transaction Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Give , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprice Ġ= Ġamount Get . divide ( amount Give , Ġtoken Get . decimals , ĠRound ingMode . HALF _ E VEN ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrade ( exchange Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTokens Pair ( token Give . symbol , Ġtoken Get . symbol ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrade Type . ASK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġconvert ĠM ILL IS _ TO _ MIN UTES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrade Event . log !!. transaction Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Give , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Get , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Tokens Pairs (): ĠSet < Tokens Pair > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpairs Ġ= Ġmutable Set Of < Tokens Pair >() ĊĊĠĠĠĠĠĠĠ Ġether delta Token Resolver . exchange Tokens Pairs . forEach Ġ{ Ġ_, Ġether delta Token Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpairs . add ( Tokens Pair ( ether delta Token . symbol , ĠETH _ SYMBOL )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpairs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Tokens (): ĠSet < Token > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġether delta Token Resolver . trading Tokens ĊĠĠĠ Ġ} Ċ Ċ }