22
33const Client = require ( 'bitcoin-core' )
44const config = require ( 'config' )
5+ const lodash = require ( 'lodash' )
56
6- const EncryptionKeys = require ( './lib/EncryptionKeys.js' )
7- const Logger = require ( './lib/Logger.js' )
8- const PreFlight = require ( './lib/PreFlight.js' )
9- const RefillOutgoing = require ( './lib/RefillOutgoing.js' )
10- const SelectOutgoing = require ( './lib/SelectOutgoing.js' )
11- const ReturnAllToSenders = require ( './lib/ReturnAllToSenders.js' )
12- const PrepareIncoming = require ( './lib/PrepareIncoming.js' )
13- const RetrieveSubchainAddresses = require ( './lib/RetrieveSubchainAddresses.js' )
14- const ProcessIncoming = require ( './lib/ProcessIncoming.js' )
15- const SpendToHolding = require ( './lib/SpendToHolding.js' )
7+ let EncryptionKeys = require ( './lib/EncryptionKeys.js' ) //eslint-disable-line
8+ let Logger = require ( './lib/Logger.js' ) //eslint-disable-line
9+ let PreFlight = require ( './lib/PreFlight.js' ) //eslint-disable-line
10+ let RefillOutgoing = require ( './lib/RefillOutgoing.js' ) //eslint-disable-line
11+ let SelectOutgoing = require ( './lib/SelectOutgoing.js' ) //eslint-disable-line
12+ let ReturnAllToSenders = require ( './lib/ReturnAllToSenders.js' ) //eslint-disable-line
13+ let PrepareIncoming = require ( './lib/PrepareIncoming.js' ) //eslint-disable-line
14+ let RetrieveSubchainAddresses = require ( './lib/RetrieveSubchainAddresses.js' ) //eslint-disable-line
15+ let ProcessIncoming = require ( './lib/ProcessIncoming.js' ) //eslint-disable-line
16+ let SpendToHolding = require ( './lib/SpendToHolding.js' ) //eslint-disable-line
1617
1718const settings = config . get ( 'INCOMING' )
1819
@@ -41,10 +42,11 @@ IncomingServer.init = () => {
4142
4243 Logger . writeLog ( 'INC_000' , 'server starting' )
4344 EncryptionKeys . findKeysToRemove ( { type : 'private' } , IncomingServer . startProcessing )
44- setInterval ( ( ) => {
45+ IncomingServer . cron = setInterval ( ( ) => {
4546 if ( IncomingServer . paused === false ) {
4647 EncryptionKeys . findKeysToRemove ( { type : 'private' } , IncomingServer . startProcessing )
4748 } else {
49+ clearInterval ( IncomingServer . cron )
4850 Logger . writeLog ( 'INC_001' , 'processing paused' , { paused : IncomingServer . paused } )
4951 }
5052 } , settings . scriptInterval )
@@ -80,6 +82,7 @@ IncomingServer.holdingProcessed = (success, data) => {
8082 if ( ! success ) {
8183 Logger . writeLog ( 'INC_004' , 'failed to process the holding account' , { success, data } , true )
8284 IncomingServer . processing = false
85+ IncomingServer . paused = true
8386 return
8487 }
8588 SelectOutgoing . run ( {
@@ -96,6 +99,9 @@ IncomingServer.outgoingSelected = (success, data) => {
9699 }
97100
98101 if ( data . returnAllToSenders ) {
102+ if ( data . pause ) {
103+ IncomingServer . paused = true
104+ }
99105 ReturnAllToSenders . run ( {
100106 navClient : IncomingServer . navClient ,
101107 } , IncomingServer . allPendingReturned )
@@ -111,14 +117,15 @@ IncomingServer.outgoingSelected = (success, data) => {
111117 navClient : IncomingServer . navClient ,
112118 outgoingNavBalance : data . outgoingNavBalance ,
113119 subBalance : IncomingServer . runtime . subBalance ,
120+ settings,
114121 } , IncomingServer . currentBatchPrepared )
115122}
116123
117124IncomingServer . allPendingReturned = ( success , data ) => {
118- console . log ( 'STATUS: IncomingServer.allPendingReturned' , success , data )
119125 if ( ! success ) {
120126 Logger . writeLog ( 'INC_006' , 'failed to return all pending to sender' , { success, data } , true )
121127 IncomingServer . processing = false
128+ IncomingServer . paused = true
122129 return
123130 }
124131 Logger . writeLog ( 'INC_007' , 'returned all pending to sender' , { success, data } , true )
@@ -127,15 +134,55 @@ IncomingServer.allPendingReturned = (success, data) => {
127134}
128135
129136IncomingServer . currentBatchPrepared = ( success , data ) => {
130- if ( ! success || ! data || ! data . currentBatch ) {
137+ if ( ! success || ! data || ( ( ! data . currentBatch || ! data . currentFlattened || ! data . numFlattened ) && ! data . pendingToReturn ) ) {
138+ Logger . writeLog ( 'INC_011D' , 'prepareIncoming returned bad data' , { success, data } )
131139 IncomingServer . processing = false
132140 return
133141 }
142+
134143 IncomingServer . runtime . currentBatch = data . currentBatch
144+ IncomingServer . runtime . currentFlattened = data . currentFlattened
145+ IncomingServer . runtime . numFlattened = data . numFlattened
146+ IncomingServer . runtime . pendingToReturn = data . pendingToReturn
147+
148+ if ( IncomingServer . runtime . pendingToReturn && IncomingServer . runtime . pendingToReturn . length > 0 ) {
149+ Logger . writeLog ( 'INC_011' , 'failed to process some transactions' , { success, data } , true )
150+ ReturnAllToSenders . fromList ( {
151+ navClient : IncomingServer . navClient ,
152+ transactionsToReturn : IncomingServer . runtime . pendingToReturn ,
153+ } , IncomingServer . pendingFailedReturned )
154+ return
155+ }
156+
157+ if ( ! IncomingServer . runtime . currentBatch || lodash . size ( IncomingServer . runtime . currentBatch ) === 0 ) {
158+ Logger . writeLog ( 'INC_011B' , 'no currentBatch to process' , { currentBatch : IncomingServer . runtime . currentBatch } )
159+ IncomingServer . processing = false
160+ return
161+ }
162+ RetrieveSubchainAddresses . run ( {
163+ subClient : IncomingServer . subClient ,
164+ chosenOutgoing : IncomingServer . runtime . chosenOutgoing ,
165+ numAddresses : IncomingServer . runtime . numFlattened ,
166+ } , IncomingServer . retrievedSubchainAddresses )
167+ }
168+
169+ IncomingServer . pendingFailedReturned = ( success , data ) => {
170+ if ( ! success ) {
171+ Logger . writeLog ( 'INC_011A' , 'failed to return failed pending to sender' , { success, data } , true )
172+ IncomingServer . paused = true
173+ ReturnAllToSenders . run ( {
174+ navClient : IncomingServer . navClient ,
175+ } , IncomingServer . allPendingReturned )
176+ }
177+ if ( ! IncomingServer . runtime . currentBatch || lodash . size ( IncomingServer . runtime . currentBatch ) === 0 ) {
178+ Logger . writeLog ( 'INC_011C' , 'no currentBatch to process' , { currentBatch : IncomingServer . runtime . currentBatch } )
179+ IncomingServer . processing = false
180+ return
181+ }
135182 RetrieveSubchainAddresses . run ( {
136183 subClient : IncomingServer . subClient ,
137184 chosenOutgoing : IncomingServer . runtime . chosenOutgoing ,
138- currentBatch : data . currentBatch ,
185+ numAddresses : IncomingServer . runtime . numFlattened ,
139186 } , IncomingServer . retrievedSubchainAddresses )
140187}
141188
@@ -147,8 +194,10 @@ IncomingServer.retrievedSubchainAddresses = (success, data) => {
147194 } , IncomingServer . allPendingReturned )
148195 return
149196 }
197+ // @TODO compile the correct transactions to return
150198 ProcessIncoming . run ( {
151199 currentBatch : IncomingServer . runtime . currentBatch ,
200+ currentFlattened : IncomingServer . runtime . currentFlattened ,
152201 outgoingPubKey : IncomingServer . runtime . outgoingPubKey ,
153202 subClient : IncomingServer . subClient ,
154203 navClient : IncomingServer . navClient ,
@@ -159,21 +208,38 @@ IncomingServer.retrievedSubchainAddresses = (success, data) => {
159208
160209IncomingServer . transactionsProcessed = ( success , data ) => {
161210 if ( ! success || ! data ) {
211+ if ( data && data . partialFailure ) {
212+ Logger . writeLog ( 'INC_010A' , 'failed part way through processing subchain transactions' , { success, data } , true )
213+ IncomingServer . paused = true
214+ IncomingServer . processing = false
215+ return
216+ }
162217 Logger . writeLog ( 'INC_010' , 'failed to process transactions' , { success, data } , true )
218+ IncomingServer . paused = true
163219 ReturnAllToSenders . run ( {
164220 navClient : IncomingServer . navClient ,
165221 } , IncomingServer . allPendingReturned )
166222 return
167223 }
168224
169- IncomingServer . runtime . successfulSubTransactions = data . successfulSubTransactions
170- IncomingServer . runtime . transactionsToReturn = data . transactionsToReturn
225+ IncomingServer . runtime . successfulTxGroups = data . successfulTxGroups
226+ IncomingServer . runtime . txGroupsToReturn = data . txGroupsToReturn
227+ IncomingServer . runtime . transactionsToReturn = [ ]
171228
172- if ( IncomingServer . runtime . transactionsToReturn && IncomingServer . runtime . transactionsToReturn . length > 0 ) {
229+ if ( IncomingServer . runtime . txGroupsToReturn && IncomingServer . runtime . txGroupsToReturn . length > 0 ) {
173230 Logger . writeLog ( 'INC_011' , 'failed to process some transactions' , { success, data } , true )
231+
232+ // extract the relevant transactions to return from the txGroupsToReturn
233+ for ( let i = 0 ; i < IncomingServer . runtime . txGroupsToReturn . length ; i ++ ) {
234+ const txGroup = IncomingServer . runtime . txGroupsToReturn [ i ]
235+ for ( let j = 0 ; j < txGroup . transactions . length ; j ++ ) {
236+ IncomingServer . runtime . transactionsToReturn . push ( txGroup . transactions [ j ] )
237+ }
238+ }
239+
174240 ReturnAllToSenders . fromList ( {
175241 navClient : IncomingServer . navClient ,
176- transactionsToReturn : data . transactionsToReturn ,
242+ transactionsToReturn : IncomingServer . runtime . transactionsToReturn ,
177243 } , IncomingServer . failedTransactionsReturned )
178244 return
179245 }
@@ -182,8 +248,18 @@ IncomingServer.transactionsProcessed = (success, data) => {
182248
183249IncomingServer . failedTransactionsReturned = ( success , data ) => {
184250 if ( ! success ) {
251+ IncomingServer . paused = true
185252 Logger . writeLog ( 'INC_012' , 'failed to return failed transactions to sender' , { success, data } , true )
186253 }
254+ IncomingServer . runtime . successfulSubTransactions = [ ]
255+ // extract the relevant transactions to return from the txGroupsToReturn
256+ for ( let i = 0 ; i < IncomingServer . runtime . successfulTxGroups . length ; i ++ ) {
257+ const txGroup = IncomingServer . runtime . successfulTxGroups [ i ]
258+ lodash . forEach ( txGroup . transactions , ( transaction ) => {
259+ IncomingServer . runtime . successfulSubTransactions . push ( transaction )
260+ } )
261+ }
262+
187263 SpendToHolding . run ( {
188264 successfulSubTransactions : IncomingServer . runtime . successfulSubTransactions ,
189265 holdingEncrypted : IncomingServer . runtime . holdingEncrypted ,
0 commit comments