@yuants/vendor-turboflow 1.1.0 → 1.2.0

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 (51) hide show
  1. package/.rush/temp/chunked-rush-logs/vendor-turboflow.build.chunks.jsonl +6 -6
  2. package/.rush/temp/operation/build/all.log +6 -6
  3. package/.rush/temp/operation/build/log-chunks.jsonl +6 -6
  4. package/.rush/temp/operation/build/state.json +1 -1
  5. package/.rush/temp/shrinkwrap-deps.json +1 -1
  6. package/CHANGELOG.json +37 -0
  7. package/CHANGELOG.md +13 -1
  8. package/README.md +134 -0
  9. package/lib/api/private-api.d.ts +2 -2
  10. package/lib/api/private-api.d.ts.map +1 -1
  11. package/lib/api/private-api.js +12 -15
  12. package/lib/api/private-api.js.map +1 -1
  13. package/lib/index.d.ts +2 -0
  14. package/lib/index.d.ts.map +1 -1
  15. package/lib/index.js +4 -0
  16. package/lib/index.js.map +1 -1
  17. package/lib/services/account-actions-with-credential.d.ts +2 -0
  18. package/lib/services/account-actions-with-credential.d.ts.map +1 -0
  19. package/lib/services/account-actions-with-credential.js +60 -0
  20. package/lib/services/account-actions-with-credential.js.map +1 -0
  21. package/lib/services/order-actions-with-credential.d.ts +2 -0
  22. package/lib/services/order-actions-with-credential.d.ts.map +1 -0
  23. package/lib/services/order-actions-with-credential.js +25 -0
  24. package/lib/services/order-actions-with-credential.js.map +1 -0
  25. package/lib/services/orders/cancelOrder.d.ts +4 -0
  26. package/lib/services/orders/cancelOrder.d.ts.map +1 -0
  27. package/lib/services/orders/cancelOrder.js +42 -0
  28. package/lib/services/orders/cancelOrder.js.map +1 -0
  29. package/lib/services/orders/listOrders.d.ts +7 -0
  30. package/lib/services/orders/listOrders.d.ts.map +1 -0
  31. package/lib/services/orders/listOrders.js +78 -0
  32. package/lib/services/orders/listOrders.js.map +1 -0
  33. package/lib/services/orders/modifyOrder.d.ts +4 -0
  34. package/lib/services/orders/modifyOrder.d.ts.map +1 -0
  35. package/lib/services/orders/modifyOrder.js +46 -0
  36. package/lib/services/orders/modifyOrder.js.map +1 -0
  37. package/lib/services/orders/submitOrder.d.ts +6 -0
  38. package/lib/services/orders/submitOrder.d.ts.map +1 -0
  39. package/lib/services/orders/submitOrder.js +61 -0
  40. package/lib/services/orders/submitOrder.js.map +1 -0
  41. package/package.json +5 -3
  42. package/rush-logs/vendor-turboflow.build.log +6 -6
  43. package/src/api/private-api.ts +25 -18
  44. package/src/index.ts +3 -0
  45. package/src/services/account-actions-with-credential.ts +76 -0
  46. package/src/services/order-actions-with-credential.ts +30 -0
  47. package/src/services/orders/cancelOrder.ts +43 -0
  48. package/src/services/orders/listOrders.ts +84 -0
  49. package/src/services/orders/modifyOrder.ts +46 -0
  50. package/src/services/orders/submitOrder.ts +63 -0
  51. package/temp/package-deps.json +17 -8
@@ -0,0 +1,84 @@
1
+ import { IActionHandlerOfListOrders, IOrder } from '@yuants/data-order';
2
+ import { encodePath, formatTime } from '@yuants/utils';
3
+ import { ICredential, getOrderList } from '../../api/private-api';
4
+
5
+ type OrderDirection = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT';
6
+
7
+ /**
8
+ * Map TurboFlow order_way to order direction
9
+ * 1: 开多 (Open Long), 2: 平空 (Close Short), 3: 开空 (Open Short), 4: 平多 (Close Long)
10
+ */
11
+ const mapOrderDirection = (order_way: number): OrderDirection => {
12
+ switch (order_way) {
13
+ case 1:
14
+ return 'OPEN_LONG';
15
+ case 2:
16
+ return 'CLOSE_SHORT';
17
+ case 3:
18
+ return 'OPEN_SHORT';
19
+ case 4:
20
+ return 'CLOSE_LONG';
21
+ default:
22
+ return 'OPEN_LONG';
23
+ }
24
+ };
25
+
26
+ /**
27
+ * Map TurboFlow order to Yuan IOrder format
28
+ */
29
+ const mapOrder = (order: any, account_id: string): IOrder => {
30
+ const volume = parseFloat(order.size) || 0;
31
+ const price = parseFloat(order.price) || 0;
32
+
33
+ return {
34
+ order_id: order.id,
35
+ account_id,
36
+ product_id: encodePath('PERPETUAL', order.pair_id),
37
+ order_type: order.order_type.toUpperCase() as any,
38
+ order_direction: mapOrderDirection(order.order_way),
39
+ volume: Number.isFinite(volume) ? volume : 0,
40
+ price: Number.isFinite(price) && price > 0 ? price : undefined,
41
+ submit_at: new Date(order.created_at).getTime(),
42
+ order_status: order.order_status.toLowerCase(),
43
+ comment: JSON.stringify({
44
+ pool_id: order.pool_id,
45
+ pair_id: order.pair_id,
46
+ coin_code: order.coin_code,
47
+ leverage: order.leverage,
48
+ margin_type: order.margin_type,
49
+ fee_mode: order.fee_mode,
50
+ pos_mode: order.pos_mode,
51
+ position_id: order.position_id,
52
+ }),
53
+ };
54
+ };
55
+
56
+ /**
57
+ * List orders implementation
58
+ */
59
+ export const listOrders: IActionHandlerOfListOrders<ICredential> = async (credential, account_id) => {
60
+ console.info(`[${formatTime(Date.now())}] Listing orders for account: ${account_id}`);
61
+
62
+ try {
63
+ // Get pending orders
64
+ const response = await getOrderList(credential, {
65
+ page_num: 1,
66
+ page_size: 100,
67
+ status: 'Pending',
68
+ });
69
+
70
+ if (response.errno !== '0') {
71
+ throw new Error(`Failed to list orders: ${response.msg}`);
72
+ }
73
+
74
+ const orders = response.data.data.map((order) => mapOrder(order, account_id));
75
+
76
+ console.info(`[${formatTime(Date.now())}] Found ${orders.length} orders`);
77
+
78
+ return orders;
79
+ } catch (error) {
80
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
81
+ console.error(`[${formatTime(Date.now())}] Failed to list orders for ${account_id}: ${errorMessage}`);
82
+ throw new Error(`Failed to list orders: ${errorMessage}`);
83
+ }
84
+ };
@@ -0,0 +1,46 @@
1
+ import { IOrder } from '@yuants/data-order';
2
+ import { formatTime } from '@yuants/utils';
3
+ import { ICredential, remendOrder } from '../../api/private-api';
4
+
5
+ export const modifyOrder = async (credential: ICredential, order: IOrder): Promise<void> => {
6
+ console.info(`[${formatTime(Date.now())}] Modifying order ${order.order_id}`);
7
+
8
+ try {
9
+ // Parse comment for position_id and other parameters
10
+ let position_id: string | undefined;
11
+ let tp_order: any;
12
+ let sl_order: any;
13
+
14
+ if (order.comment) {
15
+ try {
16
+ const params = JSON.parse(order.comment);
17
+ position_id = params.position_id;
18
+ tp_order = params.tp_order;
19
+ sl_order = params.sl_order;
20
+ } catch (e) {
21
+ console.warn(`[${formatTime(Date.now())}] Failed to parse order comment:`, e);
22
+ }
23
+ }
24
+
25
+ if (!position_id) {
26
+ throw new Error('position_id is required for modifying order');
27
+ }
28
+
29
+ const response = await remendOrder(credential, {
30
+ position_id,
31
+ price: order.price?.toString(),
32
+ vol: order.volume.toString(),
33
+ tp_order,
34
+ sl_order,
35
+ });
36
+
37
+ if (response.errno !== '0') {
38
+ throw new Error(`Failed to modify order: ${response.msg}`);
39
+ }
40
+
41
+ console.info(`[${formatTime(Date.now())}] Order modified successfully`);
42
+ } catch (error) {
43
+ console.error(`[${formatTime(Date.now())}] Error modifying order:`, error);
44
+ throw error;
45
+ }
46
+ };
@@ -0,0 +1,63 @@
1
+ import { IOrder } from '@yuants/data-order';
2
+ import { formatTime } from '@yuants/utils';
3
+ import { ICredential, submitOrder as submitOrderApi } from '../../api/private-api';
4
+
5
+ export const submitOrder = async (credential: ICredential, order: IOrder): Promise<{ order_id: string }> => {
6
+ // Parse product_id to get pair_id
7
+ const productParts = order.product_id.split('/');
8
+ const pair_id = productParts[productParts.length - 1];
9
+
10
+ // Determine order_way based on order_direction
11
+ // 1: 开多 (Open Long), 2: 平空 (Close Short), 3: 开空 (Open Short), 4: 平多 (Close Long)
12
+ let order_way: 1 | 2 | 3 | 4;
13
+ switch (order.order_direction) {
14
+ case 'OPEN_LONG':
15
+ order_way = 1;
16
+ break;
17
+ case 'CLOSE_SHORT':
18
+ order_way = 2;
19
+ break;
20
+ case 'OPEN_SHORT':
21
+ order_way = 3;
22
+ break;
23
+ case 'CLOSE_LONG':
24
+ order_way = 4;
25
+ break;
26
+ default:
27
+ throw new Error(`Unsupported order direction: ${order.order_direction}`);
28
+ }
29
+
30
+ // Determine order_type
31
+ let order_type: 'limit' | 'market' | 'stop_limit' | 'stop_market';
32
+ switch (order.order_type) {
33
+ case 'LIMIT':
34
+ order_type = 'limit';
35
+ break;
36
+ case 'MARKET':
37
+ order_type = 'market';
38
+ break;
39
+ default:
40
+ order_type = 'limit';
41
+ }
42
+
43
+ // Build the order request
44
+
45
+ const response = await submitOrderApi(credential, {
46
+ request_id: Date.now(),
47
+ pair_id,
48
+ pool_id: 2, // usdc
49
+ coin_code: '2', // usdc
50
+ order_type,
51
+ order_way,
52
+ margin_type: 2, // Default to cross margin
53
+ leverage: 100,
54
+ size: order.volume.toString(), // usdc value
55
+ position_mode: 1, // Default to one-way
56
+ time_in_force: 'GTC' as const,
57
+ fee_mode: 1,
58
+ order_mode: 1 as const, // Normal order
59
+ price: order.price?.toString(),
60
+ });
61
+
62
+ return { order_id: response.data.order.id };
63
+ };
@@ -1,12 +1,21 @@
1
1
  {
2
- "apps/vendor-turboflow/CHANGELOG.json": "1e7ab5be9628f789b599e5055cd6b2f7cacd360e",
3
- "apps/vendor-turboflow/CHANGELOG.md": "d445af2347d78f45f202fe2b2533661cb6df88bf",
4
- "apps/vendor-turboflow/package.json": "e9b561ab5e033d9bf0d5c6e1739c653af6038970",
5
- "apps/vendor-turboflow/src/api/private-api.ts": "bd1289d75502eab773dbf903c50aaebb3330bbc7",
6
- "apps/vendor-turboflow/src/index.ts": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
2
+ "apps/vendor-turboflow/CHANGELOG.json": "350b7c6800859724fd1ff4a1c4df32e164d854a3",
3
+ "apps/vendor-turboflow/CHANGELOG.md": "31fc93ba045c6d26ff202823e59d114cf6c26092",
4
+ "apps/vendor-turboflow/README.md": "084c5960ccac11196467867e63c790f6b14ca3a5",
5
+ "apps/vendor-turboflow/package.json": "f246025cb7eef95826dab6e3e14cb7b07b241cd1",
6
+ "apps/vendor-turboflow/src/api/private-api.ts": "984f48c4fefbd06372477d55d77d04e5100677c5",
7
+ "apps/vendor-turboflow/src/index.ts": "8bdf474409cc344ea02d884afe5d51ec69b1ec09",
8
+ "apps/vendor-turboflow/src/services/account-actions-with-credential.ts": "a6bc02ec571edbfe92ee884b17a291d0982536b4",
9
+ "apps/vendor-turboflow/src/services/order-actions-with-credential.ts": "65a026635484aca00a22ad1e3a37fdcc87955311",
10
+ "apps/vendor-turboflow/src/services/orders/cancelOrder.ts": "1d5f6bdb44c1905be945996e578c7d5667cd021e",
11
+ "apps/vendor-turboflow/src/services/orders/listOrders.ts": "01121cbaee641a6ea4fd6c05fee0094c7a74ebfb",
12
+ "apps/vendor-turboflow/src/services/orders/modifyOrder.ts": "b833093cf61948efe6007cfc95583ef525201cd1",
13
+ "apps/vendor-turboflow/src/services/orders/submitOrder.ts": "a4684d1cdd0529a796d8e2173093e32db7258011",
7
14
  "apps/vendor-turboflow/tsconfig.json": "5d15ec8bd54da210724db6ed27c0f925f86ee153",
8
- "apps/vendor-turboflow/.rush/temp/shrinkwrap-deps.json": "28785b0befb5998cb952f15644f5134b770d497b",
9
- "libraries/protocol/temp/package-deps.json": "1066c0e55149b4c79b28652f4f38ce8af1c1ac05",
10
- "libraries/utils/temp/package-deps.json": "8c6f73fea6edf8cf30af2d69ad4dc25a7a6e6c4b",
15
+ "apps/vendor-turboflow/.rush/temp/shrinkwrap-deps.json": "bd10565593bf1d1988009aa7c17f190815026be9",
16
+ "libraries/protocol/temp/package-deps.json": "00d9a96a90bfc0e57ef3b9547151f2970a600402",
17
+ "libraries/utils/temp/package-deps.json": "4a683c07df7c75079b700111b9f6beb36c74ff7d",
18
+ "libraries/data-account/temp/package-deps.json": "bf8b41c4d878dab0f39ea684fffaf6bc3c74c988",
19
+ "libraries/data-order/temp/package-deps.json": "4a0272551da88c9eb52150775640b12c31786de8",
11
20
  "tools/toolkit/temp/package-deps.json": "23e053490eb8feade23e4d45de4e54883e322711"
12
21
  }