@@ -184,7 +184,9 @@ import {
184184 Asset ,
185185 MissingNonceError ,
186186 InsufficientFundsError ,
187- PlaceLimitOrderParams
187+ PlaceLimitOrderParams ,
188+ OrdersPlaced ,
189+ OrdersCancelledAndPlaced
188190} from '../types'
189191import {
190192 ClientMode ,
@@ -3924,13 +3926,62 @@ export class Client {
39243926
39253927 public async placeLimitOrders (
39263928 params : PlaceLimitOrderParams [ ]
3927- ) : Promise < OrderPlaced [ ] > {
3929+ ) : Promise < OrdersPlaced > {
39283930 await this . prefillRPoolIfNeededForAssets (
39293931 params [ 0 ] . limitPrice . currencyA ,
39303932 params [ 0 ] . limitPrice . currencyB
39313933 )
39323934
3933- const placeLimitOrderPayloads = await Promise . all (
3935+ const placeLimitOrderPayloads = await this . generatePlaceOrdersParams ( params )
3936+
3937+ const names = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] . slice (
3938+ 0 ,
3939+ placeLimitOrderPayloads . length
3940+ )
3941+ const paramNames = names
3942+ . map ( name => `$p${ name } :PlaceLimitOrderParams!, $s${ name } :Signature!` )
3943+ . join ( ',' )
3944+ const aliases = names
3945+ . map (
3946+ name =>
3947+ ` ${ name } : placeLimitOrder(affiliateDeveloperCode: $affiliateDeveloperCode, payload: $p${ name } , signature: $s${ name } ) {\n id\n status\n ordersTillSignState\n }`
3948+ )
3949+ . join ( '\n' )
3950+ const mutationStr = `mutation placeLimitOrders($affiliateDeveloperCode: AffiliateDeveloperCode, ${ paramNames } ) {\n${ aliases } \n}`
3951+ const mutation = gqlstring ( mutationStr )
3952+
3953+ const variables = {
3954+ affiliateDeveloperCode : this . affiliateDeveloperCode
3955+ }
3956+
3957+ placeLimitOrderPayloads . forEach ( ( item , index ) => {
3958+ variables [ `p${ names [ index ] } ` ] = item . signedPayload
3959+ variables [ `s${ names [ index ] } ` ] = item . signature
3960+ } )
3961+
3962+ try {
3963+ const result = await this . gql . mutate ( {
3964+ mutation,
3965+ variables
3966+ } )
3967+
3968+ return {
3969+ orders : Object . keys ( result . data ) . map (
3970+ k => result . data [ k ]
3971+ ) as OrderPlaced [ ]
3972+ }
3973+ } catch ( e ) {
3974+ return {
3975+ error : e ,
3976+ orders : [ ]
3977+ }
3978+ }
3979+ }
3980+
3981+ private generatePlaceOrdersParams = async (
3982+ params : PlaceLimitOrderParams [ ]
3983+ ) : Promise < PayloadSignature [ ] > => {
3984+ return await Promise . all (
39343985 params . map ( async param => {
39353986 const { nonceOrder, noncesFrom, noncesTo } = this . getNoncesForTrade (
39363987 param . marketName ,
@@ -3960,43 +4011,107 @@ export class Client {
39604011 return signedPayload
39614012 } )
39624013 )
4014+ }
39634015
3964- const names = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] . slice (
3965- 0 ,
3966- placeLimitOrderPayloads . length
4016+ /**
4017+ * Cancel a list of orders by ID.
4018+ *
4019+ * @param orderID[]
4020+ * @returns
4021+ *
4022+ * Example
4023+ * ```
4024+ * const cancelledOrders = await nash.cancelOrder(['11','12'])
4025+ * console.log(cancelledOrders)
4026+ * ```
4027+ */
4028+ public async cancelAndPlaceOrders (
4029+ orderIDs : string [ ] ,
4030+ marketName : string ,
4031+ orders : PlaceLimitOrderParams [ ]
4032+ ) : Promise < OrdersCancelledAndPlaced > {
4033+ const [ a , b ] = marketName . split ( '_' )
4034+ await this . prefillRPoolIfNeededForAssets (
4035+ a as CryptoCurrency ,
4036+ b as CryptoCurrency
39674037 )
3968- const paramNames = names
4038+
4039+ const cancelOrdersPayloads = await Promise . all (
4040+ orderIDs . map ( async id => {
4041+ const cancelOrderParams = createCancelOrderParams ( id , marketName )
4042+ const signedPayload = await this . signPayload ( cancelOrderParams )
4043+ return signedPayload
4044+ } )
4045+ )
4046+
4047+ const placeLimitOrderPayloads = await this . generatePlaceOrdersParams ( orders )
4048+
4049+ const allNames = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' ]
4050+ const cancelNames = allNames . slice ( 0 , cancelOrdersPayloads . length )
4051+ const cancelParams = cancelNames
4052+ . map ( name => `$p${ name } :CancelOrderParams!, $s${ name } :Signature!` )
4053+ . join ( ',' )
4054+ const cancelAliases = cancelNames
4055+ . map (
4056+ name =>
4057+ ` ${ name } : cancelOrder(payload: $p${ name } , signature: $s${ name } ) { orderId }`
4058+ )
4059+ . join ( '\n' )
4060+
4061+ const placeNames = allNames . slice (
4062+ cancelOrdersPayloads . length ,
4063+ cancelOrdersPayloads . length + orders . length
4064+ )
4065+ const placeOrderParams = placeNames
39694066 . map ( name => `$p${ name } :PlaceLimitOrderParams!, $s${ name } :Signature!` )
39704067 . join ( ',' )
3971- const aliases = names
4068+ const placeOrderAliases = placeNames
39724069 . map (
39734070 name =>
39744071 ` ${ name } : placeLimitOrder(affiliateDeveloperCode: $affiliateDeveloperCode, payload: $p${ name } , signature: $s${ name } ) {\n id\n status\n ordersTillSignState\n }`
39754072 )
39764073 . join ( '\n' )
3977- const mutationStr = `mutation placeLimitOrders($affiliateDeveloperCode: AffiliateDeveloperCode, ${ paramNames } ) {\n${ aliases } \n}`
4074+
4075+ const mutationStr = `mutation cancelAndPlaceOrders(${ cancelParams } , ${ placeOrderParams } ${
4076+ placeLimitOrderPayloads . length
4077+ ? ', $affiliateDeveloperCode: AffiliateDeveloperCode'
4078+ : ''
4079+ } ) {\n${ cancelAliases } \n${ placeOrderAliases } \n}`
39784080 const mutation = gqlstring ( mutationStr )
39794081
3980- const variables = {
3981- affiliateDeveloperCode : this . affiliateDeveloperCode
4082+ const variables : any = { }
4083+ if ( placeLimitOrderPayloads . length > 0 ) {
4084+ variables . affiliateDeveloperCode = this . affiliateDeveloperCode
39824085 }
39834086
4087+ cancelOrdersPayloads . forEach ( ( item , index ) => {
4088+ variables [ `p${ cancelNames [ index ] } ` ] = item . payload
4089+ variables [ `s${ cancelNames [ index ] } ` ] = item . signature
4090+ } )
39844091 placeLimitOrderPayloads . forEach ( ( item , index ) => {
3985- variables [ `p${ names [ index ] } ` ] = item . signedPayload
3986- variables [ `s${ names [ index ] } ` ] = item . signature
4092+ variables [ `p${ placeNames [ index ] } ` ] = item . signedPayload
4093+ variables [ `s${ placeNames [ index ] } ` ] = item . signature
39874094 } )
39884095
39894096 try {
39904097 const result = await this . gql . mutate ( {
39914098 mutation,
39924099 variables
39934100 } )
3994- console . info ( "Result: " , result )
3995- return Object . keys ( result . data ) . map ( k => result . data [ k ] ) as OrderPlaced [ ]
3996-
3997- } catch ( e ) {
3998- console . info ( e )
4101+ return {
4102+ orders : Object . keys ( result . data )
4103+ . filter ( k => placeNames . indexOf ( k ) > - 1 )
4104+ . map ( k => result . data [ k ] ) as OrderPlaced [ ] ,
4105+ cancelled : Object . keys ( result . data )
4106+ . filter ( k => cancelNames . indexOf ( k ) > - 1 )
4107+ . map ( k => result . data [ k ] ) as CancelledOrder [ ]
4108+ }
4109+ } catch ( e ) {
4110+ return {
4111+ error : e ,
4112+ orders : [ ] ,
4113+ cancelled : [ ]
4114+ }
39994115 }
4000-
40014116 }
40024117}
0 commit comments