package Ġio . pro venance . explorer . service . async Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . google . protobuf . Any Ċ import Ġcom . google . protobuf . Timestamp Ċ import Ġcos mos . base . ab ci . v 1 beta 1 . Ab ci Ċ import Ġcos mos . base . tender mint . v 1 beta 1 . Query Ċ import Ġcos mos . tx . v 1 beta 1 . Service OuterClass Ċ import Ġcos mos . tx . v 1 beta 1 . Tx OuterClass Ċ import Ġcos mw asm . wasm . v 1 beta 1 . Proposal Ċ import Ġio . pro venance . explorer . config . Explorer Properties Ċ import Ġio . pro venance . explorer . domain . core . logger Ċ import Ġio . pro venance . explorer . domain . core . to M Address Ċ import Ġio . pro venance . explorer . domain . entities . Account Record Ċ import Ġio . pro venance . explorer . domain . entities . Block Cache Record Ċ import Ġio . pro venance . explorer . domain . entities . Block Pro poser Record Ċ import Ġio . pro venance . explorer . domain . entities . Block Tx Retry Record Ċ import Ġio . pro venance . explorer . domain . entities . Fee Pay er Ċ import Ġio . pro venance . explorer . domain . entities . I bc Channel Record Ċ import Ġio . pro venance . explorer . domain . entities . Sig Join Type Ċ import Ġio . pro venance . explorer . domain . entities . Signature Join Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Address Join Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Address Join Type Ċ import Ġio . pro venance . explorer . domain . entities . Tx Cache Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Event Attr Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Event Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Fee Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Fe ep ayer Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Gas Cache Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Marker Join Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Message Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx N ft Join Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Single Message Cache Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Sm Code Record Ċ import Ġio . pro venance . explorer . domain . entities . Tx Sm Contract Record Ċ import Ġio . pro venance . explorer . domain . entities . Validator State Record Ċ import Ġio . pro venance . explorer . domain . entities . update Hit Count Ċ import Ġio . pro venance . explorer . domain . extensions . get Sign ers Ċ import Ġio . pro venance . explorer . domain . extensions . height Ċ import Ġio . pro venance . explorer . domain . extensions . to DateTime Ċ import Ġio . pro venance . explorer . domain . extensions . toObject Node Ċ import Ġio . pro venance . explorer . domain . extensions . translate Address Ċ import Ġio . pro venance . explorer . domain . models . explorer . Ledger Info Ċ import Ġio . pro venance . explorer . domain . models . explorer . Msg Proto Break out Ċ import Ġio . pro venance . explorer . domain . models . explorer . Tx Data Ċ import Ġio . pro venance . explorer . grpc . extensions . Address Events Ċ import Ġio . pro venance . explorer . grpc . extensions . Denom Events Ċ import Ġio . pro venance . explorer . grpc . extensions . G ov MsgType Ċ import Ġio . pro venance . explorer . grpc . extensions . Sm Contract Event Keys Ċ import Ġio . pro venance . explorer . grpc . extensions . Sm Contract Value Ċ import Ġio . pro venance . explorer . grpc . extensions . denom Event Regex Parse Ċ import Ġio . pro venance . explorer . grpc . extensions . getAddress Event By Event Ċ import Ġio . pro venance . explorer . grpc . extensions . get Associated Addresses Ċ import Ġio . pro venance . explorer . grpc . extensions . get Associated Den oms Ċ import Ġio . pro venance . explorer . grpc . extensions . get Associated G ov Msgs Ċ import Ġio . pro venance . explorer . grpc . extensions . get Associated Metadata Ċ import Ġio . pro venance . explorer . grpc . extensions . get Associated Metadata Events Ċ import Ġio . pro venance . explorer . grpc . extensions . get Associated Sm Contract Msgs Ċ import Ġio . pro venance . explorer . grpc . extensions . get Denom Event By Event Ċ import Ġio . pro venance . explorer . grpc . extensions . get I bc Channel Events Ċ import Ġio . pro venance . explorer . grpc . extensions . get I bc Ledger Msgs Ċ import Ġio . pro venance . explorer . grpc . extensions . get Sm Contract Event By Event Ċ import Ġio . pro venance . explorer . grpc . extensions . is I bc Timeout On Close Ċ import Ġio . pro venance . explorer . grpc . extensions . is I bc Transfer Msg Ċ import Ġio . pro venance . explorer . grpc . extensions . is Metadata Deletion Msg Ċ import Ġio . pro venance . explorer . grpc . extensions . scr ub Quotes Ċ import Ġio . pro venance . explorer . grpc . extensions . to Msg Ack nowledge ment Ċ import Ġio . pro venance . explorer . grpc . extensions . to Msg Deposit Ċ import Ġio . pro venance . explorer . grpc . extensions . to Msg Recv Packet Ċ import Ġio . pro venance . explorer . grpc . extensions . to Msg Submit Proposal Ċ import Ġio . pro venance . explorer . grpc . extensions . to Msg Timeout On Close Ċ import Ġio . pro venance . explorer . grpc . extensions . to Msg Transfer Ċ import Ġio . pro venance . explorer . grpc . extensions . to Msg Vote Ċ import Ġio . pro venance . explorer . grpc . v 1 . Transaction Grpc Client Ċ import Ġio . pro venance . explorer . service . Account Service Ċ import Ġio . pro venance . explorer . service . Asset Service Ċ import Ġio . pro venance . explorer . service . Block Service Ċ import Ġio . pro venance . explorer . service . G ov Service Ċ import Ġio . pro venance . explorer . service . I bc Service Ċ import Ġio . pro venance . explorer . service . N ft Service Ċ import Ġio . pro venance . explorer . service . Smart Contract Service Ċ import Ġio . pro venance . explorer . service . Validator Service Ċ import Ġnet . pear x . k ase change . to Snake Case Ċ import Ġnet . pear x . k ase change . universal Word Splitter Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . math . BigInteger Ċ Ċ @ Service Ċ class ĠAsync Caching ( ĊĠĠĠ Ġprivate Ġval Ġtx Client : ĠTransaction Grpc Client , ĊĠĠĠ Ġprivate Ġval Ġblock Service : ĠBlock Service , ĊĠĠĠ Ġprivate Ġval Ġvalidator Service : ĠValidator Service , ĊĠĠĠ Ġprivate Ġval Ġaccount Service : ĠAccount Service , ĊĠĠĠ Ġprivate Ġval Ġasset Service : ĠAsset Service , ĊĠĠĠ Ġprivate Ġval Ġn ft Service : ĠN ft Service , ĊĠĠĠ Ġprivate Ġval Ġgov Service : ĠG ov Service , ĊĠĠĠ Ġprivate Ġval Ġi bc Service : ĠI bc Service , ĊĠĠĠ Ġprivate Ġval Ġsm Contract Service : ĠSmart Contract Service , ĊĠĠĠ Ġprivate Ġval Ġprops : ĠExplorer Properties Ċ ) Ġ{ ĊĊĠĠĠ Ġprotected Ġval Ġlogger Ġ= Ġlogger ( Async Caching :: class ) ĊĊĠĠĠ Ġprotected Ġvar Ġchain Id : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġfun Ġget Block ( block Height : ĠInt , Ġcheck T xs : ĠBoolean Ġ= Ġfalse ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ ĠBlock Cache Record . findById ( block Height )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Cache Record . update Hit Count ( block Height ) ĊĠĠĠĠĠĠĠ Ġ} ?. block ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check T xs Ġ&& Ġit . block . data . tx s Count Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave T xs ( it ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġsave Block E tc ( block Service . getBlock At Height From Chain ( block Height )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Chain Id String () Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( chain Id . isEmpty ()) Ġget Block ( block Service . get Latest Block Height Index ()) !!. block . header . chain Id . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . chain Id Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġthis . chain Id ĊĊĠĠĠ Ġfun Ġsave Block E tc ( block Res : ĠQuery . Get Block By Height Response ?): ĠQuery . Get Block By Height Response ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( block Res Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġlogger . info (" saving Ġblock Ġ${ block Res . block . height () }") ĊĠĠĠĠĠĠĠ Ġval Ġblock Timestamp Ġ= Ġblock Res . block . header . time . to DateTime () ĊĠĠĠĠĠĠĠ Ġblock Service . add Block To Cache ( block Res . block . height (), Ġblock Res . block . data . tx s Count , Ġblock Timestamp , Ġblock Res ) ĊĠĠĠĠĠĠĠ Ġvalidator Service . save Pro poser Record ( block Res , Ġblock Timestamp , Ġblock Res . block . height ()) ĊĠĠĠĠĠĠĠ Ġvalidator Service . save Validators At Height ( block Res . block . height ()) ĊĠĠĠĠĠĠĠ Ġvalidator Service . save Mis sed Blocks ( block Res ) ĊĠĠĠĠĠĠĠ Ġif Ġ( block Res . block . data . tx s Count Ġ> Ġ 0 ) Ġsave T xs ( block Res ) ĊĠĠĠĠĠĠĠ Ġreturn Ġblock Res ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠTx Updated Items ( ĊĠĠĠĠĠĠĠ Ġval Ġaddresses : ĠMap < String , ĠList < Int >>, ĊĠĠĠĠĠĠĠ Ġval Ġmarkers : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġscopes : ĠList < String > Ġ= ĠlistOf () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġsave T xs ( block Res : ĠQuery . Get Block By Height Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Be Updated Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd T xs To Cache ( block Res . block . height (), Ġblock Res . block . data . tx s Count , Ġblock Res . block . header . time ) ĊĠĠĠĠĠĠĠ Ġto Be Updated . flatMap Ġ{ Ġit . markers Ġ}. toSet (). let Ġ{ Ġasset Service . update Assets ( it , Ġblock Res . block . header . time ) Ġ} ĊĠĠĠĠĠĠĠ Ġto Be Updated . flatMap Ġ{ Ġit . addresses . entries Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ({ Ġit . key Ġ}) Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġ(_, Ġvalues ) Ġ-> Ġvalues . flatten (). toSet () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . entries . forEach Ġ{ Ġent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ent . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Address Join Type . OPERATOR . name Ġ-> Ġvalidator Service . update St aking Validators ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġent . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Res . block . height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġupdated Ġ-> Ġif Ġ( updated ) ĠValidator State Record . refresh Current State View () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtx Count For Height ( block Height : ĠInt ) Ġ= Ġtransaction Ġ{ ĠTx Cache Record . findBy Height ( block Height ). count () Ġ} ĊĊĠĠĠ Ġfun Ġadd T xs To Cache ( block Height : ĠInt , Ġexpected Num T xs : ĠInt , Ġblock Time : ĠTimestamp ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( tx Count For Height ( block Height ). toInt () Ġ== Ġexpected Num T xs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Cache Ġhit Ġfor Ġtransaction Ġat Ġheight Ġ$ block Height Ġwith Ġ$ expected Num T xs Ġtransactions ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠlistOf () Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Searching Ġfor Ġ$ expected Num T xs Ġtransactions Ġat Ġheight Ġ$ block Height ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Add T xs ( block Height , Ġexpected Num T xs , Ġblock Time ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Add T xs ( block Height : ĠInt , Ġtx Count : ĠInt , Ġblock Time : ĠTimestamp ): ĠList < Tx Updated Items > Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġtx Client . getT xs By Height ( block Height , Ġtx Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġcalculate Block Tx Fee ( it , Ġblock Height ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġadd Tx To Cache With Timestamp ( tx Client . get Tx By Hash ( it . tx hash ), Ġblock Time ) Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġretrieve Ġtransactions Ġat Ġblock : Ġ$ block Height ", Ġe . message ) ĊĠĠĠĠĠĠĠ ĠBlock Tx Retry Record . insert ( block Height , Ġe ) ĊĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Block Tx Fee ( result : ĠList < Ab ci . Tx Response >, Ġheight : ĠInt ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . map Ġ{ Ġit . tx . unpack ( Tx OuterClass . Tx :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum erator Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . sum Of Ġ{ Ġit . auth Info . fee . amount List . first OrNull ()?. amount ?. to BigInteger () Ġ?: ĠBigInteger . ZERO Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdenominator Ġ= Ġlist . sum Of Ġ{ Ġit . auth Info . fee . gas Limit . to BigInteger () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum erator . toDouble (). div ( denom inator . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĠBlock Pro poser Record . save ( height , Ġit , Ġnull , Ġnull ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Tx To Cache With Timestamp ( res : ĠService OuterClass . Get Tx Response , Ġblock Time : ĠTimestamp ) Ġ= ĊĠĠĠĠĠĠĠ Ġadd Tx To Cache ( res , Ġblock Time . to DateTime ()) ĊĊĠĠĠ Ġ// ĠFunction Ġthat Ġsaves Ġall Ġthe Ġthings Ġunder Ġa Ġtransaction ĊĠĠĠ Ġfun Ġadd Tx To Cache ( ĊĠĠĠĠĠĠĠ Ġres : ĠService OuterClass . Get Tx Response , ĊĠĠĠĠĠĠĠ Ġblock Time : ĠDateTime ĊĠĠĠ Ġ): ĠTx Updated Items Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtx Pair Ġ= ĠTx Cache Record . insert Ignore ( res , Ġblock Time ). let Ġ{ ĠPair ( it , Ġres ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtx Info Ġ= ĠTx Data ( res . tx Response . height . toInt (), Ġtx Pair . first . value , Ġres . tx Response . tx hash , Ġblock Time ) ĊĠĠĠĠĠĠĠ Ġsave Tx Gas Fees ( res , Ġtx Info ) ĊĠĠĠĠĠĠĠ Ġsave Messages ( tx Info , Ġtx Pair . second ) ĊĠĠĠĠĠĠĠ Ġval Ġadd rs Ġ= Ġsave Addresses ( tx Info , Ġtx Pair . second ) ĊĠĠĠĠĠĠĠ Ġval Ġmarkers Ġ= Ġsave Markers ( tx Info , Ġtx Pair . second ) ĊĠĠĠĠĠĠĠ Ġsave N ft Data ( tx Info , Ġtx Pair . second ) ĊĠĠĠĠĠĠĠ Ġsave G ov Data ( tx Pair . second , Ġtx Info ) ĊĠĠĠĠĠĠĠ Ġsave I bc Channel Data ( tx Pair . second , Ġtx Info ) ĊĠĠĠĠĠĠĠ Ġsave Smart Contract Data ( tx Pair . second , Ġtx Info ) ĊĠĠĠĠĠĠĠ Ġsave Signatures Tx ( tx Pair . second , Ġtx Info ) ĊĠĠĠĠĠĠĠ Ġreturn ĠTx Updated Items ( addrs , Ġmarkers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Events ( ĊĠĠĠĠĠĠĠ Ġtx Info : ĠTx Data , ĊĠĠĠĠĠĠĠ Ġtx : ĠService OuterClass . Get Tx Response , ĊĠĠĠĠĠĠĠ Ġmsg Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġmsg Type : ĠInt , ĊĠĠĠĠĠĠĠ Ġidx : ĠInt ĊĠĠĠ Ġ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġtx . tx Response . logs List [ idx ]. events List . forEach Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Id Ġ= ĠTx Event Record . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Info . block Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Info . tx Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Info . tx Hash Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . attributes List . forEach Ġ{ Ġattr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Event Attr Record . insert ( attr . key , Ġattr . value , Ġevent Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Tx Gas Fees ( tx : ĠService OuterClass . Get Tx Response , Ġtx Info : ĠTx Data ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTx Gas Cache Record . insert Ignore ( tx , Ġtx Info . tx Timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT xF ee Record . insert ( tx Info , Ġtx ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Messages ( tx Info : ĠTx Data , Ġtx : ĠService OuterClass . Get Tx Response ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġtx . tx . body . messages List . forEach Indexed Ġ{ Ġidx , Ġmsg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġmodule , Ġtype ) Ġ= Ġmsg . get MsgType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Rec Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Message Record . insert ( tx Info . block Height , Ġtx Info . tx Hash , Ġtx Info . tx Hash Id !! , Ġmsg , Ġtype , Ġmodule , Ġidx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tx . tx Response . logs Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Events ( tx Info , Ġtx , Ġmsg Rec . id . value , Ġmsg Rec . tx MessageType . id . value , Ġidx ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tx . tx . body . messages Count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Single Message Cache Record . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Info . tx Timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Info . tx Hash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx Response . gas Used . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg Rec . tx MessageType . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠAny . get MsgType (): ĠMsg Proto Break out Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproto Type Ġ= Ġthis . type Url ĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġif Ġ(! proto Type . startsWith ("/ ib c ")) Ġproto Type . split (". ")[ 1 ] ĊĠĠĠĠĠĠĠ Ġelse Ġproto Type . split (". "). let Ġ{ Ġlist Ġ-> Ġ"${ list [ 0 ]. drop ( 1 )} _${ list [ 2 ]}" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġproto Type . split (" Msg ")[ 1 ]. remove Suffix (" Request "). to Snake Case ( universal Word Splitter ( false )) ĊĠĠĠĠĠĠĠ Ġreturn ĠMsg Proto Break out ( proto Type , Ġmodule , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Addresses ( tx Info : ĠTx Data , Ġtx : ĠService OuterClass . Get Tx Response ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Add rs Ġ= Ġtx . tx . body . messages List . flatMap Ġ{ Ġit . get Associated Addresses () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġevent Add rs Ġ= Ġtx . tx Response . logs List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . events List Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . type Ġin ĠAddress Events . values (). map Ġ{ Ġaddr Ġ-> Ġaddr . event Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Address Event By Event ( e . type ) !!. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . attributes List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġattr Ġ-> Ġattr . key Ġin Ġit . id Field Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfound Ġ-> Ġfound . value . scr ub Quotes () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( msg Add rs Ġ+ Ġevent Add rs ). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġsave Addr ( it , Ġtx Info ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second Ġ!= Ġnull Ġ}. groupBy ({ Ġit . first Ġ}) Ġ{ Ġit . second !! Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Addr ( addr : ĠString , Ġtx Info : ĠTx Data ): ĠPair < String , ĠInt ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddr Pair Ġ= Ġaddr . getAddress Type ( props ) ĊĠĠĠĠĠĠĠ Ġvar Ġpair Copy Ġ= Ġaddr Pair !!. copy () ĊĠĠĠĠĠĠĠ Ġif Ġ( addr Pair . second Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( addr Pair . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Address Join Type . OPERATOR . name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidator Service . save Validator ( addr ). let Ġ{ Ġpair Copy Ġ= Ġaddr Pair . copy ( second Ġ= Ġit . first . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTx Address Join Type . ACCOUNT . name Ġ-> Ġaccount Service . save Account ( addr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġpair Copy Ġ= Ġaddr Pair . copy ( second Ġ= Ġit . id . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlock Tx Retry Record . insert Non Retry ( tx Info . block Height , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( addr Pair . second Ġ!= Ġnull ) ĠTx Address Join Record . insert ( tx Info , Ġpair Copy , Ġaddr ) ĊĠĠĠĠĠĠĠ Ġreturn Ġaddr Pair ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Markers ( tx Info : ĠTx Data , Ġtx : ĠService OuterClass . Get Tx Response ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Den oms Ġ= Ġtx . tx . body . messages List . map Ġ{ Ġit . get Associated Den oms () Ġto Ġit . is I bc Transfer Msg () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdenom s Ġ= Ġmsg Den oms . flatMap Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcaptures Ġall Ġevents Ġthat Ġhave Ġa Ġdenom ĊĠĠĠĠĠĠĠ Ġval Ġevent Den oms Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx Response . logs List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . events List Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . type Ġin ĠDen om Events . values (). map Ġ{ Ġde Ġ-> Ġde . event Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Denom Event By Event ( e . type ) !!. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . attributes List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġattr Ġ-> Ġattr . key Ġ== Ġit . id Field Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġfound Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . parse ) Ġfound . value . scr ub Quotes (). denom Event Regex Parse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfound . value . scr ub Quotes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( denom s Ġ+ Ġevent Den oms ). toSet (). map NotNull Ġ{ Ġde Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdenom Ġ= Ġmsg Den oms . first OrNull Ġ{ Ġit . first . contains ( de ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( denom Ġ!= Ġnull Ġ&& Ġdenom . second ) Ġif Ġ( tx . tx Response . code Ġ== Ġ 0 ) Ġsave Denom ( de , Ġtx Info ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġsave Denom ( de , Ġtx Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Denom ( denom : ĠString , Ġtx Info : ĠTx Data ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġasset Service . get Asset Raw ( denom ). let Ġ{ Ġ( id , Ġ_) Ġ-> ĠTx Marker Join Record . insert ( tx Info , Ġid !!. value , Ġdenom ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdenom ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave N ft Data ( tx Info : ĠTx Data , Ġtx : ĠService OuterClass . Get Tx Response ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠG ather ĠMetadata Addresses Ġfrom Ġthe ĠMsg s Ġthemselves ĊĠĠĠĠĠĠĠ Ġval Ġmsg Addr Pairs Ġ= Ġtx . tx . body . messages List . map Ġ{ Ġit . get Associated Metadata () Ġto Ġit . is Metadata Deletion Msg () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmsg Add rs Ġ= Ġmsg Addr Pairs . flatMap Ġ{ Ġit . first Ġ}. filter NotNull () ĊĊĠĠĠĠĠĠĠ Ġ// ĠG ather Ġevent - only ĠMetadata Addresses Ġfrom Ġthe Ġevents ĊĠĠĠĠĠĠĠ Ġval Ġme Ġ= Ġtx . tx . body . messages List . flatMap Ġ{ Ġit . get Associated Metadata Events () Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġval Ġme Add rs Ġ= Ġtx . tx Response . logs List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlog Ġ-> Ġlog . events List Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . type Ġin Ġme . map Ġ{ Ġm Ġ-> Ġm . event Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . attributes List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġa Ġ-> Ġa . key Ġin Ġme . map Ġ{ Ġm Ġ-> Ġm . id Field Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġj ack son ObjectMapper (). readValue ( it . value , ĠString :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġaddr Ġ-> Ġaddr . to M Address () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġn ft Ġaddresses ĊĠĠĠĠĠĠĠ Ġval Ġn fts Ġ= Ġ( msg Add rs Ġ+ Ġme Add rs ). map NotNull Ġ{ Ġmd Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn ft Service . save M Address ( md ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmark Ġdeleted Ġif Ġnecessary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tx . tx Response . code Ġ== Ġ 0 Ġ&& Ġ( msg Addr Pairs . first OrNull Ġ{ Ġit . first Ġ== ĠlistOf ( md ) Ġ} ?. second Ġ== Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ft Service . mark Deleted ( md ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġn ft Ġjoins ĊĠĠĠĠĠĠĠ Ġn fts . forEach Ġ{ Ġn ft Ġ-> ĠTx N ft Join Record . insert ( tx Info , Ġn ft ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave G ov Data ( tx : ĠService OuterClass . Get Tx Response , Ġtx Info : ĠTx Data ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tx . tx Response . code Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx . body . messages List . map Ġ{ Ġit . get Associated G ov Msgs () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Indexed Ġfe @{ Ġidx , Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair Ġ== Ġnull ) Ġreturn @ fe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( pair . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG ov MsgType . PRO POS AL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHave Ġto Ġfind Ġthe Ġproposal Id Ġin Ġthe Ġlog Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx Response . logs List [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. events List . first Ġ{ Ġit . type Ġ== Ġ" submit _ proposal " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. attributes List . first Ġ{ Ġit . key Ġ== Ġ" proposal _ id " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second . to Msg Submit Proposal (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgov Service . save Proposal ( id , Ġtx Info , Ġit . pro poser , Ġis Submit Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgov Service . save Deposit ( id , Ġtx Info , Ġnull , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgov Service . add Proposal To Monitor ( it , Ġid , Ġtx Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG ov MsgType . DE POSIT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpair . second . to Msg Deposit (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgov Service . save Proposal ( it . proposal Id , Ġtx Info , Ġit . de positor , Ġis Submit Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgov Service . save Deposit ( it . proposal Id , Ġtx Info , Ġit , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG ov MsgType . V OTE Ġ-> Ġpair . second . to Msg Vote (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgov Service . save Proposal ( it . proposal Id , Ġtx Info , Ġit . v oter , Ġis Submit Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgov Service . save Vote ( tx Info , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠHandle ĠWeight ed Ġvotes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave I bc Channel Data ( tx : ĠService OuterClass . Get Tx Response , Ġtx Info : ĠTx Data ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tx . tx Response . code Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx . body . messages List . filter Ġ{ Ġit . is I bc Timeout On Close () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġmsg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . to Msg Timeout On Close (). packet . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bc Service . save I bc Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . source Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . source Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx . body . messages List . map Ġ{ Ġit . get I bc Channel Events () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Indexed Ġfe @{ Ġidx , Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair Ġ== Ġnull ) Ġreturn @ fe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Attr Ġ= Ġpair . second . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Attr Ġ= Ġpair . second . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( port , Ġchannel ) Ġ= Ġtx . tx Response . logs List [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. events List . first Ġ{ Ġit . type Ġ== Ġpair . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. attributes List . let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . first Ġ{ Ġit . key Ġ== Ġport Attr Ġ}. value Ġto Ġlist . first Ġ{ Ġit . key Ġ== Ġchannel Attr Ġ}. value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bc Service . save I bc Channel ( port , Ġchannel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx . body . messages List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmsg Ġ-> Ġmsg . get I bc Ledger Msgs () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Indexed Ġfe @{ Ġidx , Ġany Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( any Ġ== Ġnull ) Ġreturn @ fe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġledger Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany . type Url . endsWith (" Msg Transfer ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġany . to Msg Transfer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI bc Channel Record . findBy Src Port Src Channel ( msg . source Port , Ġmsg . source Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bc Service . parse Transfer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Ġ= Ġchannel !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenom Ġ= Ġmsg . token . denom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogs Ġ= Ġtx . tx Response . logs List [ idx ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Out Ġ= Ġmsg . token . amount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany . type Url . endsWith (" Msg Recv Packet ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġany . to Msg Recv Packet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠI bc Channel Record . findBy Src Port Src Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . packet . destination Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . packet . destination Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bc Service . parse Recv ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Ġ= Ġchannel !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogs Ġ= Ġtx . tx Response . logs List [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany . type Url . endsWith (" Msg Ack nowledge ment ") Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġany . to Msg Ack nowledge ment () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠI bc Channel Record . findBy Src Port Src Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . packet . source Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . packet . source Channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġmsg . packet . data . toString Utf 8 (). toObject Node () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bc Service . parse Ack nowledge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLed ger Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Ġ= Ġchannel !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogs Ġ= Ġtx . tx Response . logs List [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlogger . debug (" This Ġtype Url Ġis Ġnot Ġyet Ġsupported Ġin Ġas Ġan Ġi bc Ġledger Ġmsg : Ġ${ any . type Url }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġreturn @ fe Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bc Service . save I bc Ledger ( ledger , Ġtx Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Smart Contract Data ( tx : ĠService OuterClass . Get Tx Response , Ġtx Info : ĠTx Data ) Ġ= ĊĠĠĠĠĠĠĠ Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcodes ToBe Saved Ġ= Ġmutable ListOf < Long >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontract sTo Be Saved Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx . body . messages List . map NotNull Ġ{ Ġit . get Associated Sm Contract Msgs () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġfe @{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . forEach Ġ{ Ġpair Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( pair . first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSm Contract Value . CODE Ġ-> Ġcodes ToBe Saved . add ( pair . second Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSm Contract Value . CONTRACT Ġ-> Ġcontract sTo Be Saved . add ( pair . second Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx Response . logs List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . events List Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . type Ġin ĠSm Contract Event Keys . values (). map Ġ{ Ġsc Ġ-> Ġsc . eventType Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Sm Contract Event By Event ( e . type ) !!. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . attributes List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġattr Ġ-> Ġattr . key Ġin Ġit . event Key . keys Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġmp @{ Ġfound Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . event Key [ found . key ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSm Contract Value . CODE Ġ-> Ġcodes ToBe Saved . add ( found . value . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSm Contract Value . CONTRACT Ġ-> Ġcontract sTo Be Saved . add ( found . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn @ mp Ġ// Ġdo Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcodes ToBe Saved . map Ġ{ Ġsm Contract Service . save Code ( it , Ġtx Info ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġcode Ġ-> ĠTx Sm Code Record . insert ( tx Info , Ġcode ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontract sTo Be Saved . associate By Ġ{ Ġcontract Ġ-> Ġsm Contract Service . save Contract ( contract , Ġtx Info ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġcontract Ġ-> ĠTx Sm Contract Record . insert ( tx Info , Ġcontract . key , Ġcontract . value ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġgov Ġproposals ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx . body . messages List . map NotNull Ġ{ Ġit . get Associated G ov Msgs () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . first Ġ== ĠG ov MsgType . PRO POS AL Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . second . to Msg Submit Proposal () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . content . type Url . endsWith (" v 1 beta 1 . Store Code Proposal ") Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . content . unpack ( Proposal . Store Code Proposal :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . content . type Url . endsWith (" v 1 . Store Code Proposal ") Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . content . unpack ( cosm wasm . wasm . v 1 . Proposal . Store Code Proposal :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave Signatures Tx ( tx : ĠService OuterClass . Get Tx Response , Ġtx Info : ĠTx Data ) Ġ= Ġtransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġtx . tx . auth Info . signer Infos List . forEach Ġ{ Ġsig Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature Join Record . insert ( sig . publicKey , ĠSig Join Type . TRANSACTION , Ġtx . tx Response . tx hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAccount Record . findBy Address ( tx . tx . auth Info . fee . gran ter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠT xF eep ayer Record . insert Ignore ( tx Info , ĠF ee Pay er . GRAN TER . name , Ġit . id . value , Ġit . account Address ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠAccount Record . findBy Address ( tx . tx . auth Info . fee . pay er ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠT xF eep ayer Record . insert Ignore ( tx Info , ĠF ee Pay er . PAY ER . name , Ġit . id . value , Ġit . account Address ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġsign ers ĊĠĠĠĠĠĠĠ Ġtx . tx . body . messages List . flatMap Ġ{ Ġit . get Sign ers () Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith ( props . prov Val Oper Prefix ()) Ġ-> Ġit . translate Address ( props ). account Addr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith ( props . prov Acc Prefix ()) Ġ-> Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġlogger (). debug (" Address Ġtype Ġis Ġnot Ġsupported : ĠAddr Ġ$ this "). let Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġaccount Service . save Account ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT xF eep ayer Record . insert Ignore ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ee Pay er . FIRST _ SIGN ER . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 0 ]. id . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 0 ]. account Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSignature Join Record . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . base Account !!. pub Key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSig Join Type . TRANSACTION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtx . tx Response . tx hash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠString . getAddress Type ( props : ĠExplorer Properties ) Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġthis . startsWith ( props . prov Val Oper Prefix ()) Ġ-> ĊĠĠĠĠĠĠĠ ĠPair ( Tx Address Join Type . OPERATOR . name , ĠValidator State Record . findBy Operator ( this )?. operator Addr Id ) ĊĠĠĠ Ġthis . startsWith ( props . prov Acc Prefix ()) Ġ-> ĊĠĠĠĠĠĠĠ ĠPair ( Tx Address Join Type . ACCOUNT . name , ĠAccount Record . findBy Address ( this )?. id ?. value ) ĊĠĠĠ Ġelse Ġ-> Ġlogger (). debug (" Address Ġtype Ġis Ġnot Ġsupported : ĠAddr Ġ$ this "). let Ġ{ Ġnull Ġ} Ċ } Ċ