package Ġcom . af ric in nov ate . al gor and android kotlin . repository Impl Ċ Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . Client Service . API Service Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . Resource Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . model . Account Transactions Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . repository . Transaction Repository Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . utils . Constants Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . utils . Constants . ALG OD _ API _ TOKEN _ KEY Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . utils . Constants . PAS SP HR ASE Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . utils . Constants . REC IE VER Ċ import Ġcom . af ric in nov ate . al gor and android kotlin . utils . Constants . SEND ER Ċ import Ġcom . al gor and . alg os dk . account . Account Ċ import Ġcom . al gor and . alg os dk . crypto . Address Ċ import Ġcom . al gor and . alg os dk . transaction . Signed Transaction Ċ import Ġcom . al gor and . alg os dk . transaction . Transaction Ċ import Ġcom . al gor and . alg os dk . util . Encoder . encode To Msg Pack Ċ import Ġcom . al gor and . alg os dk . v 2 . client . common . Al god Client Ċ import Ġcom . al gor and . alg os dk . v 2 . client . common . Response Ċ import Ġcom . al gor and . alg os dk . v 2 . client . model . Pending Transaction Response Ċ import Ġcom . al gor and . alg os dk . v 2 . client . model . Transaction Parameters Response Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . apache . commons . lang 3 . Array Utils Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton ĊĊ Ċ @ Singleton Ċ class ĠTransaction Repository Impl Ġ@ Inject Ġconstructor ( private Ġval Ġapi Service : ĠAPI Service ) Ġ: ĊĠĠĠ ĠTransaction Repository Ġ{ ĊĠĠĠ Ġprivate Ġval Ġclient : ĠAl god Client Ġ= ĠAl god Client ( ĊĠĠĠĠĠĠĠ ĠConstants . ALG OD _ API _ ADDR , ĊĠĠĠĠĠĠĠ ĠConstants . ALG OD _ PORT , ĊĠĠĠĠĠĠĠ ĠConstants . ALG OD _ API _ TOKEN , ĊĠĠĠ Ġ) ĊĠĠĠ Ġvar Ġheaders Ġ= ĠarrayOf (" X - API - Key ") ĊĠĠĠ Ġvar Ġvalues Ġ= ĠarrayOf ( ALG OD _ API _ TOKEN _ KEY ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġtransfer Fund ( amount : ĠLong , Ġreceiver Address : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpass Phrase Ġ= ĠPAS SP HR ASE ĊĠĠĠĠĠĠĠ Ġval Ġmy Account Ġ= ĠAccount ( pass Phrase ) ĊĠĠĠĠĠĠĠ Ġ// ĠConstruct Ġthe Ġtransaction ĊĠĠĠĠĠĠĠ Ġval ĠRE CE IVER Ġ= ĠREC IE VER ĊĠĠĠĠĠĠĠ Ġval Ġsender Ġ= ĠS ENDER ĊĠĠĠĠĠĠĠ Ġval Ġresp : ĠResponse < Transaction Parameters Response > Ġ= Ġclient . Transaction Params (). execute ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! resp . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" message Ġ${ resp . message () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( resp . message ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams : ĠTransaction Parameters Response Ġ= Ġresp . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠException (" Params Ġretrieval Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtxn : ĠTransaction Ġ= ĠTransaction . Payment Transaction Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sender ( sender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. amount ( amount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receiver ( Address ( receiver Address )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. suggest ed Params ( params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Sign Ġthe Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Txn : ĠSigned Transaction Ġ= Ġmy Account . sign Transaction ( txn ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Signed Ġtransaction Ġwith Ġtx id :: Ġ\" Ġ+ Ġ${ signed Txn . transaction ID }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit Transaction ( signed Txn ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Error Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġutility Ġfunction Ġto Ġwait Ġon Ġa Ġtransaction Ġto Ġbe Ġconfirmed ĊĠĠĠĠ Ġ* Ġthe Ġtimeout Ġparameter Ġindicates Ġhow Ġmany Ġrounds Ġdo Ġyou Ġwish Ġto Ġcheck Ġpending Ġtransactions Ġfor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠwaitFor Confirmation ( ĊĠĠĠĠĠĠĠ Ġmy client : ĠAl god Client ?, ĊĠĠĠĠĠĠĠ Ġtx ID : ĠString ?, ĊĠĠĠĠĠĠĠ Ġtimeout : ĠInt ĊĠĠĠ Ġ): ĠPending Transaction Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire (!( my client Ġ== Ġnull Ġ|| Ġtx ID Ġ== Ġnull Ġ|| Ġtimeout Ġ< Ġ 0 )) Ġ{ Ġ" Bad Ġarguments Ġfor ĠwaitFor Confirmation ." Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġresp Ġ= Ġmy client . Get Status (). execute ( headers , Ġvalues ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! resp . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . Exception ( resp . message ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnode Status Response Ġ= Ġresp . body () ĊĠĠĠĠĠĠĠ Ġval Ġstart Round Ġ= Ġnode Status Response . last Round Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Round Ġ= Ġstart Round ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Round Ġ< Ġstart Round Ġ+ Ġtimeout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġpending Ġtransactions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresp 2 Ġ= Ġmy client . Pending Transaction Information ( tx ID ). execute ( headers , Ġvalues ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resp 2 . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Info Ġ= Ġresp 2 . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Info . confirmed Round Ġ!= Ġnull Ġ&& Ġpending Info . confirmed Round Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGot Ġthe Ġcompleted ĠTransaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpending Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Info . pool Error Ġ!= Ġnull Ġ&& Ġpending Info . pool Error . length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġwas Ġa Ġpool Ġerror , Ġthen Ġthe Ġtransaction Ġhas Ġbeen Ġrejected ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . Exception (" The Ġtransaction Ġhas Ġbeen Ġrejected Ġwith Ġa Ġpool Ġerror : Ġ" Ġ+ Ġpending Info . pool Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresp Ġ= Ġmy client . WaitFor Block ( current Round ). execute ( headers , Ġvalues ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! resp . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . Exception ( resp . message ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Round ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . Exception (" Transaction Ġnot Ġconfirmed Ġafter Ġ$ timeout Ġrounds !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsubmit Transaction ( signed Txn : ĠSigned Transaction ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtx Headers : ĠArray < String > Ġ= ĠArray Utils . add ( headers , Ġ" Content - Type ") ĊĠĠĠĠĠĠĠ Ġval Ġtx Values : ĠArray < String > Ġ= ĠArray Utils . add ( values , Ġ" application / x - binary ") ĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSubmit Ġthe Ġtransaction Ġto Ġthe Ġnetwork ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Tx Bytes : ĠByteArray Ġ= Ġencode To Msg Pack ( signed Txn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw tx response Ġ= Ġclient . Raw Transaction (). raw txn ( encoded Tx Bytes ). execute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Headers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! raw tx response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" raw Ġ${ raw tx response . message () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( raw tx response . message ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġraw tx response . body (). tx Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResource . Success (" Successfully Ġsent Ġtx Ġwith ĠID : Ġ$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Successfully Ġsent Ġtx Ġwith ĠID : Ġ$ id ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Confirmation ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Confirmation ( client , Ġid , Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . message ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTim ber . d (" id Ġis Ġ$ id ") ĊĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Transactions By Address ( address : ĠString ): ĠAccount Transactions ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġapi Service . service . get Acc count Transactions By Address ( address ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" trans Ġ$ response ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" trans Ġ${ response . body () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . error Body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . message ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse . body () ĊĠĠĠ Ġ} Ċ } Ċ