package Ġio . pro venance . invoice . services Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . flatMap Ċ import Ġcos mos . auth . v 1 beta 1 . Auth . Base Account Ċ import Ġcos mos . base . ab ci . v 1 beta 1 . Ab ci . Tx Response Ċ import Ġcos mos . tx . v 1 beta 1 . Service OuterClass . Broadcast Mode Ċ import Ġcos mos . tx . v 1 beta 1 . Tx OuterClass . Tx Body Ċ import Ġcos mw asm . wasm . v 1 . Tx . Msg Execute Contract Ċ import Ġio . pro venance . client . grpc . Base Req Ċ import Ġio . pro venance . client . grpc . Base Req Signer Ċ import Ġio . pro venance . client . grpc . Gas Estimate Ċ import Ġio . pro venance . client . grpc . Pb Client Ċ import Ġio . pro venance . client . protobuf . extensions . getBase Account Ċ import Ġio . pro venance . invoice . config . pro venance . Object Store Ċ import Ġio . pro venance . invoice . config . pro venance . Provenance Properties Ċ import Ġio . pro venance . invoice . domain . pro ven anc et x . Oracle Approval Ċ import Ġio . pro venance . invoice . util . extension . check I Ċ import Ġio . pro venance . invoice . util . extension . checkNotNull I Ċ import Ġio . pro venance . invoice . util . extension . to Proto Any I Ċ import Ġio . pro venance . invoice . util . extension . wrap List I Ċ import Ġio . pro venance . invoice . util . pro venance . Account Signer Ċ import Ġio . pro venance . name . v 1 . Query Resolve Request Ċ import Ġmu . K Logging Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . util . UUID Ċ Ċ @ Service Ċ class ĠPro venance Query Service ( ĊĠĠĠ Ġprivate Ġval Ġobject Store : ĠObject Store , ĊĠĠĠ Ġprivate Ġval Ġpb Client : ĠP b Client , ĊĠĠĠ Ġprivate Ġval Ġpro venance Properties : ĠPro venance Properties , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ: ĠK Logging () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubmit s Ġa Ġmessage Ġto Ġthe Ġpay able - asset - smart - contract Ġnotify ing Ġthat Ġthe Ġoracle Ġaccount Ġ( the Ġaddress Ġused Ġin ĊĠĠĠĠ Ġ* Ġthe Ġproperties Ġof Ġthis Ġapplication ) Ġhas Ġapproved Ġthe Ġinvoice Ġfor Ġpayment . Ġ ĠWrap s Ġan Ġerrors Ġencountered Ġin Ġan ĊĠĠĠĠ Ġ* ĠEither Ġthat Ġincludes Ġa Ġspecial Ġexception Ġof Ġtype ĠOracle Approval Exception . Ġ ĠThis Ġexception , Ġif Ġencountered , Ġwill ĊĠĠĠĠ Ġ* Ġcontain Ġthe Ġunderlying Ġissue Ġas Ġthe Ġcause Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsubmit Oracle Approval ( ĊĠĠĠĠĠĠĠ Ġinvoice Uuid : ĠUUID , ĊĠĠĠĠĠĠĠ Ġlog Prefix : ĠString Ġ= Ġ" OR AC LE ĠAP PRO VAL Ġ[$ invoice Uuid ] :" ĊĠĠĠ Ġ): ĠEither < Oracle Approval Exception , ĠTx Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info ("$ log Prefix ĠMark ing Ġoracle Ġapproval Ġon Ġthe Ġchain ") ĊĠĠĠĠĠĠĠ Ġreturn Ġget Contract Address ( log Prefix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġcontract Address Ġ-> Ġget Oracle Account ( log Prefix ). map Ġ{ Ġoracle Account Ġ-> Ġcontract Address Ġto Ġoracle Account Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ( contract Address , Ġoracle Account ) Ġ-> Ġget Base Req ( log Prefix , Ġinvoice Uuid , Ġcontract Address , Ġoracle Account ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġbase Req Ġ-> Ġget Gas Estimate ( log Prefix , Ġbase Req ). map Ġ{ Ġgas Estimate Ġ-> Ġbase Req Ġto Ġgas Estimate Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ( base Req , Ġgas Estimate ) Ġ-> Ġbroadcast Oracle Approval Tx ( log Prefix , Ġbase Req , Ġgas Estimate ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġfetch Ġthe Ġcontract Ġaddress Ġfrom Ġthe Ġname Client Ġby Ġpassing Ġthe Ġcontract Ġname . Ġ ĠOn Ġa Ġfailure , Ġwraps Ġthe ĊĠĠĠĠ Ġ* Ġresponse Ġerror Ġin Ġan ĠOracle Approval Exception Ġfor Ġupstream Ġhandling . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Contract Address ( log Prefix : ĠString ): ĠEither < Oracle Approval Exception , ĠString > Ġ= ĠEither ĊĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġpb Client . name Client . resolve ( Query Resolve Request . newBuilder (). setName ( pro venance Properties . pay ables Contract Name ). build ()). address Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Left To Oracle Failure ("$ log Prefix ĠFailed Ġto Ġresolve Ġcontract Ġby Ġname Ġ[ ${ pro venance Properties . pay ables Contract Name } ]. ĠMark ing Ġinvoice Ġwith Ġapproval Ġfailure ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġfetch Ġthe Ġoracle Ġaccount Ġas Ġa ĠBase Account Ġby Ġquerying Ġthe ĠP b Client Ġwith Ġthe Ġoracle 's ĠBe ch 3 2 Ġaddress . ĊĠĠĠĠ Ġ* ĠOn Ġa Ġfailure , Ġwraps Ġthe Ġresponse Ġerror Ġin Ġan ĠOracle Approval Exception Ġfor Ġupstream Ġhandling . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Oracle Account ( log Prefix : ĠString ): ĠEither < Oracle Approval Exception , ĠBase Account > Ġ= ĠEither ĊĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġpb Client . auth Client . getBase Account ( object Store . oracle Account Detail . be ch 3 2 Address ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Left To Oracle Failure ("$ log Prefix ĠFailed Ġto Ġfetch Ġbase Ġaccount Ġfor Ġoracle Ġaddress Ġ[ ${ object Store . oracle Account Detail . be ch 3 2 Address } ]. ĠMark ing Ġinvoice Ġwith Ġapproval Ġfailure ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġconstruct Ġa ĠBase Req Ġfrom Ġthe Ġprovided Ġdetails . Ġ ĠOn Ġa Ġfailure , Ġwraps Ġthe Ġresponse Ġerror Ġin Ġan ĊĠĠĠĠ Ġ* ĠOracle Approval Exception Ġfor Ġupstream Ġhandling . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Base Req ( ĊĠĠĠĠĠĠĠ Ġlog Prefix : ĠString , ĊĠĠĠĠĠĠĠ Ġinvoice Uuid : ĠUUID , ĊĠĠĠĠĠĠĠ Ġcontract Address : ĠString , ĊĠĠĠĠĠĠĠ Ġoracle Account : ĠBase Account ĊĠĠĠ Ġ): ĠEither < Oracle Approval Exception , ĠBase Req > Ġ= ĠEither . catch Ġ{ ĊĠĠĠĠĠĠĠ ĠBase Req ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign ers Ġ= ĠBase Req Signer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigner Ġ= ĠAccount Signer . from Account Detail ( object Store . oracle Account Detail ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Ġ= Ġoracle Account , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). wrap List I (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= ĠTx Body . newBuilder (). add Messages ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMsg Execute Contract . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Msg ( Oracle Approval . for Uuid ( invoice Uuid ). to Base 6 4 Msg ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Contract ( contract Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sender ( object Store . oracle Account Detail . be ch 3 2 Address ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Proto Any I () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). set Memo (" Oracle Ġsignature "). build (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchain Id Ġ= Ġpro venance Properties . chain Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgas Adjustment Ġ= Ġ 2 . 0 , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}. map Left To Oracle Failure ("$ log Prefix ĠFailed Ġto Ġgenerate ĠBase Req Ġfor Ġoracle Ġapproval Ġtransaction ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġrun Ġa Ġtx Ġgas Ġestimation Ġon Ġthe Ġprovided ĠBase Req . Ġ ĠOn Ġa Ġfailure Ġ( which Ġindicates Ġthat Ġthe Ġcontract ĊĠĠĠĠ Ġ* Ġwill Ġnot Ġaccept Ġthis Ġtransaction Ġdue Ġto Ġan Ġerror , Ġor Ġthe Ġblockchain Ġis Ġhaving Ġissues ) Ġthe Ġresponse Ġerror Ġis ĊĠĠĠĠ Ġ* Ġwrapped Ġin Ġan ĠOracle Approval Exception Ġfor Ġupstream Ġhandling . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Gas Estimate ( log Prefix : ĠString , Ġbase Req : ĠBase Req ): ĠEither < Oracle Approval Exception , ĠG as Estimate > Ġ= ĠEither ĊĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġpb Client . estimate Tx ( base Req ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Left To Oracle Failure ("$ log Prefix ĠFailed Ġto Ġestimate Ġgas Ġfor Ġoracle Ġapproval . ĠMark ing Ġinvoice Ġwith Ġapproval Ġfailure ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġbroadcast Ġa Ġcompleted Ġtransaction Ġfrom Ġthe Ġprovided ĠBase Req Ġand ĠG as Estimate . Ġ ĠOn Ġa Ġfailure , Ġthe ĊĠĠĠĠ Ġ* Ġresponse Ġerror Ġis Ġwrapped Ġin Ġan ĠOracle Approval Exception Ġfor Ġupstream Ġhandling . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbroadcast Oracle Approval Tx ( log Prefix : ĠString , Ġbase Req : ĠBase Req , Ġgas Estimate : ĠG as Estimate ): ĠEither < Oracle Approval Exception , ĠTx Response > Ġ= ĠEither ĊĠĠĠĠĠĠĠ Ġ. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpb Client . broadcast Tx ( base Req Ġ= Ġbase Req , Ġgas Estimate Ġ= Ġgas Estimate , Ġmode Ġ= ĠBroadcast Mode . BRO ADCAST _ MODE _ BLOCK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. checkNotNull I Ġ{ Ġ"$ log Prefix ĠNull Ġresponse Ġreceived Ġfrom Ġoracle Ġapproval Ġtransaction " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. tx Response ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. check I ( predicate Ġ= Ġ{ Ġit . code Ġ== Ġ 0 Ġ}, Ġlazy Message Ġ= Ġ{ Ġ"$ log Prefix ĠOracle Ġapproval Ġtransaction Ġfailed . ĠMark ing Ġinvoice Ġas Ġfailed " Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Left To Oracle Failure () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġan Ġeither Ġderived Ġvia Ġan ĠEither . catch {} Ġinto Ġa Ġnew ĠEither Ġthat Ġwraps Ġthe Ġresulting ĠThrowable Ġin Ġan ĊĠĠĠĠ Ġ* ĠOracle Approval Exception . Ġ ĠDer ives Ġthe Ġmessage Ġfor Ġthe Ġexception Ġfrom Ġthe Ġwrapped Ġthrowable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T : ĠAny > ĠEither < Throwable , ĠT >. map Left To Oracle Failure (): ĠEither < Oracle Approval Exception , ĠT > Ġ= Ġmap Left Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ ĠOracle Approval Exception ( t . message Ġ?: Ġ" Oracle Ġapproval Ġfailed ", Ġt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġan Ġeither Ġderived Ġvia Ġan ĠEither . catch {} Ġinto Ġa Ġnew ĠEither Ġthat Ġwraps Ġthe Ġresulting ĠThrowable Ġin Ġan ĊĠĠĠĠ Ġ* ĠOracle Approval Exception . Ġ ĠThe Ġoriginal ĠThrowable 's Ġmessage Ġwill Ġlive Ġwithin Ġthe Ġcause Ġvalue Ġof Ġthe Ġwrapper ĊĠĠĠĠ Ġ* Ġexception . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġ< T : ĠAny > ĠEither < Throwable , ĠT >. map Left To Oracle Failure ( failure Message : ĠString ): ĠEither < Oracle Approval Exception , ĠT > Ġ= Ġmap Left Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠ ĠOracle Approval Exception ( failure Message , Ġt ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġcustom Ġexception Ġthat Ġindicates Ġthat Ġthe Ġissue Ġencountered Ġis Ġdue Ġto Ġthe Ġa Ġfailure Ġin Ġthe Ġoracle Ġapproval Ċ Ġ* Ġprocess Ġfor Ġin voices . Ċ Ġ*/ Ċ class ĠOracle Approval Exception ( message : ĠString , Ġcause : ĠThrowable ) Ġ: ĠException ( message , Ġcause ) Ċ