Skip to content

Commit 10ddf4a

Browse files
committed
add ability to place and cancel orders in bulk
1 parent 4ececf3 commit 10ddf4a

File tree

4 files changed

+171
-2
lines changed

4 files changed

+171
-2
lines changed

src/client/client.ts

Lines changed: 140 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ import {
183183
AssetData,
184184
Asset,
185185
MissingNonceError,
186-
InsufficientFundsError
186+
InsufficientFundsError,
187+
PlaceLimitOrderParams
187188
} from '../types'
188189
import {
189190
ClientMode,
@@ -192,6 +193,8 @@ import {
192193
GQLResp,
193194
PayloadSignature
194195
} from '../types/client'
196+
import { default as gqlstring } from 'graphql-tag'
197+
195198
import { BlockchainError } from './movements'
196199
import { gqlToString } from './queryPrinter'
197200
import { 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
}

src/client/networks.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ export const ETH_NETWORK: NetworkSettingsRecord = {
4747
contract: '0x00F2B67B5A5EC2FF88B2BE7D5A8D1A39D5929237'
4848
}
4949
},
50-
nodes: ['https://consensus1.eth.nash.io','https://consensus2.eth.nash.io','https://consensus3.eth.nash.io']
50+
nodes: [
51+
'https://consensus1.eth.nash.io',
52+
'https://consensus2.eth.nash.io',
53+
'https://consensus3.eth.nash.io'
54+
]
5155
},
5256
[Networks.TestNet]: {
5357
contracts: {},

src/mutations/orders/cancelOrder.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,19 @@ export const CANCEL_ORDER_MUTATION = gql`
1010
}
1111
${CANCELED_ORDER_FRAGMENT}
1212
`
13+
14+
export const CANCEL_ORDERS_MUTATION = gql`
15+
mutation cancelOrders(
16+
$pA: CancelOrderParams!
17+
$pB: CancelOrderParams!
18+
$sA: Signature!
19+
$sB: Signature!
20+
) {
21+
a: cancelOrder(payload: $pA, signature: $sA) {
22+
orderId
23+
}
24+
b: cancelOrder(payload: $pB, signature: $sB) {
25+
orderId
26+
}
27+
}
28+
`

src/types/order.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,13 @@ export interface OrderPlaced {
6060
status: OrderStatus
6161
ordersTillSignState: number
6262
}
63+
64+
export interface PlaceLimitOrderParams {
65+
allowTaker: boolean
66+
amount: CurrencyAmount
67+
buyOrSell: OrderBuyOrSell
68+
cancellationPolicy: OrderCancellationPolicy
69+
limitPrice: CurrencyPrice
70+
marketName: string
71+
cancelAt?: DateTime
72+
}

0 commit comments

Comments
 (0)