2
2
3
3
const Client = require ( 'bitcoin-core' )
4
4
const config = require ( 'config' )
5
+ const lodash = require ( 'lodash' )
5
6
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
16
17
17
18
const settings = config . get ( 'INCOMING' )
18
19
@@ -41,10 +42,11 @@ IncomingServer.init = () => {
41
42
42
43
Logger . writeLog ( 'INC_000' , 'server starting' )
43
44
EncryptionKeys . findKeysToRemove ( { type : 'private' } , IncomingServer . startProcessing )
44
- setInterval ( ( ) => {
45
+ IncomingServer . cron = setInterval ( ( ) => {
45
46
if ( IncomingServer . paused === false ) {
46
47
EncryptionKeys . findKeysToRemove ( { type : 'private' } , IncomingServer . startProcessing )
47
48
} else {
49
+ clearInterval ( IncomingServer . cron )
48
50
Logger . writeLog ( 'INC_001' , 'processing paused' , { paused : IncomingServer . paused } )
49
51
}
50
52
} , settings . scriptInterval )
@@ -80,6 +82,7 @@ IncomingServer.holdingProcessed = (success, data) => {
80
82
if ( ! success ) {
81
83
Logger . writeLog ( 'INC_004' , 'failed to process the holding account' , { success, data } , true )
82
84
IncomingServer . processing = false
85
+ IncomingServer . paused = true
83
86
return
84
87
}
85
88
SelectOutgoing . run ( {
@@ -96,6 +99,9 @@ IncomingServer.outgoingSelected = (success, data) => {
96
99
}
97
100
98
101
if ( data . returnAllToSenders ) {
102
+ if ( data . pause ) {
103
+ IncomingServer . paused = true
104
+ }
99
105
ReturnAllToSenders . run ( {
100
106
navClient : IncomingServer . navClient ,
101
107
} , IncomingServer . allPendingReturned )
@@ -111,14 +117,15 @@ IncomingServer.outgoingSelected = (success, data) => {
111
117
navClient : IncomingServer . navClient ,
112
118
outgoingNavBalance : data . outgoingNavBalance ,
113
119
subBalance : IncomingServer . runtime . subBalance ,
120
+ settings,
114
121
} , IncomingServer . currentBatchPrepared )
115
122
}
116
123
117
124
IncomingServer . allPendingReturned = ( success , data ) => {
118
- console . log ( 'STATUS: IncomingServer.allPendingReturned' , success , data )
119
125
if ( ! success ) {
120
126
Logger . writeLog ( 'INC_006' , 'failed to return all pending to sender' , { success, data } , true )
121
127
IncomingServer . processing = false
128
+ IncomingServer . paused = true
122
129
return
123
130
}
124
131
Logger . writeLog ( 'INC_007' , 'returned all pending to sender' , { success, data } , true )
@@ -127,15 +134,55 @@ IncomingServer.allPendingReturned = (success, data) => {
127
134
}
128
135
129
136
IncomingServer . 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 } )
131
139
IncomingServer . processing = false
132
140
return
133
141
}
142
+
134
143
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
+ }
135
182
RetrieveSubchainAddresses . run ( {
136
183
subClient : IncomingServer . subClient ,
137
184
chosenOutgoing : IncomingServer . runtime . chosenOutgoing ,
138
- currentBatch : data . currentBatch ,
185
+ numAddresses : IncomingServer . runtime . numFlattened ,
139
186
} , IncomingServer . retrievedSubchainAddresses )
140
187
}
141
188
@@ -147,8 +194,10 @@ IncomingServer.retrievedSubchainAddresses = (success, data) => {
147
194
} , IncomingServer . allPendingReturned )
148
195
return
149
196
}
197
+ // @TODO compile the correct transactions to return
150
198
ProcessIncoming . run ( {
151
199
currentBatch : IncomingServer . runtime . currentBatch ,
200
+ currentFlattened : IncomingServer . runtime . currentFlattened ,
152
201
outgoingPubKey : IncomingServer . runtime . outgoingPubKey ,
153
202
subClient : IncomingServer . subClient ,
154
203
navClient : IncomingServer . navClient ,
@@ -159,21 +208,38 @@ IncomingServer.retrievedSubchainAddresses = (success, data) => {
159
208
160
209
IncomingServer . transactionsProcessed = ( success , data ) => {
161
210
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
+ }
162
217
Logger . writeLog ( 'INC_010' , 'failed to process transactions' , { success, data } , true )
218
+ IncomingServer . paused = true
163
219
ReturnAllToSenders . run ( {
164
220
navClient : IncomingServer . navClient ,
165
221
} , IncomingServer . allPendingReturned )
166
222
return
167
223
}
168
224
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 = [ ]
171
228
172
- if ( IncomingServer . runtime . transactionsToReturn && IncomingServer . runtime . transactionsToReturn . length > 0 ) {
229
+ if ( IncomingServer . runtime . txGroupsToReturn && IncomingServer . runtime . txGroupsToReturn . length > 0 ) {
173
230
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
+
174
240
ReturnAllToSenders . fromList ( {
175
241
navClient : IncomingServer . navClient ,
176
- transactionsToReturn : data . transactionsToReturn ,
242
+ transactionsToReturn : IncomingServer . runtime . transactionsToReturn ,
177
243
} , IncomingServer . failedTransactionsReturned )
178
244
return
179
245
}
@@ -182,8 +248,18 @@ IncomingServer.transactionsProcessed = (success, data) => {
182
248
183
249
IncomingServer . failedTransactionsReturned = ( success , data ) => {
184
250
if ( ! success ) {
251
+ IncomingServer . paused = true
185
252
Logger . writeLog ( 'INC_012' , 'failed to return failed transactions to sender' , { success, data } , true )
186
253
}
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
+
187
263
SpendToHolding . run ( {
188
264
successfulSubTransactions : IncomingServer . runtime . successfulSubTransactions ,
189
265
holdingEncrypted : IncomingServer . runtime . holdingEncrypted ,
0 commit comments