package Ġcom . d 3 . btc . withdraw al . handler Ċ Ċ import Ġcom . d 3 . btc . withdraw al . service . Btc Rollback Service Ċ import Ġcom . d 3 . btc . withdraw al . statistics . Withdraw al Statistics Ċ import Ġcom . d 3 . btc . withdraw al . transaction . Sign Collector Ċ import Ġcom . d 3 . btc . withdraw al . transaction . Transaction Helper Ċ import Ġcom . d 3 . btc . withdraw al . transaction . Unsigned Transactions Ċ import Ġcom . d 3 . commons . side chain . iro ha . BTC _ SIGN _ COLLECT _ DOMAIN Ċ import Ġcom . github . kit tin un f . result . map Ċ import Ġi ro ha . protocol . Commands Ċ import Ġmu . K Logging Ċ import Ġorg . bitcoin j . core . Peer Group Ċ import Ġorg . bitcoin j . core . Transaction Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ /* ĊĠĠĠ ĠClass Ġthat Ġis Ġused Ġto Ġhandle Ġnew Ġinput Ġsignature Ġappearance Ġevents Ċ Ġ*/ Ċ @ Component Ċ class ĠNew Signature EventHandler ( ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġwithdraw al Statistics : ĠWith draw al Statistics , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġsign Collector : ĠSign Collector , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġunsigned Transactions : ĠUnsigned Transactions , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġtransaction Helper : ĠTransaction Helper , ĊĠĠĠ Ġ@ Autowired Ġprivate Ġval Ġbtc Rollback Service : ĠB tc Rollback Service Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbroadcast Transaction Listeners Ġ= ĠCopy On Write ArrayList <( tx : ĠTransaction ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġ" broadcast Ġtransaction " Ġevent Ġlistener ĊĠĠĠĠ Ġ* ĠFor Ġtesting Ġpurposes Ġonly . ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġ- Ġfunction Ġthat Ġwill Ġbe Ġcalled Ġwhen Ġa Ġtransaction Ġis Ġabout Ġto Ġbe Ġbroadcast ed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Broadcast Transaction Listeners ( listener : Ġ( tx : ĠTransaction ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbroadcast Transaction Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġ" add Ġnew Ġinput Ġsignatures " Ġcommands ĊĠĠĠĠ Ġ* Ġ@ param Ġadd New Signature Command Ġ- Ġcommand Ġobject Ġfull Ġof Ġsignatures ĊĠĠĠĠ Ġ* Ġ@ param Ġpeer Group Ġ- Ġgroup Ġof ĠBitcoin Ġpeers . ĠUsed Ġto Ġbroadcast Ġwithdraw Ġtransactions . ĊĠĠĠĠ Ġ* Ġ@ param Ġon Broadcast Success Ġ- Ġfunction Ġthat Ġwill Ġbe Ġcalled Ġright Ġafter Ġsuccessful Ġtx Ġbroadcast ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhandle New Signature Command ( ĊĠĠĠĠĠĠĠ Ġadd New Signature Command : ĠCommands . Set Account Detail , ĊĠĠĠĠĠĠĠ Ġpeer Group : ĠPeer Group , ĊĠĠĠĠĠĠĠ Ġon Broadcast Success : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshort Tx Hash Ġ= Ġadd New Signature Command . accountId . replace ("@ $ BTC _ SIGN _ COLLECT _ DOMAIN ", Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġunsigned Tx Ġ= Ġunsigned Transactions . get ( short Tx Hash ) ĊĠĠĠĠĠĠĠ Ġif Ġ( unsigned Tx Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" No Ġtx Ġstarting Ġwith Ġhash Ġ$ short Tx Hash Ġwas Ġfound Ġin Ġcollection Ġof Ġunsigned Ġtransactions " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġwithdraw al Command Ġ= Ġunsigned Tx . withdraw al Details ĊĠĠĠĠĠĠĠ Ġval Ġtx Ġ= Ġunsigned Tx . tx ĊĠĠĠĠĠĠĠ Ġ// ĠHash Ġof Ġtransaction Ġwill Ġbe Ġchanged Ġafter Ġsigning . ĠThis Ġis Ġwhy Ġwe Ġkeep Ġan Ġ" original " Ġhash ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Hash Ġ= Ġtx . hash AsString ĊĠĠĠĠĠĠĠ Ġsign Collector . get Signatures ( original Hash ). fold ({ Ġsignatures Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenough Signatures Collected Ġ= Ġsign Collector . is En ough Signatures Collected ( tx , Ġsignatures ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! en ough Signatures Collected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Not Ġenough Ġsignatures Ġwere Ġcollected Ġfor Ġtx Ġ$ original Hash " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Tx Ġ$ original Hash Ġhas Ġenough Ġsignatures " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign Collector . fill Tx With Signatures ( tx , Ġsignatures ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunsigned Transactions . remove ( short Tx Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Tx ( origin ally Ġknown Ġas Ġ$ original Hash ) Ġis Ġready Ġto Ġbe Ġbroadcast ed Ġ$ tx " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbroadcast Transaction Listeners . forEach Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( tx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Wait Ġuntil Ġit Ġis Ġbroadcast ed Ġto Ġall Ġconnected Ġpeers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Group . broadcast Transaction ( tx ). future (). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Broadcast Success () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. fold ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Tx Ġ${ tx . hash AsString } Ġwas Ġsuccessfully Ġbroadcast ed " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Statistics . inc Succeeded Trans fers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Helper . unregister Un sp ents ( original Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Statistics . inc Failed Trans fers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Cannot Ġcomplete Ġtx Ġ$ original Hash ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtc Rollback Service . rollback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Command . source AccountId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Command . amount Sat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Command . withdraw al Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġcomplete ĠBitcoin Ġtransaction " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġex Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtc Rollback Service . rollback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Command . source AccountId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Command . amount Sat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Command . withdraw al Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġget Ġsignatures Ġfor ĠBitcoin Ġtransaction " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwithdraw al Statistics . inc Failed Trans fers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Cannot Ġget Ġsignatures Ġfor Ġtx Ġ$ original Hash ", Ġex ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLogger ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Logging () Ċ } Ċ