@yuants/vendor-turboflow 1.2.27 → 1.2.29
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/.rush/temp/chunked-rush-logs/vendor-turboflow.build.chunks.jsonl +17 -22
- package/.rush/temp/operation/build/all.log +17 -22
- package/.rush/temp/operation/build/log-chunks.jsonl +17 -22
- package/.rush/temp/operation/build/state.json +1 -1
- package/.rush/temp/shrinkwrap-deps.json +543 -435
- package/.rush/temp/yuants+vendor-turboflow_build_12fb188cd8f2be8793f2eed4c236e3c31969dcdb.tar.log +69 -0
- package/CHANGELOG.json +57 -0
- package/CHANGELOG.md +13 -1
- package/config/jest.config.json +3 -0
- package/config/rig.json +6 -0
- package/config/typescript.json +13 -0
- package/dist/api/private-api.js +121 -0
- package/dist/api/private-api.js.map +1 -0
- package/dist/api/public-api.js +24 -0
- package/dist/api/public-api.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/services/exchange.js +94 -0
- package/dist/services/exchange.js.map +1 -0
- package/dist/services/order-actions-with-credential.js +23 -0
- package/dist/services/order-actions-with-credential.js.map +1 -0
- package/dist/services/orders/cancelOrder.js +31 -0
- package/dist/services/orders/cancelOrder.js.map +1 -0
- package/dist/services/orders/listOrders.js +61 -0
- package/dist/services/orders/listOrders.js.map +1 -0
- package/dist/services/orders/modifyOrder.js +42 -0
- package/dist/services/orders/modifyOrder.js.map +1 -0
- package/dist/services/orders/submitOrder.js +69 -0
- package/dist/services/orders/submitOrder.js.map +1 -0
- package/lib/api/private-api.d.ts +26 -26
- package/lib/api/private-api.d.ts.map +1 -1
- package/lib/api/private-api.js.map +1 -1
- package/lib/api/public-api.d.ts.map +1 -1
- package/lib/api/public-api.js.map +1 -1
- package/lib/services/exchange.js +1 -1
- package/lib/services/exchange.js.map +1 -1
- package/lib/services/orders/cancelOrder.d.ts.map +1 -1
- package/lib/services/orders/cancelOrder.js.map +1 -1
- package/lib/services/orders/listOrders.d.ts.map +1 -1
- package/lib/services/orders/listOrders.js +1 -1
- package/lib/services/orders/listOrders.js.map +1 -1
- package/lib/services/orders/modifyOrder.d.ts.map +1 -1
- package/lib/services/orders/modifyOrder.js.map +1 -1
- package/lib/services/orders/submitOrder.d.ts.map +1 -1
- package/lib/services/orders/submitOrder.js +7 -7
- package/lib/services/orders/submitOrder.js.map +1 -1
- package/package.json +31 -29
- package/rush-logs/vendor-turboflow.build.cache.log +4 -1
- package/rush-logs/vendor-turboflow.build.log +17 -22
- package/temp/build/typescript/ts_zFq2B6Vf.json +1 -0
- package/temp/package-deps.json +14 -11
- package/temp/test/jest/haste-map-8da76140b2b07765354e535592c7b35f-798a118b6d313e054e69a784a276ddc7-ffbd83ce86c42c04c3a6c5159eec9906 +0 -0
package/.rush/temp/yuants+vendor-turboflow_build_12fb188cd8f2be8793f2eed4c236e3c31969dcdb.tar.log
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
Start time: Tue Jan 06 2026 19:02:43 GMT+0000 (Coordinated Universal Time)
|
|
2
|
+
Invoking "/usr/bin/tar -c -f /home/runner/work/Yuan/Yuan/common/temp/build-cache/yuants+vendor-turboflow_build_12fb188cd8f2be8793f2eed4c236e3c31969dcdb-4c86d2f6715bc2b7.temp -z --files-from=-"
|
|
3
|
+
|
|
4
|
+
======= BEGIN PROCESS INPUT ======
|
|
5
|
+
.rush/temp/operation/build/all.log
|
|
6
|
+
.rush/temp/operation/build/log-chunks.jsonl
|
|
7
|
+
.rush/temp/operation/build/state.json
|
|
8
|
+
dist/api/private-api.js
|
|
9
|
+
dist/api/private-api.js.map
|
|
10
|
+
dist/api/public-api.js
|
|
11
|
+
dist/api/public-api.js.map
|
|
12
|
+
dist/index.js
|
|
13
|
+
dist/index.js.map
|
|
14
|
+
dist/services/exchange.js
|
|
15
|
+
dist/services/exchange.js.map
|
|
16
|
+
dist/services/order-actions-with-credential.js
|
|
17
|
+
dist/services/order-actions-with-credential.js.map
|
|
18
|
+
dist/services/orders/cancelOrder.js
|
|
19
|
+
dist/services/orders/cancelOrder.js.map
|
|
20
|
+
dist/services/orders/listOrders.js
|
|
21
|
+
dist/services/orders/listOrders.js.map
|
|
22
|
+
dist/services/orders/modifyOrder.js
|
|
23
|
+
dist/services/orders/modifyOrder.js.map
|
|
24
|
+
dist/services/orders/submitOrder.js
|
|
25
|
+
dist/services/orders/submitOrder.js.map
|
|
26
|
+
lib/api/private-api.d.ts
|
|
27
|
+
lib/api/private-api.d.ts.map
|
|
28
|
+
lib/api/private-api.js
|
|
29
|
+
lib/api/private-api.js.map
|
|
30
|
+
lib/api/public-api.d.ts
|
|
31
|
+
lib/api/public-api.d.ts.map
|
|
32
|
+
lib/api/public-api.js
|
|
33
|
+
lib/api/public-api.js.map
|
|
34
|
+
lib/index.d.ts
|
|
35
|
+
lib/index.d.ts.map
|
|
36
|
+
lib/index.js
|
|
37
|
+
lib/index.js.map
|
|
38
|
+
lib/services/exchange.d.ts
|
|
39
|
+
lib/services/exchange.d.ts.map
|
|
40
|
+
lib/services/exchange.js
|
|
41
|
+
lib/services/exchange.js.map
|
|
42
|
+
lib/services/order-actions-with-credential.d.ts
|
|
43
|
+
lib/services/order-actions-with-credential.d.ts.map
|
|
44
|
+
lib/services/order-actions-with-credential.js
|
|
45
|
+
lib/services/order-actions-with-credential.js.map
|
|
46
|
+
lib/services/orders/cancelOrder.d.ts
|
|
47
|
+
lib/services/orders/cancelOrder.d.ts.map
|
|
48
|
+
lib/services/orders/cancelOrder.js
|
|
49
|
+
lib/services/orders/cancelOrder.js.map
|
|
50
|
+
lib/services/orders/listOrders.d.ts
|
|
51
|
+
lib/services/orders/listOrders.d.ts.map
|
|
52
|
+
lib/services/orders/listOrders.js
|
|
53
|
+
lib/services/orders/listOrders.js.map
|
|
54
|
+
lib/services/orders/modifyOrder.d.ts
|
|
55
|
+
lib/services/orders/modifyOrder.d.ts.map
|
|
56
|
+
lib/services/orders/modifyOrder.js
|
|
57
|
+
lib/services/orders/modifyOrder.js.map
|
|
58
|
+
lib/services/orders/submitOrder.d.ts
|
|
59
|
+
lib/services/orders/submitOrder.d.ts.map
|
|
60
|
+
lib/services/orders/submitOrder.js
|
|
61
|
+
lib/services/orders/submitOrder.js.map
|
|
62
|
+
temp/build/typescript/ts_zFq2B6Vf.json
|
|
63
|
+
temp/package-deps.json
|
|
64
|
+
temp/test/jest/haste-map-8da76140b2b07765354e535592c7b35f-798a118b6d313e054e69a784a276ddc7-ffbd83ce86c42c04c3a6c5159eec9906
|
|
65
|
+
======== END PROCESS INPUT =======
|
|
66
|
+
======= BEGIN PROCESS OUTPUT =======
|
|
67
|
+
======== END PROCESS OUTPUT ========
|
|
68
|
+
|
|
69
|
+
Exited with code "0"
|
package/CHANGELOG.json
CHANGED
|
@@ -1,6 +1,63 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuants/vendor-turboflow",
|
|
3
3
|
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"version": "1.2.29",
|
|
6
|
+
"tag": "@yuants/vendor-turboflow_v1.2.29",
|
|
7
|
+
"date": "Tue, 06 Jan 2026 17:23:41 GMT",
|
|
8
|
+
"comments": {
|
|
9
|
+
"patch": [
|
|
10
|
+
{
|
|
11
|
+
"comment": "upgrade node and ts and etc."
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"none": [
|
|
15
|
+
{
|
|
16
|
+
"comment": "Bump Version"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"dependency": [
|
|
20
|
+
{
|
|
21
|
+
"comment": "Updating dependency \"@yuants/protocol\" to `0.54.1`"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"comment": "Updating dependency \"@yuants/utils\" to `0.19.4`"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"comment": "Updating dependency \"@yuants/exchange\" to `0.8.11`"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"comment": "Updating dependency \"@yuants/data-product\" to `0.5.9`"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"comment": "Updating dependency \"@yuants/data-account\" to `0.11.8`"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"comment": "Updating dependency \"@yuants/data-order\" to `0.7.9`"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"comment": "Updating dependency \"@yuants/tool-kit\" to `0.2.2`"
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"version": "1.2.28",
|
|
46
|
+
"tag": "@yuants/vendor-turboflow_v1.2.28",
|
|
47
|
+
"date": "Sun, 04 Jan 2026 18:08:06 GMT",
|
|
48
|
+
"comments": {
|
|
49
|
+
"none": [
|
|
50
|
+
{
|
|
51
|
+
"comment": "Bump Version"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"dependency": [
|
|
55
|
+
{
|
|
56
|
+
"comment": "Updating dependency \"@yuants/exchange\" to `0.8.10`"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
},
|
|
4
61
|
{
|
|
5
62
|
"version": "1.2.27",
|
|
6
63
|
"tag": "@yuants/vendor-turboflow_v1.2.27",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# Change Log - @yuants/vendor-turboflow
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Tue, 06 Jan 2026 17:23:41 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 1.2.29
|
|
6
|
+
Tue, 06 Jan 2026 17:23:41 GMT
|
|
7
|
+
|
|
8
|
+
### Patches
|
|
9
|
+
|
|
10
|
+
- upgrade node and ts and etc.
|
|
11
|
+
|
|
12
|
+
## 1.2.28
|
|
13
|
+
Sun, 04 Jan 2026 18:08:06 GMT
|
|
14
|
+
|
|
15
|
+
_Version update only_
|
|
4
16
|
|
|
5
17
|
## 1.2.27
|
|
6
18
|
Fri, 02 Jan 2026 09:52:20 GMT
|
package/config/rig.json
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// The "rig.json" file directs tools to look for their config files in an external package.
|
|
2
|
+
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
|
|
3
|
+
{
|
|
4
|
+
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
|
|
5
|
+
"rigPackageName": "@rushstack/heft-node-rig"
|
|
6
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configures the TypeScript plugin for Heft. This plugin also manages linting.
|
|
3
|
+
*/
|
|
4
|
+
{
|
|
5
|
+
"$schema": "https://developer.microsoft.com/json-schemas/heft/typescript.schema.json",
|
|
6
|
+
"additionalModuleKindsToEmit": [
|
|
7
|
+
{
|
|
8
|
+
"moduleKind": "esnext",
|
|
9
|
+
"outFolderName": "dist"
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"staticAssetsToCopy": {}
|
|
13
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { decodeBase58, encodeHex, formatTime, fromPrivateKey, HmacSHA256, scopeError, signMessageByEd25519, } from '@yuants/utils';
|
|
2
|
+
const BASE_URL = 'https://surfv2-api.surf.one';
|
|
3
|
+
export const privateRequest = async (credential, method, path, params = {}) => {
|
|
4
|
+
const url = new URL(BASE_URL);
|
|
5
|
+
url.pathname = path;
|
|
6
|
+
if (method === 'GET') {
|
|
7
|
+
for (const [key, value] of Object.entries(params)) {
|
|
8
|
+
if (value !== undefined) {
|
|
9
|
+
url.searchParams.set(key, `${value}`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const publicKey = fromPrivateKey(credential.private_key).public_key;
|
|
14
|
+
const publicKeyBinary = decodeBase58(publicKey);
|
|
15
|
+
const publicKeyHex = encodeHex(publicKeyBinary);
|
|
16
|
+
const privateKeyBinary = decodeBase58(credential.private_key);
|
|
17
|
+
const headers = {};
|
|
18
|
+
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
19
|
+
// 除了 host 之外的所有内容
|
|
20
|
+
const _path = url.pathname + url.search;
|
|
21
|
+
const data = `method=${method}&path=${_path}×tamp=${timestamp}&access-key=${publicKeyHex}` +
|
|
22
|
+
(method === 'POST' ? `&body=${JSON.stringify(params)}` : '');
|
|
23
|
+
const hashData = await HmacSHA256(new TextEncoder().encode(data), publicKeyBinary);
|
|
24
|
+
const signature = signMessageByEd25519(hashData, privateKeyBinary);
|
|
25
|
+
const signatureHex = encodeHex(signature);
|
|
26
|
+
headers['API-KEY'] = publicKeyHex;
|
|
27
|
+
headers['TIMESTAMP'] = timestamp;
|
|
28
|
+
headers['SIGN'] = signatureHex;
|
|
29
|
+
headers['LANG'] = 'zh-cn';
|
|
30
|
+
const body = method === 'POST' ? JSON.stringify(params) : undefined;
|
|
31
|
+
const response = await fetch(url.toString(), {
|
|
32
|
+
method,
|
|
33
|
+
headers,
|
|
34
|
+
body,
|
|
35
|
+
});
|
|
36
|
+
const text = await response.text();
|
|
37
|
+
console.info(formatTime(Date.now()), method, url.toString(), `response = ${text}, requestBody = ${body}, headers = ${JSON.stringify(headers)}`);
|
|
38
|
+
return scopeError('TurboAPIError', { status: response.status, statusText: response.statusText, text }, () => JSON.parse(text));
|
|
39
|
+
};
|
|
40
|
+
export const createPrivateApi = (method, path) => (credential, params) => privateRequest(credential, method, path, params);
|
|
41
|
+
/**
|
|
42
|
+
* 获取账户信息
|
|
43
|
+
*/
|
|
44
|
+
export const getAccountInfo = createPrivateApi('GET', '/account/info');
|
|
45
|
+
/**
|
|
46
|
+
* 获取账户资产
|
|
47
|
+
*/
|
|
48
|
+
export const getAccountAssets = createPrivateApi('GET', '/account/assets');
|
|
49
|
+
/**
|
|
50
|
+
* 提交订单
|
|
51
|
+
*/
|
|
52
|
+
export const submitOrder = createPrivateApi('POST', '/account/order/submit');
|
|
53
|
+
/**
|
|
54
|
+
* 修改订单
|
|
55
|
+
*/
|
|
56
|
+
export const remendOrder = createPrivateApi('POST', '/account/order/remend');
|
|
57
|
+
/**
|
|
58
|
+
* 取消订单
|
|
59
|
+
*/
|
|
60
|
+
export const cancelOrder = createPrivateApi('POST', '/account/order/cancel');
|
|
61
|
+
/**
|
|
62
|
+
* 快速订单 (反向)
|
|
63
|
+
*/
|
|
64
|
+
export const quickOrder = createPrivateApi('POST', '/account/order/quick');
|
|
65
|
+
/**
|
|
66
|
+
* 保证金转账
|
|
67
|
+
*/
|
|
68
|
+
export const transferMargin = createPrivateApi('POST', '/account/order/transfer');
|
|
69
|
+
/**
|
|
70
|
+
* 模拟保证金转账
|
|
71
|
+
*/
|
|
72
|
+
export const simulateTransferMargin = createPrivateApi('GET', '/account/order/transfer/simulate');
|
|
73
|
+
/**
|
|
74
|
+
* 获取交易配置
|
|
75
|
+
*/
|
|
76
|
+
export const getOrderConfigs = createPrivateApi('GET', '/account/order/configs');
|
|
77
|
+
/**
|
|
78
|
+
* 获取订单列表
|
|
79
|
+
*/
|
|
80
|
+
export const getOrderList = createPrivateApi('GET', '/account/order/list');
|
|
81
|
+
/**
|
|
82
|
+
* 获取交易列表
|
|
83
|
+
*/
|
|
84
|
+
export const getTradeList = createPrivateApi('GET', '/account/trade/list');
|
|
85
|
+
/**
|
|
86
|
+
* 获取交易现金列表
|
|
87
|
+
*/
|
|
88
|
+
export const getCashTradeList = createPrivateApi('GET', '/account/trade/cash/list');
|
|
89
|
+
/**
|
|
90
|
+
* 获取持仓列表
|
|
91
|
+
*/
|
|
92
|
+
export const getPositionList = createPrivateApi('GET', '/account/position/list');
|
|
93
|
+
/**
|
|
94
|
+
* 获取仓位历史
|
|
95
|
+
*/
|
|
96
|
+
export const getPositionHistory = createPrivateApi('GET', '/account/position/history');
|
|
97
|
+
/**
|
|
98
|
+
* 获取交易对价格
|
|
99
|
+
*/
|
|
100
|
+
export const getPairPrice = createPrivateApi('GET', '/market/pair/price');
|
|
101
|
+
/**
|
|
102
|
+
* 获取K线数据
|
|
103
|
+
*/
|
|
104
|
+
export const getKline = createPrivateApi('GET', '/market/kline');
|
|
105
|
+
/**
|
|
106
|
+
* 获取交易对小数配置
|
|
107
|
+
*/
|
|
108
|
+
export const getDecimalConfig = createPrivateApi('GET', '/market/pair/decimal/config');
|
|
109
|
+
/**
|
|
110
|
+
* 获取抵押品列表
|
|
111
|
+
*/
|
|
112
|
+
export const getCollateralList = createPrivateApi('GET', '/pool/collateral/list');
|
|
113
|
+
/**
|
|
114
|
+
* 获取交易配置 (Public)
|
|
115
|
+
*/
|
|
116
|
+
export const getTradingConfigs = createPrivateApi('GET', '/public/trading/configs');
|
|
117
|
+
/**
|
|
118
|
+
* 获取交易对分享费用 (Public)
|
|
119
|
+
*/
|
|
120
|
+
export const getPairShareFees = createPrivateApi('GET', '/public/pair/share/fees');
|
|
121
|
+
//# sourceMappingURL=private-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"private-api.js","sourceRoot":"","sources":["../../src/api/private-api.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n decodeBase58,\n encodeHex,\n formatTime,\n fromPrivateKey,\n HmacSHA256,\n scopeError,\n signMessageByEd25519,\n} from '@yuants/utils';\n\nexport interface ICredential {\n /**\n * ED25519 Private KEY (base58)\n */\n private_key: string;\n}\n\nconst BASE_URL = 'https://surfv2-api.surf.one';\n\nexport const privateRequest = async (\n credential: ICredential,\n method: string,\n path: string,\n params: any = {},\n) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n\n if (method === 'GET') {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, `${value}`);\n }\n }\n }\n\n const publicKey = fromPrivateKey(credential.private_key).public_key;\n const publicKeyBinary = decodeBase58(publicKey);\n const publicKeyHex = encodeHex(publicKeyBinary);\n\n const privateKeyBinary = decodeBase58(credential.private_key);\n\n const headers: Record<string, string> = {};\n\n const timestamp = Math.floor(Date.now() / 1000).toString();\n\n // 除了 host 之外的所有内容\n const _path = url.pathname + url.search;\n\n const data =\n `method=${method}&path=${_path}×tamp=${timestamp}&access-key=${publicKeyHex}` +\n (method === 'POST' ? `&body=${JSON.stringify(params)}` : '');\n const hashData = await HmacSHA256(new TextEncoder().encode(data), publicKeyBinary);\n\n const signature = signMessageByEd25519(hashData, privateKeyBinary);\n const signatureHex = encodeHex(signature);\n\n headers['API-KEY'] = publicKeyHex;\n headers['TIMESTAMP'] = timestamp;\n headers['SIGN'] = signatureHex;\n headers['LANG'] = 'zh-cn';\n\n const body = method === 'POST' ? JSON.stringify(params) : undefined;\n const response = await fetch(url.toString(), {\n method,\n headers,\n body,\n });\n\n const text = await response.text();\n\n console.info(\n formatTime(Date.now()),\n method,\n url.toString(),\n `response = ${text}, requestBody = ${body}, headers = ${JSON.stringify(headers)}`,\n );\n\n return scopeError('TurboAPIError', { status: response.status, statusText: response.statusText, text }, () =>\n JSON.parse(text),\n );\n};\n\nexport const createPrivateApi =\n <T, K>(method: string, path: string) =>\n (credential: ICredential, params: T): Promise<K> =>\n privateRequest(credential, method, path, params);\n\n/**\n * 获取账户信息\n */\nexport const getAccountInfo = createPrivateApi<\n void,\n {\n errno: string;\n msg: string;\n data: {\n account_id: string;\n referral_code: string;\n email: string;\n sign_up_type: string;\n address: string;\n user_name: string;\n agr_state: boolean;\n new_user_guide: boolean;\n can_survey: boolean;\n is_referrer: boolean;\n rebate_agent_level: number;\n is_rebate_admin: boolean;\n is_rebate_login: boolean;\n x_related: {\n nick_name: string;\n profile_url: string;\n };\n svm_account: string;\n svm_approve_hash: string;\n svm_approve_state: boolean;\n svm_approve_stage: number;\n voucher_pro_state: boolean;\n stock_code: string;\n };\n }\n>('GET', '/account/info');\n\n/**\n * 获取账户资产\n */\nexport const getAccountAssets = createPrivateApi<\n { fill_coin_sub_info?: string },\n {\n errno: number;\n msg: string;\n data: {\n list: Array<{\n coin_address: string;\n coin_code: string;\n available_balance: string;\n freeze_balance: string;\n max_withdraw_amount: string;\n simulation_balance: string;\n un_pnl: string;\n wd_frz: string;\n internal_wd_freeze: string;\n cro_un_pnl: string;\n isol_un_pnl: string;\n isol_frz: string;\n coin_name: string;\n coin_sub_info?: {\n price: string;\n logo: string;\n };\n type: number;\n }>;\n };\n }\n>('GET', '/account/assets');\n\n/**\n * 提交订单\n */\nexport const submitOrder = createPrivateApi<\n {\n request_id: number;\n pair_id: string;\n pool_id: number;\n coin_code: string;\n order_type: 'limit' | 'market' | 'stop_limit' | 'stop_market';\n order_way: 1 | 2 | 3 | 4; // 1:开多 2:平空 3:开空 4:平多\n margin_type: 1 | 2; // 1:逐仓 2:全仓\n leverage: number;\n vol?: number; // 交易数量\n size?: string; // 交易数量\n position_mode: 1 | 2 | 3; // 1:单向 2:双向 3:原子\n time_in_force: 'GTC' | 'IOC' | 'FOK';\n fee_mode: 1 | 2; // 1:固定 2:利润分层\n order_mode: 1 | 2; // 1:普通 2:条件\n price?: string; // 限价单价格\n position_id?: string; // 平仓时需要\n },\n {\n errno: string;\n msg: string;\n data: {\n request_id: string;\n account_id: string;\n order: {\n id: string;\n pool_id: number;\n pair_id: string;\n order_type: string;\n order_status: string;\n };\n };\n }\n>('POST', '/account/order/submit');\n\n/**\n * 修改订单\n */\nexport const remendOrder = createPrivateApi<\n {\n position_id: string;\n price?: string;\n vol?: string;\n tp_order?: {\n order_type: string;\n close_pos: boolean;\n stop_price: string;\n };\n sl_order?: {\n order_type: string;\n close_pos: boolean;\n stop_price: string;\n };\n },\n {\n errno: string;\n msg: string;\n data: {\n request_id: string;\n account_id: string;\n };\n }\n>('POST', '/account/order/remend');\n\n/**\n * 取消订单\n */\nexport const cancelOrder = createPrivateApi<\n {\n pair_id: string;\n order_id: string;\n pool_id: number;\n },\n {\n errno: string;\n msg: string;\n data: any;\n }\n>('POST', '/account/order/cancel');\n\n/**\n * 快速订单 (反向)\n */\nexport const quickOrder = createPrivateApi<\n {\n position_id: string;\n quick_type: 'Reverse';\n },\n {\n errno: string;\n msg: string;\n data: any;\n }\n>('POST', '/account/order/quick');\n\n/**\n * 保证金转账\n */\nexport const transferMargin = createPrivateApi<\n {\n margin: string;\n position_id: string;\n },\n {\n errno: string;\n msg: string;\n data: any;\n }\n>('POST', '/account/order/transfer');\n\n/**\n * 模拟保证金转账\n */\nexport const simulateTransferMargin = createPrivateApi<\n {\n position_id: string;\n margin: string;\n },\n {\n errno: string;\n msg: string;\n data: {\n max_add_margin: string;\n min_remove_margin: string;\n liq_price: string;\n leverage: string;\n };\n }\n>('GET', '/account/order/transfer/simulate');\n\n/**\n * 获取交易配置\n */\nexport const getOrderConfigs = createPrivateApi<\n void,\n {\n errno: string;\n msg: string;\n data: {\n max_add_margin: string;\n min_remove_margin: string;\n };\n }\n>('GET', '/account/order/configs');\n\n/**\n * 获取订单列表\n */\nexport const getOrderList = createPrivateApi<\n {\n page_num?: number;\n page_size?: number;\n status?: string; // All, Pending, Filled, Cancelled, Rejected\n },\n {\n errno: string;\n msg: string;\n data: {\n page_size: number;\n page_num: number;\n count: number;\n page_count: number;\n data: Array<{\n id: string;\n pool_id: number;\n pair_id: string;\n coin_code: string;\n coin_name: string;\n price: string;\n size: string;\n vol: string;\n leverage: string;\n order_type: string;\n order_way: number;\n margin_type: number;\n dual_side: boolean;\n fee_mode: number;\n pos_mode: number;\n done_vol: string;\n deal_price: string;\n done_amount: string;\n done_size: string;\n done_pnl: string;\n biz_code: number;\n order_status: string;\n view_type: string;\n position_id: string;\n close_pos: boolean;\n tp_price: string;\n sl_price: string;\n stop_price: string;\n updated_at: string;\n created_at: string;\n }>;\n };\n }\n>('GET', '/account/order/list');\n\n/**\n * 获取交易列表\n */\nexport const getTradeList = createPrivateApi<\n {\n page_num?: number;\n page_size?: number;\n },\n {\n errno: string;\n msg: string;\n data: {\n page_size: number;\n page_num: number;\n count: number;\n page_count: number;\n data: Array<{\n id: string;\n pool_id: number;\n pair_id: string;\n symbol: string;\n pair_logo: string;\n coin_code: string;\n coin_name: string;\n coin_logo: string;\n account_id: string;\n leverage: string;\n fee_mode: number;\n order_way: number;\n order_mode: number;\n view_type: string;\n entry_price: string;\n maker_coin: string;\n maker_coin_name: string;\n maker_coin_logo: string;\n done_price: string;\n done_vol: string;\n done_vol_usd: string;\n done_amount: string;\n done_size: string;\n share_pnl: string;\n done_pnl: string;\n done_pnl_usd: string;\n done_fee: string;\n funding_fee: string;\n coin_price: string;\n fee_saved_usd: string;\n liq_price: string;\n created_at: string;\n margin_type: number;\n order_price: string;\n roe: string;\n x_related: {\n nick_name: string;\n profile_url: string;\n };\n }>;\n };\n }\n>('GET', '/account/trade/list');\n\n/**\n * 获取交易现金列表\n */\nexport const getCashTradeList = createPrivateApi<\n {\n page_num?: number;\n page_size?: number;\n },\n {\n errno: string;\n msg: string;\n data: {\n page_size: number;\n page_num: number;\n count: number;\n page_count: number;\n data: Array<{\n id: string;\n pool_id: number;\n pair_id: string;\n order_way: number;\n order_mode: number;\n symbol: string;\n pair_logo: string;\n share_rate: string;\n pair_profit_size: string;\n margin_type: number;\n volume: string;\n size: string;\n leverage: string;\n collateral_coin: string;\n entry_price: string;\n done_pnl: string;\n share_pnl: string;\n fee_mode: number;\n account_id: string;\n action: number;\n coin_code: string;\n coin_name: string;\n coin_logo: string;\n coin_price: string;\n amount: string;\n available_balance: string;\n created_at: string;\n }>;\n };\n }\n>('GET', '/account/trade/cash/list');\n\n/**\n * 获取持仓列表\n */\nexport const getPositionList = createPrivateApi<\n {\n status?: 'Holding' | 'Closed';\n page_num?: number;\n page_size?: number;\n },\n {\n errno: string;\n msg: string;\n data: {\n page_size: number;\n page_num: number;\n count: number;\n page_count: number;\n data?: Array<{\n id: string;\n pool_id: number;\n pair_id: string;\n symbol: string;\n pair_logo: string;\n coin_code: string;\n coin_name: string;\n coin_logo: string;\n side: number;\n hold_size: string;\n hold_av: string;\n fee_mode: number;\n margin_type: number;\n im: string;\n mm: string;\n em: string;\n dual_side: boolean;\n pos_mode: number;\n leverage: string;\n liq_price: string;\n tp_price: string;\n tp_size: string;\n sl_price: string;\n sl_size: string;\n unpnl: string;\n realize_pnl: string;\n acc_ff: string;\n status: number;\n updated_at: string;\n created_at: string;\n account_id: string;\n base_fee_rate: string;\n rate_multi: string;\n rate_exp: string;\n pos_multi: string;\n pnl_base_rate: string;\n max_order_size: string;\n max_slippage: string;\n buffer_rate: string;\n price_factor: string;\n hair_cut: string;\n cross_leverage?: string;\n cross_mm?: string;\n cross_unpnl?: string;\n cross_coin_unpnl?: string;\n cross_health?: string;\n frozen_vol?: string;\n isolated_available?: string;\n cross_available?: string;\n cross_risk_im?: string;\n cross_risk_mm?: string;\n cross_equity?: string;\n }>;\n };\n }\n>('GET', '/account/position/list');\n\n/**\n * 获取仓位历史\n */\nexport const getPositionHistory = createPrivateApi<\n {\n page_num?: number;\n page_size?: number;\n },\n {\n errno: string;\n msg: string;\n data: {\n page_size: number;\n page_num: number;\n count: number;\n page_count: number;\n data: Array<{\n id: string;\n pool_id: number;\n pair_id: string;\n symbol: string;\n pair_logo: string;\n coin_code: string;\n coin_name: string;\n coin_logo: string;\n account_id: string;\n side: number;\n fee_mode: number;\n margin_type: number;\n pos_mode: number;\n leverage: string;\n im: string;\n status: number;\n realize_pnl: string;\n realize_pnl_usd: string;\n roe: string;\n entry_price: string;\n open_max_size: string;\n exit_price: string;\n closed_size: string;\n closed_at: string;\n created_at: string;\n maker_coin: string;\n maker_coin_name: string;\n maker_coin_logo: string;\n maker_coin_pnl: string;\n }>;\n };\n }\n>('GET', '/account/position/history');\n\n/**\n * 获取交易对价格\n */\nexport const getPairPrice = createPrivateApi<\n {\n spot_token_key: string;\n },\n {\n errno: string;\n msg: string;\n data: {\n price: string;\n tm: number;\n };\n }\n>('GET', '/market/pair/price');\n\n/**\n * 获取K线数据\n */\nexport const getKline = createPrivateApi<\n {\n spot_token_key: string;\n granularity: string;\n limit?: number;\n end_time?: number;\n },\n {\n errno: string;\n msg: string;\n data: Array<{\n t: number;\n o: string;\n h: string;\n l: string;\n c: string;\n g: string;\n }>;\n }\n>('GET', '/market/kline');\n\n/**\n * 获取交易对小数配置\n */\nexport const getDecimalConfig = createPrivateApi<\n void,\n {\n errno: string;\n msg: string;\n data: Array<{\n coin_code: string;\n balance_decimal: number;\n price_decimal: number;\n coin_name: string;\n }>;\n }\n>('GET', '/market/pair/decimal/config');\n\n/**\n * 获取抵押品列表\n */\nexport const getCollateralList = createPrivateApi<\n {\n pair_id: number;\n },\n {\n errno: string;\n msg: string;\n data: Array<{\n id: number;\n pool_id: number;\n coin_code: string;\n coin_name: string;\n collateral_logo: string;\n balance: string;\n hair_cut: string;\n trade_pair_count: number;\n max_hold_volume: string;\n trader_max_hold_volume: string;\n }>;\n }\n>('GET', '/pool/collateral/list');\n\n/**\n * 获取交易配置 (Public)\n */\nexport const getTradingConfigs = createPrivateApi<\n void,\n {\n errno: string;\n msg: string;\n data: {\n liquidate_configs: any;\n isolated_configs: any;\n cross_configs: Array<{\n imr: string;\n mmr: string;\n min_size: string;\n max_size: string;\n }>;\n is_shareprofit_active: boolean;\n shareprofit_configs: {\n start_time: string;\n end_time: string;\n pair_configs: Array<{\n pair_id: number;\n threshold: string;\n default_threshold: string;\n }>;\n };\n };\n }\n>('GET', '/public/trading/configs');\n\n/**\n * 获取交易对分享费用 (Public)\n */\nexport const getPairShareFees = createPrivateApi<\n {\n pair_id: string;\n order_way: number;\n price: string;\n vol: string;\n leverage: number;\n },\n {\n errno: string;\n msg: string;\n data: {\n list: Array<{\n price: string;\n roi: string;\n unpnl: string;\n share_pnl: string;\n fee_rate: string;\n }>;\n };\n }\n>('GET', '/public/pair/share/fees');\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { scopeError } from '@yuants/utils';
|
|
2
|
+
const BASE_URL = 'https://surfv2-api.surf.one';
|
|
3
|
+
export const publicRequest = async (method, path, params = {}) => {
|
|
4
|
+
const url = new URL(BASE_URL);
|
|
5
|
+
url.pathname = path;
|
|
6
|
+
if (method === 'GET') {
|
|
7
|
+
for (const [key, value] of Object.entries(params)) {
|
|
8
|
+
url.searchParams.set(key, `${value}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const response = await fetch(url.toString(), {
|
|
12
|
+
method,
|
|
13
|
+
body: method === 'POST' ? JSON.stringify(params) : undefined,
|
|
14
|
+
});
|
|
15
|
+
const text = await response.text();
|
|
16
|
+
console.info(url.toString(), text);
|
|
17
|
+
return scopeError('TurboAPIError', { status: response.status, statusText: response.statusText, text }, () => JSON.parse(text));
|
|
18
|
+
};
|
|
19
|
+
export const createPublicApi = (method, path) => (params) => publicRequest(method, path, params);
|
|
20
|
+
/**
|
|
21
|
+
* 获取账户信息
|
|
22
|
+
*/
|
|
23
|
+
export const getPoolPairList = createPublicApi('GET', '/pool/pair/list');
|
|
24
|
+
//# sourceMappingURL=public-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,UAAU,EAAwB,MAAM,eAAe,CAAC;AAS3G,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAE/C,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,SAAc,EAAE,EAAE,EAAE;IACpF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;IAEpB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM;QACN,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IAEnC,OAAO,UAAU,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAC1G,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAC1B,CAAO,MAAc,EAAE,IAAY,EAAE,EAAE,CACvC,CAAC,MAAS,EAAc,EAAE,CACxB,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAqB5C,KAAK,EAAE,iBAAiB,CAAC,CAAC","sourcesContent":["import { decodeBase58, fromPrivateKey, HmacSHA256, scopeError, signMessageByEd25519 } from '@yuants/utils';\n\nexport interface ICredential {\n /**\n * ED25519 Private KEY (base58)\n */\n private_key: string;\n}\n\nconst BASE_URL = 'https://surfv2-api.surf.one';\n\nexport const publicRequest = async (method: string, path: string, params: any = {}) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n\n if (method === 'GET') {\n for (const [key, value] of Object.entries(params)) {\n url.searchParams.set(key, `${value}`);\n }\n }\n\n const response = await fetch(url.toString(), {\n method,\n body: method === 'POST' ? JSON.stringify(params) : undefined,\n });\n\n const text = await response.text();\n\n console.info(url.toString(), text);\n\n return scopeError('TurboAPIError', { status: response.status, statusText: response.statusText, text }, () =>\n JSON.parse(text),\n );\n};\n\nexport const createPublicApi =\n <T, K>(method: string, path: string) =>\n (params: T): Promise<K> =>\n publicRequest(method, path, params);\n\n/**\n * 获取账户信息\n */\nexport const getPoolPairList = createPublicApi<\n void,\n {\n errno: string;\n msg: string;\n data: {\n pair_id: string;\n base_token: string;\n quote_token: string;\n base_token_logo: string;\n base_token_name: string;\n volume_24h: string;\n price: string;\n c: string;\n max_leverage: number;\n avg_order_book_fee: string;\n funding_fee_interval: number;\n created_at: string;\n tag_id_list: number[];\n }[];\n }\n>('GET', '/pool/pair/list');\n"]}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC","sourcesContent":["import './services/exchange';\n"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { makeSpotPosition } from '@yuants/data-account';
|
|
2
|
+
import { provideExchangeServices } from '@yuants/exchange';
|
|
3
|
+
import { Terminal } from '@yuants/protocol';
|
|
4
|
+
import { getAccountAssets, getAccountInfo, getPositionList } from '../api/private-api';
|
|
5
|
+
import { encodePath } from '@yuants/utils';
|
|
6
|
+
import { submitOrder } from './orders/submitOrder';
|
|
7
|
+
import { modifyOrder } from './orders/modifyOrder';
|
|
8
|
+
import { cancelOrderAction } from './orders/cancelOrder';
|
|
9
|
+
import { listOrders } from './orders/listOrders';
|
|
10
|
+
import { getPoolPairList } from '../api/public-api';
|
|
11
|
+
const terminal = Terminal.fromNodeEnv();
|
|
12
|
+
provideExchangeServices(terminal, {
|
|
13
|
+
name: 'TURBOFLOW',
|
|
14
|
+
credentialSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
required: ['private_key'],
|
|
17
|
+
properties: {
|
|
18
|
+
private_key: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'ED25519 Private Key (base58 encoded)',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
getCredentialId: async function (credential) {
|
|
25
|
+
const accountInfo = await getAccountInfo(credential);
|
|
26
|
+
return encodePath('TURBOFLOW', accountInfo.data.account_id);
|
|
27
|
+
},
|
|
28
|
+
listProducts: async () => {
|
|
29
|
+
const data = await getPoolPairList();
|
|
30
|
+
return data.data.map((pair) => ({
|
|
31
|
+
datasource_id: 'TURBOFLOW',
|
|
32
|
+
product_id: encodePath('TURBOFLOW', 'PERP', pair.base_token, pair.pair_id),
|
|
33
|
+
name: `${pair.base_token}-${pair.quote_token}`,
|
|
34
|
+
quote_currency: pair.quote_token,
|
|
35
|
+
base_currency: pair.base_token,
|
|
36
|
+
price_step: 1e-15,
|
|
37
|
+
volume_step: 1e-15,
|
|
38
|
+
value_scale: 1,
|
|
39
|
+
value_scale_unit: '',
|
|
40
|
+
margin_rate: 1 / pair.max_leverage,
|
|
41
|
+
value_based_cost: 0,
|
|
42
|
+
volume_based_cost: 0,
|
|
43
|
+
max_position: 0,
|
|
44
|
+
max_volume: 0,
|
|
45
|
+
allow_long: true,
|
|
46
|
+
allow_short: true,
|
|
47
|
+
}));
|
|
48
|
+
},
|
|
49
|
+
getPositions: async function (credential) {
|
|
50
|
+
const assetsResponse = await getAccountAssets(credential, {
|
|
51
|
+
fill_coin_sub_info: '1',
|
|
52
|
+
});
|
|
53
|
+
const assetPositions = assetsResponse.data.list.map((x) => makeSpotPosition({
|
|
54
|
+
position_id: x.coin_code,
|
|
55
|
+
product_id: encodePath('SPOT', x.coin_name),
|
|
56
|
+
volume: parseFloat(x.available_balance),
|
|
57
|
+
free_volume: parseFloat(x.available_balance),
|
|
58
|
+
closable_price: 1,
|
|
59
|
+
}));
|
|
60
|
+
const positionsResponse = await getPositionList(credential, { status: 'Holding' });
|
|
61
|
+
const positions = (positionsResponse.data.data || []).map((position) => {
|
|
62
|
+
const side = position.side === 1 ? 'LONG' : 'SHORT';
|
|
63
|
+
const holdSize = parseFloat(position.hold_size);
|
|
64
|
+
const holdAv = parseFloat(position.hold_av);
|
|
65
|
+
const unpnl = parseFloat(position.unpnl);
|
|
66
|
+
const im = parseFloat(position.im);
|
|
67
|
+
return {
|
|
68
|
+
position_id: position.id,
|
|
69
|
+
datasource_id: 'TURBOFLOW',
|
|
70
|
+
product_id: encodePath('TURBOFLOW', 'PERP', position.symbol, position.pair_id),
|
|
71
|
+
direction: side,
|
|
72
|
+
volume: holdSize,
|
|
73
|
+
free_volume: holdSize, // Assuming all volume is free
|
|
74
|
+
position_price: holdAv,
|
|
75
|
+
closable_price: holdAv,
|
|
76
|
+
floating_profit: unpnl,
|
|
77
|
+
valuation: holdSize * holdAv,
|
|
78
|
+
margin: im,
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
return [...assetPositions, ...positions];
|
|
82
|
+
},
|
|
83
|
+
getOrders: listOrders,
|
|
84
|
+
getPositionsByProductId: function (credential, product_id) {
|
|
85
|
+
throw new Error('Function not implemented.');
|
|
86
|
+
},
|
|
87
|
+
getOrdersByProductId: function (credential, product_id) {
|
|
88
|
+
throw new Error('Function not implemented.');
|
|
89
|
+
},
|
|
90
|
+
submitOrder: submitOrder,
|
|
91
|
+
modifyOrder: modifyOrder,
|
|
92
|
+
cancelOrder: cancelOrderAction,
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/services/exchange.ts"],"names":[],"mappings":"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","sourcesContent":["import { IPosition, makeSpotPosition } from '@yuants/data-account';\nimport { IOrder } from '@yuants/data-order';\nimport { provideExchangeServices } from '@yuants/exchange';\nimport { Terminal } from '@yuants/protocol';\nimport { getAccountAssets, getAccountInfo, getPositionList, ICredential } from '../api/private-api';\nimport { encodePath } from '@yuants/utils';\nimport { submitOrder } from './orders/submitOrder';\nimport { modifyOrder } from './orders/modifyOrder';\nimport { cancelOrderAction } from './orders/cancelOrder';\nimport { listOrders } from './orders/listOrders';\nimport { getPoolPairList } from '../api/public-api';\nimport { IProduct } from '@yuants/data-product';\n\nconst terminal = Terminal.fromNodeEnv();\n\nprovideExchangeServices<ICredential>(terminal, {\n name: 'TURBOFLOW',\n credentialSchema: {\n type: 'object',\n required: ['private_key'],\n properties: {\n private_key: {\n type: 'string',\n description: 'ED25519 Private Key (base58 encoded)',\n },\n },\n },\n getCredentialId: async function (credential): Promise<string> {\n const accountInfo = await getAccountInfo(credential);\n\n return encodePath('TURBOFLOW', accountInfo.data.account_id);\n },\n listProducts: async () => {\n const data = await getPoolPairList();\n return data.data.map(\n (pair): IProduct => ({\n datasource_id: 'TURBOFLOW',\n product_id: encodePath('TURBOFLOW', 'PERP', pair.base_token, pair.pair_id),\n name: `${pair.base_token}-${pair.quote_token}`,\n quote_currency: pair.quote_token,\n base_currency: pair.base_token,\n price_step: 1e-15,\n volume_step: 1e-15,\n value_scale: 1,\n value_scale_unit: '',\n margin_rate: 1 / pair.max_leverage,\n value_based_cost: 0,\n volume_based_cost: 0,\n max_position: 0,\n max_volume: 0,\n allow_long: true,\n allow_short: true,\n }),\n );\n },\n getPositions: async function (credential) {\n const assetsResponse = await getAccountAssets(credential, {\n fill_coin_sub_info: '1',\n });\n\n const assetPositions = assetsResponse.data.list.map((x) =>\n makeSpotPosition({\n position_id: x.coin_code,\n product_id: encodePath('SPOT', x.coin_name),\n volume: parseFloat(x.available_balance),\n free_volume: parseFloat(x.available_balance),\n closable_price: 1,\n }),\n );\n\n const positionsResponse = await getPositionList(credential, { status: 'Holding' });\n\n const positions: IPosition[] = (positionsResponse.data.data || []).map((position) => {\n const side = position.side === 1 ? 'LONG' : 'SHORT';\n const holdSize = parseFloat(position.hold_size);\n const holdAv = parseFloat(position.hold_av);\n const unpnl = parseFloat(position.unpnl);\n const im = parseFloat(position.im);\n\n return {\n position_id: position.id,\n datasource_id: 'TURBOFLOW',\n product_id: encodePath('TURBOFLOW', 'PERP', position.symbol, position.pair_id),\n direction: side,\n volume: holdSize,\n free_volume: holdSize, // Assuming all volume is free\n position_price: holdAv,\n closable_price: holdAv,\n floating_profit: unpnl,\n valuation: holdSize * holdAv,\n margin: im,\n };\n });\n\n return [...assetPositions, ...positions];\n },\n getOrders: listOrders,\n getPositionsByProductId: function (credential: ICredential, product_id: string): Promise<IPosition[]> {\n throw new Error('Function not implemented.');\n },\n getOrdersByProductId: function (credential: ICredential, product_id: string): Promise<IOrder[]> {\n throw new Error('Function not implemented.');\n },\n submitOrder: submitOrder,\n modifyOrder: modifyOrder,\n cancelOrder: cancelOrderAction,\n});\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { provideOrderActionsWithCredential } from '@yuants/data-order';
|
|
2
|
+
import { Terminal } from '@yuants/protocol';
|
|
3
|
+
import { cancelOrderAction } from './orders/cancelOrder';
|
|
4
|
+
import { listOrders } from './orders/listOrders';
|
|
5
|
+
import { modifyOrder } from './orders/modifyOrder';
|
|
6
|
+
import { submitOrder } from './orders/submitOrder';
|
|
7
|
+
const terminal = Terminal.fromNodeEnv();
|
|
8
|
+
provideOrderActionsWithCredential(terminal, 'TURBOFLOW', {
|
|
9
|
+
type: 'object',
|
|
10
|
+
required: ['private_key'],
|
|
11
|
+
properties: {
|
|
12
|
+
private_key: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'ED25519 Private Key (base58 encoded)',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
}, {
|
|
18
|
+
submitOrder: submitOrder,
|
|
19
|
+
cancelOrder: cancelOrderAction,
|
|
20
|
+
modifyOrder: modifyOrder,
|
|
21
|
+
listOrders: listOrders,
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=order-actions-with-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-actions-with-credential.js","sourceRoot":"","sources":["../../src/services/order-actions-with-credential.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,iCAAiC,CAC/B,QAAQ,EACR,WAAW,EACX;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,aAAa,CAAC;IACzB,UAAU,EAAE;QACV,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,sCAAsC;SACpD;KACF;CACF,EACD;IACE,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,WAAW;IACxB,UAAU,EAAE,UAAU;CACvB,CACF,CAAC","sourcesContent":["import { provideOrderActionsWithCredential } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { ICredential } from '../api/private-api';\nimport { cancelOrderAction } from './orders/cancelOrder';\nimport { listOrders } from './orders/listOrders';\nimport { modifyOrder } from './orders/modifyOrder';\nimport { submitOrder } from './orders/submitOrder';\n\nconst terminal = Terminal.fromNodeEnv();\n\nprovideOrderActionsWithCredential<ICredential>(\n terminal,\n 'TURBOFLOW',\n {\n type: 'object',\n required: ['private_key'],\n properties: {\n private_key: {\n type: 'string',\n description: 'ED25519 Private Key (base58 encoded)',\n },\n },\n },\n {\n submitOrder: submitOrder,\n cancelOrder: cancelOrderAction,\n modifyOrder: modifyOrder,\n listOrders: listOrders,\n },\n);\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { formatTime } from '@yuants/utils';
|
|
2
|
+
import { cancelOrder as cancelOrderApi } from '../../api/private-api';
|
|
3
|
+
export const cancelOrderAction = async (credential, order) => {
|
|
4
|
+
console.info(`[${formatTime(Date.now())}] Cancelling order ${order.order_id}`);
|
|
5
|
+
// Parse product_id to get pair_id
|
|
6
|
+
const productParts = order.product_id.split('/');
|
|
7
|
+
const pair_id = productParts[productParts.length - 1];
|
|
8
|
+
// Parse comment for pool_id
|
|
9
|
+
let pool_id = 1;
|
|
10
|
+
if (order.comment) {
|
|
11
|
+
try {
|
|
12
|
+
const params = JSON.parse(order.comment);
|
|
13
|
+
pool_id = params.pool_id || 1;
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
console.warn(`[${formatTime(Date.now())}] Failed to parse order comment:`, e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
if (!order.order_id) {
|
|
20
|
+
throw new Error('order_id is required for cancelling order');
|
|
21
|
+
}
|
|
22
|
+
const response = await cancelOrderApi(credential, {
|
|
23
|
+
pair_id,
|
|
24
|
+
order_id: order.order_id,
|
|
25
|
+
pool_id,
|
|
26
|
+
});
|
|
27
|
+
if (response.errno !== '200') {
|
|
28
|
+
throw new Error(`Failed to cancel order: ${response.msg}`);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=cancelOrder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancelOrder.js","sourceRoot":"","sources":["../../../src/services/orders/cancelOrder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAe,WAAW,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,UAAuB,EAAE,KAAa,EAAiB,EAAE;IAC/F,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,sBAAsB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/E,kCAAkC;IAClC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtD,4BAA4B;IAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE;QAChD,OAAO;QACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC,CAAC","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { formatTime } from '@yuants/utils';\nimport { ICredential, cancelOrder as cancelOrderApi } from '../../api/private-api';\n\nexport const cancelOrderAction = async (credential: ICredential, order: IOrder): Promise<void> => {\n console.info(`[${formatTime(Date.now())}] Cancelling order ${order.order_id}`);\n\n // Parse product_id to get pair_id\n const productParts = order.product_id.split('/');\n const pair_id = productParts[productParts.length - 1];\n\n // Parse comment for pool_id\n let pool_id = 1;\n if (order.comment) {\n try {\n const params = JSON.parse(order.comment);\n pool_id = params.pool_id || 1;\n } catch (e) {\n console.warn(`[${formatTime(Date.now())}] Failed to parse order comment:`, e);\n }\n }\n\n if (!order.order_id) {\n throw new Error('order_id is required for cancelling order');\n }\n\n const response = await cancelOrderApi(credential, {\n pair_id,\n order_id: order.order_id,\n pool_id,\n });\n\n if (response.errno !== '200') {\n throw new Error(`Failed to cancel order: ${response.msg}`);\n }\n};\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { encodePath } from '@yuants/utils';
|
|
2
|
+
import { getOrderList } from '../../api/private-api';
|
|
3
|
+
/**
|
|
4
|
+
* Map TurboFlow order_way to order direction
|
|
5
|
+
* 1: 开多 (Open Long), 2: 平空 (Close Short), 3: 开空 (Open Short), 4: 平多 (Close Long)
|
|
6
|
+
*/
|
|
7
|
+
const mapOrderDirection = (order_way) => {
|
|
8
|
+
switch (order_way) {
|
|
9
|
+
case 1:
|
|
10
|
+
return 'OPEN_LONG';
|
|
11
|
+
case 2:
|
|
12
|
+
return 'CLOSE_SHORT';
|
|
13
|
+
case 3:
|
|
14
|
+
return 'OPEN_SHORT';
|
|
15
|
+
case 4:
|
|
16
|
+
return 'CLOSE_LONG';
|
|
17
|
+
default:
|
|
18
|
+
return 'OPEN_LONG';
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Map TurboFlow order to Yuan IOrder format
|
|
23
|
+
*/
|
|
24
|
+
const mapOrder = (order) => {
|
|
25
|
+
const volume = parseFloat(order.size) || 0;
|
|
26
|
+
const price = parseFloat(order.price) || 0;
|
|
27
|
+
return {
|
|
28
|
+
order_id: order.id,
|
|
29
|
+
account_id: '', // Will be filled in listOrders
|
|
30
|
+
product_id: encodePath('PERPETUAL', order.pair_id),
|
|
31
|
+
order_type: order.order_type.toUpperCase(),
|
|
32
|
+
order_direction: mapOrderDirection(order.order_way),
|
|
33
|
+
volume: Number.isFinite(volume) ? volume : 0,
|
|
34
|
+
price: Number.isFinite(price) && price > 0 ? price : undefined,
|
|
35
|
+
submit_at: new Date(order.created_at).getTime(),
|
|
36
|
+
order_status: order.order_status.toLowerCase(),
|
|
37
|
+
comment: JSON.stringify({
|
|
38
|
+
pool_id: order.pool_id,
|
|
39
|
+
pair_id: order.pair_id,
|
|
40
|
+
coin_code: order.coin_code,
|
|
41
|
+
leverage: order.leverage,
|
|
42
|
+
margin_type: order.margin_type,
|
|
43
|
+
fee_mode: order.fee_mode,
|
|
44
|
+
pos_mode: order.pos_mode,
|
|
45
|
+
position_id: order.position_id,
|
|
46
|
+
}),
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* List orders implementation
|
|
51
|
+
*/
|
|
52
|
+
export const listOrders = async (credential) => {
|
|
53
|
+
var _a;
|
|
54
|
+
const response = await getOrderList(credential, {
|
|
55
|
+
page_num: 1,
|
|
56
|
+
page_size: 100,
|
|
57
|
+
status: 'Pending',
|
|
58
|
+
});
|
|
59
|
+
return ((_a = response.data.data) === null || _a === void 0 ? void 0 : _a.map((order) => mapOrder(order))) || [];
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=listOrders.js.map
|