@nadohq/trigger-client 0.1.0-alpha.3 → 0.1.0-alpha.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/TriggerClient.cjs +74 -34
  2. package/dist/TriggerClient.cjs.map +1 -1
  3. package/dist/TriggerClient.d.cts +8 -4
  4. package/dist/TriggerClient.d.ts +8 -4
  5. package/dist/TriggerClient.js +73 -28
  6. package/dist/TriggerClient.js.map +1 -1
  7. package/dist/dataMappers.cjs +170 -67
  8. package/dist/dataMappers.cjs.map +1 -1
  9. package/dist/dataMappers.d.cts +22 -8
  10. package/dist/dataMappers.d.ts +22 -8
  11. package/dist/dataMappers.js +171 -66
  12. package/dist/dataMappers.js.map +1 -1
  13. package/dist/endpoints.cjs +2 -2
  14. package/dist/endpoints.cjs.map +1 -1
  15. package/dist/endpoints.d.cts +1 -1
  16. package/dist/endpoints.d.ts +1 -1
  17. package/dist/endpoints.js +2 -2
  18. package/dist/endpoints.js.map +1 -1
  19. package/dist/index.cjs +4 -4
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +9 -8
  22. package/dist/index.d.ts +9 -8
  23. package/dist/index.js +2 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/types/TriggerServerFailureError.cjs +1 -1
  26. package/dist/types/TriggerServerFailureError.cjs.map +1 -1
  27. package/dist/types/TriggerServerFailureError.d.cts +3 -2
  28. package/dist/types/TriggerServerFailureError.d.ts +3 -2
  29. package/dist/types/TriggerServerFailureError.js +1 -1
  30. package/dist/types/TriggerServerFailureError.js.map +1 -1
  31. package/dist/types/clientModelTypes.cjs +19 -0
  32. package/dist/types/clientModelTypes.cjs.map +1 -0
  33. package/dist/types/clientModelTypes.d.cts +67 -0
  34. package/dist/types/clientModelTypes.d.ts +67 -0
  35. package/dist/types/clientModelTypes.js +1 -0
  36. package/dist/types/clientModelTypes.js.map +1 -0
  37. package/dist/types/clientTypes.cjs.map +1 -1
  38. package/dist/types/clientTypes.d.cts +50 -24
  39. package/dist/types/clientTypes.d.ts +50 -24
  40. package/dist/types/index.cjs +4 -0
  41. package/dist/types/index.cjs.map +1 -1
  42. package/dist/types/index.d.cts +6 -5
  43. package/dist/types/index.d.ts +6 -5
  44. package/dist/types/index.js +2 -0
  45. package/dist/types/index.js.map +1 -1
  46. package/dist/types/serverExecuteTypes.cjs.map +1 -1
  47. package/dist/types/serverExecuteTypes.d.cts +9 -15
  48. package/dist/types/serverExecuteTypes.d.ts +9 -15
  49. package/dist/types/serverModelTypes.cjs +19 -0
  50. package/dist/types/serverModelTypes.cjs.map +1 -0
  51. package/dist/types/serverModelTypes.d.cts +42 -0
  52. package/dist/types/serverModelTypes.d.ts +42 -0
  53. package/dist/types/serverModelTypes.js +1 -0
  54. package/dist/types/serverModelTypes.js.map +1 -0
  55. package/dist/types/serverQueryTypes.cjs.map +1 -1
  56. package/dist/types/serverQueryTypes.d.cts +48 -7
  57. package/dist/types/serverQueryTypes.d.ts +48 -7
  58. package/package.json +4 -5
  59. package/src/TriggerClient.ts +90 -29
  60. package/src/dataMappers.ts +225 -71
  61. package/src/endpoints.ts +2 -2
  62. package/src/index.ts +2 -2
  63. package/src/types/TriggerServerFailureError.ts +2 -2
  64. package/src/types/clientModelTypes.ts +95 -0
  65. package/src/types/clientTypes.ts +70 -41
  66. package/src/types/index.ts +2 -0
  67. package/src/types/serverExecuteTypes.ts +9 -24
  68. package/src/types/serverModelTypes.ts +55 -0
  69. package/src/types/serverQueryTypes.ts +75 -9
@@ -33,15 +33,18 @@ __export(TriggerClient_exports, {
33
33
  TriggerClient: () => TriggerClient
34
34
  });
35
35
  module.exports = __toCommonJS(TriggerClient_exports);
36
- var import_contracts = require("@nadohq/contracts");
37
- var import_utils = require("@nadohq/utils");
36
+ var import_shared = require("@nadohq/shared");
38
37
  var import_axios = __toESM(require("axios"), 1);
39
38
  var import_dataMappers = require("./dataMappers.cjs");
40
39
  var import_TriggerServerFailureError = require("./types/TriggerServerFailureError.cjs");
41
40
  var TriggerClient = class {
42
41
  constructor(opts) {
43
42
  this.opts = opts;
44
- this.axiosInstance = import_axios.default.create({ withCredentials: true });
43
+ this.axiosInstance = import_axios.default.create({
44
+ withCredentials: true,
45
+ // We have custom logic to validate response status and create an appropriate error
46
+ validateStatus: () => true
47
+ });
45
48
  }
46
49
  /**
47
50
  * Sets the linked signer for requests
@@ -55,40 +58,31 @@ var TriggerClient = class {
55
58
  Executes
56
59
  */
57
60
  async placeTriggerOrder(params) {
58
- const orderParams = {
59
- amount: params.order.amount,
60
- expiration: params.order.expiration,
61
- price: params.order.price,
62
- subaccountName: params.order.subaccountName,
63
- subaccountOwner: params.order.subaccountOwner,
64
- nonce: params.nonce ?? (0, import_contracts.getTriggerOrderNonce)()
65
- };
66
- const signature = await this.sign(
61
+ return this.execute(
67
62
  "place_order",
68
- params.verifyingAddr,
69
- params.chainId,
70
- orderParams
63
+ await this.buildPlaceOrderExecuteParams(params)
71
64
  );
65
+ }
66
+ async placeTriggerOrders(params) {
72
67
  const executeParams = {
73
- id: params.id ?? null,
74
- order: (0, import_contracts.getNadoEIP712Values)("place_order", orderParams),
75
- trigger: (0, import_dataMappers.mapTriggerCriteria)(params.triggerCriteria),
76
- signature,
77
- product_id: params.productId,
78
- spot_leverage: params.spotLeverage ?? null,
79
- digest: params.digest ?? null
68
+ orders: await Promise.all(
69
+ params.orders.map(
70
+ async (orderParam) => this.buildPlaceOrderExecuteParams(orderParam)
71
+ )
72
+ ),
73
+ cancel_on_failure: params.cancelOnFailure ?? null
80
74
  };
81
- return this.execute("place_order", executeParams);
75
+ return this.execute("place_orders", executeParams);
82
76
  }
83
77
  async cancelTriggerOrders(params) {
84
78
  const cancelOrdersParams = {
85
79
  digests: params.digests,
86
- nonce: params.nonce ?? (0, import_contracts.getOrderNonce)(),
80
+ nonce: params.nonce ?? (0, import_shared.getOrderNonce)(),
87
81
  productIds: params.productIds,
88
82
  subaccountName: params.subaccountName,
89
83
  subaccountOwner: params.subaccountOwner
90
84
  };
91
- const tx = (0, import_contracts.getNadoEIP712Values)("cancel_orders", cancelOrdersParams);
85
+ const tx = (0, import_shared.getNadoEIP712Values)("cancel_orders", cancelOrdersParams);
92
86
  const executeParams = {
93
87
  signature: await this.sign(
94
88
  "cancel_orders",
@@ -102,12 +96,12 @@ var TriggerClient = class {
102
96
  }
103
97
  async cancelProductOrders(params) {
104
98
  const cancelProductOrdersParams = {
105
- nonce: params.nonce ?? (0, import_contracts.getOrderNonce)(),
99
+ nonce: params.nonce ?? (0, import_shared.getOrderNonce)(),
106
100
  productIds: params.productIds,
107
101
  subaccountName: params.subaccountName,
108
102
  subaccountOwner: params.subaccountOwner
109
103
  };
110
- const tx = (0, import_contracts.getNadoEIP712Values)(
104
+ const tx = (0, import_shared.getNadoEIP712Values)(
111
105
  "cancel_product_orders",
112
106
  cancelProductOrdersParams
113
107
  );
@@ -128,11 +122,11 @@ var TriggerClient = class {
128
122
  async listOrders(params) {
129
123
  const signatureParams = {
130
124
  // Default to 90 seconds from now if no recvTime is provided
131
- recvTime: (0, import_utils.toIntegerString)(params.recvTime ?? (0, import_contracts.getDefaultRecvTime)()),
125
+ recvTime: (0, import_shared.toIntegerString)(params.recvTime ?? (0, import_shared.getDefaultRecvTime)()),
132
126
  subaccountName: params.subaccountName,
133
127
  subaccountOwner: params.subaccountOwner
134
128
  };
135
- const tx = (0, import_contracts.getNadoEIP712Values)("list_trigger_orders", signatureParams);
129
+ const tx = (0, import_shared.getNadoEIP712Values)("list_trigger_orders", signatureParams);
136
130
  const signature = await this.sign(
137
131
  "list_trigger_orders",
138
132
  params.verifyingAddr,
@@ -142,9 +136,11 @@ var TriggerClient = class {
142
136
  const queryParams = {
143
137
  limit: params.limit,
144
138
  max_update_time: params.maxUpdateTimeInclusive,
145
- pending: params.pending,
146
- product_id: params.productId,
139
+ status_types: params.statusTypes,
140
+ product_ids: params.productIds,
147
141
  digests: params.digests,
142
+ trigger_types: params.triggerTypes,
143
+ reduce_only: params.reduceOnly,
148
144
  signature,
149
145
  tx
150
146
  };
@@ -154,15 +150,59 @@ var TriggerClient = class {
154
150
  orders
155
151
  };
156
152
  }
153
+ async listTwapExecutions(params) {
154
+ const queryParams = {
155
+ digest: params.digest
156
+ };
157
+ const baseResponse = await this.query("list_twap_executions", queryParams);
158
+ const executions = baseResponse.executions.map(
159
+ (execution) => ({
160
+ executionId: execution.execution_id,
161
+ scheduledTime: execution.scheduled_time,
162
+ status: (0, import_dataMappers.mapTwapExecutionStatus)(execution.status),
163
+ updatedAt: execution.updated_at
164
+ })
165
+ );
166
+ return {
167
+ executions
168
+ };
169
+ }
157
170
  /*
158
171
  Base Fns
159
172
  */
173
+ async buildPlaceOrderExecuteParams(params) {
174
+ const orderParams = {
175
+ amount: params.order.amount,
176
+ expiration: params.order.expiration,
177
+ price: params.order.price,
178
+ subaccountName: params.order.subaccountName,
179
+ subaccountOwner: params.order.subaccountOwner,
180
+ nonce: params.nonce ?? (0, import_shared.getOrderNonce)(),
181
+ appendix: params.order.appendix
182
+ };
183
+ const signature = await this.sign(
184
+ "place_order",
185
+ params.verifyingAddr,
186
+ params.chainId,
187
+ orderParams
188
+ );
189
+ return {
190
+ id: params.id ?? null,
191
+ order: (0, import_shared.getNadoEIP712Values)("place_order", orderParams),
192
+ trigger: (0, import_dataMappers.mapTriggerCriteria)(params.triggerCriteria),
193
+ signature,
194
+ product_id: params.productId,
195
+ spot_leverage: params.spotLeverage ?? null,
196
+ digest: params.digest ?? null,
197
+ borrow_margin: params.borrowMargin ?? null
198
+ };
199
+ }
160
200
  async sign(requestType, verifyingContract, chainId, params) {
161
201
  const walletClient = this.opts.linkedSignerWalletClient ?? this.opts.walletClient;
162
202
  if (walletClient == null) {
163
- throw new import_utils.WalletNotProvidedError();
203
+ throw new import_shared.WalletNotProvidedError();
164
204
  }
165
- return (0, import_contracts.getSignedTransactionRequest)({
205
+ return (0, import_shared.getSignedTransactionRequest)({
166
206
  chainId,
167
207
  requestParams: params,
168
208
  requestType,
@@ -200,7 +240,7 @@ var TriggerClient = class {
200
240
  checkResponseStatus(response) {
201
241
  if (response.status !== 200 || !response.data) {
202
242
  throw Error(
203
- `Unexpected response from server: ${response.status} ${response.statusText}`
243
+ `Unexpected response from server: ${response.status} ${response.statusText}. Data: ${response.data}`
204
244
  );
205
245
  }
206
246
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TriggerClient.ts"],"sourcesContent":["import {\n EIP712CancelOrdersParams,\n EIP712CancelProductOrdersParams,\n EIP712ListTriggerOrdersParams,\n EIP712OrderParams,\n getDefaultRecvTime,\n getNadoEIP712Values,\n getOrderNonce,\n getSignedTransactionRequest,\n getTriggerOrderNonce,\n SignableRequestType,\n SignableRequestTypeToParams,\n WalletClientWithAccount,\n} from '@nadohq/contracts';\nimport { toIntegerString, WalletNotProvidedError } from '@nadohq/utils';\nimport axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { mapServerOrderInfo, mapTriggerCriteria } from './dataMappers';\nimport {\n TriggerCancelOrdersParams,\n TriggerCancelProductOrdersParams,\n TriggerListOrdersParams,\n TriggerListOrdersResponse,\n TriggerOrderInfo,\n TriggerPlaceOrderParams,\n TriggerServerExecuteRequestByType,\n TriggerServerExecuteRequestType,\n TriggerServerExecuteResult,\n TriggerServerExecuteSuccessResult,\n TriggerServerQueryRequestByType,\n TriggerServerQueryRequestType,\n TriggerServerQueryResponse,\n TriggerServerQueryResponseByType,\n TriggerServerQuerySuccessResponse,\n} from './types';\nimport { TriggerServerFailureError } from './types/TriggerServerFailureError';\n\nexport interface TriggerClientOpts {\n // Server URL\n url: string;\n // Wallet client for EIP712 signing\n walletClient?: WalletClientWithAccount;\n // Linked signer registered through the engine, if provided, execute requests will use this signer\n linkedSignerWalletClient?: WalletClientWithAccount;\n}\n\n/**\n * Client for all trigger service requests\n */\nexport class TriggerClient {\n readonly opts: TriggerClientOpts;\n readonly axiosInstance: AxiosInstance;\n\n constructor(opts: TriggerClientOpts) {\n this.opts = opts;\n this.axiosInstance = axios.create({ withCredentials: true });\n }\n\n /**\n * Sets the linked signer for requests\n *\n * @param linkedSignerWalletClient The linkedSigner to use for all signatures. Set to null to revert to the chain signer\n */\n public setLinkedSigner(\n linkedSignerWalletClient: WalletClientWithAccount | null,\n ) {\n this.opts.linkedSignerWalletClient = linkedSignerWalletClient ?? undefined;\n }\n\n /*\n Executes\n */\n\n async placeTriggerOrder(params: TriggerPlaceOrderParams) {\n const orderParams: EIP712OrderParams = {\n amount: params.order.amount,\n expiration: params.order.expiration,\n price: params.order.price,\n subaccountName: params.order.subaccountName,\n subaccountOwner: params.order.subaccountOwner,\n nonce: params.nonce ?? getTriggerOrderNonce(),\n };\n const signature = await this.sign(\n 'place_order',\n params.verifyingAddr,\n params.chainId,\n orderParams,\n );\n\n const executeParams: TriggerServerExecuteRequestByType['place_order'] = {\n id: params.id ?? null,\n order: getNadoEIP712Values('place_order', orderParams),\n trigger: mapTriggerCriteria(params.triggerCriteria),\n signature,\n product_id: params.productId,\n spot_leverage: params.spotLeverage ?? null,\n digest: params.digest ?? null,\n };\n\n return this.execute('place_order', executeParams);\n }\n\n async cancelTriggerOrders(params: TriggerCancelOrdersParams) {\n const cancelOrdersParams: EIP712CancelOrdersParams = {\n digests: params.digests,\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values('cancel_orders', cancelOrdersParams);\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_orders'] = {\n signature: await this.sign(\n 'cancel_orders',\n params.verifyingAddr,\n params.chainId,\n cancelOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_orders', executeParams);\n }\n\n async cancelProductOrders(params: TriggerCancelProductOrdersParams) {\n const cancelProductOrdersParams: EIP712CancelProductOrdersParams = {\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values(\n 'cancel_product_orders',\n cancelProductOrdersParams,\n );\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_product_orders'] =\n {\n signature: await this.sign(\n 'cancel_product_orders',\n params.verifyingAddr,\n params.chainId,\n cancelProductOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_product_orders', executeParams);\n }\n\n /*\n Queries\n */\n async listOrders(\n params: TriggerListOrdersParams,\n ): Promise<TriggerListOrdersResponse> {\n const signatureParams: EIP712ListTriggerOrdersParams = {\n // Default to 90 seconds from now if no recvTime is provided\n recvTime: toIntegerString(params.recvTime ?? getDefaultRecvTime()),\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n\n const tx = getNadoEIP712Values('list_trigger_orders', signatureParams);\n const signature = await this.sign(\n 'list_trigger_orders',\n params.verifyingAddr,\n params.chainId,\n signatureParams,\n );\n\n const queryParams: TriggerServerQueryRequestByType['list_trigger_orders'] =\n {\n limit: params.limit,\n max_update_time: params.maxUpdateTimeInclusive,\n pending: params.pending,\n product_id: params.productId,\n digests: params.digests,\n signature,\n tx,\n };\n\n const baseResponse = await this.query('list_trigger_orders', queryParams);\n\n const orders: TriggerOrderInfo[] =\n baseResponse.orders.map(mapServerOrderInfo);\n\n return {\n orders,\n };\n }\n\n /*\n Base Fns\n */\n protected async sign<T extends SignableRequestType>(\n requestType: T,\n verifyingContract: string,\n chainId: number,\n params: SignableRequestTypeToParams[T],\n ) {\n // Use the linked signer if provided, otherwise use the default signer provided to the engine\n const walletClient =\n this.opts.linkedSignerWalletClient ?? this.opts.walletClient;\n\n if (walletClient == null) {\n throw new WalletNotProvidedError();\n }\n\n return getSignedTransactionRequest({\n chainId,\n requestParams: params,\n requestType,\n walletClient,\n verifyingContract,\n });\n }\n\n /**\n * POSTs an execute message to the trigger service and returns the successful response. Throws the failure response wrapped\n * in an TriggerServerFailureError on failure.\n *\n * @param requestType\n * @param params\n */\n protected async execute<TRequestType extends TriggerServerExecuteRequestType>(\n requestType: TRequestType,\n params: TriggerServerExecuteRequestByType[TRequestType],\n ): Promise<TriggerServerExecuteSuccessResult<TRequestType>> {\n const reqBody = {\n [requestType]: params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerExecuteResult<TRequestType>\n >(`${this.opts.url}/execute`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus catches the failure result and throws the error, so the cast to the success response is acceptable here\n return response.data as TriggerServerExecuteSuccessResult<TRequestType>;\n }\n\n protected async query<TRequestType extends TriggerServerQueryRequestType>(\n requestType: TRequestType,\n params: TriggerServerQueryRequestByType[TRequestType],\n ): Promise<TriggerServerQueryResponseByType[TRequestType]> {\n const reqBody = {\n type: requestType,\n ...params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerQueryResponse<TRequestType>\n >(`${this.opts.url}/query`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus throws on failure responses so the cast to the success response is acceptable here\n const successResponse = response as AxiosResponse<\n TriggerServerQuerySuccessResponse<TRequestType>\n >;\n\n return successResponse.data.data;\n }\n\n private checkResponseStatus(response: AxiosResponse) {\n if (response.status !== 200 || !response.data) {\n throw Error(\n `Unexpected response from server: ${response.status} ${response.statusText}`,\n );\n }\n }\n\n private checkServerStatus(\n response: AxiosResponse<\n TriggerServerExecuteResult | TriggerServerQueryResponse\n >,\n ) {\n if (response.data.status !== 'success') {\n throw new TriggerServerFailureError(response.data);\n }\n }\n}\n"],"mappings":"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","names":["axios"]}
1
+ {"version":3,"sources":["../src/TriggerClient.ts"],"sourcesContent":["import {\n EIP712CancelOrdersParams,\n EIP712CancelProductOrdersParams,\n EIP712ListTriggerOrdersParams,\n EIP712OrderParams,\n getDefaultRecvTime,\n getNadoEIP712Values,\n getOrderNonce,\n getSignedTransactionRequest,\n SignableRequestType,\n SignableRequestTypeToParams,\n toIntegerString,\n WalletClientWithAccount,\n WalletNotProvidedError,\n} from '@nadohq/shared';\nimport axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport {\n mapServerOrderInfo,\n mapTriggerCriteria,\n mapTwapExecutionStatus,\n} from './dataMappers';\nimport {\n TriggerCancelOrdersParams,\n TriggerCancelProductOrdersParams,\n TriggerListOrdersParams,\n TriggerListOrdersResponse,\n TriggerListTwapExecutionsParams,\n TriggerListTwapExecutionsResponse,\n TriggerOrderInfo,\n TriggerPlaceOrderParams,\n TriggerPlaceOrdersParams,\n TriggerServerExecuteRequestByType,\n TriggerServerExecuteRequestType,\n TriggerServerExecuteResult,\n TriggerServerExecuteSuccessResult,\n TriggerServerQueryRequestByType,\n TriggerServerQueryRequestType,\n TriggerServerQueryResponse,\n TriggerServerQueryResponseByType,\n TriggerServerQuerySuccessResponse,\n TwapExecutionInfo,\n} from './types';\nimport { TriggerServerFailureError } from './types/TriggerServerFailureError';\n\nexport interface TriggerClientOpts {\n // Server URL\n url: string;\n // Wallet client for EIP712 signing\n walletClient?: WalletClientWithAccount;\n // Linked signer registered through the engine, if provided, execute requests will use this signer\n linkedSignerWalletClient?: WalletClientWithAccount;\n}\n\n/**\n * Client for all trigger service requests\n */\nexport class TriggerClient {\n readonly opts: TriggerClientOpts;\n readonly axiosInstance: AxiosInstance;\n\n constructor(opts: TriggerClientOpts) {\n this.opts = opts;\n this.axiosInstance = axios.create({\n withCredentials: true,\n // We have custom logic to validate response status and create an appropriate error\n validateStatus: () => true,\n });\n }\n\n /**\n * Sets the linked signer for requests\n *\n * @param linkedSignerWalletClient The linkedSigner to use for all signatures. Set to null to revert to the chain signer\n */\n public setLinkedSigner(\n linkedSignerWalletClient: WalletClientWithAccount | null,\n ) {\n this.opts.linkedSignerWalletClient = linkedSignerWalletClient ?? undefined;\n }\n\n /*\n Executes\n */\n\n async placeTriggerOrder(params: TriggerPlaceOrderParams) {\n return this.execute(\n 'place_order',\n await this.buildPlaceOrderExecuteParams(params),\n );\n }\n\n async placeTriggerOrders(params: TriggerPlaceOrdersParams) {\n const executeParams: TriggerServerExecuteRequestByType['place_orders'] = {\n orders: await Promise.all(\n params.orders.map(async (orderParam) =>\n this.buildPlaceOrderExecuteParams(orderParam),\n ),\n ),\n cancel_on_failure: params.cancelOnFailure ?? null,\n };\n\n return this.execute('place_orders', executeParams);\n }\n\n async cancelTriggerOrders(params: TriggerCancelOrdersParams) {\n const cancelOrdersParams: EIP712CancelOrdersParams = {\n digests: params.digests,\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values('cancel_orders', cancelOrdersParams);\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_orders'] = {\n signature: await this.sign(\n 'cancel_orders',\n params.verifyingAddr,\n params.chainId,\n cancelOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_orders', executeParams);\n }\n\n async cancelProductOrders(params: TriggerCancelProductOrdersParams) {\n const cancelProductOrdersParams: EIP712CancelProductOrdersParams = {\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values(\n 'cancel_product_orders',\n cancelProductOrdersParams,\n );\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_product_orders'] =\n {\n signature: await this.sign(\n 'cancel_product_orders',\n params.verifyingAddr,\n params.chainId,\n cancelProductOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_product_orders', executeParams);\n }\n\n /*\n Queries\n */\n async listOrders(\n params: TriggerListOrdersParams,\n ): Promise<TriggerListOrdersResponse> {\n const signatureParams: EIP712ListTriggerOrdersParams = {\n // Default to 90 seconds from now if no recvTime is provided\n recvTime: toIntegerString(params.recvTime ?? getDefaultRecvTime()),\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n\n const tx = getNadoEIP712Values('list_trigger_orders', signatureParams);\n const signature = await this.sign(\n 'list_trigger_orders',\n params.verifyingAddr,\n params.chainId,\n signatureParams,\n );\n\n const queryParams: TriggerServerQueryRequestByType['list_trigger_orders'] =\n {\n limit: params.limit,\n max_update_time: params.maxUpdateTimeInclusive,\n status_types: params.statusTypes,\n product_ids: params.productIds,\n digests: params.digests,\n trigger_types: params.triggerTypes,\n reduce_only: params.reduceOnly,\n signature,\n tx,\n };\n\n const baseResponse = await this.query('list_trigger_orders', queryParams);\n\n const orders: TriggerOrderInfo[] =\n baseResponse.orders.map(mapServerOrderInfo);\n\n return {\n orders,\n };\n }\n\n async listTwapExecutions(\n params: TriggerListTwapExecutionsParams,\n ): Promise<TriggerListTwapExecutionsResponse> {\n const queryParams: TriggerServerQueryRequestByType['list_twap_executions'] =\n {\n digest: params.digest,\n };\n\n const baseResponse = await this.query('list_twap_executions', queryParams);\n\n const executions: TwapExecutionInfo[] = baseResponse.executions.map(\n (execution) => ({\n executionId: execution.execution_id,\n scheduledTime: execution.scheduled_time,\n status: mapTwapExecutionStatus(execution.status),\n updatedAt: execution.updated_at,\n }),\n );\n\n return {\n executions,\n };\n }\n\n /*\n Base Fns\n */\n\n async buildPlaceOrderExecuteParams(\n params: TriggerPlaceOrderParams,\n ): Promise<TriggerServerExecuteRequestByType['place_order']> {\n const orderParams: EIP712OrderParams = {\n amount: params.order.amount,\n expiration: params.order.expiration,\n price: params.order.price,\n subaccountName: params.order.subaccountName,\n subaccountOwner: params.order.subaccountOwner,\n nonce: params.nonce ?? getOrderNonce(),\n appendix: params.order.appendix,\n };\n const signature = await this.sign(\n 'place_order',\n params.verifyingAddr,\n params.chainId,\n orderParams,\n );\n\n return {\n id: params.id ?? null,\n order: getNadoEIP712Values('place_order', orderParams),\n trigger: mapTriggerCriteria(params.triggerCriteria),\n signature,\n product_id: params.productId,\n spot_leverage: params.spotLeverage ?? null,\n digest: params.digest ?? null,\n borrow_margin: params.borrowMargin ?? null,\n };\n }\n\n protected async sign<T extends SignableRequestType>(\n requestType: T,\n verifyingContract: string,\n chainId: number,\n params: SignableRequestTypeToParams[T],\n ) {\n // Use the linked signer if provided, otherwise use the default signer provided to the engine\n const walletClient =\n this.opts.linkedSignerWalletClient ?? this.opts.walletClient;\n\n if (walletClient == null) {\n throw new WalletNotProvidedError();\n }\n\n return getSignedTransactionRequest({\n chainId,\n requestParams: params,\n requestType,\n walletClient,\n verifyingContract,\n });\n }\n\n /**\n * POSTs an execute message to the trigger service and returns the successful response. Throws the failure response wrapped\n * in an TriggerServerFailureError on failure.\n *\n * @param requestType\n * @param params\n */\n protected async execute<TRequestType extends TriggerServerExecuteRequestType>(\n requestType: TRequestType,\n params: TriggerServerExecuteRequestByType[TRequestType],\n ): Promise<TriggerServerExecuteSuccessResult<TRequestType>> {\n const reqBody = {\n [requestType]: params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerExecuteResult<TRequestType>\n >(`${this.opts.url}/execute`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus catches the failure result and throws the error, so the cast to the success response is acceptable here\n return response.data as TriggerServerExecuteSuccessResult<TRequestType>;\n }\n\n protected async query<TRequestType extends TriggerServerQueryRequestType>(\n requestType: TRequestType,\n params: TriggerServerQueryRequestByType[TRequestType],\n ): Promise<TriggerServerQueryResponseByType[TRequestType]> {\n const reqBody = {\n type: requestType,\n ...params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerQueryResponse<TRequestType>\n >(`${this.opts.url}/query`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus throws on failure responses so the cast to the success response is acceptable here\n const successResponse = response as AxiosResponse<\n TriggerServerQuerySuccessResponse<TRequestType>\n >;\n\n return successResponse.data.data;\n }\n\n private checkResponseStatus(response: AxiosResponse) {\n if (response.status !== 200 || !response.data) {\n throw Error(\n `Unexpected response from server: ${response.status} ${response.statusText}. Data: ${response.data}`,\n );\n }\n }\n\n private checkServerStatus(\n response: AxiosResponse<\n TriggerServerExecuteResult | TriggerServerQueryResponse\n >,\n ) {\n if (response.data.status !== 'success') {\n throw new TriggerServerFailureError(response.data);\n }\n }\n}\n"],"mappings":"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","names":["axios"]}
@@ -1,10 +1,11 @@
1
- import { WalletClientWithAccount, SignableRequestType, SignableRequestTypeToParams } from '@nadohq/contracts';
1
+ import { WalletClientWithAccount, SignableRequestType, SignableRequestTypeToParams } from '@nadohq/shared';
2
2
  import { AxiosInstance } from 'axios';
3
- import { TriggerPlaceOrderParams, TriggerCancelOrdersParams, TriggerCancelProductOrdersParams, TriggerListOrdersParams, TriggerListOrdersResponse } from './types/clientTypes.cjs';
4
- import { TriggerServerExecuteSuccessResult, TriggerServerExecuteRequestType, TriggerServerExecuteRequestByType } from './types/serverExecuteTypes.cjs';
3
+ import { TriggerPlaceOrderParams, TriggerPlaceOrdersParams, TriggerCancelOrdersParams, TriggerCancelProductOrdersParams, TriggerListOrdersParams, TriggerListOrdersResponse, TriggerListTwapExecutionsParams, TriggerListTwapExecutionsResponse } from './types/clientTypes.cjs';
4
+ import { TriggerServerExecuteSuccessResult, TriggerServerExecuteRequestByType, TriggerServerExecuteRequestType } from './types/serverExecuteTypes.cjs';
5
5
  import { TriggerServerQueryRequestType, TriggerServerQueryRequestByType, TriggerServerQueryResponseByType } from './types/serverQueryTypes.cjs';
6
6
  import '@nadohq/engine-client';
7
- import '@nadohq/utils';
7
+ import './types/clientModelTypes.cjs';
8
+ import './types/serverModelTypes.cjs';
8
9
 
9
10
  interface TriggerClientOpts {
10
11
  url: string;
@@ -25,9 +26,12 @@ declare class TriggerClient {
25
26
  */
26
27
  setLinkedSigner(linkedSignerWalletClient: WalletClientWithAccount | null): void;
27
28
  placeTriggerOrder(params: TriggerPlaceOrderParams): Promise<TriggerServerExecuteSuccessResult<"place_order">>;
29
+ placeTriggerOrders(params: TriggerPlaceOrdersParams): Promise<TriggerServerExecuteSuccessResult<"place_orders">>;
28
30
  cancelTriggerOrders(params: TriggerCancelOrdersParams): Promise<TriggerServerExecuteSuccessResult<"cancel_orders">>;
29
31
  cancelProductOrders(params: TriggerCancelProductOrdersParams): Promise<TriggerServerExecuteSuccessResult<"cancel_product_orders">>;
30
32
  listOrders(params: TriggerListOrdersParams): Promise<TriggerListOrdersResponse>;
33
+ listTwapExecutions(params: TriggerListTwapExecutionsParams): Promise<TriggerListTwapExecutionsResponse>;
34
+ buildPlaceOrderExecuteParams(params: TriggerPlaceOrderParams): Promise<TriggerServerExecuteRequestByType['place_order']>;
31
35
  protected sign<T extends SignableRequestType>(requestType: T, verifyingContract: string, chainId: number, params: SignableRequestTypeToParams[T]): Promise<`0x${string}`>;
32
36
  /**
33
37
  * POSTs an execute message to the trigger service and returns the successful response. Throws the failure response wrapped
@@ -1,10 +1,11 @@
1
- import { WalletClientWithAccount, SignableRequestType, SignableRequestTypeToParams } from '@nadohq/contracts';
1
+ import { WalletClientWithAccount, SignableRequestType, SignableRequestTypeToParams } from '@nadohq/shared';
2
2
  import { AxiosInstance } from 'axios';
3
- import { TriggerPlaceOrderParams, TriggerCancelOrdersParams, TriggerCancelProductOrdersParams, TriggerListOrdersParams, TriggerListOrdersResponse } from './types/clientTypes.js';
4
- import { TriggerServerExecuteSuccessResult, TriggerServerExecuteRequestType, TriggerServerExecuteRequestByType } from './types/serverExecuteTypes.js';
3
+ import { TriggerPlaceOrderParams, TriggerPlaceOrdersParams, TriggerCancelOrdersParams, TriggerCancelProductOrdersParams, TriggerListOrdersParams, TriggerListOrdersResponse, TriggerListTwapExecutionsParams, TriggerListTwapExecutionsResponse } from './types/clientTypes.js';
4
+ import { TriggerServerExecuteSuccessResult, TriggerServerExecuteRequestByType, TriggerServerExecuteRequestType } from './types/serverExecuteTypes.js';
5
5
  import { TriggerServerQueryRequestType, TriggerServerQueryRequestByType, TriggerServerQueryResponseByType } from './types/serverQueryTypes.js';
6
6
  import '@nadohq/engine-client';
7
- import '@nadohq/utils';
7
+ import './types/clientModelTypes.js';
8
+ import './types/serverModelTypes.js';
8
9
 
9
10
  interface TriggerClientOpts {
10
11
  url: string;
@@ -25,9 +26,12 @@ declare class TriggerClient {
25
26
  */
26
27
  setLinkedSigner(linkedSignerWalletClient: WalletClientWithAccount | null): void;
27
28
  placeTriggerOrder(params: TriggerPlaceOrderParams): Promise<TriggerServerExecuteSuccessResult<"place_order">>;
29
+ placeTriggerOrders(params: TriggerPlaceOrdersParams): Promise<TriggerServerExecuteSuccessResult<"place_orders">>;
28
30
  cancelTriggerOrders(params: TriggerCancelOrdersParams): Promise<TriggerServerExecuteSuccessResult<"cancel_orders">>;
29
31
  cancelProductOrders(params: TriggerCancelProductOrdersParams): Promise<TriggerServerExecuteSuccessResult<"cancel_product_orders">>;
30
32
  listOrders(params: TriggerListOrdersParams): Promise<TriggerListOrdersResponse>;
33
+ listTwapExecutions(params: TriggerListTwapExecutionsParams): Promise<TriggerListTwapExecutionsResponse>;
34
+ buildPlaceOrderExecuteParams(params: TriggerPlaceOrderParams): Promise<TriggerServerExecuteRequestByType['place_order']>;
31
35
  protected sign<T extends SignableRequestType>(requestType: T, verifyingContract: string, chainId: number, params: SignableRequestTypeToParams[T]): Promise<`0x${string}`>;
32
36
  /**
33
37
  * POSTs an execute message to the trigger service and returns the successful response. Throws the failure response wrapped
@@ -4,16 +4,24 @@ import {
4
4
  getNadoEIP712Values,
5
5
  getOrderNonce,
6
6
  getSignedTransactionRequest,
7
- getTriggerOrderNonce
8
- } from "@nadohq/contracts";
9
- import { toIntegerString, WalletNotProvidedError } from "@nadohq/utils";
7
+ toIntegerString,
8
+ WalletNotProvidedError
9
+ } from "@nadohq/shared";
10
10
  import axios from "axios";
11
- import { mapServerOrderInfo, mapTriggerCriteria } from "./dataMappers.js";
11
+ import {
12
+ mapServerOrderInfo,
13
+ mapTriggerCriteria,
14
+ mapTwapExecutionStatus
15
+ } from "./dataMappers.js";
12
16
  import { TriggerServerFailureError } from "./types/TriggerServerFailureError.js";
13
17
  var TriggerClient = class {
14
18
  constructor(opts) {
15
19
  this.opts = opts;
16
- this.axiosInstance = axios.create({ withCredentials: true });
20
+ this.axiosInstance = axios.create({
21
+ withCredentials: true,
22
+ // We have custom logic to validate response status and create an appropriate error
23
+ validateStatus: () => true
24
+ });
17
25
  }
18
26
  /**
19
27
  * Sets the linked signer for requests
@@ -27,30 +35,21 @@ var TriggerClient = class {
27
35
  Executes
28
36
  */
29
37
  async placeTriggerOrder(params) {
30
- const orderParams = {
31
- amount: params.order.amount,
32
- expiration: params.order.expiration,
33
- price: params.order.price,
34
- subaccountName: params.order.subaccountName,
35
- subaccountOwner: params.order.subaccountOwner,
36
- nonce: params.nonce ?? getTriggerOrderNonce()
37
- };
38
- const signature = await this.sign(
38
+ return this.execute(
39
39
  "place_order",
40
- params.verifyingAddr,
41
- params.chainId,
42
- orderParams
40
+ await this.buildPlaceOrderExecuteParams(params)
43
41
  );
42
+ }
43
+ async placeTriggerOrders(params) {
44
44
  const executeParams = {
45
- id: params.id ?? null,
46
- order: getNadoEIP712Values("place_order", orderParams),
47
- trigger: mapTriggerCriteria(params.triggerCriteria),
48
- signature,
49
- product_id: params.productId,
50
- spot_leverage: params.spotLeverage ?? null,
51
- digest: params.digest ?? null
45
+ orders: await Promise.all(
46
+ params.orders.map(
47
+ async (orderParam) => this.buildPlaceOrderExecuteParams(orderParam)
48
+ )
49
+ ),
50
+ cancel_on_failure: params.cancelOnFailure ?? null
52
51
  };
53
- return this.execute("place_order", executeParams);
52
+ return this.execute("place_orders", executeParams);
54
53
  }
55
54
  async cancelTriggerOrders(params) {
56
55
  const cancelOrdersParams = {
@@ -114,9 +113,11 @@ var TriggerClient = class {
114
113
  const queryParams = {
115
114
  limit: params.limit,
116
115
  max_update_time: params.maxUpdateTimeInclusive,
117
- pending: params.pending,
118
- product_id: params.productId,
116
+ status_types: params.statusTypes,
117
+ product_ids: params.productIds,
119
118
  digests: params.digests,
119
+ trigger_types: params.triggerTypes,
120
+ reduce_only: params.reduceOnly,
120
121
  signature,
121
122
  tx
122
123
  };
@@ -126,9 +127,53 @@ var TriggerClient = class {
126
127
  orders
127
128
  };
128
129
  }
130
+ async listTwapExecutions(params) {
131
+ const queryParams = {
132
+ digest: params.digest
133
+ };
134
+ const baseResponse = await this.query("list_twap_executions", queryParams);
135
+ const executions = baseResponse.executions.map(
136
+ (execution) => ({
137
+ executionId: execution.execution_id,
138
+ scheduledTime: execution.scheduled_time,
139
+ status: mapTwapExecutionStatus(execution.status),
140
+ updatedAt: execution.updated_at
141
+ })
142
+ );
143
+ return {
144
+ executions
145
+ };
146
+ }
129
147
  /*
130
148
  Base Fns
131
149
  */
150
+ async buildPlaceOrderExecuteParams(params) {
151
+ const orderParams = {
152
+ amount: params.order.amount,
153
+ expiration: params.order.expiration,
154
+ price: params.order.price,
155
+ subaccountName: params.order.subaccountName,
156
+ subaccountOwner: params.order.subaccountOwner,
157
+ nonce: params.nonce ?? getOrderNonce(),
158
+ appendix: params.order.appendix
159
+ };
160
+ const signature = await this.sign(
161
+ "place_order",
162
+ params.verifyingAddr,
163
+ params.chainId,
164
+ orderParams
165
+ );
166
+ return {
167
+ id: params.id ?? null,
168
+ order: getNadoEIP712Values("place_order", orderParams),
169
+ trigger: mapTriggerCriteria(params.triggerCriteria),
170
+ signature,
171
+ product_id: params.productId,
172
+ spot_leverage: params.spotLeverage ?? null,
173
+ digest: params.digest ?? null,
174
+ borrow_margin: params.borrowMargin ?? null
175
+ };
176
+ }
132
177
  async sign(requestType, verifyingContract, chainId, params) {
133
178
  const walletClient = this.opts.linkedSignerWalletClient ?? this.opts.walletClient;
134
179
  if (walletClient == null) {
@@ -172,7 +217,7 @@ var TriggerClient = class {
172
217
  checkResponseStatus(response) {
173
218
  if (response.status !== 200 || !response.data) {
174
219
  throw Error(
175
- `Unexpected response from server: ${response.status} ${response.statusText}`
220
+ `Unexpected response from server: ${response.status} ${response.statusText}. Data: ${response.data}`
176
221
  );
177
222
  }
178
223
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TriggerClient.ts"],"sourcesContent":["import {\n EIP712CancelOrdersParams,\n EIP712CancelProductOrdersParams,\n EIP712ListTriggerOrdersParams,\n EIP712OrderParams,\n getDefaultRecvTime,\n getNadoEIP712Values,\n getOrderNonce,\n getSignedTransactionRequest,\n getTriggerOrderNonce,\n SignableRequestType,\n SignableRequestTypeToParams,\n WalletClientWithAccount,\n} from '@nadohq/contracts';\nimport { toIntegerString, WalletNotProvidedError } from '@nadohq/utils';\nimport axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { mapServerOrderInfo, mapTriggerCriteria } from './dataMappers';\nimport {\n TriggerCancelOrdersParams,\n TriggerCancelProductOrdersParams,\n TriggerListOrdersParams,\n TriggerListOrdersResponse,\n TriggerOrderInfo,\n TriggerPlaceOrderParams,\n TriggerServerExecuteRequestByType,\n TriggerServerExecuteRequestType,\n TriggerServerExecuteResult,\n TriggerServerExecuteSuccessResult,\n TriggerServerQueryRequestByType,\n TriggerServerQueryRequestType,\n TriggerServerQueryResponse,\n TriggerServerQueryResponseByType,\n TriggerServerQuerySuccessResponse,\n} from './types';\nimport { TriggerServerFailureError } from './types/TriggerServerFailureError';\n\nexport interface TriggerClientOpts {\n // Server URL\n url: string;\n // Wallet client for EIP712 signing\n walletClient?: WalletClientWithAccount;\n // Linked signer registered through the engine, if provided, execute requests will use this signer\n linkedSignerWalletClient?: WalletClientWithAccount;\n}\n\n/**\n * Client for all trigger service requests\n */\nexport class TriggerClient {\n readonly opts: TriggerClientOpts;\n readonly axiosInstance: AxiosInstance;\n\n constructor(opts: TriggerClientOpts) {\n this.opts = opts;\n this.axiosInstance = axios.create({ withCredentials: true });\n }\n\n /**\n * Sets the linked signer for requests\n *\n * @param linkedSignerWalletClient The linkedSigner to use for all signatures. Set to null to revert to the chain signer\n */\n public setLinkedSigner(\n linkedSignerWalletClient: WalletClientWithAccount | null,\n ) {\n this.opts.linkedSignerWalletClient = linkedSignerWalletClient ?? undefined;\n }\n\n /*\n Executes\n */\n\n async placeTriggerOrder(params: TriggerPlaceOrderParams) {\n const orderParams: EIP712OrderParams = {\n amount: params.order.amount,\n expiration: params.order.expiration,\n price: params.order.price,\n subaccountName: params.order.subaccountName,\n subaccountOwner: params.order.subaccountOwner,\n nonce: params.nonce ?? getTriggerOrderNonce(),\n };\n const signature = await this.sign(\n 'place_order',\n params.verifyingAddr,\n params.chainId,\n orderParams,\n );\n\n const executeParams: TriggerServerExecuteRequestByType['place_order'] = {\n id: params.id ?? null,\n order: getNadoEIP712Values('place_order', orderParams),\n trigger: mapTriggerCriteria(params.triggerCriteria),\n signature,\n product_id: params.productId,\n spot_leverage: params.spotLeverage ?? null,\n digest: params.digest ?? null,\n };\n\n return this.execute('place_order', executeParams);\n }\n\n async cancelTriggerOrders(params: TriggerCancelOrdersParams) {\n const cancelOrdersParams: EIP712CancelOrdersParams = {\n digests: params.digests,\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values('cancel_orders', cancelOrdersParams);\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_orders'] = {\n signature: await this.sign(\n 'cancel_orders',\n params.verifyingAddr,\n params.chainId,\n cancelOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_orders', executeParams);\n }\n\n async cancelProductOrders(params: TriggerCancelProductOrdersParams) {\n const cancelProductOrdersParams: EIP712CancelProductOrdersParams = {\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values(\n 'cancel_product_orders',\n cancelProductOrdersParams,\n );\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_product_orders'] =\n {\n signature: await this.sign(\n 'cancel_product_orders',\n params.verifyingAddr,\n params.chainId,\n cancelProductOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_product_orders', executeParams);\n }\n\n /*\n Queries\n */\n async listOrders(\n params: TriggerListOrdersParams,\n ): Promise<TriggerListOrdersResponse> {\n const signatureParams: EIP712ListTriggerOrdersParams = {\n // Default to 90 seconds from now if no recvTime is provided\n recvTime: toIntegerString(params.recvTime ?? getDefaultRecvTime()),\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n\n const tx = getNadoEIP712Values('list_trigger_orders', signatureParams);\n const signature = await this.sign(\n 'list_trigger_orders',\n params.verifyingAddr,\n params.chainId,\n signatureParams,\n );\n\n const queryParams: TriggerServerQueryRequestByType['list_trigger_orders'] =\n {\n limit: params.limit,\n max_update_time: params.maxUpdateTimeInclusive,\n pending: params.pending,\n product_id: params.productId,\n digests: params.digests,\n signature,\n tx,\n };\n\n const baseResponse = await this.query('list_trigger_orders', queryParams);\n\n const orders: TriggerOrderInfo[] =\n baseResponse.orders.map(mapServerOrderInfo);\n\n return {\n orders,\n };\n }\n\n /*\n Base Fns\n */\n protected async sign<T extends SignableRequestType>(\n requestType: T,\n verifyingContract: string,\n chainId: number,\n params: SignableRequestTypeToParams[T],\n ) {\n // Use the linked signer if provided, otherwise use the default signer provided to the engine\n const walletClient =\n this.opts.linkedSignerWalletClient ?? this.opts.walletClient;\n\n if (walletClient == null) {\n throw new WalletNotProvidedError();\n }\n\n return getSignedTransactionRequest({\n chainId,\n requestParams: params,\n requestType,\n walletClient,\n verifyingContract,\n });\n }\n\n /**\n * POSTs an execute message to the trigger service and returns the successful response. Throws the failure response wrapped\n * in an TriggerServerFailureError on failure.\n *\n * @param requestType\n * @param params\n */\n protected async execute<TRequestType extends TriggerServerExecuteRequestType>(\n requestType: TRequestType,\n params: TriggerServerExecuteRequestByType[TRequestType],\n ): Promise<TriggerServerExecuteSuccessResult<TRequestType>> {\n const reqBody = {\n [requestType]: params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerExecuteResult<TRequestType>\n >(`${this.opts.url}/execute`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus catches the failure result and throws the error, so the cast to the success response is acceptable here\n return response.data as TriggerServerExecuteSuccessResult<TRequestType>;\n }\n\n protected async query<TRequestType extends TriggerServerQueryRequestType>(\n requestType: TRequestType,\n params: TriggerServerQueryRequestByType[TRequestType],\n ): Promise<TriggerServerQueryResponseByType[TRequestType]> {\n const reqBody = {\n type: requestType,\n ...params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerQueryResponse<TRequestType>\n >(`${this.opts.url}/query`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus throws on failure responses so the cast to the success response is acceptable here\n const successResponse = response as AxiosResponse<\n TriggerServerQuerySuccessResponse<TRequestType>\n >;\n\n return successResponse.data.data;\n }\n\n private checkResponseStatus(response: AxiosResponse) {\n if (response.status !== 200 || !response.data) {\n throw Error(\n `Unexpected response from server: ${response.status} ${response.statusText}`,\n );\n }\n }\n\n private checkServerStatus(\n response: AxiosResponse<\n TriggerServerExecuteResult | TriggerServerQueryResponse\n >,\n ) {\n if (response.data.status !== 'success') {\n throw new TriggerServerFailureError(response.data);\n }\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/TriggerClient.ts"],"sourcesContent":["import {\n EIP712CancelOrdersParams,\n EIP712CancelProductOrdersParams,\n EIP712ListTriggerOrdersParams,\n EIP712OrderParams,\n getDefaultRecvTime,\n getNadoEIP712Values,\n getOrderNonce,\n getSignedTransactionRequest,\n SignableRequestType,\n SignableRequestTypeToParams,\n toIntegerString,\n WalletClientWithAccount,\n WalletNotProvidedError,\n} from '@nadohq/shared';\nimport axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport {\n mapServerOrderInfo,\n mapTriggerCriteria,\n mapTwapExecutionStatus,\n} from './dataMappers';\nimport {\n TriggerCancelOrdersParams,\n TriggerCancelProductOrdersParams,\n TriggerListOrdersParams,\n TriggerListOrdersResponse,\n TriggerListTwapExecutionsParams,\n TriggerListTwapExecutionsResponse,\n TriggerOrderInfo,\n TriggerPlaceOrderParams,\n TriggerPlaceOrdersParams,\n TriggerServerExecuteRequestByType,\n TriggerServerExecuteRequestType,\n TriggerServerExecuteResult,\n TriggerServerExecuteSuccessResult,\n TriggerServerQueryRequestByType,\n TriggerServerQueryRequestType,\n TriggerServerQueryResponse,\n TriggerServerQueryResponseByType,\n TriggerServerQuerySuccessResponse,\n TwapExecutionInfo,\n} from './types';\nimport { TriggerServerFailureError } from './types/TriggerServerFailureError';\n\nexport interface TriggerClientOpts {\n // Server URL\n url: string;\n // Wallet client for EIP712 signing\n walletClient?: WalletClientWithAccount;\n // Linked signer registered through the engine, if provided, execute requests will use this signer\n linkedSignerWalletClient?: WalletClientWithAccount;\n}\n\n/**\n * Client for all trigger service requests\n */\nexport class TriggerClient {\n readonly opts: TriggerClientOpts;\n readonly axiosInstance: AxiosInstance;\n\n constructor(opts: TriggerClientOpts) {\n this.opts = opts;\n this.axiosInstance = axios.create({\n withCredentials: true,\n // We have custom logic to validate response status and create an appropriate error\n validateStatus: () => true,\n });\n }\n\n /**\n * Sets the linked signer for requests\n *\n * @param linkedSignerWalletClient The linkedSigner to use for all signatures. Set to null to revert to the chain signer\n */\n public setLinkedSigner(\n linkedSignerWalletClient: WalletClientWithAccount | null,\n ) {\n this.opts.linkedSignerWalletClient = linkedSignerWalletClient ?? undefined;\n }\n\n /*\n Executes\n */\n\n async placeTriggerOrder(params: TriggerPlaceOrderParams) {\n return this.execute(\n 'place_order',\n await this.buildPlaceOrderExecuteParams(params),\n );\n }\n\n async placeTriggerOrders(params: TriggerPlaceOrdersParams) {\n const executeParams: TriggerServerExecuteRequestByType['place_orders'] = {\n orders: await Promise.all(\n params.orders.map(async (orderParam) =>\n this.buildPlaceOrderExecuteParams(orderParam),\n ),\n ),\n cancel_on_failure: params.cancelOnFailure ?? null,\n };\n\n return this.execute('place_orders', executeParams);\n }\n\n async cancelTriggerOrders(params: TriggerCancelOrdersParams) {\n const cancelOrdersParams: EIP712CancelOrdersParams = {\n digests: params.digests,\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values('cancel_orders', cancelOrdersParams);\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_orders'] = {\n signature: await this.sign(\n 'cancel_orders',\n params.verifyingAddr,\n params.chainId,\n cancelOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_orders', executeParams);\n }\n\n async cancelProductOrders(params: TriggerCancelProductOrdersParams) {\n const cancelProductOrdersParams: EIP712CancelProductOrdersParams = {\n nonce: params.nonce ?? getOrderNonce(),\n productIds: params.productIds,\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n const tx = getNadoEIP712Values(\n 'cancel_product_orders',\n cancelProductOrdersParams,\n );\n\n const executeParams: TriggerServerExecuteRequestByType['cancel_product_orders'] =\n {\n signature: await this.sign(\n 'cancel_product_orders',\n params.verifyingAddr,\n params.chainId,\n cancelProductOrdersParams,\n ),\n tx,\n };\n\n return this.execute('cancel_product_orders', executeParams);\n }\n\n /*\n Queries\n */\n async listOrders(\n params: TriggerListOrdersParams,\n ): Promise<TriggerListOrdersResponse> {\n const signatureParams: EIP712ListTriggerOrdersParams = {\n // Default to 90 seconds from now if no recvTime is provided\n recvTime: toIntegerString(params.recvTime ?? getDefaultRecvTime()),\n subaccountName: params.subaccountName,\n subaccountOwner: params.subaccountOwner,\n };\n\n const tx = getNadoEIP712Values('list_trigger_orders', signatureParams);\n const signature = await this.sign(\n 'list_trigger_orders',\n params.verifyingAddr,\n params.chainId,\n signatureParams,\n );\n\n const queryParams: TriggerServerQueryRequestByType['list_trigger_orders'] =\n {\n limit: params.limit,\n max_update_time: params.maxUpdateTimeInclusive,\n status_types: params.statusTypes,\n product_ids: params.productIds,\n digests: params.digests,\n trigger_types: params.triggerTypes,\n reduce_only: params.reduceOnly,\n signature,\n tx,\n };\n\n const baseResponse = await this.query('list_trigger_orders', queryParams);\n\n const orders: TriggerOrderInfo[] =\n baseResponse.orders.map(mapServerOrderInfo);\n\n return {\n orders,\n };\n }\n\n async listTwapExecutions(\n params: TriggerListTwapExecutionsParams,\n ): Promise<TriggerListTwapExecutionsResponse> {\n const queryParams: TriggerServerQueryRequestByType['list_twap_executions'] =\n {\n digest: params.digest,\n };\n\n const baseResponse = await this.query('list_twap_executions', queryParams);\n\n const executions: TwapExecutionInfo[] = baseResponse.executions.map(\n (execution) => ({\n executionId: execution.execution_id,\n scheduledTime: execution.scheduled_time,\n status: mapTwapExecutionStatus(execution.status),\n updatedAt: execution.updated_at,\n }),\n );\n\n return {\n executions,\n };\n }\n\n /*\n Base Fns\n */\n\n async buildPlaceOrderExecuteParams(\n params: TriggerPlaceOrderParams,\n ): Promise<TriggerServerExecuteRequestByType['place_order']> {\n const orderParams: EIP712OrderParams = {\n amount: params.order.amount,\n expiration: params.order.expiration,\n price: params.order.price,\n subaccountName: params.order.subaccountName,\n subaccountOwner: params.order.subaccountOwner,\n nonce: params.nonce ?? getOrderNonce(),\n appendix: params.order.appendix,\n };\n const signature = await this.sign(\n 'place_order',\n params.verifyingAddr,\n params.chainId,\n orderParams,\n );\n\n return {\n id: params.id ?? null,\n order: getNadoEIP712Values('place_order', orderParams),\n trigger: mapTriggerCriteria(params.triggerCriteria),\n signature,\n product_id: params.productId,\n spot_leverage: params.spotLeverage ?? null,\n digest: params.digest ?? null,\n borrow_margin: params.borrowMargin ?? null,\n };\n }\n\n protected async sign<T extends SignableRequestType>(\n requestType: T,\n verifyingContract: string,\n chainId: number,\n params: SignableRequestTypeToParams[T],\n ) {\n // Use the linked signer if provided, otherwise use the default signer provided to the engine\n const walletClient =\n this.opts.linkedSignerWalletClient ?? this.opts.walletClient;\n\n if (walletClient == null) {\n throw new WalletNotProvidedError();\n }\n\n return getSignedTransactionRequest({\n chainId,\n requestParams: params,\n requestType,\n walletClient,\n verifyingContract,\n });\n }\n\n /**\n * POSTs an execute message to the trigger service and returns the successful response. Throws the failure response wrapped\n * in an TriggerServerFailureError on failure.\n *\n * @param requestType\n * @param params\n */\n protected async execute<TRequestType extends TriggerServerExecuteRequestType>(\n requestType: TRequestType,\n params: TriggerServerExecuteRequestByType[TRequestType],\n ): Promise<TriggerServerExecuteSuccessResult<TRequestType>> {\n const reqBody = {\n [requestType]: params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerExecuteResult<TRequestType>\n >(`${this.opts.url}/execute`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus catches the failure result and throws the error, so the cast to the success response is acceptable here\n return response.data as TriggerServerExecuteSuccessResult<TRequestType>;\n }\n\n protected async query<TRequestType extends TriggerServerQueryRequestType>(\n requestType: TRequestType,\n params: TriggerServerQueryRequestByType[TRequestType],\n ): Promise<TriggerServerQueryResponseByType[TRequestType]> {\n const reqBody = {\n type: requestType,\n ...params,\n };\n const response = await this.axiosInstance.post<\n TriggerServerQueryResponse<TRequestType>\n >(`${this.opts.url}/query`, reqBody);\n\n this.checkResponseStatus(response);\n this.checkServerStatus(response);\n\n // checkServerStatus throws on failure responses so the cast to the success response is acceptable here\n const successResponse = response as AxiosResponse<\n TriggerServerQuerySuccessResponse<TRequestType>\n >;\n\n return successResponse.data.data;\n }\n\n private checkResponseStatus(response: AxiosResponse) {\n if (response.status !== 200 || !response.data) {\n throw Error(\n `Unexpected response from server: ${response.status} ${response.statusText}. Data: ${response.data}`,\n );\n }\n }\n\n private checkServerStatus(\n response: AxiosResponse<\n TriggerServerExecuteResult | TriggerServerQueryResponse\n >,\n ) {\n if (response.data.status !== 'success') {\n throw new TriggerServerFailureError(response.data);\n }\n }\n}\n"],"mappings":"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","names":[]}