/* Ċ Ġ* ĠCopyright ĠD 3 ĠLed ger , ĠInc . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . d 3 . eth . side chain Ċ Ċ import Ġcom . d 3 . commons . side chain . Chain Handler Ċ import Ġcom . d 3 . commons . side chain . Side Chain Event Ċ import Ġcom . d 3 . eth . provider .* Ċ import Ġcom . d 3 . eth . side chain . util . Deploy Helper Ċ import Ġcom . github . kit tin un f . result . fan out Ċ import Ġmu . K Logging Ċ import Ġorg . web 3 j . protocol . Web 3 j Ċ import Ġorg . web 3 j . protocol . core . methods . response . Eth Block Ċ import Ġorg . web 3 j . protocol . core . methods . response . Transaction Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof Ġ[ Chain Handler ] Ġfor ĠEthereum Ġside Ġchain . Ċ Ġ* ĠExtract Ġinteresting Ġtransactions Ġfrom ĠEthereum Ġblock . Ċ Ġ* ĠSupports Ġtwo Ġkinds Ġof Ġdeposit Ġtransfers : Ċ Ġ* Ġ 1 ) Ġfrom Ġany Ġaddress Ġto Ġ` relay ` Ġaddress Ċ Ġ* Ġ 2 ) Ġfrom Ġ` wallet ` Ġaddress Ġto Ġmaster Ġaddress Ċ Ġ* Ġ@ param Ġweb 3 Ġ- Ġnot ary . endpoint Ġof ĠEthereum Ġclient Ċ Ġ* Ġ@ param Ġeth Wallet Provider Ġ- Ġprovider Ġof Ġobservable Ġwallet s Ċ Ġ* Ġ@ param Ġeth Relay Provider Ġ- Ġprovider Ġof Ġobservable Ġrelay s Ċ Ġ* Ġ@ param Ġeth Tokens Provider Ġ- Ġprovider Ġof Ġobservable Ġtokens Ċ Ġ*/ Ċ class ĠE th Chain Handler ( ĊĠĠĠ Ġval Ġweb 3 : ĠWeb 3 j , ĊĠĠĠ Ġval Ġmaster Add res : ĠString , ĊĠĠĠ Ġval Ġeth Wallet Provider : ĠE th Address Provider , ĊĠĠĠ Ġval Ġeth Relay Provider : ĠE th Address Provider , ĊĠĠĠ Ġval Ġeth Tokens Provider : ĠE th Tokens Provider Ċ ) Ġ: ĊĠĠĠ ĠChain Handler < Eth Block > Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Initialization Ġof ĠE th Chain Handler Ġwith Ġmaster Ġ$ master Add res " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess ĠEthereum ĠERC 2 0 Ġtokens ĊĠĠĠĠ Ġ* Ġ@ param Ġtx Ġtransaction Ġin Ġblock ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġnot ary Ġevents Ġon ĠERC 2 0 Ġdeposit ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle E rc 2 0 ( ĊĠĠĠĠĠĠĠ Ġtx : ĠTransaction , ĊĠĠĠĠĠĠĠ Ġtime : ĠBigInteger , ĊĠĠĠĠĠĠĠ Ġwallet s : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġrelay s : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġtoken Name : ĠString , ĊĠĠĠĠĠĠĠ Ġis I ro ha An ch ored : ĠBoolean ĊĠĠĠ Ġ): ĠList < Side Chain Event . Primary Block Chain Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Handle ĠERC 2 0 Ġtx Ġ${ tx . hash }" Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġreceipt Ġthat Ġcontains Ġdata Ġabout Ġsolidity Ġfunction Ġexecution ĊĠĠĠĠĠĠĠ Ġval Ġreceipt Ġ= Ġweb 3 . eth Get Transaction Receipt ( tx . hash ). send () ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġtx Ġis Ġcommitted Ġsuccessfully ĊĠĠĠĠĠĠĠ Ġif Ġ( receipt . transaction Receipt . get (). is StatusOK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreceipt . transaction Receipt . get (). logs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfilter Ġout Ġtransfer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġfirst Ġtopic Ġis Ġa Ġhashed Ġrepresentation Ġof Ġa Ġtransfer Ġsignature Ġcall Ġ( the Ġsc ary Ġstring ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . topics [ 0 ] Ġ== Ġ" 0 xdd f 2 5 2 ad 1 be 2 c 8 9 b 6 9 c 2 b 0 6 8 fc 3 7 8 daa 9 5 2 ba 7 f 1 6 3 c 4 a 1 1 6 2 8 f 5 5 a 4 df 5 2 3 b 3 ef " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġamount Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( BigInteger ( it . data . drop ( 2 ), Ġ 1 6 ). compareTo ( BigInteger . ZERO ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Transaction Ġ${ tx . hash } Ġfrom ĠEthereum Ġwith Ġ 0 ĠERC 2 0 Ġamount " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsecond Ġand Ġthird Ġtopics Ġare Ġaddresses Ġfrom Ġand Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġ" 0 x " Ġ+ Ġit . topics [ 1 ]. drop ( 2 6 ). toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġ" 0 x " Ġ+ Ġit . topics [ 2 ]. drop ( 2 6 ). toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtransfer Ġfrom Ġwallet Ġto Ġmaster Ġor Ġdeposit Ġto Ġrelay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( to Ġ== Ġmaster Add res Ġ&& Ġwallet s . containsKey ( from )) Ġ|| Ġ( relay s . containsKey ( to )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeth Tokens Provider . getToken Precision ( token Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġprecision Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsecond Ġand Ġthird Ġtopics Ġare Ġaddresses Ġfrom Ġand Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġ" 0 x " Ġ+ Ġit . topics [ 1 ]. drop ( 2 6 ). toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġ" 0 x " Ġ+ Ġit . topics [ 2 ]. drop ( 2 6 ). toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġamount Ġof Ġtransfer Ġis Ġstored Ġin Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġamount Ġ= ĠBigInteger ( it . data . drop ( 2 ), Ġ 1 6 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar ĠclientId : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Ġ== Ġmaster Add res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId Ġ= Ġwallet s [ from ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId Ġ= Ġrelay s [ to ] !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is I ro ha An ch ored ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide Chain Event . Primary Block Chain Event . I ro ha An ch ored On Primary Chain Deposit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( amount , Ġprecision ). to Plain String (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide Chain Event . Primary Block Chain Event . Chain An ch ored On Primary Chain Deposit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( amount , Ġprecision ). to Plain String (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġthrow Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProcess ĠE ther Ġdeposit ĊĠĠĠĠ Ġ* Ġ@ param Ġtx Ġtransaction Ġin Ġblock ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġof Ġnot ary Ġevents Ġon ĠE ther Ġdeposit ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Ether ( ĊĠĠĠĠĠĠĠ Ġtx : ĠTransaction , ĊĠĠĠĠĠĠĠ Ġtime : ĠBigInteger , ĊĠĠĠĠĠĠĠ ĠclientId : ĠString ĊĠĠĠ Ġ): ĠList < Side Chain Event . Primary Block Chain Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Handle ĠEthereum Ġtx Ġ${ tx . hash }" Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreceipt Ġ= Ġweb 3 . eth Get Transaction Receipt ( tx . hash ). send () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! receipt . transaction Receipt . get (). is StatusOK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Transaction Ġ${ tx . hash } Ġfrom ĠEthereum Ġhas ĠFAIL Ġstatus " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( tx . value Ġ<= ĠBigInteger . ZERO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Transaction Ġ${ tx . hash } Ġfrom ĠEthereum Ġwith Ġ 0 ĠETH Ġamount " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġtx Ġamount Ġ> Ġ 0 Ġand Ġis Ġcommitted Ġsuccessfully ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSide Chain Event . Primary Block Chain Event . Chain An ch ored On Primary Chain Deposit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġnon - existent Ġkeys Ġwere Ġfiltered Ġout Ġin Ġparse Block ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠclientId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ ETH _ NAME #$ ETH _ DOMAIN ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal ( tx . value , ĠETH _ PREC ISION ). to Plain String (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . from ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse Ġ[ Eth Block ] Ġfor Ġtransactions . ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof Ġtrans ation Ġwe Ġare Ġinterested Ġin ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġparse Block ( block : ĠE th Block ): ĠList < Side Chain Event . Primary Block Chain Event > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" E thereum Ġchain Ġhandler Ġfor Ġblock Ġ${ block . block . number }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġaddresses Ġ= Ġeth Wallet Provider . get Addresses (). fan out Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeth Relay Provider . get Addresses () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġeth Tokens Provider . get Eth An ch ored Tokens (). fan out Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeth Tokens Provider . get I ro ha An ch ored Tokens () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaddresses . fan out Ġ{ Ġtokens Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ( addresses , Ġtokens ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( wallet s , Ġrelay s ) Ġ= Ġaddresses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( eth An ch ored Tokens , Ġi ro ha An ch ored Tokens ) Ġ= Ġtokens ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠE th Ġtime Ġin Ġseconds , Ġconvert Ġot Ġmilliseconds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġblock . block . timestamp . multiply ( BigInteger . valueOf ( 1 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock . block . transactions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . get () Ġas ĠTransaction Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wallet s . containsKey ( it . from ) Ġ&& Ġit . to Ġ== Ġmaster Add res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġwallet s [ it . from ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Deposit Ġfrom Ġwallet Ġ${ it . from } Ġ($ account ) Ġto Ġmaster Ġ${ master Add res }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ether ( it , Ġtime , Ġaccount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( relay s . containsKey ( it . to )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġrelay s [ it . to ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Deposit Ġto Ġrelay Ġ${ it . to } Ġ($ account )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ether ( it , Ġtime , Ġaccount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( eth An ch ored Tokens . containsKey ( it . to )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle E rc 2 0 ( it , Ġtime , Ġwallet s , Ġrelay s , Ġeth An ch ored Tokens [ it . to ] !! , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( iro ha An ch ored Tokens . containsKey ( it . to )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle E rc 2 0 ( it , Ġtime , Ġwallet s , Ġrelay s , Ġi ro ha An ch ored Tokens [ it . to ] !! , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Cannot Ġparse Ġblock ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogger ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ċ } Ċ