package Ġorg . echo . mobile . framework . facade . internal Ċ Ċ import Ġcom . google . common . primitives . Unsigned Long Ċ import Ġorg . echo . mobile . framework . Callback Ċ import Ġorg . echo . mobile . framework . ECHO _ AS SET _ ID Ċ import Ġorg . echo . mobile . framework . core . crypto . Crypto Core Component Ċ import Ġorg . echo . mobile . framework . exception . Account NotFoundException Ċ import Ġorg . echo . mobile . framework . exception . Local Exception Ċ import Ġorg . echo . mobile . framework . exception . NotFoundException Ċ import Ġorg . echo . mobile . framework . facade . Bitcoin Side chain Facade Ċ import Ġorg . echo . mobile . framework . model . Account Ċ import Ġorg . echo . mobile . framework . model . Btc Address Ċ import Ġorg . echo . mobile . framework . model . Transaction Result Ċ import Ġorg . echo . mobile . framework . model . operations . Generate Bitcoin Address Operation Ċ import Ġorg . echo . mobile . framework . model . operations . Withdraw Bitcoin Operation Ċ import Ġorg . echo . mobile . framework . model . socket operations . Result Callback Ċ import Ġorg . echo . mobile . framework . service . Database ApiService Ċ import Ġorg . echo . mobile . framework . service . Network Broadcast ApiService Ċ import Ġorg . echo . mobile . framework . support . concurrent . future . Future Task Ċ import Ġorg . echo . mobile . framework . support . concurrent . future . complete Callback Ċ import Ġorg . echo . mobile . framework . support . de material ize Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof Ġ[ Bitcoin Side chain Facade ] Ċ Ġ* Ċ Ġ* ĠWrap s Ġlogic Ġfor Ġside chain Ġprocessing Ċ Ġ* Ċ Ġ* Ġ@ author ĠD mit ri y ĠB ush ue v Ċ Ġ*/ Ċ class ĠBitcoin Side chain Facade Impl ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdatabase ApiService : ĠDatabase ApiService , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnetwork Broadcast ApiService : ĠNetwork Broadcast ApiService , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcrypto Core Component : ĠCrypto Core Component , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnotified Transactions Helper : ĠNotifications Helper < Transaction Result >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtransaction Expiration Delay : ĠLong Ċ ) Ġ: ĊĠĠĠĠĠĠĠ ĠBase Transactions Facade ( database ApiService , Ġcrypto Core Component , Ġtransaction Expiration Delay ), ĊĠĠĠĠĠĠĠ ĠBitcoin Side chain Facade Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Bitcoin Address ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Name Or Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw if : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Address : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Callback : ĠCallback < Boolean >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Callback : ĠResult Callback < Transaction Result > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Id : ĠString ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġfind Account ( account Name Or Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck OwnerAccount ( w if , Ġaccount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġcrypto Core Component . decode From W if ( w if ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Id Ġ= Ġgenerate Address ( account , Ġbackup Address , ĠprivateKey ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Callback . on Success ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Callback . onError ( ex Ġas ? ĠLocal Exception Ġ?: ĠLocal Exception ( ex )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġretrieve Transaction Result ( call Id , Ġresult Callback . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Transaction Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠCallback < Transaction Result > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= ĠFuture Task < Transaction Result >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotified Transactions Helper . subscribe On Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . complete Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġfuture . get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNotFound Exception (" Result Ġof Ġoperation Ġnot Ġfound .") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Success ( result ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . onError ( ex Ġas ? ĠLocal Exception Ġ?: ĠLocal Exception ( ex )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġget Bitcoin Address ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Name Or Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : ĠCallback < Btc Address > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġfind Account ( account Name Or Id ). getObject Id () ĊĠĠĠĠĠĠĠ Ġdatabase ApiService . get Bitcoin Address ( id , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbtc Withdraw ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Name Or Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw if : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtc Address : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfee Asset : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Callback : ĠCallback < Boolean >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Callback : ĠResult Callback < Transaction Result > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Id : ĠString ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġfind Account ( account Name Or Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck OwnerAccount ( w if , Ġaccount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠprivateKey Ġ= Ġcrypto Core Component . decode From W if ( w if ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Id Ġ= Ġwithdraw ( btc Address , Ġaccount , ĠprivateKey , Ġvalue , Ġfee Asset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Callback . on Success ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Callback . onError ( exception Ġas ? ĠLocal Exception Ġ?: ĠLocal Exception ( exception )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġretrieve Transaction Result ( call Id , Ġresult Callback . get ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwithdraw ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtc Address : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount : ĠAccount , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprivateKey : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfee Asset : ĠString ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWith draw Bitcoin Operation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccount ( account . getObject Id ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtc Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnsigned Long . valueOf ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġconfigure Transaction ( operation , ĠprivateKey , Ġfee Asset ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnetwork Broadcast ApiService . broadcast Transaction With Callback ( transaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. de material ize (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Address ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount : ĠAccount , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Address : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprivateKey : ĠByteArray ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGenerate Bitcoin Address Operation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccount ( account . getObject Id ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackup Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġconfigure Transaction ( operation , ĠprivateKey , ĠE CHO _ AS SET _ ID ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnetwork Broadcast ApiService . broadcast Transaction With Callback ( transaction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. de material ize (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Account ( name Or Id : ĠString ): ĠAccount Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccounts Map Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase ApiService . getFull Accounts ( listOf ( name Or Id ), Ġfalse ). de material ize () ĊĠĠĠĠĠĠĠ Ġreturn Ġaccounts Map [ name Or Id ]?. account ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAccount NotFoundException (" Unable Ġto Ġfind Ġrequired Ġaccount Ġ$ name Or Id ") ĊĠĠĠ Ġ} Ċ Ċ }