package Ġorg . stell ar . sdk Ċ Ċ import Ġio . in bot . kotlin stell ar . Token Amount Ċ import Ġio . in bot . kotlin stell ar . token Amount Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util . Base 6 4 Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . apache . commons . lang 3 . Random Utils Ċ import Ġorg . apache . commons . lang 3 . Validate Ċ import Ġorg . stell ar . sdk . requests . ErrorResponse Ċ import Ġorg . stell ar . sdk . requests . Too Many Requests Exception Ċ import Ġorg . stell ar . sdk . responses . Account Response Ċ import Ġorg . stell ar . sdk . responses . Submit Transaction Response Ċ import Ġorg . stell ar . sdk . responses . Submit Transaction Timeout Response Exception Ċ import Ġorg . stell ar . sdk . responses . describe Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ /** Ċ Ġ* ĠCombine Ġbuilding Ġand Ġsigning Ġinto Ġa Ġsingle Ġcall . Ċ Ġ*/ Ċ fun ĠTransaction . Builder . build And Sign ( var arg Ġpairs : ĠKey Pair ): ĠTransaction Ġ{ ĊĠĠĠ Ġpairs . forEach Ġ{ Ġit . validate Can Sign () Ġ} ĊĠĠĠ Ġval Ġtx Ġ= Ġbuild () ĊĠĠĠ Ġpairs . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġtx . sign ( it ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtx Ċ } Ċ Ċ fun ĠServer . find Account ( pair : ĠKey Pair ): ĠAccount Response ? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġaccounts (). account ( pair . accountId ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠError Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . code Ġ== Ġ 4 0 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġparse KeyPair ( str : ĠString ?): ĠKey Pair ? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠKey Pair . from Secret Seed ( str ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKey Pair . from AccountId ( str ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠKey Pair . seed String (): ĠString Ġ{ ĊĠĠĠ Ġvalidate Can Sign () ĊĠĠĠ Ġreturn Ġsecret Seed . join ToString ("") Ċ } Ċ Ċ fun ĠKey Pair . to Public Pair (): ĠKey Pair Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( can Sign ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠKey Pair . from PublicKey ( publicKey ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠKey Pair . validate Can Sign () Ġ{ ĊĠĠĠ Ġif Ġ(! can Sign ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Pair Ġhas Ġno Ġprivate Ġkey ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠKey Pair . verify ( data : ĠString , Ġbase 6 4 Signature : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify ( data . toByteArray ( StandardCharsets . UTF _ 8 ), ĠBase 6 4 . get Decoder (). decode ( base 6 4 Signature )) Ċ } Ċ Ċ fun ĠKey Pair . sign ( data : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠBase 6 4 . get Encoder (). encode ToString ( sign ( data . toByteArray ( StandardCharsets . UTF _ 8 ))) Ċ } Ċ Ċ /** Ċ Ġ* Ġasset Ġcode Ġas Ġa Ġstring Ġ( 4 Ġor Ġ 1 2 Ġletter ) Ġor ĠX LM Ġif Ġit Ġis Ġnative . Ċ Ġ*/ Ċ val ĠAsset . asset Code : ĠString ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this Ġis ĠAsset Type Credit Alpha Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnative ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" XL M " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ val ĠAsset . asset Issuer : ĠString ? ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . is Native ()) Ġnull Ġelse Ġ( this Ġas ĠAsset Type Credit Alpha Num ). issuer ĊĠĠĠ Ġ} Ċ Ċ fun ĠAsset . is Native (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis Ġis ĠAsset Type Native Ċ } Ċ Ċ fun ĠAsset . describe (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠAsset Type Native Ġ-> Ġ" XL M " ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"$ asset Code Ġ($ asset Issuer )" ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠAsset . amount ( value : ĠDouble ): ĠToken Amount Ġ{ ĊĠĠĠ Ġreturn Ġtoken Amount ( value , Ġthis ) Ċ } Ċ Ċ fun ĠAsset . amount ( value : ĠString ): ĠToken Amount Ġ{ ĊĠĠĠ Ġreturn Ġtoken Amount ( value , Ġthis ) Ċ } Ċ Ċ fun ĠAsset . amount ( tokens : ĠLong , Ġst ro ops : ĠLong Ġ= Ġ 0 ): ĠToken Amount Ġ{ ĊĠĠĠ Ġreturn Ġtoken Amount ( tokens , Ġst ro ops , Ġthis ) Ċ } Ċ fun ĠPrice . rate (): ĠDouble Ġ{ ĊĠĠĠ Ġreturn Ġnum erator . toDouble () Ġ/ Ġdenominator . toDouble () Ċ } Ċ Ċ /** Ċ Ġ* ĠKotlin Ġhelper Ġto Ġcreate , Ġsign , Ġand Ġsubmit Ġa Ġtransaction . Ċ Ġ* Ġ@ param Ġfor Account Ġaccount Ġthat Ġsigns Ġthe Ġtransaction Ċ Ġ* Ġ@ param Ġmax T ries Ġthe Ġnumber Ġof Ġtimes Ġto Ġretry Ġin Ġcase Ġof Ġa Ġtx _ bad _ seq Ġresponse . Ċ Ġ* Ġ@ param Ġtransaction Block Ġa Ġblock Ġwhere Ġyou Ġcan Ġadd Ġoperations Ġto Ġthe Ġtransaction Ċ Ġ* Ġ@ return Ġthe Ġresponse Ċ Ġ*/ Ċ fun ĠServer . do Transaction ( ĊĠĠĠ Ġnetwork : ĠNetwork , ĊĠĠĠ Ġfor Account : ĠKey Pair , ĊĠĠĠ Ġmax T ries : ĠInt , ĊĠĠĠ Ġsign ers : ĠArray < KeyPair > Ġ= ĠarrayOf ( for Account ), ĊĠĠĠ Ġtransaction Timeout : ĠLong Ġ= Ġ 1 5 0 0 0 , Ġ// Ġ 1 5 Ġseconds ĊĠĠĠ Ġbase Fee : ĠInt Ġ= Ġ 1 0 0 , Ġ// Ġthis Ġmay Ġrequire Ġlooking Ġat Ġfee Ġstats ĊĠĠĠ Ġsequence Number Override : ĠLong ? Ġ= Ġnull , Ġ// Ġwe Ġuse Ġthis Ġmainly Ġin Ġtests Ġso Ġwe Ġcan Ġtrigger Ġconflicts . ĊĠĠĠ Ġtransaction Block : Ġ( Transaction . Builder ). () Ġ-> ĠUnit Ċ ): ĠSubmit Transaction Response Ġ{ ĊĊĠĠĠ Ġval Ġresponse Ġ= Ġdo Transaction Internal ( ĊĠĠĠĠĠĠĠ Ġnetwork , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠ Ġmax T ries , ĊĠĠĠĠĠĠĠ Ġfor Account , ĊĠĠĠĠĠĠĠ Ġsign ers , ĊĠĠĠĠĠĠĠ Ġtransaction Timeout , ĊĠĠĠĠĠĠĠ Ġbase Fee , ĊĠĠĠĠĠĠĠ Ġtransaction Block , ĊĠĠĠĠĠĠĠ Ġsequence Number Override ĊĠĠĠ Ġ) ĊĠĠĠ Ġlogger . info Ġ{ Ġresponse . describe () Ġ} ĊĠĠĠ Ġreturn Ġresponse Ċ } Ċ Ċ private Ġfun ĠServer . do Transaction Internal ( ĊĠĠĠ Ġnetwork : ĠNetwork , ĊĠĠĠ Ġtries : ĠInt , ĊĠĠĠ Ġmax T ries : ĠInt , ĊĠĠĠ Ġkey Pair : ĠKey Pair , ĊĠĠĠ Ġsign ers : ĠArray < KeyPair >, ĊĠĠĠ Ġtransaction Timeout : ĠLong , ĊĠĠĠ Ġbase Fee : ĠInt , ĊĠĠĠ Ġtransaction Block : ĠTransaction . Builder . () Ġ-> ĠUnit , ĊĠĠĠ Ġsequence Number Override : ĠLong ? Ġ= Ġnull Ġ// Ġwe Ġuse Ġthis Ġmainly Ġin Ġtests Ġso Ġwe Ġcan Ġtrigger Ġconflicts . Ċ Ċ ): ĠSubmit Transaction Response Ġ{ ĊĠĠĠ Ġkey Pair . validate Can Sign () ĊĊĠĠĠ Ġval Ġsource Account Ġ= Ġif Ġ( sequence Number Override Ġ== Ġnull ) Ġaccounts (). account ( key Pair . accountId ) Ġelse ĠAccount Response ( key Pair . accountId , Ġsequence Number Override ) ĊĊĠĠĠ Ġ// Ġbuilding Ġa Ġtransaction Ġactually Ġincre ments Ġthis , Ġy ikes ĊĠĠĠ Ġval Ġcurrent SequenceNumber Ġ= Ġsource Account . sequence Number ĊĊĠĠĠ ĠValidate . isTrue ( max T ries Ġ>= Ġ 0 , Ġ" max T ries Ġshould Ġbe Ġpositive ") ĊĠĠĠ Ġval Ġbuilder Ġ= ĠTransaction . Builder ( source Account , Ġnetwork ) ĊĠĠĠ Ġbuilder . setTimeout ( transaction Timeout ) ĊĠĠĠ Ġbuilder . set Operation Fee ( base Fee ) ĊĊĠĠĠ Ġtransaction Block . invoke ( builder ) ĊĠĠĠ Ġval Ġtransaction Ġ= Ġbuilder . build And Sign (* sign ers ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġsubmit Transaction ( transaction ) ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tri es Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" transaction Ġsucceeded Ġafter Ġ$ tri es Ġtries . ĠIf Ġyou Ġsee Ġthis Ġa Ġlot , Ġtry Ġnot Ġdoing Ġconcurrent Ġmodifications Ġagainst Ġthe Ġsame Ġaccount " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorCode Ġ= Ġresponse . extras . result Codes ?. transaction ResultCode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( errorCode Ġ== Ġ" tx _ bad _ seq " Ġ&& Ġtries Ġ< Ġmax T ries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġescal ate Ġhow Ġlong Ġit Ġsleep s Ġin Ġbetween Ġdepending Ġon Ġthe Ġnumber Ġof Ġtries Ġand Ġrandomize Ġhow Ġlong Ġit Ġsleep s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġusing Ġincre ments Ġof Ġ 1 s Ġbecause Ġstellar Ġtransactions Ġare Ġrelatively Ġslow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( Random Utils . next Long ( 1 0 0 , Ġ 1 0 0 0 Ġ* Ġ( tri es . to Long () Ġ+ Ġ 1 ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġretry Ġand Ġget Ġlatest Ġsequence Ġnumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Transaction Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtries Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax T ries , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign ers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Fee , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Block ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperations Failures Ġ= Ġresponse . extras . result Codes ?. operations Result Codes ?. join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" failure Ġafter Ġ$ tri es Ġtransaction Ġfailed Ġ$ errorCode Ġ- Ġ$ operations Failures Ġ${ response . describe () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠSubmit Transaction Timeout Response Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tri es Ġ< Ġmax T ries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatest Account Ġ= Ġthis . accounts (). account ( source Account . accountId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( latest Account . sequence Number Ġ== Ġcurrent SequenceNumber ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnothing Ġhappened Ġon Ġthe Ġblockchain ? Ġlets ĠTry Ġagain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" retry ing Ġ$ tri es Ġout Ġof Ġ$ max T ries Ġbecause Ġof Ġa Ġtimeout " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Transaction Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtries Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax T ries , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign ers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Fee , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Number Override Ġ= Ġcurrent SequenceNumber ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġin Ġcase Ġthe Ġsequence Ġnumber Ġwent Ġup , Ġfetch Ġthe Ġlatest Ġtransaction Ġand Ġcompare Ġto Ġwhat Ġwe Ġwould Ġhave Ġsent Ġto Ġverify Ġif Ġthe Ġtransaction Ġhappened Ġas Ġplanned ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" conflict ing Ġtransaction Ġon Ġaccount Ġsequence Ġnumber Ġchanged Ġfrom Ġ${ source Account . sequence Number } Ġto Ġ${ latest Account . sequence Number }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . IllegalStateException (" Timeout Ġand Ġthe Ġaccount Ġsequence Ġnumber Ġincreased Ġfrom Ġ${ source Account . sequence Number } Ġto Ġ${ latest Account . sequence Number } Ġon Ġon Ġ${ key Pair . accountId }; Ġskipping Ġretry Ġto Ġavoid Ġduplicate Ġtransaction ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" fail ing Ġafter Ġtoo Ġmany Ġtries : Ġ${ e :: class . qualified Name } Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠToo Many Requests Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tri es Ġ< Ġmax T ries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" retry ing Ġ$ tri es Ġout Ġof Ġ$ max T ries Ġbecause Ġof Ġa Ġtimeout " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Transaction Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtries Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax T ries , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsign ers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Fee , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Block , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Number Override Ġ= Ġcurrent SequenceNumber ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" fail ing Ġafter Ġtoo Ġmany Ġtries : Ġ${ e :: class . qualified Name } Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠError Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġcheck Ġfor Ġmis matching Ġledger ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġcheck Ġfor Ġbase Ġfee Ġissues Ġand Ġimplement Ġmechanism Ġto Ġretry Ġwith Ġhigher Ġfee ĊĠĠĠĠĠĠĠ Ġlogger . error Ġ{ Ġ" ERROR Ġ${ e . code } Ġ${ e . body }" Ġ} ĊĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠ Ġ} Ċ } Ċ