Skip to content

Commit 134e367

Browse files
committed
Add ability to cancel and place orders in a single request
1 parent 06ee8d4 commit 134e367

File tree

2 files changed

+145
-19
lines changed

2 files changed

+145
-19
lines changed

src/client/client.ts

Lines changed: 134 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,9 @@ import {
184184
Asset,
185185
MissingNonceError,
186186
InsufficientFundsError,
187-
PlaceLimitOrderParams
187+
PlaceLimitOrderParams,
188+
OrdersPlaced,
189+
OrdersCancelledAndPlaced
188190
} from '../types'
189191
import {
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
}

src/types/order.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,14 @@ export interface PlaceLimitOrderParams {
7070
marketName: string
7171
cancelAt?: DateTime
7272
}
73+
74+
export interface OrdersPlaced {
75+
error?: any
76+
orders: OrderPlaced[]
77+
}
78+
79+
export interface OrdersCancelledAndPlaced {
80+
error?: any
81+
cancelled: CancelledOrder[]
82+
orders: OrderPlaced[]
83+
}

0 commit comments

Comments
 (0)