@@ -272,8 +272,10 @@ const BLOCKCHAIN_TO_BIP44 = {
272272 [ Blockchain . NEO ] : BIP44 . NEO
273273}
274274
275+ const ORDERS_REMAINING_TO_AUTOSYNC_AT = 20
275276const NEP5_OLD_ASSETS = [ 'nos' , 'phx' , 'guard' , 'lx' , 'ava' ]
276277export const MISSING_NONCES = 'missing_asset_nonces'
278+ export const MAX_ORDERS_REACHED = 'Maximal number of orders have been reached'
277279export const MAX_SIGN_STATE_RECURSION = 5
278280
279281export class Client {
@@ -317,7 +319,7 @@ export class Client {
317319 private tradedAssets : string [ ] = [ ]
318320 private assetNonces : { [ key : string ] : number [ ] }
319321 private currentOrderNonce : number
320-
322+ private signStateInProgress : boolean
321323 /**
322324 * Create a new instance of [[Client]]
323325 *
@@ -337,6 +339,7 @@ export class Client {
337339 ...opts
338340 }
339341 this . clientOpts = {
342+ autoSignState : true ,
340343 runRequestsOverWebsockets : false ,
341344 headers : { } ,
342345 ...clientOpts
@@ -1608,6 +1611,8 @@ export class Client {
16081611 public async getSignAndSyncStates (
16091612 sync = false
16101613 ) : Promise < SyncStatesData | SignStatesData > {
1614+ this . signStateInProgress = true
1615+
16111616 const emptyStates : GetStatesData = {
16121617 states : [ ] ,
16131618 recycledOrders : [ ] ,
@@ -1616,6 +1621,8 @@ export class Client {
16161621 const signStatesRecursive : SignStatesData = await this . signStates (
16171622 emptyStates
16181623 )
1624+ this . signStateInProgress = false
1625+
16191626 if ( sync ) {
16201627 const syncResult = await this . syncStates ( signStatesRecursive )
16211628 return syncResult
@@ -1936,10 +1943,22 @@ export class Client {
19361943 } )
19371944 measurementPlaceOrder . end ( )
19381945 measurementPlaceLimitOrder . end ( )
1946+
1947+ await this . handleOrderPlaced ( result . data . placeLimitOrder )
1948+
19391949 return result . data . placeLimitOrder
19401950 } catch ( e ) {
1951+ let replaceOrder = false
19411952 if ( e . message . includes ( MISSING_NONCES ) ) {
1953+ replaceOrder = true
19421954 await this . updateTradedAssetNonces ( )
1955+ } else if ( e . message . includes ( MAX_ORDERS_REACHED ) ) {
1956+ if ( this . clientOpts . autoSignState && ! this . signStateInProgress ) {
1957+ replaceOrder = true
1958+ await this . getSignAndSyncStates ( )
1959+ }
1960+ }
1961+ if ( replaceOrder ) {
19431962 return await this . placeLimitOrder (
19441963 allowTaker ,
19451964 amount ,
@@ -2026,12 +2045,23 @@ export class Client {
20262045 } )
20272046 measurementPlaceOrder . end ( )
20282047 measurementPlaceMarketOrder . end ( )
2048+ await this . handleOrderPlaced ( result . data . placeMarketOrder )
20292049 return result . data . placeMarketOrder
20302050 } catch ( e ) {
2051+ let replaceOrder = false
20312052 if ( e . message . includes ( MISSING_NONCES ) ) {
2053+ replaceOrder = true
20322054 await this . updateTradedAssetNonces ( )
2055+ } else if ( e . message . includes ( MAX_ORDERS_REACHED ) ) {
2056+ if ( this . clientOpts . autoSignState && ! this . signStateInProgress ) {
2057+ replaceOrder = true
2058+ await this . getSignAndSyncStates ( )
2059+ }
2060+ }
2061+ if ( replaceOrder ) {
20332062 return await this . placeMarketOrder ( amount , buyOrSell , marketName )
20342063 }
2064+
20352065 return this . handleOrderError ( e , signedPayload )
20362066 }
20372067 }
@@ -2136,11 +2166,20 @@ export class Client {
21362166 } )
21372167 measurementPlaceOrder . end ( )
21382168 measurementPlaceMarketOrder . end ( )
2139-
2169+ await this . handleOrderPlaced ( result . data . placeStopLimitOrder )
21402170 return result . data . placeStopLimitOrder
21412171 } catch ( e ) {
2172+ let replaceOrder = false
21422173 if ( e . message . includes ( MISSING_NONCES ) ) {
2174+ replaceOrder = true
21432175 await this . updateTradedAssetNonces ( )
2176+ } else if ( e . message . includes ( MAX_ORDERS_REACHED ) ) {
2177+ if ( this . clientOpts . autoSignState && ! this . signStateInProgress ) {
2178+ replaceOrder = true
2179+ await this . getSignAndSyncStates ( )
2180+ }
2181+ }
2182+ if ( replaceOrder ) {
21442183 return await this . placeStopLimitOrder (
21452184 allowTaker ,
21462185 amount ,
@@ -2238,10 +2277,20 @@ export class Client {
22382277 } )
22392278 measurementPlaceOrder . end ( )
22402279 measurementPlaceMarketOrder . end ( )
2280+ await this . handleOrderPlaced ( result . data . placeStopMarketOrder )
22412281 return result . data . placeStopMarketOrder
22422282 } catch ( e ) {
2283+ let replaceOrder = false
22432284 if ( e . message . includes ( MISSING_NONCES ) ) {
2285+ replaceOrder = true
22442286 await this . updateTradedAssetNonces ( )
2287+ } else if ( e . message . includes ( MAX_ORDERS_REACHED ) ) {
2288+ if ( this . clientOpts . autoSignState && ! this . signStateInProgress ) {
2289+ replaceOrder = true
2290+ await this . getSignAndSyncStates ( )
2291+ }
2292+ }
2293+ if ( replaceOrder ) {
22452294 return await this . placeStopMarketOrder (
22462295 amount ,
22472296 buyOrSell ,
@@ -2254,6 +2303,17 @@ export class Client {
22542303 }
22552304 }
22562305
2306+ private handleOrderPlaced = async ( order : OrderPlaced ) : Promise < void > => {
2307+ if (
2308+ this . clientOpts . autoSignState &&
2309+ order . ordersTillSignState < ORDERS_REMAINING_TO_AUTOSYNC_AT &&
2310+ ! this . signStateInProgress
2311+ ) {
2312+ console . info ( 'Will auto sign state: ' , order . ordersTillSignState )
2313+ await this . getSignAndSyncStates ( )
2314+ }
2315+ }
2316+
22572317 private handleOrderError ( error : Error , signedPayload : any ) : any {
22582318 if ( error . message . includes ( MISSING_NONCES ) ) {
22592319 this . updateTradedAssetNonces ( )
0 commit comments