@yuants/vendor-huobi 0.11.41 → 0.13.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.
- package/dist/account-info.js +235 -0
- package/dist/account-info.js.map +1 -0
- package/dist/api/private-api.js +251 -0
- package/dist/api/private-api.js.map +1 -0
- package/dist/api/public-api.js +145 -0
- package/dist/api/public-api.js.map +1 -0
- package/dist/api.js +0 -279
- package/dist/api.js.map +1 -1
- package/dist/index.js +28 -524
- package/dist/index.js.map +1 -1
- package/dist/interest_rate.js +2 -2
- package/dist/interest_rate.js.map +1 -1
- package/dist/order-actions-with-credentials.js +15 -0
- package/dist/order-actions-with-credentials.js.map +1 -0
- package/dist/order-actions.js +17 -0
- package/dist/order-actions.js.map +1 -0
- package/dist/orders/submitOrder.js +93 -0
- package/dist/orders/submitOrder.js.map +1 -0
- package/dist/product.js +4 -4
- package/dist/product.js.map +1 -1
- package/dist/quote.js +5 -5
- package/dist/quote.js.map +1 -1
- package/dist/transfer.js +248 -0
- package/dist/transfer.js.map +1 -0
- package/dist/uid.js +22 -0
- package/dist/uid.js.map +1 -0
- package/lib/account-info.d.ts +35 -0
- package/lib/account-info.d.ts.map +1 -0
- package/lib/account-info.js +243 -0
- package/lib/account-info.js.map +1 -0
- package/lib/api/private-api.d.ts +474 -0
- package/lib/api/private-api.d.ts.map +1 -0
- package/lib/api/private-api.js +280 -0
- package/lib/api/private-api.js.map +1 -0
- package/lib/api/public-api.d.ts +308 -0
- package/lib/api/public-api.d.ts.map +1 -0
- package/lib/api/public-api.js +158 -0
- package/lib/api/public-api.js.map +1 -0
- package/lib/api.d.ts +2 -621
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +0 -279
- package/lib/api.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +26 -522
- package/lib/index.js.map +1 -1
- package/lib/interest_rate.js +2 -2
- package/lib/interest_rate.js.map +1 -1
- package/lib/order-actions-with-credentials.d.ts +2 -0
- package/lib/order-actions-with-credentials.d.ts.map +1 -0
- package/lib/order-actions-with-credentials.js +17 -0
- package/lib/order-actions-with-credentials.js.map +1 -0
- package/lib/order-actions.d.ts +7 -0
- package/lib/order-actions.d.ts.map +1 -0
- package/lib/order-actions.js +21 -0
- package/lib/order-actions.js.map +1 -0
- package/lib/orders/submitOrder.d.ts +6 -0
- package/lib/orders/submitOrder.d.ts.map +1 -0
- package/lib/orders/submitOrder.js +97 -0
- package/lib/orders/submitOrder.js.map +1 -0
- package/lib/product.js +4 -4
- package/lib/product.js.map +1 -1
- package/lib/quote.js +5 -5
- package/lib/quote.js.map +1 -1
- package/lib/transfer.d.ts +19 -0
- package/lib/transfer.d.ts.map +1 -0
- package/lib/transfer.js +255 -0
- package/lib/transfer.js.map +1 -0
- package/lib/uid.d.ts +13 -0
- package/lib/uid.d.ts.map +1 -0
- package/lib/uid.js +26 -0
- package/lib/uid.js.map +1 -0
- package/package.json +3 -3
- package/temp/package-deps.json +18 -11
- package/dist/logger.js +0 -91
- package/dist/logger.js.map +0 -1
- package/lib/logger.d.ts +0 -21
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js +0 -98
- package/lib/logger.js.map +0 -1
package/dist/transfer.js
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { addAccountTransferAddress } from '@yuants/transfer';
|
|
2
|
+
import { getDepositWithdrawHistory, getSpotAccountDepositAddresses, getV2ReferenceCurrencies, postSpotAccountTransfer, postSubUserTransfer, postSuperMarginAccountTransferIn, postSuperMarginAccountTransferOut, postWithdraw, } from './api/private-api';
|
|
3
|
+
/**
|
|
4
|
+
* 设置 TRC20 USDT 提现地址
|
|
5
|
+
*/
|
|
6
|
+
export const setupTrc20WithdrawalAddresses = async (terminal, spotAccountId, credential, isMainAccount) => {
|
|
7
|
+
if (!isMainAccount) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const res = await getSpotAccountDepositAddresses(credential, { currency: 'usdt' });
|
|
11
|
+
const addresses = res.data.filter((v) => v.chain === 'trc20usdt').map((v) => v.address);
|
|
12
|
+
for (const address of addresses) {
|
|
13
|
+
addAccountTransferAddress({
|
|
14
|
+
terminal,
|
|
15
|
+
account_id: spotAccountId,
|
|
16
|
+
currency: 'USDT',
|
|
17
|
+
address: address,
|
|
18
|
+
network_id: 'TRC20',
|
|
19
|
+
onApply: {
|
|
20
|
+
INIT: async (order) => {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
const res0 = await getV2ReferenceCurrencies(credential, { currency: 'usdt' });
|
|
23
|
+
const fee = (_b = (_a = res0.data
|
|
24
|
+
.find((v) => v.currency === 'usdt')) === null || _a === void 0 ? void 0 : _a.chains.find((v) => v.chain === 'trc20usdt')) === null || _b === void 0 ? void 0 : _b.transactFeeWithdraw;
|
|
25
|
+
if (!fee) {
|
|
26
|
+
return { state: 'ERROR', message: 'MISSING FEE' };
|
|
27
|
+
}
|
|
28
|
+
const res = await postWithdraw(credential, {
|
|
29
|
+
address: order.current_rx_address,
|
|
30
|
+
amount: '' + (order.expected_amount - +fee),
|
|
31
|
+
currency: 'usdt',
|
|
32
|
+
fee: fee,
|
|
33
|
+
chain: 'trc20usdt',
|
|
34
|
+
});
|
|
35
|
+
if (res.status != 'ok') {
|
|
36
|
+
return { state: 'INIT', message: `${res.status}` };
|
|
37
|
+
}
|
|
38
|
+
return { state: 'PENDING', context: `${res.data}` };
|
|
39
|
+
},
|
|
40
|
+
PENDING: async (order) => {
|
|
41
|
+
var _a;
|
|
42
|
+
if (!order.current_tx_context) {
|
|
43
|
+
return { state: 'ERROR', message: 'MISSING CONTEXT' };
|
|
44
|
+
}
|
|
45
|
+
const wdId = +order.current_tx_context;
|
|
46
|
+
const res = await getDepositWithdrawHistory(credential, {
|
|
47
|
+
currency: 'usdt',
|
|
48
|
+
type: 'withdraw',
|
|
49
|
+
from: `${wdId}`,
|
|
50
|
+
});
|
|
51
|
+
const txId = (_a = res.data.find((v) => v.id === wdId)) === null || _a === void 0 ? void 0 : _a['tx-hash'];
|
|
52
|
+
if (!txId) {
|
|
53
|
+
return { state: 'PENDING', context: `${wdId}` };
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
state: 'COMPLETE',
|
|
57
|
+
transaction_id: txId,
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
onEval: async (order) => {
|
|
62
|
+
const res = await getDepositWithdrawHistory(credential, {
|
|
63
|
+
currency: 'usdt',
|
|
64
|
+
type: 'deposit',
|
|
65
|
+
direct: 'next',
|
|
66
|
+
});
|
|
67
|
+
const theItem = res.data.find((v) => v['tx-hash'] === order.current_transaction_id && v.state === 'safe');
|
|
68
|
+
if (!theItem) {
|
|
69
|
+
return { state: 'PENDING' };
|
|
70
|
+
}
|
|
71
|
+
return { received_amount: +theItem.amount, state: 'COMPLETE' };
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* 设置 SPOT 和 SUPER_MARGIN 账户之间的内部转账
|
|
78
|
+
*/
|
|
79
|
+
export const setupSpotSuperMarginTransfer = (terminal, spotAccountId, superMarginAccountId, credential, huobiUid) => {
|
|
80
|
+
const networkId = `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`;
|
|
81
|
+
// SPOT -> SUPER_MARGIN
|
|
82
|
+
addAccountTransferAddress({
|
|
83
|
+
terminal,
|
|
84
|
+
account_id: spotAccountId,
|
|
85
|
+
currency: 'USDT',
|
|
86
|
+
network_id: networkId,
|
|
87
|
+
address: 'SPOT',
|
|
88
|
+
onApply: {
|
|
89
|
+
INIT: async (order) => {
|
|
90
|
+
const transferInResult = await postSuperMarginAccountTransferIn(credential, {
|
|
91
|
+
currency: 'usdt',
|
|
92
|
+
amount: '' + (order.current_amount || order.expected_amount),
|
|
93
|
+
});
|
|
94
|
+
if (transferInResult.status !== 'ok') {
|
|
95
|
+
return { state: 'INIT' };
|
|
96
|
+
}
|
|
97
|
+
return { state: 'COMPLETE' };
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
onEval: async (order) => {
|
|
101
|
+
return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
// SUPER_MARGIN -> SPOT
|
|
105
|
+
addAccountTransferAddress({
|
|
106
|
+
terminal,
|
|
107
|
+
account_id: superMarginAccountId,
|
|
108
|
+
currency: 'USDT',
|
|
109
|
+
network_id: networkId,
|
|
110
|
+
address: 'SUPER_MARGIN',
|
|
111
|
+
onApply: {
|
|
112
|
+
INIT: async (order) => {
|
|
113
|
+
const transferOutResult = await postSuperMarginAccountTransferOut(credential, {
|
|
114
|
+
currency: 'usdt',
|
|
115
|
+
amount: '' + (order.current_amount || order.expected_amount),
|
|
116
|
+
});
|
|
117
|
+
if (transferOutResult.status !== 'ok') {
|
|
118
|
+
return { state: 'INIT' };
|
|
119
|
+
}
|
|
120
|
+
return { state: 'COMPLETE' };
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
onEval: async (order) => {
|
|
124
|
+
return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* 设置 SPOT 和 SWAP 账户之间的内部转账
|
|
130
|
+
*/
|
|
131
|
+
export const setupSpotSwapTransfer = (terminal, spotAccountId, swapAccountId, credential, huobiUid) => {
|
|
132
|
+
const networkId = `Huobi/${huobiUid}/SPOT-SWAP`;
|
|
133
|
+
// SPOT -> SWAP
|
|
134
|
+
addAccountTransferAddress({
|
|
135
|
+
terminal,
|
|
136
|
+
account_id: spotAccountId,
|
|
137
|
+
currency: 'USDT',
|
|
138
|
+
network_id: networkId,
|
|
139
|
+
address: 'SPOT',
|
|
140
|
+
onApply: {
|
|
141
|
+
INIT: async (order) => {
|
|
142
|
+
const transferResult = await postSpotAccountTransfer(credential, {
|
|
143
|
+
from: 'spot',
|
|
144
|
+
to: 'linear-swap',
|
|
145
|
+
currency: 'usdt',
|
|
146
|
+
amount: order.current_amount || order.expected_amount,
|
|
147
|
+
'margin-account': 'USDT',
|
|
148
|
+
});
|
|
149
|
+
if (!transferResult.success) {
|
|
150
|
+
return { state: 'INIT' };
|
|
151
|
+
}
|
|
152
|
+
return { state: 'COMPLETE' };
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
onEval: async (order) => {
|
|
156
|
+
return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
// SWAP -> SPOT
|
|
160
|
+
addAccountTransferAddress({
|
|
161
|
+
terminal,
|
|
162
|
+
account_id: swapAccountId,
|
|
163
|
+
currency: 'USDT',
|
|
164
|
+
network_id: networkId,
|
|
165
|
+
address: 'SWAP',
|
|
166
|
+
onApply: {
|
|
167
|
+
INIT: async (order) => {
|
|
168
|
+
const transferResult = await postSpotAccountTransfer(credential, {
|
|
169
|
+
from: 'linear-swap',
|
|
170
|
+
to: 'spot',
|
|
171
|
+
currency: 'usdt',
|
|
172
|
+
amount: order.current_amount || order.expected_amount,
|
|
173
|
+
'margin-account': 'USDT',
|
|
174
|
+
});
|
|
175
|
+
if (!transferResult.success) {
|
|
176
|
+
return { state: 'INIT' };
|
|
177
|
+
}
|
|
178
|
+
return { state: 'COMPLETE' };
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
onEval: async (order) => {
|
|
182
|
+
return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* 设置子账户转账
|
|
188
|
+
*/
|
|
189
|
+
export const setupSubAccountTransfers = (terminal, spotAccountId, credential, huobiUid, subAccounts, isMainAccount) => {
|
|
190
|
+
if (!isMainAccount) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
for (const subAccount of subAccounts) {
|
|
194
|
+
const spotSubAccountId = `huobi/${subAccount.uid}/spot/usdt`;
|
|
195
|
+
const subAccountNetworkId = `Huobi/${huobiUid}/SubAccount/${subAccount.uid}`;
|
|
196
|
+
// 主账户 -> 子账户
|
|
197
|
+
addAccountTransferAddress({
|
|
198
|
+
terminal,
|
|
199
|
+
account_id: spotAccountId,
|
|
200
|
+
currency: 'USDT',
|
|
201
|
+
network_id: subAccountNetworkId,
|
|
202
|
+
address: '#main',
|
|
203
|
+
onApply: {
|
|
204
|
+
INIT: async (order) => {
|
|
205
|
+
const transferResult = await postSubUserTransfer(credential, {
|
|
206
|
+
'sub-uid': +order.current_rx_address,
|
|
207
|
+
currency: 'usdt',
|
|
208
|
+
amount: order.current_amount || order.expected_amount,
|
|
209
|
+
type: 'master-transfer-out',
|
|
210
|
+
});
|
|
211
|
+
if (transferResult.status !== 'ok') {
|
|
212
|
+
return { state: 'INIT' };
|
|
213
|
+
}
|
|
214
|
+
return { state: 'COMPLETE' };
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
onEval: async (order) => {
|
|
218
|
+
return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
// 子账户 -> 主账户
|
|
222
|
+
addAccountTransferAddress({
|
|
223
|
+
terminal,
|
|
224
|
+
account_id: spotSubAccountId,
|
|
225
|
+
currency: 'USDT',
|
|
226
|
+
network_id: subAccountNetworkId,
|
|
227
|
+
address: `${subAccount.uid}`,
|
|
228
|
+
onApply: {
|
|
229
|
+
INIT: async (order) => {
|
|
230
|
+
const transferResult = await postSubUserTransfer(credential, {
|
|
231
|
+
'sub-uid': +order.current_tx_address,
|
|
232
|
+
currency: 'usdt',
|
|
233
|
+
amount: order.current_amount || order.expected_amount,
|
|
234
|
+
type: 'master-transfer-in',
|
|
235
|
+
});
|
|
236
|
+
if (transferResult.status !== 'ok') {
|
|
237
|
+
return { state: 'INIT' };
|
|
238
|
+
}
|
|
239
|
+
return { state: 'COMPLETE' };
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
onEval: async (order) => {
|
|
243
|
+
return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport {\n getDepositWithdrawHistory,\n getSpotAccountDepositAddresses,\n getV2ReferenceCurrencies,\n ICredential,\n postSpotAccountTransfer,\n postSubUserTransfer,\n postSuperMarginAccountTransferIn,\n postSuperMarginAccountTransferOut,\n postWithdraw,\n} from './api/private-api';\n\n/**\n * 设置 TRC20 USDT 提现地址\n */\nexport const setupTrc20WithdrawalAddresses = async (\n terminal: Terminal,\n spotAccountId: string,\n credential: ICredential,\n isMainAccount: boolean,\n) => {\n if (!isMainAccount) {\n return;\n }\n\n const res = await getSpotAccountDepositAddresses(credential, { currency: 'usdt' });\n const addresses = res.data.filter((v) => v.chain === 'trc20usdt').map((v) => v.address);\n\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: spotAccountId,\n currency: 'USDT',\n address: address,\n network_id: 'TRC20',\n onApply: {\n INIT: async (order) => {\n const res0 = await getV2ReferenceCurrencies(credential, { currency: 'usdt' });\n const fee = res0.data\n .find((v) => v.currency === 'usdt')\n ?.chains.find((v) => v.chain === 'trc20usdt')?.transactFeeWithdraw;\n if (!fee) {\n return { state: 'ERROR', message: 'MISSING FEE' };\n }\n const res = await postWithdraw(credential, {\n address: order.current_rx_address!,\n amount: '' + (order.expected_amount - +fee),\n currency: 'usdt',\n fee: fee,\n chain: 'trc20usdt',\n });\n if (res.status != 'ok') {\n return { state: 'INIT', message: `${res.status}` };\n }\n return { state: 'PENDING', context: `${res.data}` };\n },\n PENDING: async (order) => {\n if (!order.current_tx_context) {\n return { state: 'ERROR', message: 'MISSING CONTEXT' };\n }\n const wdId = +order.current_tx_context;\n const res = await getDepositWithdrawHistory(credential, {\n currency: 'usdt',\n type: 'withdraw',\n from: `${wdId}`,\n });\n const txId = res.data.find((v) => v.id === wdId)?.['tx-hash'];\n if (!txId) {\n return { state: 'PENDING', context: `${wdId}` };\n }\n return {\n state: 'COMPLETE',\n transaction_id: txId,\n };\n },\n },\n onEval: async (order) => {\n const res = await getDepositWithdrawHistory(credential, {\n currency: 'usdt',\n type: 'deposit',\n direct: 'next',\n });\n\n const theItem = res.data.find(\n (v) => v['tx-hash'] === order.current_transaction_id && v.state === 'safe',\n );\n if (!theItem) {\n return { state: 'PENDING' };\n }\n return { received_amount: +theItem.amount, state: 'COMPLETE' };\n },\n });\n }\n};\n\n/**\n * 设置 SPOT 和 SUPER_MARGIN 账户之间的内部转账\n */\nexport const setupSpotSuperMarginTransfer = (\n terminal: Terminal,\n spotAccountId: string,\n superMarginAccountId: string,\n credential: ICredential,\n huobiUid: number,\n) => {\n const networkId = `Huobi/${huobiUid}/SPOT-SUPER_MARGIN`;\n\n // SPOT -> SUPER_MARGIN\n addAccountTransferAddress({\n terminal,\n account_id: spotAccountId,\n currency: 'USDT',\n network_id: networkId,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferInResult = await postSuperMarginAccountTransferIn(credential, {\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferInResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n // SUPER_MARGIN -> SPOT\n addAccountTransferAddress({\n terminal,\n account_id: superMarginAccountId,\n currency: 'USDT',\n network_id: networkId,\n address: 'SUPER_MARGIN',\n onApply: {\n INIT: async (order) => {\n const transferOutResult = await postSuperMarginAccountTransferOut(credential, {\n currency: 'usdt',\n amount: '' + (order.current_amount || order.expected_amount),\n });\n if (transferOutResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n};\n\n/**\n * 设置 SPOT 和 SWAP 账户之间的内部转账\n */\nexport const setupSpotSwapTransfer = (\n terminal: Terminal,\n spotAccountId: string,\n swapAccountId: string,\n credential: ICredential,\n huobiUid: number,\n) => {\n const networkId = `Huobi/${huobiUid}/SPOT-SWAP`;\n\n // SPOT -> SWAP\n addAccountTransferAddress({\n terminal,\n account_id: spotAccountId,\n currency: 'USDT',\n network_id: networkId,\n address: 'SPOT',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postSpotAccountTransfer(credential, {\n from: 'spot',\n to: 'linear-swap',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n // SWAP -> SPOT\n addAccountTransferAddress({\n terminal,\n account_id: swapAccountId,\n currency: 'USDT',\n network_id: networkId,\n address: 'SWAP',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postSpotAccountTransfer(credential, {\n from: 'linear-swap',\n to: 'spot',\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n 'margin-account': 'USDT',\n });\n if (!transferResult.success) {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n};\n\n/**\n * 设置子账户转账\n */\nexport const setupSubAccountTransfers = (\n terminal: Terminal,\n spotAccountId: string,\n credential: ICredential,\n huobiUid: number,\n subAccounts: any[],\n isMainAccount: boolean,\n) => {\n if (!isMainAccount) {\n return;\n }\n\n for (const subAccount of subAccounts) {\n const spotSubAccountId = `huobi/${subAccount.uid}/spot/usdt`;\n const subAccountNetworkId = `Huobi/${huobiUid}/SubAccount/${subAccount.uid}`;\n\n // 主账户 -> 子账户\n addAccountTransferAddress({\n terminal,\n account_id: spotAccountId,\n currency: 'USDT',\n network_id: subAccountNetworkId,\n address: '#main',\n onApply: {\n INIT: async (order) => {\n const transferResult = await postSubUserTransfer(credential, {\n 'sub-uid': +order.current_rx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-out',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n\n // 子账户 -> 主账户\n addAccountTransferAddress({\n terminal,\n account_id: spotSubAccountId,\n currency: 'USDT',\n network_id: subAccountNetworkId,\n address: `${subAccount.uid}`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postSubUserTransfer(credential, {\n 'sub-uid': +order.current_tx_address!,\n currency: 'usdt',\n amount: order.current_amount || order.expected_amount,\n type: 'master-transfer-in',\n });\n if (transferResult.status !== 'ok') {\n return { state: 'INIT' };\n }\n return { state: 'COMPLETE' };\n },\n },\n onEval: async (order) => {\n return { received_amount: order.current_amount || order.expected_amount, state: 'COMPLETE' };\n },\n });\n }\n};\n"]}
|
package/dist/uid.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createCache } from '@yuants/cache';
|
|
2
|
+
import { getAccount, getUid } from './api/private-api';
|
|
3
|
+
export const uidCache = createCache((key) => getUid(JSON.parse(key)));
|
|
4
|
+
const huobiAccounts = createCache((key) => getAccount(JSON.parse(key)));
|
|
5
|
+
export const superMarginAccountUidCache = createCache((key) => huobiAccounts.query(key).then((x) => { var _a; return (_a = x === null || x === void 0 ? void 0 : x.data.find((v) => v.type === 'super-margin')) === null || _a === void 0 ? void 0 : _a.id; }));
|
|
6
|
+
export const spotAccountUidCache = createCache((key) => huobiAccounts.query(key).then((x) => { var _a; return (_a = x === null || x === void 0 ? void 0 : x.data.find((v) => v.type === 'spot')) === null || _a === void 0 ? void 0 : _a.id; }));
|
|
7
|
+
export const getAccountIds = async (key) => {
|
|
8
|
+
const uid = await uidCache.query(key);
|
|
9
|
+
if (!uid)
|
|
10
|
+
throw new Error('Failed to get UID');
|
|
11
|
+
const account_id = `huobi/${uid}`;
|
|
12
|
+
const SPOT_ACCOUNT_ID = `${account_id}/spot/usdt`;
|
|
13
|
+
const SUPER_MARGIN_ACCOUNT_ID = `${account_id}/super-margin`;
|
|
14
|
+
const SWAP_ACCOUNT_ID = `${account_id}/swap`;
|
|
15
|
+
return {
|
|
16
|
+
main: account_id,
|
|
17
|
+
spot: SPOT_ACCOUNT_ID,
|
|
18
|
+
superMargin: SUPER_MARGIN_ACCOUNT_ID,
|
|
19
|
+
swap: SWAP_ACCOUNT_ID,
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=uid.js.map
|
package/dist/uid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uid.js","sourceRoot":"","sources":["../src/uid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEtE,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,0BAA0B,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5D,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,0CAAE,EAAE,CAAA,EAAA,CAAC,CACzF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE,CACrD,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,0CAAE,EAAE,CAAA,EAAA,CAAC,CACjF,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,SAAS,GAAG,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,GAAG,UAAU,YAAY,CAAC;IAClD,MAAM,uBAAuB,GAAG,GAAG,UAAU,eAAe,CAAC;IAC7D,MAAM,eAAe,GAAG,GAAG,UAAU,OAAO,CAAC;IAE7C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,uBAAuB;QACpC,IAAI,EAAE,eAAe;KACtB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { createCache } from '@yuants/cache';\nimport { getAccount, getUid } from './api/private-api';\n\nexport const uidCache = createCache((key) => getUid(JSON.parse(key)));\n\nconst huobiAccounts = createCache((key) => getAccount(JSON.parse(key)));\n\nexport const superMarginAccountUidCache = createCache((key) =>\n huobiAccounts.query(key).then((x) => x?.data.find((v) => v.type === 'super-margin')?.id),\n);\n\nexport const spotAccountUidCache = createCache((key) =>\n huobiAccounts.query(key).then((x) => x?.data.find((v) => v.type === 'spot')?.id),\n);\n\nexport const getAccountIds = async (key: string) => {\n const uid = await uidCache.query(key);\n if (!uid) throw new Error('Failed to get UID');\n\n const account_id = `huobi/${uid}`;\n const SPOT_ACCOUNT_ID = `${account_id}/spot/usdt`;\n const SUPER_MARGIN_ACCOUNT_ID = `${account_id}/super-margin`;\n const SWAP_ACCOUNT_ID = `${account_id}/swap`;\n\n return {\n main: account_id,\n spot: SPOT_ACCOUNT_ID,\n superMargin: SUPER_MARGIN_ACCOUNT_ID,\n swap: SWAP_ACCOUNT_ID,\n };\n};\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Terminal } from '@yuants/protocol';
|
|
2
|
+
import { ICredential } from './api/private-api';
|
|
3
|
+
/**
|
|
4
|
+
* 提供 SWAP 账户信息服务
|
|
5
|
+
*/
|
|
6
|
+
export declare const provideSwapAccountInfoService: (terminal: Terminal, accountId: string, credential: ICredential) => void;
|
|
7
|
+
/**
|
|
8
|
+
* 获取超级保证金账户余额流
|
|
9
|
+
*/
|
|
10
|
+
export declare const getSuperMarginAccountBalance$: (credential: ICredential, superMarginAccountUid: number) => import("rxjs").Observable<{
|
|
11
|
+
list: {
|
|
12
|
+
currency: string;
|
|
13
|
+
balance: string;
|
|
14
|
+
type: string;
|
|
15
|
+
}[];
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* 设置超级保证金账户的 WebSocket 订阅
|
|
19
|
+
*/
|
|
20
|
+
export declare const setupSuperMarginWebSocketSubscriptions: (superMarginAccountBalance$: ReturnType<typeof getSuperMarginAccountBalance$>, subscriptions: Set<string>) => void;
|
|
21
|
+
/**
|
|
22
|
+
* 提供超级保证金账户信息服务
|
|
23
|
+
*/
|
|
24
|
+
export declare const provideSuperMarginAccountInfoService: (terminal: Terminal, accountId: string, credential: ICredential, superMarginAccountUid: number, subscriptions: Set<string>) => import("rxjs").Observable<{
|
|
25
|
+
list: {
|
|
26
|
+
currency: string;
|
|
27
|
+
balance: string;
|
|
28
|
+
type: string;
|
|
29
|
+
}[];
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* 提供 SPOT 账户信息服务
|
|
33
|
+
*/
|
|
34
|
+
export declare const provideSpotAccountInfoService: (terminal: Terminal, accountId: string, credential: ICredential, spotAccountUid: number) => void;
|
|
35
|
+
//# sourceMappingURL=account-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-info.d.ts","sourceRoot":"","sources":["../src/account-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmB5C,OAAO,EAKL,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,eAAO,MAAM,6BAA6B,aAC9B,QAAQ,aACP,MAAM,cACL,WAAW,SAgGxB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,eAAgB,WAAW,yBAAyB,MAAM;;;;;;EAanG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sCAAsC,+BACrB,WAAW,oCAAoC,CAAC,iBAC7D,IAAI,MAAM,CAAC,SAoC3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,aACrC,QAAQ,aACP,MAAM,cACL,WAAW,yBACA,MAAM,iBACd,IAAI,MAAM,CAAC;;;;;;EA4F3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,aAC9B,QAAQ,aACP,MAAM,cACL,WAAW,kBACP,MAAM,SAqBvB,CAAC"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.provideSpotAccountInfoService = exports.provideSuperMarginAccountInfoService = exports.setupSuperMarginWebSocketSubscriptions = exports.getSuperMarginAccountBalance$ = exports.provideSwapAccountInfoService = void 0;
|
|
4
|
+
const data_account_1 = require("@yuants/data-account");
|
|
5
|
+
const utils_1 = require("@yuants/utils");
|
|
6
|
+
const rxjs_1 = require("rxjs");
|
|
7
|
+
const api_1 = require("./api");
|
|
8
|
+
const private_api_1 = require("./api/private-api");
|
|
9
|
+
const product_1 = require("./product");
|
|
10
|
+
/**
|
|
11
|
+
* 提供 SWAP 账户信息服务
|
|
12
|
+
*/
|
|
13
|
+
const provideSwapAccountInfoService = (terminal, accountId, credential) => {
|
|
14
|
+
(0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => {
|
|
15
|
+
// balance
|
|
16
|
+
const balance = await (0, private_api_1.getUnifiedAccountInfo)(credential);
|
|
17
|
+
if (!balance.data) {
|
|
18
|
+
throw new Error('Failed to get unified account info');
|
|
19
|
+
}
|
|
20
|
+
const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');
|
|
21
|
+
if (!balanceData) {
|
|
22
|
+
throw new Error('No USDT balance found in unified account');
|
|
23
|
+
}
|
|
24
|
+
const equity = balanceData.margin_balance;
|
|
25
|
+
const free = balanceData.withdraw_available;
|
|
26
|
+
// positions
|
|
27
|
+
const positionsRes = await (0, private_api_1.getSwapCrossPositionInfo)(credential);
|
|
28
|
+
const mapProductIdToPerpetualProduct = await (0, rxjs_1.firstValueFrom)(product_1.swapProductService.mapProductIdToProduct$);
|
|
29
|
+
const positions = (positionsRes.data || []).map((v) => {
|
|
30
|
+
const product_id = v.contract_code;
|
|
31
|
+
const theProduct = mapProductIdToPerpetualProduct === null || mapProductIdToPerpetualProduct === void 0 ? void 0 : mapProductIdToPerpetualProduct.get(product_id);
|
|
32
|
+
const valuation = v.volume * v.last_price * ((theProduct === null || theProduct === void 0 ? void 0 : theProduct.value_scale) || 1);
|
|
33
|
+
return {
|
|
34
|
+
position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,
|
|
35
|
+
datasource_id: 'HUOBI-SWAP',
|
|
36
|
+
product_id,
|
|
37
|
+
direction: v.direction === 'buy' ? 'LONG' : 'SHORT',
|
|
38
|
+
volume: v.volume,
|
|
39
|
+
free_volume: v.available,
|
|
40
|
+
position_price: v.cost_hold,
|
|
41
|
+
closable_price: v.last_price,
|
|
42
|
+
floating_profit: v.profit_unreal,
|
|
43
|
+
valuation,
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
// orders
|
|
47
|
+
// const orders: IOrder[] = [];
|
|
48
|
+
// let page_index = 1;
|
|
49
|
+
// const page_size = 50;
|
|
50
|
+
// while (true) {
|
|
51
|
+
// const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });
|
|
52
|
+
// if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {
|
|
53
|
+
// break;
|
|
54
|
+
// }
|
|
55
|
+
// const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {
|
|
56
|
+
// return {
|
|
57
|
+
// order_id: v.order_id_str,
|
|
58
|
+
// account_id: SWAP_ACCOUNT_ID,
|
|
59
|
+
// product_id: v.contract_code,
|
|
60
|
+
// order_type: ['lightning'].includes(v.order_price_type)
|
|
61
|
+
// ? 'MARKET'
|
|
62
|
+
// : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(
|
|
63
|
+
// v.order_price_type,
|
|
64
|
+
// )
|
|
65
|
+
// ? 'LIMIT'
|
|
66
|
+
// : ['fok'].includes(v.order_price_type)
|
|
67
|
+
// ? 'FOK'
|
|
68
|
+
// : v.order_price_type.includes('ioc')
|
|
69
|
+
// ? 'IOC'
|
|
70
|
+
// : 'STOP', // unreachable code
|
|
71
|
+
// order_direction:
|
|
72
|
+
// v.direction === 'open'
|
|
73
|
+
// ? v.offset === 'buy'
|
|
74
|
+
// ? 'OPEN_LONG'
|
|
75
|
+
// : 'OPEN_SHORT'
|
|
76
|
+
// : v.offset === 'buy'
|
|
77
|
+
// ? 'CLOSE_SHORT'
|
|
78
|
+
// : 'CLOSE_LONG',
|
|
79
|
+
// volume: v.volume,
|
|
80
|
+
// submit_at: v.created_at,
|
|
81
|
+
// price: v.price,
|
|
82
|
+
// traded_volume: v.trade_volume,
|
|
83
|
+
// };
|
|
84
|
+
// });
|
|
85
|
+
// orders.push(...pageOrders);
|
|
86
|
+
// page_index++;
|
|
87
|
+
// }
|
|
88
|
+
return {
|
|
89
|
+
money: {
|
|
90
|
+
currency: 'USDT',
|
|
91
|
+
equity,
|
|
92
|
+
free,
|
|
93
|
+
},
|
|
94
|
+
positions,
|
|
95
|
+
};
|
|
96
|
+
}, { auto_refresh_interval: 1000 });
|
|
97
|
+
};
|
|
98
|
+
exports.provideSwapAccountInfoService = provideSwapAccountInfoService;
|
|
99
|
+
/**
|
|
100
|
+
* 获取超级保证金账户余额流
|
|
101
|
+
*/
|
|
102
|
+
const getSuperMarginAccountBalance$ = (credential, superMarginAccountUid) => {
|
|
103
|
+
return (0, rxjs_1.defer)(() => (0, private_api_1.getSpotAccountBalance)(credential, superMarginAccountUid)).pipe(
|
|
104
|
+
//
|
|
105
|
+
(0, rxjs_1.map)((res) => res.data), (0, rxjs_1.repeat)({ delay: 1000 }), (0, rxjs_1.tap)({
|
|
106
|
+
error: (e) => {
|
|
107
|
+
console.error((0, utils_1.formatTime)(Date.now()), 'unifiedRaw', e);
|
|
108
|
+
},
|
|
109
|
+
}), (0, rxjs_1.retry)({ delay: 5000 }), (0, rxjs_1.shareReplay)(1));
|
|
110
|
+
};
|
|
111
|
+
exports.getSuperMarginAccountBalance$ = getSuperMarginAccountBalance$;
|
|
112
|
+
/**
|
|
113
|
+
* 设置超级保证金账户的 WebSocket 订阅
|
|
114
|
+
*/
|
|
115
|
+
const setupSuperMarginWebSocketSubscriptions = (superMarginAccountBalance$, subscriptions) => {
|
|
116
|
+
(0, rxjs_1.from)(api_1.client.spot_ws.connection$).subscribe(() => {
|
|
117
|
+
subscriptions.clear();
|
|
118
|
+
});
|
|
119
|
+
// subscribe the symbols of positions we held
|
|
120
|
+
superMarginAccountBalance$
|
|
121
|
+
.pipe(
|
|
122
|
+
//
|
|
123
|
+
(0, rxjs_1.mergeMap)((res) => (0, rxjs_1.from)((res === null || res === void 0 ? void 0 : res.list) || []).pipe((0, rxjs_1.filter)((v) => v.currency !== 'usdt'), (0, rxjs_1.map)((v) => v.currency), (0, rxjs_1.distinct)(), (0, rxjs_1.toArray)(), (0, rxjs_1.map)((v) => new Set(v)))))
|
|
124
|
+
.subscribe((v) => {
|
|
125
|
+
const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));
|
|
126
|
+
const toSubscribe = [...v].filter((x) => !subscriptions.has(x));
|
|
127
|
+
for (const symbol of toUnsubscribe) {
|
|
128
|
+
api_1.client.spot_ws.output$.next({
|
|
129
|
+
unsub: `market.${symbol}usdt.ticker`,
|
|
130
|
+
});
|
|
131
|
+
subscriptions.delete(symbol);
|
|
132
|
+
}
|
|
133
|
+
for (const symbol of toSubscribe) {
|
|
134
|
+
api_1.client.spot_ws.output$.next({
|
|
135
|
+
sub: `market.${symbol}usdt.ticker`,
|
|
136
|
+
});
|
|
137
|
+
subscriptions.add(symbol);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
exports.setupSuperMarginWebSocketSubscriptions = setupSuperMarginWebSocketSubscriptions;
|
|
142
|
+
/**
|
|
143
|
+
* 提供超级保证金账户信息服务
|
|
144
|
+
*/
|
|
145
|
+
const provideSuperMarginAccountInfoService = (terminal, accountId, credential, superMarginAccountUid, subscriptions) => {
|
|
146
|
+
const superMarginAccountBalance$ = (0, exports.getSuperMarginAccountBalance$)(credential, superMarginAccountUid);
|
|
147
|
+
(0, exports.setupSuperMarginWebSocketSubscriptions)(superMarginAccountBalance$, subscriptions);
|
|
148
|
+
(0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => {
|
|
149
|
+
var _a;
|
|
150
|
+
// get account balance
|
|
151
|
+
const accountBalance = await (0, private_api_1.getSpotAccountBalance)(credential, superMarginAccountUid);
|
|
152
|
+
const balanceList = ((_a = accountBalance.data) === null || _a === void 0 ? void 0 : _a.list) || [];
|
|
153
|
+
// calculate usdt balance
|
|
154
|
+
const usdtBalance = balanceList
|
|
155
|
+
.filter((v) => v.currency === 'usdt')
|
|
156
|
+
.reduce((acc, cur) => acc + +cur.balance, 0);
|
|
157
|
+
// get positions (non-usdt currencies)
|
|
158
|
+
const positions = [];
|
|
159
|
+
const nonUsdtCurrencies = balanceList
|
|
160
|
+
.filter((v) => v.currency !== 'usdt')
|
|
161
|
+
.reduce((acc, cur) => {
|
|
162
|
+
const existing = acc.find((item) => item.currency === cur.currency);
|
|
163
|
+
if (existing) {
|
|
164
|
+
existing.balance += +cur.balance;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
acc.push({ currency: cur.currency, balance: +cur.balance });
|
|
168
|
+
}
|
|
169
|
+
return acc;
|
|
170
|
+
}, []);
|
|
171
|
+
// get prices and create positions
|
|
172
|
+
for (const currencyData of nonUsdtCurrencies) {
|
|
173
|
+
if (currencyData.balance > 0) {
|
|
174
|
+
try {
|
|
175
|
+
// get current price from websocket or fallback to REST API
|
|
176
|
+
let price;
|
|
177
|
+
try {
|
|
178
|
+
const tickPrice = await (0, rxjs_1.firstValueFrom)(api_1.client.spot_ws.input$.pipe(
|
|
179
|
+
//
|
|
180
|
+
(0, rxjs_1.first)((v) => { var _a, _b; return ((_a = v.ch) === null || _a === void 0 ? void 0 : _a.includes('ticker')) && ((_b = v.ch) === null || _b === void 0 ? void 0 : _b.includes(currencyData.currency)) && v.tick; }), (0, rxjs_1.map)((v) => v.tick.bid), (0, rxjs_1.timeout)(5000), (0, rxjs_1.tap)({
|
|
181
|
+
error: (e) => {
|
|
182
|
+
subscriptions.clear();
|
|
183
|
+
},
|
|
184
|
+
})));
|
|
185
|
+
price = tickPrice;
|
|
186
|
+
}
|
|
187
|
+
catch (_b) {
|
|
188
|
+
// fallback to REST API
|
|
189
|
+
const tickerRes = await (0, private_api_1.getSpotTick)(credential, { symbol: `${currencyData.currency}usdt` });
|
|
190
|
+
price = tickerRes.tick.close;
|
|
191
|
+
}
|
|
192
|
+
positions.push({
|
|
193
|
+
position_id: `${currencyData.currency}/usdt/spot`,
|
|
194
|
+
product_id: `${currencyData.currency}usdt`,
|
|
195
|
+
direction: 'LONG',
|
|
196
|
+
volume: currencyData.balance,
|
|
197
|
+
free_volume: currencyData.balance,
|
|
198
|
+
position_price: price,
|
|
199
|
+
closable_price: price,
|
|
200
|
+
floating_profit: 0,
|
|
201
|
+
valuation: currencyData.balance * price,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
console.warn((0, utils_1.formatTime)(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// calculate equity
|
|
210
|
+
const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;
|
|
211
|
+
return {
|
|
212
|
+
money: {
|
|
213
|
+
currency: 'USDT',
|
|
214
|
+
equity,
|
|
215
|
+
free: equity,
|
|
216
|
+
},
|
|
217
|
+
positions,
|
|
218
|
+
};
|
|
219
|
+
}, { auto_refresh_interval: 1000 });
|
|
220
|
+
return superMarginAccountBalance$;
|
|
221
|
+
};
|
|
222
|
+
exports.provideSuperMarginAccountInfoService = provideSuperMarginAccountInfoService;
|
|
223
|
+
/**
|
|
224
|
+
* 提供 SPOT 账户信息服务
|
|
225
|
+
*/
|
|
226
|
+
const provideSpotAccountInfoService = (terminal, accountId, credential, spotAccountUid) => {
|
|
227
|
+
(0, data_account_1.provideAccountInfoService)(terminal, accountId, async () => {
|
|
228
|
+
var _a, _b;
|
|
229
|
+
const spotBalance = await (0, private_api_1.getSpotAccountBalance)(credential, spotAccountUid);
|
|
230
|
+
const equity = +((_b = (_a = spotBalance.data.list.find((v) => v.currency === 'usdt')) === null || _a === void 0 ? void 0 : _a.balance) !== null && _b !== void 0 ? _b : 0);
|
|
231
|
+
const free = equity;
|
|
232
|
+
return {
|
|
233
|
+
money: {
|
|
234
|
+
currency: 'USDT',
|
|
235
|
+
equity,
|
|
236
|
+
free,
|
|
237
|
+
},
|
|
238
|
+
positions: [],
|
|
239
|
+
};
|
|
240
|
+
}, { auto_refresh_interval: 1000 });
|
|
241
|
+
};
|
|
242
|
+
exports.provideSpotAccountInfoService = provideSpotAccountInfoService;
|
|
243
|
+
//# sourceMappingURL=account-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-info.js","sourceRoot":"","sources":["../src/account-info.ts"],"names":[],"mappings":"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","sourcesContent":["import { IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport {\n defer,\n distinct,\n filter,\n first,\n firstValueFrom,\n from,\n map,\n mergeMap,\n repeat,\n retry,\n shareReplay,\n tap,\n timeout,\n toArray,\n} from 'rxjs';\nimport { client } from './api';\nimport {\n getSpotAccountBalance,\n getSpotTick,\n getSwapCrossPositionInfo,\n getUnifiedAccountInfo,\n ICredential,\n} from './api/private-api';\nimport { swapProductService } from './product';\n\n/**\n * 提供 SWAP 账户信息服务\n */\nexport const provideSwapAccountInfoService = (\n terminal: Terminal,\n accountId: string,\n credential: ICredential,\n) => {\n provideAccountInfoService(\n terminal,\n accountId,\n async () => {\n // balance\n const balance = await getUnifiedAccountInfo(credential);\n if (!balance.data) {\n throw new Error('Failed to get unified account info');\n }\n const balanceData = balance.data.find((v) => v.margin_asset === 'USDT');\n if (!balanceData) {\n throw new Error('No USDT balance found in unified account');\n }\n const equity = balanceData.margin_balance;\n const free = balanceData.withdraw_available;\n\n // positions\n const positionsRes = await getSwapCrossPositionInfo(credential);\n const mapProductIdToPerpetualProduct = await firstValueFrom(swapProductService.mapProductIdToProduct$);\n const positions: IPosition[] = (positionsRes.data || []).map((v): IPosition => {\n const product_id = v.contract_code;\n const theProduct = mapProductIdToPerpetualProduct?.get(product_id);\n const valuation = v.volume * v.last_price * (theProduct?.value_scale || 1);\n return {\n position_id: `${v.contract_code}/${v.contract_type}/${v.direction}/${v.margin_mode}`,\n datasource_id: 'HUOBI-SWAP',\n product_id,\n direction: v.direction === 'buy' ? 'LONG' : 'SHORT',\n volume: v.volume,\n free_volume: v.available,\n position_price: v.cost_hold,\n closable_price: v.last_price,\n floating_profit: v.profit_unreal,\n valuation,\n };\n });\n\n // orders\n // const orders: IOrder[] = [];\n // let page_index = 1;\n // const page_size = 50;\n\n // while (true) {\n // const ordersRes = await client.getSwapOpenOrders({ page_index, page_size });\n // if (!ordersRes.data?.orders || ordersRes.data.orders.length === 0) {\n // break;\n // }\n\n // const pageOrders: IOrder[] = ordersRes.data.orders.map((v): IOrder => {\n // return {\n // order_id: v.order_id_str,\n // account_id: SWAP_ACCOUNT_ID,\n // product_id: v.contract_code,\n // order_type: ['lightning'].includes(v.order_price_type)\n // ? 'MARKET'\n // : ['limit', 'opponent', 'post_only', 'optimal_5', 'optimal_10', 'optimal_20'].includes(\n // v.order_price_type,\n // )\n // ? 'LIMIT'\n // : ['fok'].includes(v.order_price_type)\n // ? 'FOK'\n // : v.order_price_type.includes('ioc')\n // ? 'IOC'\n // : 'STOP', // unreachable code\n // order_direction:\n // v.direction === 'open'\n // ? v.offset === 'buy'\n // ? 'OPEN_LONG'\n // : 'OPEN_SHORT'\n // : v.offset === 'buy'\n // ? 'CLOSE_SHORT'\n // : 'CLOSE_LONG',\n // volume: v.volume,\n // submit_at: v.created_at,\n // price: v.price,\n // traded_volume: v.trade_volume,\n // };\n // });\n\n // orders.push(...pageOrders);\n // page_index++;\n // }\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n};\n\n/**\n * 获取超级保证金账户余额流\n */\nexport const getSuperMarginAccountBalance$ = (credential: ICredential, superMarginAccountUid: number) => {\n return defer(() => getSpotAccountBalance(credential, superMarginAccountUid)).pipe(\n //\n map((res) => res.data),\n repeat({ delay: 1000 }),\n tap({\n error: (e) => {\n console.error(formatTime(Date.now()), 'unifiedRaw', e);\n },\n }),\n retry({ delay: 5000 }),\n shareReplay(1),\n );\n};\n\n/**\n * 设置超级保证金账户的 WebSocket 订阅\n */\nexport const setupSuperMarginWebSocketSubscriptions = (\n superMarginAccountBalance$: ReturnType<typeof getSuperMarginAccountBalance$>,\n subscriptions: Set<string>,\n) => {\n from(client.spot_ws.connection$).subscribe(() => {\n subscriptions.clear();\n });\n // subscribe the symbols of positions we held\n superMarginAccountBalance$\n .pipe(\n //\n mergeMap((res) =>\n from(res?.list || []).pipe(\n filter((v) => v.currency !== 'usdt'),\n map((v) => v.currency),\n distinct(),\n toArray(),\n map((v) => new Set(v)),\n ),\n ),\n )\n .subscribe((v: Set<string>) => {\n const toUnsubscribe = [...subscriptions].filter((x) => !v.has(x));\n const toSubscribe = [...v].filter((x) => !subscriptions.has(x));\n\n for (const symbol of toUnsubscribe) {\n client.spot_ws.output$.next({\n unsub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.delete(symbol);\n }\n for (const symbol of toSubscribe) {\n client.spot_ws.output$.next({\n sub: `market.${symbol}usdt.ticker`,\n });\n subscriptions.add(symbol);\n }\n });\n};\n\n/**\n * 提供超级保证金账户信息服务\n */\nexport const provideSuperMarginAccountInfoService = (\n terminal: Terminal,\n accountId: string,\n credential: ICredential,\n superMarginAccountUid: number,\n subscriptions: Set<string>,\n) => {\n const superMarginAccountBalance$ = getSuperMarginAccountBalance$(credential, superMarginAccountUid);\n setupSuperMarginWebSocketSubscriptions(superMarginAccountBalance$, subscriptions);\n\n provideAccountInfoService(\n terminal,\n accountId,\n async () => {\n // get account balance\n const accountBalance = await getSpotAccountBalance(credential, superMarginAccountUid);\n const balanceList = accountBalance.data?.list || [];\n\n // calculate usdt balance\n const usdtBalance = balanceList\n .filter((v) => v.currency === 'usdt')\n .reduce((acc, cur) => acc + +cur.balance, 0);\n\n // get positions (non-usdt currencies)\n const positions: IPosition[] = [];\n const nonUsdtCurrencies = balanceList\n .filter((v) => v.currency !== 'usdt')\n .reduce((acc, cur) => {\n const existing = acc.find((item) => item.currency === cur.currency);\n if (existing) {\n existing.balance += +cur.balance;\n } else {\n acc.push({ currency: cur.currency, balance: +cur.balance });\n }\n return acc;\n }, [] as { currency: string; balance: number }[]);\n\n // get prices and create positions\n for (const currencyData of nonUsdtCurrencies) {\n if (currencyData.balance > 0) {\n try {\n // get current price from websocket or fallback to REST API\n let price: number;\n try {\n const tickPrice = await firstValueFrom(\n client.spot_ws.input$.pipe(\n //\n first((v) => v.ch?.includes('ticker') && v.ch?.includes(currencyData.currency) && v.tick),\n map((v): number => v.tick.bid),\n timeout(5000),\n tap({\n error: (e) => {\n subscriptions.clear();\n },\n }),\n ),\n );\n price = tickPrice;\n } catch {\n // fallback to REST API\n const tickerRes = await getSpotTick(credential, { symbol: `${currencyData.currency}usdt` });\n price = tickerRes.tick.close;\n }\n\n positions.push({\n position_id: `${currencyData.currency}/usdt/spot`,\n product_id: `${currencyData.currency}usdt`,\n direction: 'LONG',\n volume: currencyData.balance,\n free_volume: currencyData.balance,\n position_price: price,\n closable_price: price,\n floating_profit: 0,\n valuation: currencyData.balance * price,\n });\n } catch (error) {\n console.warn(formatTime(Date.now()), `Failed to get price for ${currencyData.currency}:`, error);\n }\n }\n }\n\n // calculate equity\n const equity = positions.reduce((acc, cur) => acc + cur.closable_price * cur.volume, 0) + usdtBalance;\n\n return {\n money: {\n currency: 'USDT',\n equity,\n free: equity,\n },\n positions,\n };\n },\n { auto_refresh_interval: 1000 },\n );\n\n return superMarginAccountBalance$;\n};\n\n/**\n * 提供 SPOT 账户信息服务\n */\nexport const provideSpotAccountInfoService = (\n terminal: Terminal,\n accountId: string,\n credential: ICredential,\n spotAccountUid: number,\n) => {\n provideAccountInfoService(\n terminal,\n accountId,\n async () => {\n const spotBalance = await getSpotAccountBalance(credential, spotAccountUid);\n\n const equity = +(spotBalance.data.list.find((v) => v.currency === 'usdt')?.balance ?? 0);\n const free = equity;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions: [],\n };\n },\n { auto_refresh_interval: 1000 },\n );\n};\n"]}
|