@nadohq/trigger-client 0.1.0-alpha.2 → 0.1.0-alpha.20

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 +41 -17
  2. package/dist/TriggerClient.cjs.map +1 -1
  3. package/dist/TriggerClient.d.cts +5 -3
  4. package/dist/TriggerClient.d.ts +5 -3
  5. package/dist/TriggerClient.js +39 -10
  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 +42 -24
  39. package/dist/types/clientTypes.d.ts +42 -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 +4 -15
  48. package/dist/types/serverExecuteTypes.d.ts +4 -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 +48 -9
  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 +61 -41
  66. package/src/types/index.ts +2 -0
  67. package/src/types/serverExecuteTypes.ts +3 -24
  68. package/src/types/serverModelTypes.ts +55 -0
  69. package/src/types/serverQueryTypes.ts +75 -9
@@ -1,26 +1,45 @@
1
- import { SignedTx, EIP712ListTriggerOrdersValues } from '@nadohq/contracts';
2
1
  import { EngineServerExecuteResult } from '@nadohq/engine-client';
2
+ import { SignedTx, EIP712ListTriggerOrdersValues } from '@nadohq/shared';
3
3
  import { TriggerServerPlaceOrderParams } from './serverExecuteTypes.cjs';
4
+ import './serverModelTypes.cjs';
4
5
 
5
- type TriggerServerOrderStatus = 'pending' | {
6
- triggered: EngineServerExecuteResult;
6
+ type TriggerServerOrderStatus = {
7
+ cancelled: TriggerServerCancelReason;
7
8
  } | {
8
- cancelled: string;
9
+ triggered: EngineServerExecuteResult;
9
10
  } | {
10
11
  internal_error: string;
12
+ } | 'triggering' | 'waiting_price' | 'waiting_dependency' | {
13
+ twap_executing: {
14
+ current_execution: number;
15
+ total_executions: number;
16
+ };
17
+ } | {
18
+ twap_completed: {
19
+ executed: number;
20
+ total: number;
21
+ };
11
22
  };
12
23
  /**
13
24
  * Request types
14
25
  */
26
+ type TriggerServerTriggerTypeFilter = 'price_trigger' | 'time_trigger';
27
+ type TriggerServerStatusTypeFilter = 'cancelled' | 'triggered' | 'internal_error' | 'triggering' | 'waiting_price' | 'waiting_dependency' | 'twap_executing' | 'twap_completed';
15
28
  interface TriggerServerListTriggerOrdersParams extends SignedTx<EIP712ListTriggerOrdersValues> {
16
- pending: boolean;
17
- product_id?: number;
29
+ product_ids?: number[];
18
30
  max_update_time?: number;
19
31
  digests?: string[];
20
32
  limit?: number;
33
+ trigger_types?: TriggerServerTriggerTypeFilter[];
34
+ status_types?: TriggerServerStatusTypeFilter[];
35
+ reduce_only?: boolean;
36
+ }
37
+ interface TriggerServerListTwapExecutionsParams {
38
+ digest: string;
21
39
  }
22
40
  interface TriggerServerQueryRequestByType {
23
41
  list_trigger_orders: TriggerServerListTriggerOrdersParams;
42
+ list_twap_executions: TriggerServerListTwapExecutionsParams;
24
43
  }
25
44
  type TriggerServerQueryRequestType = keyof TriggerServerQueryRequestByType;
26
45
  /**
@@ -33,12 +52,34 @@ interface TriggerServerOrderInfo {
33
52
  order: TriggerServerOrder;
34
53
  status: TriggerServerOrderStatus;
35
54
  updated_at: number;
55
+ placed_at: number;
36
56
  }
37
57
  interface TriggerServerListTriggerOrdersResponse {
38
58
  orders: TriggerServerOrderInfo[];
39
59
  }
60
+ type TriggerServerCancelReason = 'user_requested' | 'linked_signer_changed' | 'expired' | 'account_health' | 'isolated_subaccount_closed' | 'dependent_order_cancelled';
61
+ type TriggerServerTwapExecutionStatus = 'pending' | {
62
+ executed: {
63
+ executed_time: number;
64
+ execute_response: EngineServerExecuteResult;
65
+ };
66
+ } | {
67
+ failed: string;
68
+ } | {
69
+ cancelled: TriggerServerCancelReason;
70
+ };
71
+ interface TriggerServerTwapExecutionInfo {
72
+ execution_id: number;
73
+ scheduled_time: number;
74
+ status: TriggerServerTwapExecutionStatus;
75
+ updated_at: number;
76
+ }
77
+ interface TriggerServerTwapExecutionsResponse {
78
+ executions: TriggerServerTwapExecutionInfo[];
79
+ }
40
80
  interface TriggerServerQueryResponseByType {
41
81
  list_trigger_orders: TriggerServerListTriggerOrdersResponse;
82
+ list_twap_executions: TriggerServerTwapExecutionsResponse;
42
83
  }
43
84
  interface TriggerServerQuerySuccessResponse<TQueryType extends keyof TriggerServerQueryResponseByType = TriggerServerQueryRequestType> {
44
85
  status: 'success';
@@ -51,4 +92,4 @@ interface TriggerServerQueryFailureResponse {
51
92
  }
52
93
  type TriggerServerQueryResponse<TQueryType extends keyof TriggerServerQueryResponseByType = TriggerServerQueryRequestType> = TriggerServerQuerySuccessResponse<TQueryType> | TriggerServerQueryFailureResponse;
53
94
 
54
- export type { TriggerServerListTriggerOrdersParams, TriggerServerListTriggerOrdersResponse, TriggerServerOrder, TriggerServerOrderInfo, TriggerServerOrderStatus, TriggerServerQueryFailureResponse, TriggerServerQueryRequestByType, TriggerServerQueryRequestType, TriggerServerQueryResponse, TriggerServerQueryResponseByType, TriggerServerQuerySuccessResponse };
95
+ export type { TriggerServerCancelReason, TriggerServerListTriggerOrdersParams, TriggerServerListTriggerOrdersResponse, TriggerServerListTwapExecutionsParams, TriggerServerOrder, TriggerServerOrderInfo, TriggerServerOrderStatus, TriggerServerQueryFailureResponse, TriggerServerQueryRequestByType, TriggerServerQueryRequestType, TriggerServerQueryResponse, TriggerServerQueryResponseByType, TriggerServerQuerySuccessResponse, TriggerServerStatusTypeFilter, TriggerServerTriggerTypeFilter, TriggerServerTwapExecutionInfo, TriggerServerTwapExecutionStatus, TriggerServerTwapExecutionsResponse };
@@ -1,26 +1,45 @@
1
- import { SignedTx, EIP712ListTriggerOrdersValues } from '@nadohq/contracts';
2
1
  import { EngineServerExecuteResult } from '@nadohq/engine-client';
2
+ import { SignedTx, EIP712ListTriggerOrdersValues } from '@nadohq/shared';
3
3
  import { TriggerServerPlaceOrderParams } from './serverExecuteTypes.js';
4
+ import './serverModelTypes.js';
4
5
 
5
- type TriggerServerOrderStatus = 'pending' | {
6
- triggered: EngineServerExecuteResult;
6
+ type TriggerServerOrderStatus = {
7
+ cancelled: TriggerServerCancelReason;
7
8
  } | {
8
- cancelled: string;
9
+ triggered: EngineServerExecuteResult;
9
10
  } | {
10
11
  internal_error: string;
12
+ } | 'triggering' | 'waiting_price' | 'waiting_dependency' | {
13
+ twap_executing: {
14
+ current_execution: number;
15
+ total_executions: number;
16
+ };
17
+ } | {
18
+ twap_completed: {
19
+ executed: number;
20
+ total: number;
21
+ };
11
22
  };
12
23
  /**
13
24
  * Request types
14
25
  */
26
+ type TriggerServerTriggerTypeFilter = 'price_trigger' | 'time_trigger';
27
+ type TriggerServerStatusTypeFilter = 'cancelled' | 'triggered' | 'internal_error' | 'triggering' | 'waiting_price' | 'waiting_dependency' | 'twap_executing' | 'twap_completed';
15
28
  interface TriggerServerListTriggerOrdersParams extends SignedTx<EIP712ListTriggerOrdersValues> {
16
- pending: boolean;
17
- product_id?: number;
29
+ product_ids?: number[];
18
30
  max_update_time?: number;
19
31
  digests?: string[];
20
32
  limit?: number;
33
+ trigger_types?: TriggerServerTriggerTypeFilter[];
34
+ status_types?: TriggerServerStatusTypeFilter[];
35
+ reduce_only?: boolean;
36
+ }
37
+ interface TriggerServerListTwapExecutionsParams {
38
+ digest: string;
21
39
  }
22
40
  interface TriggerServerQueryRequestByType {
23
41
  list_trigger_orders: TriggerServerListTriggerOrdersParams;
42
+ list_twap_executions: TriggerServerListTwapExecutionsParams;
24
43
  }
25
44
  type TriggerServerQueryRequestType = keyof TriggerServerQueryRequestByType;
26
45
  /**
@@ -33,12 +52,34 @@ interface TriggerServerOrderInfo {
33
52
  order: TriggerServerOrder;
34
53
  status: TriggerServerOrderStatus;
35
54
  updated_at: number;
55
+ placed_at: number;
36
56
  }
37
57
  interface TriggerServerListTriggerOrdersResponse {
38
58
  orders: TriggerServerOrderInfo[];
39
59
  }
60
+ type TriggerServerCancelReason = 'user_requested' | 'linked_signer_changed' | 'expired' | 'account_health' | 'isolated_subaccount_closed' | 'dependent_order_cancelled';
61
+ type TriggerServerTwapExecutionStatus = 'pending' | {
62
+ executed: {
63
+ executed_time: number;
64
+ execute_response: EngineServerExecuteResult;
65
+ };
66
+ } | {
67
+ failed: string;
68
+ } | {
69
+ cancelled: TriggerServerCancelReason;
70
+ };
71
+ interface TriggerServerTwapExecutionInfo {
72
+ execution_id: number;
73
+ scheduled_time: number;
74
+ status: TriggerServerTwapExecutionStatus;
75
+ updated_at: number;
76
+ }
77
+ interface TriggerServerTwapExecutionsResponse {
78
+ executions: TriggerServerTwapExecutionInfo[];
79
+ }
40
80
  interface TriggerServerQueryResponseByType {
41
81
  list_trigger_orders: TriggerServerListTriggerOrdersResponse;
82
+ list_twap_executions: TriggerServerTwapExecutionsResponse;
42
83
  }
43
84
  interface TriggerServerQuerySuccessResponse<TQueryType extends keyof TriggerServerQueryResponseByType = TriggerServerQueryRequestType> {
44
85
  status: 'success';
@@ -51,4 +92,4 @@ interface TriggerServerQueryFailureResponse {
51
92
  }
52
93
  type TriggerServerQueryResponse<TQueryType extends keyof TriggerServerQueryResponseByType = TriggerServerQueryRequestType> = TriggerServerQuerySuccessResponse<TQueryType> | TriggerServerQueryFailureResponse;
53
94
 
54
- export type { TriggerServerListTriggerOrdersParams, TriggerServerListTriggerOrdersResponse, TriggerServerOrder, TriggerServerOrderInfo, TriggerServerOrderStatus, TriggerServerQueryFailureResponse, TriggerServerQueryRequestByType, TriggerServerQueryRequestType, TriggerServerQueryResponse, TriggerServerQueryResponseByType, TriggerServerQuerySuccessResponse };
95
+ export type { TriggerServerCancelReason, TriggerServerListTriggerOrdersParams, TriggerServerListTriggerOrdersResponse, TriggerServerListTwapExecutionsParams, TriggerServerOrder, TriggerServerOrderInfo, TriggerServerOrderStatus, TriggerServerQueryFailureResponse, TriggerServerQueryRequestByType, TriggerServerQueryRequestType, TriggerServerQueryResponse, TriggerServerQueryResponseByType, TriggerServerQuerySuccessResponse, TriggerServerStatusTypeFilter, TriggerServerTriggerTypeFilter, TriggerServerTwapExecutionInfo, TriggerServerTwapExecutionStatus, TriggerServerTwapExecutionsResponse };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nadohq/trigger-client",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.0-alpha.20",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "> TODO: description",
@@ -37,9 +37,8 @@
37
37
  }
38
38
  },
39
39
  "dependencies": {
40
- "@nadohq/contracts": "^0.1.0-alpha.2",
41
- "@nadohq/engine-client": "^0.1.0-alpha.2",
42
- "@nadohq/utils": "^0.1.0-alpha.2",
40
+ "@nadohq/engine-client": "^0.1.0-alpha.20",
41
+ "@nadohq/shared": "^0.1.0-alpha.20",
43
42
  "axios": "*",
44
43
  "ts-mixer": "*"
45
44
  },
@@ -49,5 +48,5 @@
49
48
  "devDependencies": {
50
49
  "viem": "*"
51
50
  },
52
- "gitHead": "7ec8ff9383dc6734bb64511b87b0687438d01618"
51
+ "gitHead": "59a3e0df21791fd31860080fc9fa920129e4170d"
53
52
  }
@@ -7,19 +7,25 @@ import {
7
7
  getNadoEIP712Values,
8
8
  getOrderNonce,
9
9
  getSignedTransactionRequest,
10
- getTriggerOrderNonce,
11
10
  SignableRequestType,
12
11
  SignableRequestTypeToParams,
12
+ toIntegerString,
13
13
  WalletClientWithAccount,
14
- } from '@nadohq/contracts';
15
- import { toIntegerString, WalletNotProvidedError } from '@nadohq/utils';
14
+ WalletNotProvidedError,
15
+ } from '@nadohq/shared';
16
16
  import axios, { AxiosInstance, AxiosResponse } from 'axios';
17
- import { mapServerOrderInfo, mapTriggerCriteria } from './dataMappers';
17
+ import {
18
+ mapServerOrderInfo,
19
+ mapTriggerCriteria,
20
+ mapTwapExecutionStatus,
21
+ } from './dataMappers';
18
22
  import {
19
23
  TriggerCancelOrdersParams,
20
24
  TriggerCancelProductOrdersParams,
21
25
  TriggerListOrdersParams,
22
26
  TriggerListOrdersResponse,
27
+ TriggerListTwapExecutionsParams,
28
+ TriggerListTwapExecutionsResponse,
23
29
  TriggerOrderInfo,
24
30
  TriggerPlaceOrderParams,
25
31
  TriggerServerExecuteRequestByType,
@@ -31,6 +37,7 @@ import {
31
37
  TriggerServerQueryResponse,
32
38
  TriggerServerQueryResponseByType,
33
39
  TriggerServerQuerySuccessResponse,
40
+ TwapExecutionInfo,
34
41
  } from './types';
35
42
  import { TriggerServerFailureError } from './types/TriggerServerFailureError';
36
43
 
@@ -52,7 +59,11 @@ export class TriggerClient {
52
59
 
53
60
  constructor(opts: TriggerClientOpts) {
54
61
  this.opts = opts;
55
- this.axiosInstance = axios.create({ withCredentials: true });
62
+ this.axiosInstance = axios.create({
63
+ withCredentials: true,
64
+ // We have custom logic to validate response status and create an appropriate error
65
+ validateStatus: () => true,
66
+ });
56
67
  }
57
68
 
58
69
  /**
@@ -77,7 +88,8 @@ export class TriggerClient {
77
88
  price: params.order.price,
78
89
  subaccountName: params.order.subaccountName,
79
90
  subaccountOwner: params.order.subaccountOwner,
80
- nonce: params.nonce ?? getTriggerOrderNonce(),
91
+ nonce: params.nonce ?? getOrderNonce(),
92
+ appendix: params.order.appendix,
81
93
  };
82
94
  const signature = await this.sign(
83
95
  'place_order',
@@ -94,6 +106,7 @@ export class TriggerClient {
94
106
  product_id: params.productId,
95
107
  spot_leverage: params.spotLeverage ?? null,
96
108
  digest: params.digest ?? null,
109
+ borrow_margin: params.borrowMargin ?? null,
97
110
  };
98
111
 
99
112
  return this.execute('place_order', executeParams);
@@ -173,9 +186,11 @@ export class TriggerClient {
173
186
  {
174
187
  limit: params.limit,
175
188
  max_update_time: params.maxUpdateTimeInclusive,
176
- pending: params.pending,
177
- product_id: params.productId,
189
+ status_types: params.statusTypes,
190
+ product_ids: params.productIds,
178
191
  digests: params.digests,
192
+ trigger_types: params.triggerTypes,
193
+ reduce_only: params.reduceOnly,
179
194
  signature,
180
195
  tx,
181
196
  };
@@ -190,6 +205,30 @@ export class TriggerClient {
190
205
  };
191
206
  }
192
207
 
208
+ async listTwapExecutions(
209
+ params: TriggerListTwapExecutionsParams,
210
+ ): Promise<TriggerListTwapExecutionsResponse> {
211
+ const queryParams: TriggerServerQueryRequestByType['list_twap_executions'] =
212
+ {
213
+ digest: params.digest,
214
+ };
215
+
216
+ const baseResponse = await this.query('list_twap_executions', queryParams);
217
+
218
+ const executions: TwapExecutionInfo[] = baseResponse.executions.map(
219
+ (execution) => ({
220
+ executionId: execution.execution_id,
221
+ scheduledTime: execution.scheduled_time,
222
+ status: mapTwapExecutionStatus(execution.status),
223
+ updatedAt: execution.updated_at,
224
+ }),
225
+ );
226
+
227
+ return {
228
+ executions,
229
+ };
230
+ }
231
+
193
232
  /*
194
233
  Base Fns
195
234
  */
@@ -267,7 +306,7 @@ export class TriggerClient {
267
306
  private checkResponseStatus(response: AxiosResponse) {
268
307
  if (response.status !== 200 || !response.data) {
269
308
  throw Error(
270
- `Unexpected response from server: ${response.status} ${response.statusText}`,
309
+ `Unexpected response from server: ${response.status} ${response.statusText}. Data: ${response.data}`,
271
310
  );
272
311
  }
273
312
  }
@@ -3,122 +3,276 @@ import {
3
3
  removeDecimals,
4
4
  toBigDecimal,
5
5
  toIntegerString,
6
- } from '@nadohq/utils';
6
+ unpackOrderAppendix,
7
+ } from '@nadohq/shared';
7
8
  import {
9
+ PriceTriggerCriteria,
10
+ PriceTriggerRequirementType,
11
+ TimeTriggerCriteria,
8
12
  TriggerCriteria,
9
13
  TriggerOrder,
10
14
  TriggerOrderInfo,
11
15
  TriggerOrderStatus,
12
16
  TriggerServerOrderInfo,
13
17
  TriggerServerOrderStatus,
18
+ TriggerServerPriceRequirement,
19
+ TriggerServerPriceTriggerCriteria,
20
+ TriggerServerTimeTriggerCriteria,
14
21
  TriggerServerTriggerCriteria,
22
+ TriggerServerTwapExecutionStatus,
23
+ TwapExecutionStatus,
15
24
  } from './types';
16
25
 
17
- export function mapTriggerServerOrderStatus(
26
+ /**
27
+ * Maps client-side trigger criteria to server-side trigger criteria format.
28
+ * Converts price and time triggers to their respective server representations
29
+ * with proper decimal scaling and field name transformations.
30
+ *
31
+ * @param criteria - The client-side trigger criteria (price or time based)
32
+ * @returns The server-formatted trigger criteria ready for API transmission
33
+ */
34
+ export function mapTriggerCriteria(
35
+ criteria: TriggerCriteria,
36
+ ): TriggerServerTriggerCriteria {
37
+ switch (criteria.type) {
38
+ case 'price':
39
+ return {
40
+ price_trigger: mapPriceTriggerCriteria(criteria.criteria),
41
+ };
42
+ case 'time':
43
+ return {
44
+ time_trigger: mapTimeTriggerCriteria(criteria.criteria),
45
+ };
46
+ }
47
+ }
48
+
49
+ function mapPriceTriggerCriteria(
50
+ criteria: PriceTriggerCriteria,
51
+ ): TriggerServerPriceTriggerCriteria {
52
+ const priceValue = toIntegerString(addDecimals(criteria.triggerPrice));
53
+
54
+ const price_requirement = ((): TriggerServerPriceRequirement => {
55
+ switch (criteria.type) {
56
+ case 'oracle_price_above':
57
+ return { oracle_price_above: priceValue };
58
+ case 'oracle_price_below':
59
+ return { oracle_price_below: priceValue };
60
+ case 'last_price_above':
61
+ return { last_price_above: priceValue };
62
+ case 'last_price_below':
63
+ return { last_price_below: priceValue };
64
+ case 'mid_price_above':
65
+ return { mid_price_above: priceValue };
66
+ case 'mid_price_below':
67
+ return { mid_price_below: priceValue };
68
+ }
69
+ })();
70
+
71
+ return {
72
+ price_requirement,
73
+ dependency: criteria.dependency
74
+ ? {
75
+ digest: criteria.dependency.digest,
76
+ on_partial_fill: criteria.dependency.onPartialFill,
77
+ }
78
+ : undefined,
79
+ };
80
+ }
81
+
82
+ function mapTimeTriggerCriteria(
83
+ criteria: TimeTriggerCriteria,
84
+ ): TriggerServerTimeTriggerCriteria {
85
+ return {
86
+ interval: Number(criteria.interval),
87
+ amounts: criteria.amounts?.map((amount) => toIntegerString(amount)),
88
+ };
89
+ }
90
+
91
+ /**
92
+ * Maps complete server-side trigger order information to client-side format.
93
+ *
94
+ * @param info - The complete server-side trigger order information including order, status, and timestamps
95
+ * @returns The client-side trigger order information with converted values and normalized structure
96
+ */
97
+ export function mapServerOrderInfo(
98
+ info: TriggerServerOrderInfo,
99
+ ): TriggerOrderInfo {
100
+ const { order: serverOrder, status, updated_at, placed_at } = info;
101
+ const order: TriggerOrder = {
102
+ amount: toBigDecimal(serverOrder.order.amount),
103
+ expiration: Number(serverOrder.order.expiration),
104
+ nonce: serverOrder.order.nonce,
105
+ price: removeDecimals(toBigDecimal(serverOrder.order.priceX18)),
106
+ digest: serverOrder.digest,
107
+ productId: serverOrder.product_id,
108
+ triggerCriteria: mapServerTriggerCriteria(serverOrder.trigger),
109
+ appendix: unpackOrderAppendix(serverOrder.order.appendix),
110
+ };
111
+ return {
112
+ serverOrder,
113
+ order,
114
+ status: mapTriggerServerOrderStatus(status),
115
+ updatedAt: updated_at,
116
+ placementTime: placed_at,
117
+ };
118
+ }
119
+
120
+ function mapTriggerServerOrderStatus(
18
121
  status: TriggerServerOrderStatus,
19
122
  ): TriggerOrderStatus {
20
- if (status === 'pending') {
123
+ if (status === 'triggering') {
21
124
  return {
22
- type: 'pending',
125
+ type: 'triggering',
126
+ };
127
+ } else if (status === 'waiting_price') {
128
+ return {
129
+ type: 'waiting_price',
130
+ };
131
+ } else if (status === 'waiting_dependency') {
132
+ return {
133
+ type: 'waiting_dependency',
23
134
  };
24
135
  } else if ('cancelled' in status) {
25
136
  return {
26
137
  type: 'cancelled',
27
138
  reason: status.cancelled,
28
139
  };
140
+ } else if ('triggered' in status) {
141
+ return {
142
+ type: 'triggered',
143
+ result: status.triggered,
144
+ };
29
145
  } else if ('internal_error' in status) {
30
146
  return {
31
147
  type: 'internal_error',
32
148
  error: status.internal_error,
33
149
  };
34
- } else if ('triggered' in status) {
150
+ } else if ('twap_executing' in status) {
35
151
  return {
36
- type: 'triggered',
37
- result: status.triggered,
152
+ type: 'twap_executing',
153
+ currentExecution: status.twap_executing.current_execution,
154
+ totalExecutions: status.twap_executing.total_executions,
155
+ };
156
+ } else if ('twap_completed' in status) {
157
+ return {
158
+ type: 'twap_completed',
159
+ executed: status.twap_completed.executed,
160
+ total: status.twap_completed.total,
38
161
  };
39
162
  }
40
163
  throw Error(`Unknown trigger order status: ${JSON.stringify(status)}`);
41
164
  }
42
165
 
43
- export function mapTriggerCriteria(
44
- criteria: TriggerCriteria,
45
- ): TriggerServerTriggerCriteria {
46
- const priceValue = toIntegerString(addDecimals(criteria.triggerPrice));
47
- switch (criteria.type) {
48
- case 'oracle_price_above':
49
- return { price_above: priceValue };
50
- case 'oracle_price_below':
51
- return { price_below: priceValue };
52
- case 'last_price_above':
53
- return { last_price_above: priceValue };
54
- case 'last_price_below':
55
- return { last_price_below: priceValue };
56
- case 'mid_price_above':
57
- return { mid_price_above: priceValue };
58
- case 'mid_price_below':
59
- return { mid_price_below: priceValue };
60
- }
61
- }
62
-
63
- export function mapServerTriggerCriteria(
166
+ function mapServerTriggerCriteria(
64
167
  criteria: TriggerServerTriggerCriteria,
65
168
  ): TriggerCriteria {
66
- if ('price_above' in criteria) {
169
+ if ('price_trigger' in criteria) {
67
170
  return {
68
- type: 'oracle_price_above',
69
- triggerPrice: removeDecimals(criteria.price_above),
171
+ type: 'price',
172
+ criteria: mapServerPriceTriggerCriteria(criteria.price_trigger),
70
173
  };
71
174
  }
72
- if ('price_below' in criteria) {
175
+ if ('time_trigger' in criteria) {
73
176
  return {
74
- type: 'oracle_price_below',
75
- triggerPrice: removeDecimals(criteria.price_below),
177
+ type: 'time',
178
+ criteria: mapServerTimeTriggerCriteria(criteria.time_trigger),
76
179
  };
77
180
  }
78
- if ('last_price_above' in criteria) {
181
+ throw new Error(`Unknown trigger criteria: ${JSON.stringify(criteria)}`);
182
+ }
183
+
184
+ function mapServerPriceTriggerCriteria(
185
+ serverCriteria: TriggerServerPriceTriggerCriteria,
186
+ ): PriceTriggerCriteria {
187
+ const { price_requirement, dependency } = serverCriteria;
188
+
189
+ const { type, triggerPrice } = ((): {
190
+ type: PriceTriggerRequirementType;
191
+ triggerPrice: string;
192
+ } => {
193
+ if ('oracle_price_above' in price_requirement) {
194
+ return {
195
+ type: 'oracle_price_above',
196
+ triggerPrice: price_requirement.oracle_price_above,
197
+ };
198
+ } else if ('oracle_price_below' in price_requirement) {
199
+ return {
200
+ type: 'oracle_price_below',
201
+ triggerPrice: price_requirement.oracle_price_below,
202
+ };
203
+ } else if ('last_price_above' in price_requirement) {
204
+ return {
205
+ type: 'last_price_above',
206
+ triggerPrice: price_requirement.last_price_above,
207
+ };
208
+ } else if ('last_price_below' in price_requirement) {
209
+ return {
210
+ type: 'last_price_below',
211
+ triggerPrice: price_requirement.last_price_below,
212
+ };
213
+ } else if ('mid_price_above' in price_requirement) {
214
+ return {
215
+ type: 'mid_price_above',
216
+ triggerPrice: price_requirement.mid_price_above,
217
+ };
218
+ } else if ('mid_price_below' in price_requirement) {
219
+ return {
220
+ type: 'mid_price_below',
221
+ triggerPrice: price_requirement.mid_price_below,
222
+ };
223
+ } else {
224
+ throw new Error(
225
+ `Unknown price requirement: ${JSON.stringify(price_requirement)}`,
226
+ );
227
+ }
228
+ })();
229
+
230
+ return {
231
+ type,
232
+ triggerPrice: removeDecimals(triggerPrice),
233
+ dependency: dependency
234
+ ? {
235
+ digest: dependency.digest,
236
+ onPartialFill: dependency.on_partial_fill,
237
+ }
238
+ : undefined,
239
+ };
240
+ }
241
+
242
+ function mapServerTimeTriggerCriteria(
243
+ serverCriteria: TriggerServerTimeTriggerCriteria,
244
+ ): TimeTriggerCriteria {
245
+ return {
246
+ interval: toBigDecimal(serverCriteria.interval),
247
+ amounts: serverCriteria.amounts?.map((amount: string) =>
248
+ toBigDecimal(amount),
249
+ ),
250
+ };
251
+ }
252
+
253
+ export function mapTwapExecutionStatus(
254
+ status: TriggerServerTwapExecutionStatus,
255
+ ): TwapExecutionStatus {
256
+ if (status === 'pending') {
79
257
  return {
80
- type: 'last_price_above',
81
- triggerPrice: removeDecimals(criteria.last_price_above),
258
+ type: 'pending',
82
259
  };
83
- }
84
- if ('last_price_below' in criteria) {
260
+ } else if ('executed' in status) {
85
261
  return {
86
- type: 'last_price_below',
87
- triggerPrice: removeDecimals(criteria.last_price_below),
262
+ type: 'executed',
263
+ executedTime: status.executed.executed_time,
264
+ executeResponse: status.executed.execute_response,
88
265
  };
89
- }
90
- if ('mid_price_above' in criteria) {
266
+ } else if ('failed' in status) {
91
267
  return {
92
- type: 'mid_price_above',
93
- triggerPrice: removeDecimals(criteria.mid_price_above),
268
+ type: 'failed',
269
+ error: status.failed,
94
270
  };
95
- }
96
- if ('mid_price_below' in criteria) {
271
+ } else if ('cancelled' in status) {
97
272
  return {
98
- type: 'mid_price_below',
99
- triggerPrice: removeDecimals(criteria.mid_price_below),
273
+ type: 'cancelled',
274
+ reason: status.cancelled,
100
275
  };
101
276
  }
102
- throw new Error(`Unknown trigger criteria: ${JSON.stringify(criteria)}`);
103
- }
104
-
105
- export function mapServerOrderInfo(
106
- info: TriggerServerOrderInfo,
107
- ): TriggerOrderInfo {
108
- const { order: serverOrder, status, updated_at } = info;
109
- const order: TriggerOrder = {
110
- amount: toBigDecimal(serverOrder.order.amount),
111
- expiration: toBigDecimal(serverOrder.order.expiration),
112
- nonce: serverOrder.order.nonce,
113
- price: removeDecimals(toBigDecimal(serverOrder.order.priceX18)),
114
- digest: serverOrder.digest,
115
- productId: serverOrder.product_id,
116
- triggerCriteria: mapServerTriggerCriteria(serverOrder.trigger),
117
- };
118
- return {
119
- serverOrder,
120
- order,
121
- status: mapTriggerServerOrderStatus(status),
122
- updatedAt: updated_at,
123
- };
277
+ throw Error(`Unknown TWAP execution status: ${JSON.stringify(status)}`);
124
278
  }
package/src/endpoints.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { ChainEnv } from '@nadohq/contracts';
1
+ import { ChainEnv } from '@nadohq/shared';
2
2
 
3
3
  export const TRIGGER_CLIENT_ENDPOINTS: Record<ChainEnv, string> = {
4
4
  local: 'http://localhost:80/trigger',
5
- arbitrumTestnet: 'https://trigger.sepolia-test.vertexprotocol.com/v1',
6
5
  arbitrum: 'https://trigger.prod.vertexprotocol.com/v1',
6
+ inkTestnet: 'https://trigger.test.nado-backend.xyz/v1',
7
7
  };