@yuants/vendor-gate 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/api/http-client.js +89 -0
  2. package/dist/api/http-client.js.map +1 -0
  3. package/dist/api/private-api.js +108 -0
  4. package/dist/api/private-api.js.map +1 -0
  5. package/dist/api/public-api.js +37 -0
  6. package/dist/api/public-api.js.map +1 -0
  7. package/dist/api/rate-limiter.js +60 -0
  8. package/dist/api/rate-limiter.js.map +1 -0
  9. package/dist/index.js +7 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/services/account-actions-with-credential.js +37 -0
  12. package/dist/services/account-actions-with-credential.js.map +1 -0
  13. package/dist/services/accounts/future.js +56 -0
  14. package/dist/services/accounts/future.js.map +1 -0
  15. package/dist/services/accounts/profile.js +25 -0
  16. package/dist/services/accounts/profile.js.map +1 -0
  17. package/dist/services/accounts/spot.js +19 -0
  18. package/dist/services/accounts/spot.js.map +1 -0
  19. package/dist/services/accounts/unified.js +50 -0
  20. package/dist/services/accounts/unified.js.map +1 -0
  21. package/dist/services/default-credential.js +15 -0
  22. package/dist/services/default-credential.js.map +1 -0
  23. package/dist/services/legacy.js +53 -0
  24. package/dist/services/legacy.js.map +1 -0
  25. package/dist/services/markets/interest-rate.js +30 -0
  26. package/dist/services/markets/interest-rate.js.map +1 -0
  27. package/dist/services/markets/product.js +38 -0
  28. package/dist/services/markets/product.js.map +1 -0
  29. package/dist/services/order-actions-with-credential.js +18 -0
  30. package/dist/services/order-actions-with-credential.js.map +1 -0
  31. package/dist/services/orders/cancelOrder.js +8 -0
  32. package/dist/services/orders/cancelOrder.js.map +1 -0
  33. package/dist/services/orders/listOrders.js +31 -0
  34. package/dist/services/orders/listOrders.js.map +1 -0
  35. package/dist/services/orders/submitOrder.js +50 -0
  36. package/dist/services/orders/submitOrder.js.map +1 -0
  37. package/dist/services/transfer.js +107 -0
  38. package/dist/services/transfer.js.map +1 -0
  39. package/dist/vendor-gate.d.ts +1 -0
  40. package/lib/api/http-client.d.ts +9 -0
  41. package/lib/api/http-client.d.ts.map +1 -0
  42. package/lib/api/http-client.js +97 -0
  43. package/lib/api/http-client.js.map +1 -0
  44. package/lib/api/private-api.d.ts +343 -0
  45. package/lib/api/private-api.d.ts.map +1 -0
  46. package/lib/api/private-api.js +126 -0
  47. package/lib/api/private-api.js.map +1 -0
  48. package/lib/api/public-api.d.ts +149 -0
  49. package/lib/api/public-api.d.ts.map +1 -0
  50. package/lib/api/public-api.js +45 -0
  51. package/lib/api/public-api.js.map +1 -0
  52. package/lib/api/rate-limiter.d.ts +8 -0
  53. package/lib/api/rate-limiter.d.ts.map +1 -0
  54. package/lib/api/rate-limiter.js +64 -0
  55. package/lib/api/rate-limiter.js.map +1 -0
  56. package/lib/index.d.ts +7 -0
  57. package/lib/index.d.ts.map +1 -0
  58. package/lib/index.js +9 -0
  59. package/lib/index.js.map +1 -0
  60. package/lib/services/account-actions-with-credential.d.ts +2 -0
  61. package/lib/services/account-actions-with-credential.d.ts.map +1 -0
  62. package/lib/services/account-actions-with-credential.js +39 -0
  63. package/lib/services/account-actions-with-credential.js.map +1 -0
  64. package/lib/services/accounts/future.d.ts +13 -0
  65. package/lib/services/accounts/future.d.ts.map +1 -0
  66. package/lib/services/accounts/future.js +61 -0
  67. package/lib/services/accounts/future.js.map +1 -0
  68. package/lib/services/accounts/profile.d.ts +10 -0
  69. package/lib/services/accounts/profile.d.ts.map +1 -0
  70. package/lib/services/accounts/profile.js +29 -0
  71. package/lib/services/accounts/profile.js.map +1 -0
  72. package/lib/services/accounts/spot.d.ts +11 -0
  73. package/lib/services/accounts/spot.d.ts.map +1 -0
  74. package/lib/services/accounts/spot.js +23 -0
  75. package/lib/services/accounts/spot.js.map +1 -0
  76. package/lib/services/accounts/unified.d.ts +12 -0
  77. package/lib/services/accounts/unified.d.ts.map +1 -0
  78. package/lib/services/accounts/unified.js +54 -0
  79. package/lib/services/accounts/unified.js.map +1 -0
  80. package/lib/services/default-credential.d.ts +3 -0
  81. package/lib/services/default-credential.d.ts.map +1 -0
  82. package/lib/services/default-credential.js +19 -0
  83. package/lib/services/default-credential.js.map +1 -0
  84. package/lib/services/legacy.d.ts +2 -0
  85. package/lib/services/legacy.d.ts.map +1 -0
  86. package/lib/services/legacy.js +55 -0
  87. package/lib/services/legacy.js.map +1 -0
  88. package/lib/services/markets/interest-rate.d.ts +2 -0
  89. package/lib/services/markets/interest-rate.d.ts.map +1 -0
  90. package/lib/services/markets/interest-rate.js +32 -0
  91. package/lib/services/markets/interest-rate.js.map +1 -0
  92. package/lib/services/markets/product.d.ts +3 -0
  93. package/lib/services/markets/product.d.ts.map +1 -0
  94. package/lib/services/markets/product.js +41 -0
  95. package/lib/services/markets/product.js.map +1 -0
  96. package/lib/services/order-actions-with-credential.d.ts +2 -0
  97. package/lib/services/order-actions-with-credential.d.ts.map +1 -0
  98. package/lib/services/order-actions-with-credential.js +20 -0
  99. package/lib/services/order-actions-with-credential.js.map +1 -0
  100. package/lib/services/orders/cancelOrder.d.ts +4 -0
  101. package/lib/services/orders/cancelOrder.d.ts.map +1 -0
  102. package/lib/services/orders/cancelOrder.js +12 -0
  103. package/lib/services/orders/cancelOrder.js.map +1 -0
  104. package/lib/services/orders/listOrders.d.ts +4 -0
  105. package/lib/services/orders/listOrders.d.ts.map +1 -0
  106. package/lib/services/orders/listOrders.js +35 -0
  107. package/lib/services/orders/listOrders.js.map +1 -0
  108. package/lib/services/orders/submitOrder.d.ts +4 -0
  109. package/lib/services/orders/submitOrder.d.ts.map +1 -0
  110. package/lib/services/orders/submitOrder.js +54 -0
  111. package/lib/services/orders/submitOrder.js.map +1 -0
  112. package/lib/services/transfer.d.ts +2 -0
  113. package/lib/services/transfer.d.ts.map +1 -0
  114. package/lib/services/transfer.js +109 -0
  115. package/lib/services/transfer.js.map +1 -0
  116. package/lib/tsdoc-metadata.json +11 -0
  117. package/package.json +13 -17
  118. package/temp/package-deps.json +46 -0
  119. package/temp/vendor-gate.api.json +177 -0
  120. 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"]}