@yuants/vendor-gate 0.4.0 → 0.4.2
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/api/http-client.js +89 -0
- package/dist/api/http-client.js.map +1 -0
- package/dist/api/private-api.js +108 -0
- package/dist/api/private-api.js.map +1 -0
- package/dist/api/public-api.js +37 -0
- package/dist/api/public-api.js.map +1 -0
- package/dist/api/rate-limiter.js +60 -0
- package/dist/api/rate-limiter.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/services/account-actions-with-credential.js +37 -0
- package/dist/services/account-actions-with-credential.js.map +1 -0
- package/dist/services/accounts/future.js +56 -0
- package/dist/services/accounts/future.js.map +1 -0
- package/dist/services/accounts/profile.js +25 -0
- package/dist/services/accounts/profile.js.map +1 -0
- package/dist/services/accounts/spot.js +19 -0
- package/dist/services/accounts/spot.js.map +1 -0
- package/dist/services/accounts/unified.js +50 -0
- package/dist/services/accounts/unified.js.map +1 -0
- package/dist/services/default-credential.js +15 -0
- package/dist/services/default-credential.js.map +1 -0
- package/dist/services/legacy.js +53 -0
- package/dist/services/legacy.js.map +1 -0
- package/dist/services/markets/interest-rate.js +30 -0
- package/dist/services/markets/interest-rate.js.map +1 -0
- package/dist/services/markets/product.js +38 -0
- package/dist/services/markets/product.js.map +1 -0
- package/dist/services/order-actions-with-credential.js +18 -0
- package/dist/services/order-actions-with-credential.js.map +1 -0
- package/dist/services/orders/cancelOrder.js +8 -0
- package/dist/services/orders/cancelOrder.js.map +1 -0
- package/dist/services/orders/listOrders.js +31 -0
- package/dist/services/orders/listOrders.js.map +1 -0
- package/dist/services/orders/submitOrder.js +50 -0
- package/dist/services/orders/submitOrder.js.map +1 -0
- package/dist/services/transfer.js +107 -0
- package/dist/services/transfer.js.map +1 -0
- package/dist/vendor-gate.d.ts +1 -0
- package/lib/api/http-client.d.ts +9 -0
- package/lib/api/http-client.d.ts.map +1 -0
- package/lib/api/http-client.js +97 -0
- package/lib/api/http-client.js.map +1 -0
- package/lib/api/private-api.d.ts +343 -0
- package/lib/api/private-api.d.ts.map +1 -0
- package/lib/api/private-api.js +126 -0
- package/lib/api/private-api.js.map +1 -0
- package/lib/api/public-api.d.ts +149 -0
- package/lib/api/public-api.d.ts.map +1 -0
- package/lib/api/public-api.js +45 -0
- package/lib/api/public-api.js.map +1 -0
- package/lib/api/rate-limiter.d.ts +8 -0
- package/lib/api/rate-limiter.d.ts.map +1 -0
- package/lib/api/rate-limiter.js +64 -0
- package/lib/api/rate-limiter.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +1 -0
- package/lib/services/account-actions-with-credential.d.ts +2 -0
- package/lib/services/account-actions-with-credential.d.ts.map +1 -0
- package/lib/services/account-actions-with-credential.js +39 -0
- package/lib/services/account-actions-with-credential.js.map +1 -0
- package/lib/services/accounts/future.d.ts +13 -0
- package/lib/services/accounts/future.d.ts.map +1 -0
- package/lib/services/accounts/future.js +61 -0
- package/lib/services/accounts/future.js.map +1 -0
- package/lib/services/accounts/profile.d.ts +10 -0
- package/lib/services/accounts/profile.d.ts.map +1 -0
- package/lib/services/accounts/profile.js +29 -0
- package/lib/services/accounts/profile.js.map +1 -0
- package/lib/services/accounts/spot.d.ts +11 -0
- package/lib/services/accounts/spot.d.ts.map +1 -0
- package/lib/services/accounts/spot.js +23 -0
- package/lib/services/accounts/spot.js.map +1 -0
- package/lib/services/accounts/unified.d.ts +12 -0
- package/lib/services/accounts/unified.d.ts.map +1 -0
- package/lib/services/accounts/unified.js +54 -0
- package/lib/services/accounts/unified.js.map +1 -0
- package/lib/services/default-credential.d.ts +3 -0
- package/lib/services/default-credential.d.ts.map +1 -0
- package/lib/services/default-credential.js +19 -0
- package/lib/services/default-credential.js.map +1 -0
- package/lib/services/legacy.d.ts +2 -0
- package/lib/services/legacy.d.ts.map +1 -0
- package/lib/services/legacy.js +55 -0
- package/lib/services/legacy.js.map +1 -0
- package/lib/services/markets/interest-rate.d.ts +2 -0
- package/lib/services/markets/interest-rate.d.ts.map +1 -0
- package/lib/services/markets/interest-rate.js +32 -0
- package/lib/services/markets/interest-rate.js.map +1 -0
- package/lib/services/markets/product.d.ts +3 -0
- package/lib/services/markets/product.d.ts.map +1 -0
- package/lib/services/markets/product.js +41 -0
- package/lib/services/markets/product.js.map +1 -0
- package/lib/services/order-actions-with-credential.d.ts +2 -0
- package/lib/services/order-actions-with-credential.d.ts.map +1 -0
- package/lib/services/order-actions-with-credential.js +20 -0
- package/lib/services/order-actions-with-credential.js.map +1 -0
- package/lib/services/orders/cancelOrder.d.ts +4 -0
- package/lib/services/orders/cancelOrder.d.ts.map +1 -0
- package/lib/services/orders/cancelOrder.js +12 -0
- package/lib/services/orders/cancelOrder.js.map +1 -0
- package/lib/services/orders/listOrders.d.ts +4 -0
- package/lib/services/orders/listOrders.d.ts.map +1 -0
- package/lib/services/orders/listOrders.js +35 -0
- package/lib/services/orders/listOrders.js.map +1 -0
- package/lib/services/orders/submitOrder.d.ts +4 -0
- package/lib/services/orders/submitOrder.d.ts.map +1 -0
- package/lib/services/orders/submitOrder.js +54 -0
- package/lib/services/orders/submitOrder.js.map +1 -0
- package/lib/services/transfer.d.ts +2 -0
- package/lib/services/transfer.d.ts.map +1 -0
- package/lib/services/transfer.js +109 -0
- package/lib/services/transfer.js.map +1 -0
- package/lib/tsdoc-metadata.json +11 -0
- package/package.json +5 -9
- package/temp/package-deps.json +46 -0
- package/temp/vendor-gate.api.json +177 -0
- package/temp/vendor-gate.api.md +9 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { formatTime } from '@yuants/utils';
|
|
2
|
+
let warned = false;
|
|
3
|
+
export const getDefaultCredential = () => {
|
|
4
|
+
const access_key = process.env.ACCESS_KEY;
|
|
5
|
+
const secret_key = process.env.SECRET_KEY;
|
|
6
|
+
if (!access_key || !secret_key) {
|
|
7
|
+
if (!warned) {
|
|
8
|
+
console.warn(formatTime(Date.now()), 'Missing ACCESS_KEY or SECRET_KEY, skip registering Gate default services');
|
|
9
|
+
warned = true;
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return { access_key, secret_key };
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=default-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-credential.js","sourceRoot":"","sources":["../../src/services/default-credential.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAuB,EAAE;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC1C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE;QAC9B,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,CAAC,IAAI,CACV,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB,0EAA0E,CAC3E,CAAC;YACF,MAAM,GAAG,IAAI,CAAC;SACf;QACD,OAAO,IAAI,CAAC;KACb;IACD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AACpC,CAAC,CAAC","sourcesContent":["import { formatTime } from '@yuants/utils';\nimport { ICredential } from '../api/private-api';\n\nlet warned = false;\n\nexport const getDefaultCredential = (): ICredential | null => {\n const access_key = process.env.ACCESS_KEY;\n const secret_key = process.env.SECRET_KEY;\n if (!access_key || !secret_key) {\n if (!warned) {\n console.warn(\n formatTime(Date.now()),\n 'Missing ACCESS_KEY or SECRET_KEY, skip registering Gate default services',\n );\n warned = true;\n }\n return null;\n }\n return { access_key, secret_key };\n};\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';
|
|
2
|
+
import { providePendingOrdersService } from '@yuants/data-order';
|
|
3
|
+
import { Terminal } from '@yuants/protocol';
|
|
4
|
+
import { formatTime } from '@yuants/utils';
|
|
5
|
+
import { resolveAccountProfile } from './accounts/profile';
|
|
6
|
+
import { getFutureAccountInfo } from './accounts/future';
|
|
7
|
+
import { getUnifiedAccountInfo } from './accounts/unified';
|
|
8
|
+
import { getSpotAccountInfo } from './accounts/spot';
|
|
9
|
+
import { listOrders } from './orders/listOrders';
|
|
10
|
+
import { submitOrder } from './orders/submitOrder';
|
|
11
|
+
import { cancelOrder } from './orders/cancelOrder';
|
|
12
|
+
import { getDefaultCredential } from './default-credential';
|
|
13
|
+
const credential = getDefaultCredential();
|
|
14
|
+
if (credential) {
|
|
15
|
+
(async () => {
|
|
16
|
+
const terminal = Terminal.fromNodeEnv();
|
|
17
|
+
const accountIds = await resolveAccountProfile(credential);
|
|
18
|
+
provideAccountInfoService(terminal, accountIds.future, () => getFutureAccountInfo(credential, accountIds.future), { auto_refresh_interval: 1000 });
|
|
19
|
+
addAccountMarket(terminal, { account_id: accountIds.future, market_id: 'GATE/USDT-FUTURE' });
|
|
20
|
+
provideAccountInfoService(terminal, accountIds.unified, () => getUnifiedAccountInfo(credential, accountIds.unified), { auto_refresh_interval: 1000 });
|
|
21
|
+
addAccountMarket(terminal, { account_id: accountIds.unified, market_id: 'GATE/UNIFIED' });
|
|
22
|
+
provideAccountInfoService(terminal, accountIds.spot, () => getSpotAccountInfo(credential, accountIds.spot), { auto_refresh_interval: 1000 });
|
|
23
|
+
addAccountMarket(terminal, { account_id: accountIds.spot, market_id: 'GATE/SPOT' });
|
|
24
|
+
providePendingOrdersService(terminal, accountIds.future, () => listOrders(credential, accountIds.future), { auto_refresh_interval: 2000 });
|
|
25
|
+
terminal.server.provideService('SubmitOrder', {
|
|
26
|
+
required: ['account_id'],
|
|
27
|
+
properties: { account_id: { const: accountIds.future } },
|
|
28
|
+
}, async (msg) => {
|
|
29
|
+
try {
|
|
30
|
+
const data = await submitOrder(credential, msg.req);
|
|
31
|
+
return { res: { code: 0, message: 'OK', data } };
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return { res: { code: 500, message: `${error}` } };
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
terminal.server.provideService('CancelOrder', {
|
|
38
|
+
required: ['account_id'],
|
|
39
|
+
properties: { account_id: { const: accountIds.future } },
|
|
40
|
+
}, async (msg) => {
|
|
41
|
+
try {
|
|
42
|
+
await cancelOrder(credential, msg.req);
|
|
43
|
+
return { res: { code: 0, message: 'OK' } };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return { res: { code: 500, message: `${error}` } };
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
})().catch((error) => {
|
|
50
|
+
console.error(formatTime(Date.now()), 'GateLegacyInitFailed', error);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=legacy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/services/legacy.ts"],"names":[],"mappings":"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","sourcesContent":["import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';\nimport { IOrder, providePendingOrdersService } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { formatTime } from '@yuants/utils';\nimport { resolveAccountProfile } from './accounts/profile';\nimport { getFutureAccountInfo } from './accounts/future';\nimport { getUnifiedAccountInfo } from './accounts/unified';\nimport { getSpotAccountInfo } from './accounts/spot';\nimport { listOrders } from './orders/listOrders';\nimport { submitOrder } from './orders/submitOrder';\nimport { cancelOrder } from './orders/cancelOrder';\nimport { getDefaultCredential } from './default-credential';\n\nconst credential = getDefaultCredential();\n\nif (credential) {\n (async () => {\n const terminal = Terminal.fromNodeEnv();\n const accountIds = await resolveAccountProfile(credential);\n\n provideAccountInfoService(\n terminal,\n accountIds.future,\n () => getFutureAccountInfo(credential, accountIds.future),\n { auto_refresh_interval: 1000 },\n );\n addAccountMarket(terminal, { account_id: accountIds.future, market_id: 'GATE/USDT-FUTURE' });\n\n provideAccountInfoService(\n terminal,\n accountIds.unified,\n () => getUnifiedAccountInfo(credential, accountIds.unified),\n { auto_refresh_interval: 1000 },\n );\n addAccountMarket(terminal, { account_id: accountIds.unified, market_id: 'GATE/UNIFIED' });\n\n provideAccountInfoService(\n terminal,\n accountIds.spot,\n () => getSpotAccountInfo(credential, accountIds.spot),\n { auto_refresh_interval: 1000 },\n );\n addAccountMarket(terminal, { account_id: accountIds.spot, market_id: 'GATE/SPOT' });\n\n providePendingOrdersService(\n terminal,\n accountIds.future,\n () => listOrders(credential, accountIds.future),\n { auto_refresh_interval: 2000 },\n );\n\n terminal.server.provideService<IOrder, { order_id: string }>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: { account_id: { const: accountIds.future } },\n },\n async (msg) => {\n try {\n const data = await submitOrder(credential, msg.req);\n return { res: { code: 0, message: 'OK', data } };\n } catch (error) {\n return { res: { code: 500, message: `${error}` } };\n }\n },\n );\n\n terminal.server.provideService<IOrder>(\n 'CancelOrder',\n {\n required: ['account_id'],\n properties: { account_id: { const: accountIds.future } },\n },\n async (msg) => {\n try {\n await cancelOrder(credential, msg.req);\n return { res: { code: 0, message: 'OK' } };\n } catch (error) {\n return { res: { code: 500, message: `${error}` } };\n }\n },\n );\n })().catch((error) => {\n console.error(formatTime(Date.now()), 'GateLegacyInitFailed', error);\n });\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createSeriesProvider } from '@yuants/data-series';
|
|
2
|
+
import { Terminal } from '@yuants/protocol';
|
|
3
|
+
import { decodePath, formatTime } from '@yuants/utils';
|
|
4
|
+
import { getFutureFundingRate } from '../../api/public-api';
|
|
5
|
+
const terminal = Terminal.fromNodeEnv();
|
|
6
|
+
createSeriesProvider(terminal, {
|
|
7
|
+
tableName: 'interest_rate',
|
|
8
|
+
series_id_prefix_parts: ['GATE-FUTURE'],
|
|
9
|
+
reversed: false,
|
|
10
|
+
queryFn: async ({ series_id }) => {
|
|
11
|
+
const [, product_id] = decodePath(series_id);
|
|
12
|
+
if (!product_id) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
const funding_rate_history = await getFutureFundingRate('usdt', {
|
|
16
|
+
contract: product_id,
|
|
17
|
+
limit: 1000,
|
|
18
|
+
});
|
|
19
|
+
return funding_rate_history.map((entry) => ({
|
|
20
|
+
series_id,
|
|
21
|
+
product_id,
|
|
22
|
+
datasource_id: 'GATE-FUTURE',
|
|
23
|
+
created_at: formatTime(entry.t * 1000),
|
|
24
|
+
long_rate: `${-Number(entry.r)}`,
|
|
25
|
+
short_rate: `${Number(entry.r)}`,
|
|
26
|
+
settlement_price: '',
|
|
27
|
+
}));
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=interest-rate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interest-rate.js","sourceRoot":"","sources":["../../../src/services/markets/interest-rate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,oBAAoB,CAAgB,QAAQ,EAAE;IAC5C,SAAS,EAAE,eAAe;IAC1B,sBAAsB,EAAE,CAAC,aAAa,CAAC;IACvC,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC/B,MAAM,CAAC,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,EAAE,CAAC;SACX;QACD,MAAM,oBAAoB,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE;YAC9D,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,OAAO,oBAAoB,CAAC,GAAG,CAC7B,CAAC,KAAK,EAAiB,EAAE,CAAC,CAAC;YACzB,SAAS;YACT,UAAU;YACV,aAAa,EAAE,aAAa;YAC5B,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;YACtC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAChC,UAAU,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAChC,gBAAgB,EAAE,EAAE;SACrB,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { IInterestRate } from '@yuants/data-interest-rate';\nimport { createSeriesProvider } from '@yuants/data-series';\nimport { Terminal } from '@yuants/protocol';\nimport { decodePath, formatTime } from '@yuants/utils';\nimport { getFutureFundingRate } from '../../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\ncreateSeriesProvider<IInterestRate>(terminal, {\n tableName: 'interest_rate',\n series_id_prefix_parts: ['GATE-FUTURE'],\n reversed: false,\n queryFn: async ({ series_id }) => {\n const [, product_id] = decodePath(series_id);\n if (!product_id) {\n return [];\n }\n const funding_rate_history = await getFutureFundingRate('usdt', {\n contract: product_id,\n limit: 1000,\n });\n\n return funding_rate_history.map(\n (entry): IInterestRate => ({\n series_id,\n product_id,\n datasource_id: 'GATE-FUTURE',\n created_at: formatTime(entry.t * 1000),\n long_rate: `${-Number(entry.r)}`,\n short_rate: `${Number(entry.r)}`,\n settlement_price: '',\n }),\n );\n },\n});\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Terminal } from '@yuants/protocol';
|
|
2
|
+
import { createSQLWriter } from '@yuants/sql';
|
|
3
|
+
import { defer, from, map, mergeMap, repeat, retry, shareReplay, Subject, tap, toArray } from 'rxjs';
|
|
4
|
+
import { getFuturesContracts } from '../../api/public-api';
|
|
5
|
+
const terminal = Terminal.fromNodeEnv();
|
|
6
|
+
const product$ = new Subject();
|
|
7
|
+
const usdtFutureProducts$ = defer(() => getFuturesContracts('usdt', {})).pipe(mergeMap((contracts) => from(contracts).pipe(map((contract) => {
|
|
8
|
+
const [base, quote] = contract.name.split('_');
|
|
9
|
+
return {
|
|
10
|
+
datasource_id: 'GATE-FUTURE',
|
|
11
|
+
product_id: contract.name,
|
|
12
|
+
base_currency: base,
|
|
13
|
+
quote_currency: quote,
|
|
14
|
+
value_scale: Number(contract.quanto_multiplier),
|
|
15
|
+
price_step: Number(contract.order_price_round),
|
|
16
|
+
volume_step: 1,
|
|
17
|
+
name: '',
|
|
18
|
+
value_scale_unit: '',
|
|
19
|
+
margin_rate: 0,
|
|
20
|
+
value_based_cost: 0,
|
|
21
|
+
volume_based_cost: 0,
|
|
22
|
+
max_position: 0,
|
|
23
|
+
max_volume: 0,
|
|
24
|
+
allow_long: true,
|
|
25
|
+
allow_short: true,
|
|
26
|
+
market_id: 'GATE/USDT-FUTURE',
|
|
27
|
+
no_interest_rate: false,
|
|
28
|
+
};
|
|
29
|
+
}), tap((item) => product$.next(item)), toArray())), repeat({ delay: 3600000 }), retry({ delay: 60000 }), shareReplay(1));
|
|
30
|
+
usdtFutureProducts$.subscribe();
|
|
31
|
+
export const mapProductIdToUsdtFutureProduct$ = usdtFutureProducts$.pipe(map((items) => new Map(items.map((item) => [item.product_id, item]))), shareReplay(1));
|
|
32
|
+
createSQLWriter(terminal, {
|
|
33
|
+
data$: product$,
|
|
34
|
+
tableName: 'product',
|
|
35
|
+
conflictKeys: ['datasource_id', 'product_id'],
|
|
36
|
+
writeInterval: 1000,
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=product.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../../../src/services/markets/product.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAY,CAAC;AAEzC,MAAM,mBAAmB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAC3E,QAAQ,CAAC,CAAC,SAAS,EAAE,EAAE,CACrB,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,QAAQ,EAAY,EAAE;IACzB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO;QACL,aAAa,EAAE,aAAa;QAC5B,UAAU,EAAE,QAAQ,CAAC,IAAI;QACzB,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC/C,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC9C,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE;QACR,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,CAAC;QACd,gBAAgB,EAAE,CAAC;QACnB,iBAAiB,EAAE,CAAC;QACpB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,kBAAkB;QAC7B,gBAAgB,EAAE,KAAK;KACxB,CAAC;AACJ,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAClC,OAAO,EAAE,CACV,CACF,EACD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAS,EAAE,CAAC,EAC5B,KAAK,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,CAAC,EACxB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,mBAAmB,CAAC,SAAS,EAAE,CAAC;AAEhC,MAAM,CAAC,MAAM,gCAAgC,GAAG,mBAAmB,CAAC,IAAI,CACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EACrE,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AAEF,eAAe,CAAC,QAAQ,EAAE;IACxB,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,SAAS;IACpB,YAAY,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC;IAC7C,aAAa,EAAE,IAAI;CACpB,CAAC,CAAC","sourcesContent":["import { IProduct } from '@yuants/data-product';\nimport { Terminal } from '@yuants/protocol';\nimport { createSQLWriter } from '@yuants/sql';\nimport { defer, from, map, mergeMap, repeat, retry, shareReplay, Subject, tap, toArray } from 'rxjs';\nimport { getFuturesContracts } from '../../api/public-api';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst product$ = new Subject<IProduct>();\n\nconst usdtFutureProducts$ = defer(() => getFuturesContracts('usdt', {})).pipe(\n mergeMap((contracts) =>\n from(contracts).pipe(\n map((contract): IProduct => {\n const [base, quote] = contract.name.split('_');\n return {\n datasource_id: 'GATE-FUTURE',\n product_id: contract.name,\n base_currency: base,\n quote_currency: quote,\n value_scale: Number(contract.quanto_multiplier),\n price_step: Number(contract.order_price_round),\n volume_step: 1,\n name: '',\n value_scale_unit: '',\n margin_rate: 0,\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 market_id: 'GATE/USDT-FUTURE',\n no_interest_rate: false,\n };\n }),\n tap((item) => product$.next(item)),\n toArray(),\n ),\n ),\n repeat({ delay: 3_600_000 }),\n retry({ delay: 60_000 }),\n shareReplay(1),\n);\n\nusdtFutureProducts$.subscribe();\n\nexport const mapProductIdToUsdtFutureProduct$ = usdtFutureProducts$.pipe(\n map((items) => new Map(items.map((item) => [item.product_id, item]))),\n shareReplay(1),\n);\n\ncreateSQLWriter(terminal, {\n data$: product$,\n tableName: 'product',\n conflictKeys: ['datasource_id', 'product_id'],\n writeInterval: 1000,\n});\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { provideOrderActionsWithCredential } from '@yuants/data-order';
|
|
2
|
+
import { Terminal } from '@yuants/protocol';
|
|
3
|
+
import { cancelOrder } from './orders/cancelOrder';
|
|
4
|
+
import { submitOrder } from './orders/submitOrder';
|
|
5
|
+
import { listOrders } from './orders/listOrders';
|
|
6
|
+
provideOrderActionsWithCredential(Terminal.fromNodeEnv(), 'GATE', {
|
|
7
|
+
type: 'object',
|
|
8
|
+
required: ['access_key', 'secret_key'],
|
|
9
|
+
properties: {
|
|
10
|
+
access_key: { type: 'string' },
|
|
11
|
+
secret_key: { type: 'string' },
|
|
12
|
+
},
|
|
13
|
+
}, {
|
|
14
|
+
submitOrder,
|
|
15
|
+
cancelOrder,
|
|
16
|
+
listOrders,
|
|
17
|
+
});
|
|
18
|
+
//# 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;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,iCAAiC,CAC/B,QAAQ,CAAC,WAAW,EAAE,EACtB,MAAM,EACN;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;IACtC,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD;IACE,WAAW;IACX,WAAW;IACX,UAAU;CACX,CACF,CAAC","sourcesContent":["import { provideOrderActionsWithCredential } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { cancelOrder } from './orders/cancelOrder';\nimport { submitOrder } from './orders/submitOrder';\nimport { listOrders } from './orders/listOrders';\nimport { ICredential } from '../api/private-api';\n\nprovideOrderActionsWithCredential<ICredential>(\n Terminal.fromNodeEnv(),\n 'GATE',\n {\n type: 'object',\n required: ['access_key', 'secret_key'],\n properties: {\n access_key: { type: 'string' },\n secret_key: { type: 'string' },\n },\n },\n {\n submitOrder,\n cancelOrder,\n listOrders,\n },\n);\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { deleteFutureOrders } from '../../api/private-api';
|
|
2
|
+
export const cancelOrder = async (credential, order) => {
|
|
3
|
+
if (!order.order_id) {
|
|
4
|
+
throw new Error('Missing order_id');
|
|
5
|
+
}
|
|
6
|
+
await deleteFutureOrders(credential, 'usdt', order.order_id);
|
|
7
|
+
};
|
|
8
|
+
//# 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,kBAAkB,EAAe,MAAM,uBAAuB,CAAC;AAExE,MAAM,CAAC,MAAM,WAAW,GAA6C,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;IAC/F,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;KACrC;IACD,MAAM,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC,CAAC","sourcesContent":["import { IActionHandlerOfCancelOrder } from '@yuants/data-order';\nimport { deleteFutureOrders, ICredential } from '../../api/private-api';\n\nexport const cancelOrder: IActionHandlerOfCancelOrder<ICredential> = async (credential, order) => {\n if (!order.order_id) {\n throw new Error('Missing order_id');\n }\n await deleteFutureOrders(credential, 'usdt', order.order_id);\n};\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getFuturesOrders } from '../../api/private-api';
|
|
2
|
+
const resolveOrderDirection = (order) => {
|
|
3
|
+
const isLong = order.size > 0;
|
|
4
|
+
if (order.is_close) {
|
|
5
|
+
return isLong ? 'CLOSE_SHORT' : 'CLOSE_LONG';
|
|
6
|
+
}
|
|
7
|
+
return isLong ? 'OPEN_LONG' : 'OPEN_SHORT';
|
|
8
|
+
};
|
|
9
|
+
export const listOrders = async (credential, account_id) => {
|
|
10
|
+
const orders = await getFuturesOrders(credential, 'usdt', { status: 'open' });
|
|
11
|
+
return orders.map((order) => {
|
|
12
|
+
const volume = Math.abs(order.size);
|
|
13
|
+
const leftVolume = typeof order.left === 'number' ? Math.abs(order.left) : undefined;
|
|
14
|
+
const traded_volume = leftVolume !== undefined ? Math.max(volume - leftVolume, 0) : undefined;
|
|
15
|
+
const price = Number(order.price);
|
|
16
|
+
const traded_price = Number(order.fill_price);
|
|
17
|
+
return {
|
|
18
|
+
order_id: `${order.id}`,
|
|
19
|
+
account_id,
|
|
20
|
+
product_id: order.contract,
|
|
21
|
+
order_direction: resolveOrderDirection(order),
|
|
22
|
+
volume,
|
|
23
|
+
price: Number.isFinite(price) ? price : undefined,
|
|
24
|
+
submit_at: order.create_time * 1000,
|
|
25
|
+
traded_volume,
|
|
26
|
+
traded_price: Number.isFinite(traded_price) ? traded_price : undefined,
|
|
27
|
+
order_status: order.status,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=listOrders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listOrders.js","sourceRoot":"","sources":["../../../src/services/orders/listOrders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAItE,MAAM,qBAAqB,GAAG,CAAC,KAA0C,EAAkB,EAAE;IAC3F,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,QAAQ,EAAE;QAClB,OAAO,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;KAC9C;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAA4C,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE;IAClG,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAU,EAAE;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,MAAM,aAAa,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,OAAO;YACL,QAAQ,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE;YACvB,UAAU;YACV,UAAU,EAAE,KAAK,CAAC,QAAQ;YAC1B,eAAe,EAAE,qBAAqB,CAAC,KAAK,CAAC;YAC7C,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YACjD,SAAS,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI;YACnC,aAAa;YACb,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;YACtE,YAAY,EAAE,KAAK,CAAC,MAAM;SAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { IActionHandlerOfListOrders, IOrder } from '@yuants/data-order';\nimport { getFuturesOrders, ICredential } from '../../api/private-api';\n\ntype OrderDirection = 'OPEN_LONG' | 'OPEN_SHORT' | 'CLOSE_LONG' | 'CLOSE_SHORT';\n\nconst resolveOrderDirection = (order: { size: number; is_close: boolean }): OrderDirection => {\n const isLong = order.size > 0;\n if (order.is_close) {\n return isLong ? 'CLOSE_SHORT' : 'CLOSE_LONG';\n }\n return isLong ? 'OPEN_LONG' : 'OPEN_SHORT';\n};\n\nexport const listOrders: IActionHandlerOfListOrders<ICredential> = async (credential, account_id) => {\n const orders = await getFuturesOrders(credential, 'usdt', { status: 'open' });\n return orders.map((order): IOrder => {\n const volume = Math.abs(order.size);\n const leftVolume = typeof order.left === 'number' ? Math.abs(order.left) : undefined;\n const traded_volume = leftVolume !== undefined ? Math.max(volume - leftVolume, 0) : undefined;\n const price = Number(order.price);\n const traded_price = Number(order.fill_price);\n return {\n order_id: `${order.id}`,\n account_id,\n product_id: order.contract,\n order_direction: resolveOrderDirection(order),\n volume,\n price: Number.isFinite(price) ? price : undefined,\n submit_at: order.create_time * 1000,\n traded_volume,\n traded_price: Number.isFinite(traded_price) ? traded_price : undefined,\n order_status: order.status,\n };\n });\n};\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { postFutureOrders } from '../../api/private-api';
|
|
2
|
+
const resolveSizeSign = (order_direction) => {
|
|
3
|
+
switch (order_direction) {
|
|
4
|
+
case 'OPEN_LONG':
|
|
5
|
+
case 'CLOSE_SHORT':
|
|
6
|
+
return 1;
|
|
7
|
+
case 'OPEN_SHORT':
|
|
8
|
+
case 'CLOSE_LONG':
|
|
9
|
+
return -1;
|
|
10
|
+
default:
|
|
11
|
+
throw new Error(`Unsupported order_direction: ${order_direction}`);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const resolveTif = (order_type) => {
|
|
15
|
+
if (order_type === 'MARKET')
|
|
16
|
+
return 'ioc';
|
|
17
|
+
if (order_type === 'LIMIT' || order_type === 'MAKER')
|
|
18
|
+
return 'gtc';
|
|
19
|
+
throw new Error(`Unsupported order_type: ${order_type}`);
|
|
20
|
+
};
|
|
21
|
+
export const submitOrder = async (credential, order) => {
|
|
22
|
+
if (!order.product_id) {
|
|
23
|
+
throw new Error('Missing product_id');
|
|
24
|
+
}
|
|
25
|
+
if (!order.volume || order.volume <= 0) {
|
|
26
|
+
throw new Error('Invalid order volume');
|
|
27
|
+
}
|
|
28
|
+
const size = order.volume * resolveSizeSign(order.order_direction);
|
|
29
|
+
const tif = resolveTif(order.order_type);
|
|
30
|
+
const reduce_only = order.order_direction === 'CLOSE_LONG' || order.order_direction === 'CLOSE_SHORT';
|
|
31
|
+
const price = order.order_type === 'MARKET' ? '0' : order.price !== undefined ? `${order.price}` : undefined;
|
|
32
|
+
if (price === undefined) {
|
|
33
|
+
throw new Error('Limit/Maker order requires price');
|
|
34
|
+
}
|
|
35
|
+
const res = await postFutureOrders(credential, 'usdt', {
|
|
36
|
+
contract: order.product_id,
|
|
37
|
+
size,
|
|
38
|
+
price,
|
|
39
|
+
tif,
|
|
40
|
+
reduce_only,
|
|
41
|
+
});
|
|
42
|
+
if (res.label) {
|
|
43
|
+
const detail = [res.label, res.message, res.detail].filter((v) => !!v).join(': ');
|
|
44
|
+
throw new Error(detail);
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
order_id: `${res.id}`,
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=submitOrder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submitOrder.js","sourceRoot":"","sources":["../../../src/services/orders/submitOrder.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEtE,MAAM,eAAe,GAAG,CAAC,eAAwB,EAAU,EAAE;IAC3D,QAAQ,eAAe,EAAE;QACvB,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,CAAC,CAAC;QACX,KAAK,YAAY,CAAC;QAClB,KAAK,YAAY;YACf,OAAO,CAAC,CAAC,CAAC;QACZ;YACE,MAAM,IAAI,KAAK,CAAC,gCAAgC,eAAe,EAAE,CAAC,CAAC;KACtE;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,UAAmB,EAAU,EAAE;IACjD,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACnE,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAA6C,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;IAC/F,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;KACvC;IACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;QACtC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;KACzC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,CAAC,eAAe,KAAK,YAAY,IAAI,KAAK,CAAC,eAAe,KAAK,aAAa,CAAC;IACtG,MAAM,KAAK,GACT,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;KACrD;IAED,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE;QACrD,QAAQ,EAAE,KAAK,CAAC,UAAU;QAC1B,IAAI;QACJ,KAAK;QACL,GAAG;QACH,WAAW;KACZ,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,KAAK,EAAE;QACb,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;KACzB;IAED,OAAO;QACL,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE;KACtB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { IActionHandlerOfSubmitOrder } from '@yuants/data-order';\nimport { ICredential, postFutureOrders } from '../../api/private-api';\n\nconst resolveSizeSign = (order_direction?: string): number => {\n switch (order_direction) {\n case 'OPEN_LONG':\n case 'CLOSE_SHORT':\n return 1;\n case 'OPEN_SHORT':\n case 'CLOSE_LONG':\n return -1;\n default:\n throw new Error(`Unsupported order_direction: ${order_direction}`);\n }\n};\n\nconst resolveTif = (order_type?: string): string => {\n if (order_type === 'MARKET') return 'ioc';\n if (order_type === 'LIMIT' || order_type === 'MAKER') return 'gtc';\n throw new Error(`Unsupported order_type: ${order_type}`);\n};\n\nexport const submitOrder: IActionHandlerOfSubmitOrder<ICredential> = async (credential, order) => {\n if (!order.product_id) {\n throw new Error('Missing product_id');\n }\n if (!order.volume || order.volume <= 0) {\n throw new Error('Invalid order volume');\n }\n\n const size = order.volume * resolveSizeSign(order.order_direction);\n const tif = resolveTif(order.order_type);\n const reduce_only = order.order_direction === 'CLOSE_LONG' || order.order_direction === 'CLOSE_SHORT';\n const price =\n order.order_type === 'MARKET' ? '0' : order.price !== undefined ? `${order.price}` : undefined;\n if (price === undefined) {\n throw new Error('Limit/Maker order requires price');\n }\n\n const res = await postFutureOrders(credential, 'usdt', {\n contract: order.product_id,\n size,\n price,\n tif,\n reduce_only,\n });\n\n if (res.label) {\n const detail = [res.label, res.message, res.detail].filter((v) => !!v).join(': ');\n throw new Error(detail);\n }\n\n return {\n order_id: `${res.id}`,\n };\n};\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Terminal } from '@yuants/protocol';
|
|
2
|
+
import { addAccountTransferAddress } from '@yuants/transfer';
|
|
3
|
+
import { formatTime } from '@yuants/utils';
|
|
4
|
+
import { getDepositAddress, getDepositHistory, getSubAccountList, getWithdrawalHistory, postWalletTransfer, postWithdrawals, } from '../api/private-api';
|
|
5
|
+
import { resolveAccountProfile } from './accounts/profile';
|
|
6
|
+
import { getDefaultCredential } from './default-credential';
|
|
7
|
+
const credential = getDefaultCredential();
|
|
8
|
+
const registerInternalTransfer = (terminal, credential, accountId, direction, network_id) => {
|
|
9
|
+
const params = direction === 'spot_to_future'
|
|
10
|
+
? {
|
|
11
|
+
account_id: accountId,
|
|
12
|
+
from: 'spot',
|
|
13
|
+
to: 'futures',
|
|
14
|
+
address: 'SPOT',
|
|
15
|
+
}
|
|
16
|
+
: {
|
|
17
|
+
account_id: accountId,
|
|
18
|
+
from: 'futures',
|
|
19
|
+
to: 'spot',
|
|
20
|
+
address: 'USDT_FUTURE',
|
|
21
|
+
};
|
|
22
|
+
addAccountTransferAddress({
|
|
23
|
+
terminal,
|
|
24
|
+
account_id: params.account_id,
|
|
25
|
+
network_id,
|
|
26
|
+
currency: 'USDT',
|
|
27
|
+
address: params.address,
|
|
28
|
+
onApply: {
|
|
29
|
+
INIT: async (order) => {
|
|
30
|
+
const transferResult = await postWalletTransfer(credential, {
|
|
31
|
+
currency: 'USDT',
|
|
32
|
+
from: params.from,
|
|
33
|
+
to: params.to,
|
|
34
|
+
amount: `${order.current_amount}`,
|
|
35
|
+
settle: 'usdt',
|
|
36
|
+
});
|
|
37
|
+
if (transferResult.tx_id !== undefined) {
|
|
38
|
+
return { state: 'COMPLETE', transaction_id: transferResult.tx_id };
|
|
39
|
+
}
|
|
40
|
+
return { state: 'INIT', message: JSON.stringify(transferResult) };
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
onEval: async (transferOrder) => ({
|
|
44
|
+
state: 'COMPLETE',
|
|
45
|
+
received_amount: transferOrder.current_amount,
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
if (credential) {
|
|
50
|
+
(async () => {
|
|
51
|
+
const terminal = Terminal.fromNodeEnv();
|
|
52
|
+
const accountIds = await resolveAccountProfile(credential);
|
|
53
|
+
const ACCOUNT_INTERNAL_NETWORK_ID = `Gate/${accountIds.uid}/ACCOUNT_INTERNAL`;
|
|
54
|
+
registerInternalTransfer(terminal, credential, accountIds.future, 'future_to_spot', ACCOUNT_INTERNAL_NETWORK_ID);
|
|
55
|
+
const subAccountsResult = await getSubAccountList(credential, { type: '0' });
|
|
56
|
+
const isMainAccount = Array.isArray(subAccountsResult);
|
|
57
|
+
if (isMainAccount) {
|
|
58
|
+
const depositAddressRes = await getDepositAddress(credential, { currency: 'USDT' });
|
|
59
|
+
console.info(formatTime(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes));
|
|
60
|
+
const addresses = depositAddressRes.multichain_addresses.filter((item) => item.chain === 'TRX');
|
|
61
|
+
for (const address of addresses) {
|
|
62
|
+
addAccountTransferAddress({
|
|
63
|
+
terminal,
|
|
64
|
+
account_id: accountIds.spot,
|
|
65
|
+
network_id: 'TRC20',
|
|
66
|
+
currency: 'USDT',
|
|
67
|
+
address: address.address,
|
|
68
|
+
onApply: {
|
|
69
|
+
INIT: async (transferOrder) => {
|
|
70
|
+
const transferResult = await postWithdrawals(credential, {
|
|
71
|
+
amount: `${transferOrder.current_amount}`,
|
|
72
|
+
currency: 'USDT',
|
|
73
|
+
address: transferOrder.current_rx_address,
|
|
74
|
+
chain: 'TRX',
|
|
75
|
+
});
|
|
76
|
+
const { txid, withdraw_order_id } = transferResult;
|
|
77
|
+
if (txid && txid.length > 0) {
|
|
78
|
+
return { state: 'COMPLETE', transaction_id: txid };
|
|
79
|
+
}
|
|
80
|
+
return { state: 'PENDING', context: withdraw_order_id };
|
|
81
|
+
},
|
|
82
|
+
PENDING: async (transferOrder) => {
|
|
83
|
+
const wdId = transferOrder.current_tx_context;
|
|
84
|
+
const withdrawalRecordsResult = await getWithdrawalHistory(credential, {});
|
|
85
|
+
const withdrawalRecord = withdrawalRecordsResult.find((item) => item.withdraw_order_id === wdId);
|
|
86
|
+
if (withdrawalRecord && withdrawalRecord.txid && withdrawalRecord.txid.length > 0) {
|
|
87
|
+
return { state: 'COMPLETE', transaction_id: withdrawalRecord.txid };
|
|
88
|
+
}
|
|
89
|
+
return { state: 'PENDING', context: wdId };
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
onEval: async (transferOrder) => {
|
|
93
|
+
const checkResult = await getDepositHistory(credential, { currency: 'USDT' });
|
|
94
|
+
const depositRecord = checkResult.find((item) => item.txid === transferOrder.current_transaction_id);
|
|
95
|
+
if (depositRecord && depositRecord.status === 'DONE') {
|
|
96
|
+
return { state: 'COMPLETE', received_amount: Number(depositRecord.amount) };
|
|
97
|
+
}
|
|
98
|
+
return { state: 'PENDING' };
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
})().catch((error) => {
|
|
104
|
+
console.error(formatTime(Date.now()), 'GateTransferInitFailed', error);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/services/transfer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Terminal } from '@yuants/protocol';\nimport { addAccountTransferAddress } from '@yuants/transfer';\nimport { formatTime } from '@yuants/utils';\nimport {\n getDepositAddress,\n getDepositHistory,\n getSubAccountList,\n getWithdrawalHistory,\n ICredential,\n postWalletTransfer,\n postWithdrawals,\n} from '../api/private-api';\nimport { resolveAccountProfile } from './accounts/profile';\nimport { getDefaultCredential } from './default-credential';\n\nconst credential = getDefaultCredential();\n\nconst registerInternalTransfer = (\n terminal: Terminal,\n credential: ICredential,\n accountId: string,\n direction: 'spot_to_future' | 'future_to_spot',\n network_id: string,\n) => {\n const params =\n direction === 'spot_to_future'\n ? {\n account_id: accountId,\n from: 'spot',\n to: 'futures',\n address: 'SPOT',\n }\n : {\n account_id: accountId,\n from: 'futures',\n to: 'spot',\n address: 'USDT_FUTURE',\n };\n\n addAccountTransferAddress({\n terminal,\n account_id: params.account_id,\n network_id,\n currency: 'USDT',\n address: params.address,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postWalletTransfer(credential, {\n currency: 'USDT',\n from: params.from,\n to: params.to,\n amount: `${order.current_amount}`,\n settle: 'usdt',\n });\n if (transferResult.tx_id !== undefined) {\n return { state: 'COMPLETE', transaction_id: transferResult.tx_id };\n }\n return { state: 'INIT', message: JSON.stringify(transferResult) };\n },\n },\n onEval: async (transferOrder) => ({\n state: 'COMPLETE',\n received_amount: transferOrder.current_amount,\n }),\n });\n};\n\nif (credential) {\n (async () => {\n const terminal = Terminal.fromNodeEnv();\n const accountIds = await resolveAccountProfile(credential);\n const ACCOUNT_INTERNAL_NETWORK_ID = `Gate/${accountIds.uid}/ACCOUNT_INTERNAL`;\n\n registerInternalTransfer(\n terminal,\n credential,\n accountIds.future,\n 'future_to_spot',\n ACCOUNT_INTERNAL_NETWORK_ID,\n );\n\n const subAccountsResult = await getSubAccountList(credential, { type: '0' });\n const isMainAccount = Array.isArray(subAccountsResult);\n if (isMainAccount) {\n const depositAddressRes = await getDepositAddress(credential, { currency: 'USDT' });\n console.info(formatTime(Date.now()), 'DepositAddress', JSON.stringify(depositAddressRes));\n const addresses = depositAddressRes.multichain_addresses.filter((item) => item.chain === 'TRX');\n for (const address of addresses) {\n addAccountTransferAddress({\n terminal,\n account_id: accountIds.spot,\n network_id: 'TRC20',\n currency: 'USDT',\n address: address.address,\n onApply: {\n INIT: async (transferOrder) => {\n const transferResult = await postWithdrawals(credential, {\n amount: `${transferOrder.current_amount}`,\n currency: 'USDT',\n address: transferOrder.current_rx_address!,\n chain: 'TRX',\n });\n const { txid, withdraw_order_id } = transferResult;\n if (txid && txid.length > 0) {\n return { state: 'COMPLETE', transaction_id: txid };\n }\n return { state: 'PENDING', context: withdraw_order_id };\n },\n PENDING: async (transferOrder) => {\n const wdId = transferOrder.current_tx_context;\n const withdrawalRecordsResult = await getWithdrawalHistory(credential, {});\n const withdrawalRecord = withdrawalRecordsResult.find(\n (item) => item.withdraw_order_id === wdId,\n );\n if (withdrawalRecord && withdrawalRecord.txid && withdrawalRecord.txid.length > 0) {\n return { state: 'COMPLETE', transaction_id: withdrawalRecord.txid };\n }\n return { state: 'PENDING', context: wdId };\n },\n },\n onEval: async (transferOrder) => {\n const checkResult = await getDepositHistory(credential, { currency: 'USDT' });\n const depositRecord = checkResult.find(\n (item) => item.txid === transferOrder.current_transaction_id,\n );\n if (depositRecord && depositRecord.status === 'DONE') {\n return { state: 'COMPLETE', received_amount: Number(depositRecord.amount) };\n }\n return { state: 'PENDING' };\n },\n });\n }\n }\n })().catch((error) => {\n console.error(formatTime(Date.now()), 'GateTransferInitFailed', error);\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare type HttpMethod = 'GET' | 'POST' | 'DELETE' | 'PUT';
|
|
2
|
+
export declare type GateParams = Record<string, string | number | boolean | undefined>;
|
|
3
|
+
export interface IGateCredential {
|
|
4
|
+
access_key: string;
|
|
5
|
+
secret_key: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const requestPublic: <TResponse>(method: HttpMethod, path: string, params?: GateParams) => Promise<TResponse>;
|
|
8
|
+
export declare const requestPrivate: <TResponse>(credential: IGateCredential, method: HttpMethod, path: string, params?: GateParams) => Promise<TResponse>;
|
|
9
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/api/http-client.ts"],"names":[],"mappings":"AAMA,oBAAY,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE3D,oBAAY,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAwDD,eAAO,MAAM,aAAa,sBAChB,UAAU,QACZ,MAAM,WACH,UAAU,uBAgBpB,CAAC;AAEF,eAAO,MAAM,cAAc,0BACb,eAAe,UACnB,UAAU,QACZ,MAAM,WACH,UAAU,uBA6BpB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.requestPrivate = exports.requestPublic = void 0;
|
|
7
|
+
const utils_1 = require("@yuants/utils");
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
const crypto_js_1 = __importDefault(require("crypto-js"));
|
|
10
|
+
const BASE_URL = 'https://api.gateio.ws';
|
|
11
|
+
const serializeQueryParams = (params) => {
|
|
12
|
+
if (!params)
|
|
13
|
+
return undefined;
|
|
14
|
+
const normalizedEntries = Object.entries(params).filter(([, value]) => value !== undefined);
|
|
15
|
+
if (normalizedEntries.length === 0) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return Object.fromEntries(normalizedEntries.map(([key, value]) => [key, `${value}`]));
|
|
19
|
+
};
|
|
20
|
+
const createRequestArtifacts = (method, path, params) => {
|
|
21
|
+
const url = new URL(BASE_URL);
|
|
22
|
+
url.pathname = path;
|
|
23
|
+
const searchParams = serializeQueryParams(params);
|
|
24
|
+
if (method === 'GET' && searchParams) {
|
|
25
|
+
Object.entries(searchParams).forEach(([key, value]) => url.searchParams.set(key, value));
|
|
26
|
+
}
|
|
27
|
+
const rawBody = method === 'GET' ? '' : JSON.stringify(params);
|
|
28
|
+
const body = rawBody;
|
|
29
|
+
return { url, body };
|
|
30
|
+
};
|
|
31
|
+
const toHeaderObject = (headers) => {
|
|
32
|
+
const iterable = headers;
|
|
33
|
+
return Object.fromEntries(Array.from(iterable));
|
|
34
|
+
};
|
|
35
|
+
const parseJSON = async (response, path, params) => {
|
|
36
|
+
const text = await response.text();
|
|
37
|
+
if (process.env.LOG_LEVEL === 'DEBUG') {
|
|
38
|
+
console.debug((0, utils_1.formatTime)(Date.now()), 'GateResponse', path, JSON.stringify(params !== null && params !== void 0 ? params : {}), text, {
|
|
39
|
+
status: response.status,
|
|
40
|
+
headers: toHeaderObject(response.headers),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
return JSON.parse(text);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error((0, utils_1.formatTime)(Date.now()), 'GateRequestFailed', path, JSON.stringify(params !== null && params !== void 0 ? params : {}), text, {
|
|
48
|
+
status: response.status,
|
|
49
|
+
headers: toHeaderObject(response.headers),
|
|
50
|
+
});
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const requestPublic = async (method, path, params) => {
|
|
55
|
+
const { url, body } = createRequestArtifacts(method, path, params);
|
|
56
|
+
const headers = {
|
|
57
|
+
Accept: 'application/json',
|
|
58
|
+
};
|
|
59
|
+
if (body) {
|
|
60
|
+
headers['Content-Type'] = 'application/json';
|
|
61
|
+
}
|
|
62
|
+
console.info((0, utils_1.formatTime)(Date.now()), method, url.href);
|
|
63
|
+
const response = await fetch(url.href, {
|
|
64
|
+
method,
|
|
65
|
+
headers,
|
|
66
|
+
body: body || undefined,
|
|
67
|
+
});
|
|
68
|
+
return parseJSON(response, path, params);
|
|
69
|
+
};
|
|
70
|
+
exports.requestPublic = requestPublic;
|
|
71
|
+
const requestPrivate = async (credential, method, path, params) => {
|
|
72
|
+
const { url, body } = createRequestArtifacts(method, path, params);
|
|
73
|
+
const timestamp = Date.now() / 1000;
|
|
74
|
+
const bodyDigest = crypto_js_1.default.enc.Hex.stringify(crypto_js_1.default.SHA512(body));
|
|
75
|
+
const signTarget = `${method}\n${url.pathname}\n${url.searchParams}\n${bodyDigest}\n${timestamp}`;
|
|
76
|
+
const sign = crypto_js_1.default.enc.Hex.stringify(crypto_js_1.default.HmacSHA512(signTarget, credential.secret_key));
|
|
77
|
+
const headers = {
|
|
78
|
+
Accept: 'application/json',
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
KEY: credential.access_key,
|
|
81
|
+
SIGN: sign,
|
|
82
|
+
Timestamp: `${timestamp}`,
|
|
83
|
+
};
|
|
84
|
+
// Add Channel ID header if exists
|
|
85
|
+
if (process.env.CHANNEL_ID) {
|
|
86
|
+
headers['X-Gate-Channel-Id'] = process.env.CHANNEL_ID;
|
|
87
|
+
}
|
|
88
|
+
console.info((0, utils_1.formatTime)(Date.now()), method, url.href, JSON.stringify(headers), body);
|
|
89
|
+
const response = await fetch(url.href, {
|
|
90
|
+
method,
|
|
91
|
+
headers,
|
|
92
|
+
body: body || undefined,
|
|
93
|
+
});
|
|
94
|
+
return parseJSON(response, path, params);
|
|
95
|
+
};
|
|
96
|
+
exports.requestPrivate = requestPrivate;
|
|
97
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/api/http-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatTime } from '@yuants/utils';\n// @ts-ignore\nimport CryptoJS from 'crypto-js';\n\nconst BASE_URL = 'https://api.gateio.ws';\n\nexport type HttpMethod = 'GET' | 'POST' | 'DELETE' | 'PUT';\n\nexport type GateParams = Record<string, string | number | boolean | undefined>;\n\nexport interface IGateCredential {\n access_key: string;\n secret_key: string;\n}\n\ninterface IRequestArtifacts {\n url: URL;\n body: string;\n}\n\nconst serializeQueryParams = (params?: GateParams): Record<string, string> | undefined => {\n if (!params) return undefined;\n const normalizedEntries = Object.entries(params).filter(([, value]) => value !== undefined);\n if (normalizedEntries.length === 0) {\n return undefined;\n }\n return Object.fromEntries(normalizedEntries.map(([key, value]) => [key, `${value}`]));\n};\n\nconst createRequestArtifacts = (method: HttpMethod, path: string, params?: GateParams): IRequestArtifacts => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n const searchParams = serializeQueryParams(params);\n if (method === 'GET' && searchParams) {\n Object.entries(searchParams).forEach(([key, value]) => url.searchParams.set(key, value));\n }\n const rawBody = method === 'GET' ? '' : JSON.stringify(params);\n const body = rawBody;\n return { url, body };\n};\n\nconst toHeaderObject = (headers: Headers): Record<string, string> => {\n const iterable = headers as unknown as Iterable<[string, string]>;\n return Object.fromEntries(Array.from(iterable));\n};\n\nconst parseJSON = async <TResponse>(\n response: Response,\n path: string,\n params?: GateParams,\n): Promise<TResponse> => {\n const text = await response.text();\n if (process.env.LOG_LEVEL === 'DEBUG') {\n console.debug(formatTime(Date.now()), 'GateResponse', path, JSON.stringify(params ?? {}), text, {\n status: response.status,\n headers: toHeaderObject(response.headers),\n });\n }\n try {\n return JSON.parse(text) as TResponse;\n } catch (error) {\n console.error(formatTime(Date.now()), 'GateRequestFailed', path, JSON.stringify(params ?? {}), text, {\n status: response.status,\n headers: toHeaderObject(response.headers),\n });\n throw error;\n }\n};\n\nexport const requestPublic = async <TResponse>(\n method: HttpMethod,\n path: string,\n params?: GateParams,\n): Promise<TResponse> => {\n const { url, body } = createRequestArtifacts(method, path, params);\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n if (body) {\n headers['Content-Type'] = 'application/json';\n }\n console.info(formatTime(Date.now()), method, url.href);\n const response = await fetch(url.href, {\n method,\n headers,\n body: body || undefined,\n });\n return parseJSON<TResponse>(response, path, params);\n};\n\nexport const requestPrivate = async <TResponse>(\n credential: IGateCredential,\n method: HttpMethod,\n path: string,\n params?: GateParams,\n): Promise<TResponse> => {\n const { url, body } = createRequestArtifacts(method, path, params);\n const timestamp = Date.now() / 1000;\n const bodyDigest = CryptoJS.enc.Hex.stringify(CryptoJS.SHA512(body));\n const signTarget = `${method}\\n${url.pathname}\\n${url.searchParams}\\n${bodyDigest}\\n${timestamp}`;\n const sign = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA512(signTarget, credential.secret_key));\n\n const headers: Record<string, string> = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n KEY: credential.access_key,\n SIGN: sign,\n Timestamp: `${timestamp}`,\n };\n\n // Add Channel ID header if exists\n if (process.env.CHANNEL_ID) {\n headers['X-Gate-Channel-Id'] = process.env.CHANNEL_ID;\n }\n\n console.info(formatTime(Date.now()), method, url.href, JSON.stringify(headers), body);\n\n const response = await fetch(url.href, {\n method,\n headers,\n body: body || undefined,\n });\n return parseJSON<TResponse>(response, path, params);\n};\n"]}
|