@@ -183,7 +183,8 @@ import {
183183 AssetData ,
184184 Asset ,
185185 MissingNonceError ,
186- InsufficientFundsError
186+ InsufficientFundsError ,
187+ PlaceLimitOrderParams
187188} from '../types'
188189import {
189190 ClientMode ,
@@ -192,6 +193,8 @@ import {
192193 GQLResp ,
193194 PayloadSignature
194195} from '../types/client'
196+ import { default as gqlstring } from 'graphql-tag'
197+
195198import { BlockchainError } from './movements'
196199import { gqlToString } from './queryPrinter'
197200import { CryptoCurrency } from '../constants/currency'
@@ -3854,4 +3857,140 @@ export class Client {
38543857 public getBtcAddress ( ) : string {
38553858 return this . apiKey . child_keys [ BIP44 . BTC ] . address
38563859 }
3860+
3861+ /*
3862+ Updates for placing or cancelling multiple orders in same request
3863+ */
3864+
3865+ /**
3866+ * Cancel a list of orders by ID.
3867+ *
3868+ * @param orderID[]
3869+ * @returns
3870+ *
3871+ * Example
3872+ * ```
3873+ * const cancelledOrders = await nash.cancelOrder(['11','12'])
3874+ * console.log(cancelledOrders)
3875+ * ```
3876+ */
3877+ public async cancelOrders (
3878+ orderIDs : string [ ] ,
3879+ marketName : string
3880+ ) : Promise < CancelledOrder [ ] > {
3881+ const [ a , b ] = marketName . split ( '_' )
3882+ await this . prefillRPoolIfNeededForAssets (
3883+ a as CryptoCurrency ,
3884+ b as CryptoCurrency
3885+ )
3886+
3887+ const cancelOrdersPayloads = await Promise . all (
3888+ orderIDs . map ( async id => {
3889+ const cancelOrderParams = createCancelOrderParams ( id , marketName )
3890+ const signedPayload = await this . signPayload ( cancelOrderParams )
3891+ return signedPayload
3892+ } )
3893+ )
3894+
3895+ const names = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] . slice (
3896+ 0 ,
3897+ cancelOrdersPayloads . length
3898+ )
3899+ const params = names
3900+ . map ( name => `$p${ name } :CancelOrderParams!, $s${ name } :Signature!` )
3901+ . join ( ',' )
3902+ const aliases = names
3903+ . map (
3904+ name =>
3905+ ` ${ name } : cancelOrder(payload: $p${ name } , signature: $s${ name } ) { orderId }`
3906+ )
3907+ . join ( '\n' )
3908+ const mutationStr = `mutation cancelOrders(${ params } ) {\n${ aliases } \n}`
3909+ const mutation = gqlstring ( mutationStr )
3910+ const variables = { }
3911+ cancelOrdersPayloads . forEach ( ( item , index ) => {
3912+ variables [ `p${ names [ index ] } ` ] = item . payload
3913+ variables [ `s${ names [ index ] } ` ] = item . signature
3914+ } )
3915+ const result = await this . gql . mutate ( {
3916+ mutation,
3917+ variables
3918+ } )
3919+ const cancelledOrders = Object . keys ( result . data ) . map (
3920+ k => result . data [ k ]
3921+ ) as CancelledOrder [ ]
3922+ return cancelledOrders
3923+ }
3924+
3925+ public async placeLimitOrders (
3926+ params : PlaceLimitOrderParams [ ]
3927+ ) : Promise < OrderPlaced [ ] > {
3928+ await this . prefillRPoolIfNeededForAssets (
3929+ params [ 0 ] . limitPrice . currencyA ,
3930+ params [ 0 ] . limitPrice . currencyB
3931+ )
3932+
3933+ const placeLimitOrderPayloads = await Promise . all (
3934+ params . map ( async param => {
3935+ const { nonceOrder, noncesFrom, noncesTo } = this . getNoncesForTrade (
3936+ param . marketName ,
3937+ param . buyOrSell
3938+ )
3939+ const normalizedAmount = normalizeAmountForMarket (
3940+ param . amount ,
3941+ this . marketData [ param . marketName ]
3942+ )
3943+ const normalizedLimitPrice = normalizePriceForMarket (
3944+ param . limitPrice ,
3945+ this . marketData [ param . marketName ]
3946+ )
3947+ const placeLimitOrderParams = createPlaceLimitOrderParams (
3948+ param . allowTaker ,
3949+ normalizedAmount ,
3950+ param . buyOrSell ,
3951+ param . cancellationPolicy ,
3952+ normalizedLimitPrice ,
3953+ param . marketName ,
3954+ noncesFrom ,
3955+ noncesTo ,
3956+ nonceOrder ,
3957+ param . cancelAt
3958+ )
3959+ const signedPayload = await this . signPayload ( placeLimitOrderParams )
3960+ return signedPayload
3961+ } )
3962+ )
3963+
3964+ const names = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] . slice (
3965+ 0 ,
3966+ placeLimitOrderPayloads . length
3967+ )
3968+ const paramNames = names
3969+ . map ( name => `$p${ name } :PlaceLimitOrderParams!, $s${ name } :Signature!` )
3970+ . join ( ',' )
3971+ const aliases = names
3972+ . map (
3973+ name =>
3974+ ` ${ name } : placeLimitOrder(affiliateDeveloperCode: $affiliateDeveloperCode, payload: $p${ name } , signature: $s${ name } ) {\n id\n status\n ordersTillSignState\n }`
3975+ )
3976+ . join ( '\n' )
3977+ const mutationStr = `mutation placeLimitOrders($affiliateDeveloperCode: AffiliateDeveloperCode, ${ paramNames } ) {\n${ aliases } \n}`
3978+ const mutation = gqlstring ( mutationStr )
3979+
3980+ const variables = {
3981+ affiliateDeveloperCode : this . affiliateDeveloperCode
3982+ }
3983+
3984+ placeLimitOrderPayloads . forEach ( ( item , index ) => {
3985+ variables [ `p${ names [ index ] } ` ] = item . signedPayload
3986+ variables [ `s${ names [ index ] } ` ] = item . signature
3987+ } )
3988+
3989+ const result = await this . gql . mutate ( {
3990+ mutation,
3991+ variables
3992+ } )
3993+
3994+ return Object . keys ( result . data ) . map ( k => result . data [ k ] ) as OrderPlaced [ ]
3995+ }
38573996}
0 commit comments