/* Ċ Ġ* ĠCopyright ĠD 3 ĠLed ger , ĠInc . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . d 3 . eth . withdraw al . consumer Ċ Ċ import Ġcom . d 3 . commons . model . D 3 ErrorException Ċ import Ġcom . d 3 . eth . side chain . util . Deploy Helper Ċ import Ġcom . d 3 . eth . vac uum . Relay Vac uum Config Ċ import Ġcom . d 3 . eth . vac uum . execute Vac uum Ċ import Ġcom . d 3 . eth . withdraw al . withdraw al service . WITH DRAW AL _ OPERATION Ċ import Ġcom . d 3 . eth . withdraw al . withdraw al service . Withdraw al Service Output Event Ċ import Ġcontract . Relay Ċ import Ġintegration . eth . config . E thereum Config Ċ import Ġintegration . eth . config . E thereum Password s Ċ import Ġmu . K Logging Ċ import Ġorg . web 3 j . protocol . core . methods . response . Transaction Receipt Ċ import Ġorg . web 3 j . utils . Numeric Ċ import Ġjava . math . BigInteger Ċ Ċ class ĠE th Consumer ( ĊĠĠĠ Ġe thereum Config : ĠEthereum Config , ĊĠĠĠ Ġe thereum Password s : ĠEthereum Password s , ĊĠĠĠ Ġprivate Ġval Ġrelay Vac uum Config : ĠRelay Vac uum Config Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdeploy Helper Ġ= ĠDeploy Helper ( ethereum Config , Ġe thereum Password s ) ĊĊĠĠĠ Ġfun Ġconsume ( event : ĠWith draw al Service Output Event ): ĠTransaction Receipt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Cons umed Ġeth Ġevent Ġ$ event " Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ! is ĠWith draw al Service Output Event . Eth Refund ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unsupported Ġoutput Ġevent Ġtype ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Got Ġproof :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" account Ġ${ event . proof . account }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" amount Ġ${ event . proof . amount }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" token Ġ${ event . proof . token Contract Address }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" iro ha Ġhash Ġ${ event . proof . iro ha Hash }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" relay Ġ${ event . proof . relay }\ n " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrelay Ġ= Ġdeploy Helper . load Relay Contract ( event . proof . relay ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( event . is I ro ha An ch ored ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw I ro ha An ch ored ( relay , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw E thereum An ch ored ( relay , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠM int Ġin ĠEthereum Ġtokens Ġthat Ġshould Ġbe Ġwithdraw en . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwithdraw I ro ha An ch ored ( ĊĠĠĠĠĠĠĠ Ġrelay : ĠRelay , ĊĠĠĠĠĠĠĠ Ġevent : ĠWith draw al Service Output Event . Eth Refund ĊĠĠĠ Ġ): ĠTransaction Receipt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Withdraw ĠI ro ha Ġan ch ored " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelay . mint Tokens By Peers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . token Contract Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger ( event . proof . amount ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . account , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNumeric . hex StringTo ByteArray ( event . proof . iro ha Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . v , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . r , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay . contract Address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). send () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Web 3 j Ġexception Ġencountered ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall ĠRelay Ġmethod Ġwithdraw Ġand Ġpre form Ġvac uum Ġif Ġneeded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwithdraw E thereum An ch ored ( ĊĠĠĠĠĠĠĠ Ġrelay : ĠRelay , ĊĠĠĠĠĠĠĠ Ġevent : ĠWith draw al Service Output Event . Eth Refund ĊĠĠĠ Ġ): ĠTransaction Receipt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Withdraw ĠEthereum Ġan ch ored " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġfirst Ġwithdraw Ġcall ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġwithdraw ( relay , Ġevent ) ĊĠĠĠĠĠĠĠ Ġ// ĠHere Ġworks Ġnext Ġlogic : ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġfirst Ġcall Ġreturns Ġlogs Ġwith Ġsize Ġ 2 Ġthen Ġcheck Ġif Ġa Ġdestination Ġaddress Ġis Ġequal Ġto Ġthe Ġaddress ĊĠĠĠĠĠĠĠ Ġ// Ġfrom Ġthe Ġsecond Ġlog ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġits Ġtrue Ġthen Ġwe Ġstart Ġvac uum Ġprocess ĊĠĠĠĠĠĠĠ Ġval Ġlogs Ġ= Ġcall ?. logs ĊĠĠĠĠĠĠĠ Ġif Ġ( logs Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( log Ġin Ġlogs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( log . topics . contains (" 0 x 3 3 d 1 e 0 3 0 1 8 4 6 de 1 4 9 6 df 7 3 b 1 da 3 d 1 7 c 8 5 b 7 2 6 6 dd 8 3 2 d 2 1 e 1 0 ff 2 1 a 1 f 1 4 3 ef 2 9 3 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġevent . proof . account . toLowerCase () Ġ== Ġ" 0 x " Ġ+ Ġlog . data . toLowerCase (). sub Sequence ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 3 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Vac uum ( relay Vac uum Config ). fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwithdraw ( relay , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠD 3 ErrorException . fatal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailed Operation Ġ= ĠWITH DRAW AL _ OPERATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Cannot Ġexecute Ġvac uum ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Cause Ġ= Ġex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcall ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġrelay Ġmethod Ġto Ġwithdraw ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwithdraw ( relay : ĠRelay , Ġevent : ĠWith draw al Service Output Event . Eth Refund ): ĠTransaction Receipt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelay . withdraw ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . token Contract Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger ( event . proof . amount ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . account , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNumeric . hex StringTo ByteArray ( event . proof . iro ha Hash ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . v , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . r , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . proof . s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelay . contract Address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). send () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Web 3 j Ġexception Ġencountered ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogger ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ċ } Ċ