@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.
- package/dist/TriggerClient.cjs +41 -17
- package/dist/TriggerClient.cjs.map +1 -1
- package/dist/TriggerClient.d.cts +5 -3
- package/dist/TriggerClient.d.ts +5 -3
- package/dist/TriggerClient.js +39 -10
- package/dist/TriggerClient.js.map +1 -1
- package/dist/dataMappers.cjs +170 -67
- package/dist/dataMappers.cjs.map +1 -1
- package/dist/dataMappers.d.cts +22 -8
- package/dist/dataMappers.d.ts +22 -8
- package/dist/dataMappers.js +171 -66
- package/dist/dataMappers.js.map +1 -1
- package/dist/endpoints.cjs +2 -2
- package/dist/endpoints.cjs.map +1 -1
- package/dist/endpoints.d.cts +1 -1
- package/dist/endpoints.d.ts +1 -1
- package/dist/endpoints.js +2 -2
- package/dist/endpoints.js.map +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -8
- package/dist/index.d.ts +9 -8
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/types/TriggerServerFailureError.cjs +1 -1
- package/dist/types/TriggerServerFailureError.cjs.map +1 -1
- package/dist/types/TriggerServerFailureError.d.cts +3 -2
- package/dist/types/TriggerServerFailureError.d.ts +3 -2
- package/dist/types/TriggerServerFailureError.js +1 -1
- package/dist/types/TriggerServerFailureError.js.map +1 -1
- package/dist/types/clientModelTypes.cjs +19 -0
- package/dist/types/clientModelTypes.cjs.map +1 -0
- package/dist/types/clientModelTypes.d.cts +67 -0
- package/dist/types/clientModelTypes.d.ts +67 -0
- package/dist/types/clientModelTypes.js +1 -0
- package/dist/types/clientModelTypes.js.map +1 -0
- package/dist/types/clientTypes.cjs.map +1 -1
- package/dist/types/clientTypes.d.cts +42 -24
- package/dist/types/clientTypes.d.ts +42 -24
- package/dist/types/index.cjs +4 -0
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts +6 -5
- package/dist/types/index.d.ts +6 -5
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/serverExecuteTypes.cjs.map +1 -1
- package/dist/types/serverExecuteTypes.d.cts +4 -15
- package/dist/types/serverExecuteTypes.d.ts +4 -15
- package/dist/types/serverModelTypes.cjs +19 -0
- package/dist/types/serverModelTypes.cjs.map +1 -0
- package/dist/types/serverModelTypes.d.cts +42 -0
- package/dist/types/serverModelTypes.d.ts +42 -0
- package/dist/types/serverModelTypes.js +1 -0
- package/dist/types/serverModelTypes.js.map +1 -0
- package/dist/types/serverQueryTypes.cjs.map +1 -1
- package/dist/types/serverQueryTypes.d.cts +48 -7
- package/dist/types/serverQueryTypes.d.ts +48 -7
- package/package.json +4 -5
- package/src/TriggerClient.ts +48 -9
- package/src/dataMappers.ts +225 -71
- package/src/endpoints.ts +2 -2
- package/src/index.ts +2 -2
- package/src/types/TriggerServerFailureError.ts +2 -2
- package/src/types/clientModelTypes.ts +95 -0
- package/src/types/clientTypes.ts +61 -41
- package/src/types/index.ts +2 -0
- package/src/types/serverExecuteTypes.ts +3 -24
- package/src/types/serverModelTypes.ts +55 -0
- 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 =
|
|
6
|
-
|
|
6
|
+
type TriggerServerOrderStatus = {
|
|
7
|
+
cancelled: TriggerServerCancelReason;
|
|
7
8
|
} | {
|
|
8
|
-
|
|
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
|
-
|
|
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 =
|
|
6
|
-
|
|
6
|
+
type TriggerServerOrderStatus = {
|
|
7
|
+
cancelled: TriggerServerCancelReason;
|
|
7
8
|
} | {
|
|
8
|
-
|
|
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
|
-
|
|
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.
|
|
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/
|
|
41
|
-
"@nadohq/
|
|
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": "
|
|
51
|
+
"gitHead": "59a3e0df21791fd31860080fc9fa920129e4170d"
|
|
53
52
|
}
|
package/src/TriggerClient.ts
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
14
|
+
WalletNotProvidedError,
|
|
15
|
+
} from '@nadohq/shared';
|
|
16
16
|
import axios, { AxiosInstance, AxiosResponse } from 'axios';
|
|
17
|
-
import {
|
|
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({
|
|
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 ??
|
|
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
|
-
|
|
177
|
-
|
|
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
|
}
|
package/src/dataMappers.ts
CHANGED
|
@@ -3,122 +3,276 @@ import {
|
|
|
3
3
|
removeDecimals,
|
|
4
4
|
toBigDecimal,
|
|
5
5
|
toIntegerString,
|
|
6
|
-
|
|
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
|
-
|
|
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 === '
|
|
123
|
+
if (status === 'triggering') {
|
|
21
124
|
return {
|
|
22
|
-
type: '
|
|
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 ('
|
|
150
|
+
} else if ('twap_executing' in status) {
|
|
35
151
|
return {
|
|
36
|
-
type: '
|
|
37
|
-
|
|
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
|
-
|
|
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 ('
|
|
169
|
+
if ('price_trigger' in criteria) {
|
|
67
170
|
return {
|
|
68
|
-
type: '
|
|
69
|
-
|
|
171
|
+
type: 'price',
|
|
172
|
+
criteria: mapServerPriceTriggerCriteria(criteria.price_trigger),
|
|
70
173
|
};
|
|
71
174
|
}
|
|
72
|
-
if ('
|
|
175
|
+
if ('time_trigger' in criteria) {
|
|
73
176
|
return {
|
|
74
|
-
type: '
|
|
75
|
-
|
|
177
|
+
type: 'time',
|
|
178
|
+
criteria: mapServerTimeTriggerCriteria(criteria.time_trigger),
|
|
76
179
|
};
|
|
77
180
|
}
|
|
78
|
-
|
|
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: '
|
|
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: '
|
|
87
|
-
|
|
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: '
|
|
93
|
-
|
|
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: '
|
|
99
|
-
|
|
273
|
+
type: 'cancelled',
|
|
274
|
+
reason: status.cancelled,
|
|
100
275
|
};
|
|
101
276
|
}
|
|
102
|
-
throw
|
|
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/
|
|
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
|
};
|