@yuants/vendor-binance 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/api/client.js +13 -2
  2. package/dist/api/client.js.map +1 -1
  3. package/dist/api/public-api.js +6 -0
  4. package/dist/api/public-api.js.map +1 -1
  5. package/dist/index.js +1 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/legacy_index.js +163 -197
  8. package/dist/legacy_index.js.map +1 -1
  9. package/dist/public-data/product.js +82 -3
  10. package/dist/public-data/product.js.map +1 -1
  11. package/dist/public-data/quote.js +2 -2
  12. package/dist/public-data/quote.js.map +1 -1
  13. package/dist/services/accounts/profile.js +4 -15
  14. package/dist/services/accounts/profile.js.map +1 -1
  15. package/dist/services/accounts/spot.js.map +1 -1
  16. package/dist/services/accounts/unified.js +1 -11
  17. package/dist/services/accounts/unified.js.map +1 -1
  18. package/dist/services/exchange.js +56 -0
  19. package/dist/services/exchange.js.map +1 -0
  20. package/dist/services/orders/listOrders.js +44 -35
  21. package/dist/services/orders/listOrders.js.map +1 -1
  22. package/lib/api/client.d.ts.map +1 -1
  23. package/lib/api/client.js +12 -1
  24. package/lib/api/client.js.map +1 -1
  25. package/lib/api/public-api.d.ts +41 -0
  26. package/lib/api/public-api.d.ts.map +1 -1
  27. package/lib/api/public-api.js +8 -1
  28. package/lib/api/public-api.js.map +1 -1
  29. package/lib/index.d.ts +1 -2
  30. package/lib/index.d.ts.map +1 -1
  31. package/lib/index.js +1 -2
  32. package/lib/index.js.map +1 -1
  33. package/lib/legacy_index.d.ts +0 -1
  34. package/lib/legacy_index.js +162 -198
  35. package/lib/legacy_index.js.map +1 -1
  36. package/lib/public-data/product.d.ts +2 -1
  37. package/lib/public-data/product.d.ts.map +1 -1
  38. package/lib/public-data/product.js +83 -2
  39. package/lib/public-data/product.js.map +1 -1
  40. package/lib/public-data/quote.js +2 -2
  41. package/lib/public-data/quote.js.map +1 -1
  42. package/lib/services/accounts/profile.d.ts +1 -5
  43. package/lib/services/accounts/profile.d.ts.map +1 -1
  44. package/lib/services/accounts/profile.js +6 -17
  45. package/lib/services/accounts/profile.js.map +1 -1
  46. package/lib/services/accounts/spot.d.ts +2 -2
  47. package/lib/services/accounts/spot.d.ts.map +1 -1
  48. package/lib/services/accounts/spot.js.map +1 -1
  49. package/lib/services/accounts/unified.d.ts +2 -2
  50. package/lib/services/accounts/unified.d.ts.map +1 -1
  51. package/lib/services/accounts/unified.js +1 -11
  52. package/lib/services/accounts/unified.js.map +1 -1
  53. package/lib/services/exchange.d.ts +2 -0
  54. package/lib/services/exchange.d.ts.map +1 -0
  55. package/lib/services/exchange.js +58 -0
  56. package/lib/services/exchange.js.map +1 -0
  57. package/lib/services/orders/listOrders.d.ts +4 -2
  58. package/lib/services/orders/listOrders.d.ts.map +1 -1
  59. package/lib/services/orders/listOrders.js +47 -36
  60. package/lib/services/orders/listOrders.js.map +1 -1
  61. package/package.json +2 -1
  62. package/temp/package-deps.json +17 -17
  63. package/dist/services/account-actions-with-credential.js +0 -34
  64. package/dist/services/account-actions-with-credential.js.map +0 -1
  65. package/dist/services/order-actions-with-credential.js +0 -21
  66. package/dist/services/order-actions-with-credential.js.map +0 -1
  67. package/lib/services/account-actions-with-credential.d.ts +0 -2
  68. package/lib/services/account-actions-with-credential.d.ts.map +0 -1
  69. package/lib/services/account-actions-with-credential.js +0 -36
  70. package/lib/services/account-actions-with-credential.js.map +0 -1
  71. package/lib/services/order-actions-with-credential.d.ts +0 -2
  72. package/lib/services/order-actions-with-credential.d.ts.map +0 -1
  73. package/lib/services/order-actions-with-credential.js +0 -23
  74. package/lib/services/order-actions-with-credential.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { GlobalPrometheusRegistry } from '@yuants/protocol';
2
- import { formatTime, HmacSHA256 } from '@yuants/utils';
2
+ import { formatTime, HmacSHA256, newError } from '@yuants/utils';
3
3
  const MetricBinanceApiUsedWeight = GlobalPrometheusRegistry.gauge('binance_api_used_weight', '');
4
+ let retryAfterUntil = null;
4
5
  export const isApiError = (value) => typeof (value === null || value === void 0 ? void 0 : value.code) === 'number' && typeof (value === null || value === void 0 ? void 0 : value.msg) === 'string';
5
6
  const appendParams = (url, params) => {
6
7
  if (!params)
@@ -44,12 +45,22 @@ const callApi = async (method, endpoint, params, credential) => {
44
45
  else {
45
46
  console.info(formatTime(Date.now()), method, url.href);
46
47
  }
48
+ if (retryAfterUntil) {
49
+ if (Date.now() <= retryAfterUntil) {
50
+ throw newError('ACTIVE_RATE_LIMIT', { retryAfterUntil, now: Date.now(), url: url.href });
51
+ }
52
+ retryAfterUntil = null;
53
+ }
47
54
  const res = await fetch(url.href, {
48
55
  method,
49
56
  headers,
50
57
  });
51
58
  const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');
52
- console.info(formatTime(Date.now()), 'response', method, url.href, res.status, `usedWeight1M=${usedWeight1M !== null && usedWeight1M !== void 0 ? usedWeight1M : 'N/A'}`);
59
+ const retryAfter = res.headers.get('Retry-After');
60
+ if (retryAfter) {
61
+ retryAfterUntil = Date.now() + parseInt(retryAfter, 10) * 1000;
62
+ }
63
+ console.info(formatTime(Date.now()), 'response', method, url.href, `status=${res.status}`, retryAfter ? `retryAfter=${retryAfter}` : '', `usedWeight1M=${usedWeight1M !== null && usedWeight1M !== void 0 ? usedWeight1M : 'N/A'}`);
53
64
  if (usedWeight1M) {
54
65
  MetricBinanceApiUsedWeight.set(+usedWeight1M);
55
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { GlobalPrometheusRegistry } from '@yuants/protocol';\nimport { formatTime, HmacSHA256 } from '@yuants/utils';\n\nconst MetricBinanceApiUsedWeight = GlobalPrometheusRegistry.gauge('binance_api_used_weight', '');\n\ntype HttpMethod = 'GET' | 'POST' | 'DELETE' | 'PUT';\n\ntype RequestParams = Record<string, string | number | boolean | undefined>;\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n}\n\nexport interface IApiError {\n code: number;\n msg: string;\n}\n\nexport const isApiError = <T>(value: T | IApiError): value is IApiError =>\n typeof (value as IApiError)?.code === 'number' && typeof (value as IApiError)?.msg === 'string';\n\nconst appendParams = (url: URL, params?: RequestParams) => {\n if (!params) return;\n const entries = Object.entries(params).filter(([, value]) => value !== undefined);\n const timestampEntry = entries.find(([key]) => key === 'timestamp');\n const restEntries = entries.filter(([key]) => key !== 'timestamp');\n restEntries\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .forEach(([key, value]) => {\n url.searchParams.set(key, String(value));\n });\n if (timestampEntry) {\n url.searchParams.set(timestampEntry[0], String(timestampEntry[1]));\n }\n};\n\nconst callApi = async <T>(\n method: HttpMethod,\n endpoint: string,\n params?: RequestParams,\n credential?: ICredential,\n): Promise<T> => {\n const url = new URL(endpoint);\n const normalizedParams: RequestParams = { ...params };\n if (credential) {\n if (normalizedParams.recvWindow === undefined) {\n // FYI https://developers.binance.com/docs/derivatives/usds-margined-futures/general-info#timing-security\n normalizedParams.recvWindow = 5000;\n }\n if (normalizedParams.timestamp === undefined) {\n normalizedParams.timestamp = Date.now();\n }\n }\n appendParams(url, normalizedParams);\n\n let headers: Record<string, string> | undefined;\n if (credential) {\n const signData = url.search.slice(1);\n\n const signature = Buffer.from(\n await HmacSHA256(new TextEncoder().encode(signData), new TextEncoder().encode(credential.secret_key)),\n ).toString('hex');\n url.searchParams.set('signature', signature);\n headers = {\n 'Content-Type': 'application/json;charset=utf-8',\n 'X-MBX-APIKEY': credential.access_key,\n };\n console.info(\n formatTime(Date.now()),\n method,\n url.href,\n JSON.stringify(headers),\n url.searchParams.toString(),\n signData,\n );\n } else {\n console.info(formatTime(Date.now()), method, url.href);\n }\n\n const res = await fetch(url.href, {\n method,\n headers,\n });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n console.info(\n formatTime(Date.now()),\n 'response',\n method,\n url.href,\n res.status,\n `usedWeight1M=${usedWeight1M ?? 'N/A'}`,\n );\n if (usedWeight1M) {\n MetricBinanceApiUsedWeight.set(+usedWeight1M);\n }\n return res.json() as Promise<T>;\n};\n\nexport const requestPublic = <T>(method: HttpMethod, endpoint: string, params?: RequestParams) =>\n callApi<T>(method, endpoint, params);\n\nexport const requestPrivate = <T>(\n credential: ICredential,\n method: HttpMethod,\n endpoint: string,\n params?: RequestParams,\n) => callApi<T>(method, endpoint, params, credential);\n\nexport const getDefaultCredential = (): ICredential => {\n const access_key = process.env.ACCESS_KEY;\n const secret_key = process.env.SECRET_KEY;\n if (!access_key || !secret_key) {\n throw new Error('Missing Binance credential: ACCESS_KEY and SECRET_KEY must be set');\n }\n return { access_key, secret_key };\n};\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { GlobalPrometheusRegistry } from '@yuants/protocol';\nimport { formatTime, HmacSHA256, newError } from '@yuants/utils';\n\nconst MetricBinanceApiUsedWeight = GlobalPrometheusRegistry.gauge('binance_api_used_weight', '');\n\ntype HttpMethod = 'GET' | 'POST' | 'DELETE' | 'PUT';\n\ntype RequestParams = Record<string, string | number | boolean | undefined>;\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n}\n\nexport interface IApiError {\n code: number;\n msg: string;\n}\n\nlet retryAfterUntil: number | null = null;\n\nexport const isApiError = <T>(value: T | IApiError): value is IApiError =>\n typeof (value as IApiError)?.code === 'number' && typeof (value as IApiError)?.msg === 'string';\n\nconst appendParams = (url: URL, params?: RequestParams) => {\n if (!params) return;\n const entries = Object.entries(params).filter(([, value]) => value !== undefined);\n const timestampEntry = entries.find(([key]) => key === 'timestamp');\n const restEntries = entries.filter(([key]) => key !== 'timestamp');\n restEntries\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .forEach(([key, value]) => {\n url.searchParams.set(key, String(value));\n });\n if (timestampEntry) {\n url.searchParams.set(timestampEntry[0], String(timestampEntry[1]));\n }\n};\n\nconst callApi = async <T>(\n method: HttpMethod,\n endpoint: string,\n params?: RequestParams,\n credential?: ICredential,\n): Promise<T> => {\n const url = new URL(endpoint);\n const normalizedParams: RequestParams = { ...params };\n if (credential) {\n if (normalizedParams.recvWindow === undefined) {\n // FYI https://developers.binance.com/docs/derivatives/usds-margined-futures/general-info#timing-security\n normalizedParams.recvWindow = 5000;\n }\n if (normalizedParams.timestamp === undefined) {\n normalizedParams.timestamp = Date.now();\n }\n }\n appendParams(url, normalizedParams);\n\n let headers: Record<string, string> | undefined;\n if (credential) {\n const signData = url.search.slice(1);\n\n const signature = Buffer.from(\n await HmacSHA256(new TextEncoder().encode(signData), new TextEncoder().encode(credential.secret_key)),\n ).toString('hex');\n url.searchParams.set('signature', signature);\n headers = {\n 'Content-Type': 'application/json;charset=utf-8',\n 'X-MBX-APIKEY': credential.access_key,\n };\n console.info(\n formatTime(Date.now()),\n method,\n url.href,\n JSON.stringify(headers),\n url.searchParams.toString(),\n signData,\n );\n } else {\n console.info(formatTime(Date.now()), method, url.href);\n }\n\n if (retryAfterUntil) {\n if (Date.now() <= retryAfterUntil) {\n throw newError('ACTIVE_RATE_LIMIT', { retryAfterUntil, now: Date.now(), url: url.href });\n }\n retryAfterUntil = null;\n }\n\n const res = await fetch(url.href, {\n method,\n headers,\n });\n const usedWeight1M = res.headers.get('x-mbx-used-weight-1m');\n const retryAfter = res.headers.get('Retry-After');\n if (retryAfter) {\n retryAfterUntil = Date.now() + parseInt(retryAfter, 10) * 1000;\n }\n console.info(\n formatTime(Date.now()),\n 'response',\n method,\n url.href,\n `status=${res.status}`,\n retryAfter ? `retryAfter=${retryAfter}` : '',\n `usedWeight1M=${usedWeight1M ?? 'N/A'}`,\n );\n if (usedWeight1M) {\n MetricBinanceApiUsedWeight.set(+usedWeight1M);\n }\n return res.json() as Promise<T>;\n};\n\nexport const requestPublic = <T>(method: HttpMethod, endpoint: string, params?: RequestParams) =>\n callApi<T>(method, endpoint, params);\n\nexport const requestPrivate = <T>(\n credential: ICredential,\n method: HttpMethod,\n endpoint: string,\n params?: RequestParams,\n) => callApi<T>(method, endpoint, params, credential);\n\nexport const getDefaultCredential = (): ICredential => {\n const access_key = process.env.ACCESS_KEY;\n const secret_key = process.env.SECRET_KEY;\n if (!access_key || !secret_key) {\n throw new Error('Missing Binance credential: ACCESS_KEY and SECRET_KEY must be set');\n }\n return { access_key, secret_key };\n};\n"]}
@@ -47,4 +47,10 @@ export const getFutureOpenInterest = (params) => requestPublic('GET', 'https://f
47
47
  * https://binance-docs.github.io/apidocs/spot/cn/#5393cd0851
48
48
  */
49
49
  export const getSpotBookTicker = (params) => requestPublic('GET', 'https://api.binance.com/api/v3/ticker/bookTicker', params);
50
+ /**
51
+ * 获取现货交易规则和交易对
52
+ *
53
+ * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/general-endpoints#%E4%BA%A4%E6%98%93%E8%A7%84%E8%8C%83%E4%BF%A1%E6%81%AF
54
+ */
55
+ export const getSpotExchangeInfo = () => requestPublic('GET', 'https://api.binance.com/api/v3/exchangeInfo');
50
56
  //# sourceMappingURL=public-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgGzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAiC,EAAE,CACtE,aAAa,CAAsB,KAAK,EAAE,+CAA+C,CAAC,CAAC;AAE7F;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAKpC,EAAsC,EAAE,CACvC,aAAa,CAA4B,KAAK,EAAE,8CAA8C,EAAE,MAAM,CAAC,CAAC;AAE1G;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAA2B,EAAuC,EAAE,CACxG,aAAa,CAA6B,KAAK,EAAE,+CAA+C,EAAE,MAAM,CAAC,CAAC;AAE5G;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA4B,EAAqC,EAAE,CACrG,aAAa,CACX,KAAK,EACL,oDAAoD,EACpD,MAAM,CACP,CAAC;AAEJ;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAA0B,EAAgC,EAAE,CAChG,aAAa,CAAsB,KAAK,EAAE,+CAA+C,EAAE,MAAM,CAAC,CAAC;AASrG;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAA4B,EAAmC,EAAE,CACjG,aAAa,CAAyB,KAAK,EAAE,kDAAkD,EAAE,MAAM,CAAC,CAAC","sourcesContent":["import { requestPublic } from './client';\n\nexport interface IFutureExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface IFutureExchangeSymbol {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: IFutureExchangeFilter[];\n orderTypes: string[];\n timeInForce: string[];\n}\n\nexport interface IFutureExchangeInfo {\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: IFutureExchangeSymbol[];\n}\n\nexport interface IFutureFundingRateEntry {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n}\n\nexport interface IFuturePremiumIndexEntry {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n}\n\nexport interface IFutureBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n}\n\nexport interface IFutureOpenInterest {\n openInterest: string;\n symbol: string;\n time: number;\n}\n\nexport interface IMarginPair {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n}\n\n/**\n * 获取交易规则和交易对\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#0f3f2d5ee7\n */\nexport const getFutureExchangeInfo = (): Promise<IFutureExchangeInfo> =>\n requestPublic<IFutureExchangeInfo>('GET', 'https://fapi.binance.com/fapi/v1/exchangeInfo');\n\n/**\n * 查询资金费率历史\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#31dbeb24c4\n */\nexport const getFutureFundingRate = (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}): Promise<IFutureFundingRateEntry[]> =>\n requestPublic<IFutureFundingRateEntry[]>('GET', 'https://fapi.binance.com/fapi/v1/fundingRate', params);\n\n/**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\nexport const getFuturePremiumIndex = (params: { symbol?: string }): Promise<IFuturePremiumIndexEntry[]> =>\n requestPublic<IFuturePremiumIndexEntry[]>('GET', 'https://fapi.binance.com/fapi/v1/premiumIndex', params);\n\n/**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\nexport const getFutureBookTicker = (params?: { symbol?: string }): Promise<IFutureBookTickerEntry[]> =>\n requestPublic<IFutureBookTickerEntry[]>(\n 'GET',\n 'https://fapi.binance.com/fapi/v1/ticker/bookTicker',\n params,\n );\n\n/**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\nexport const getFutureOpenInterest = (params: { symbol: string }): Promise<IFutureOpenInterest> =>\n requestPublic<IFutureOpenInterest>('GET', 'https://fapi.binance.com/fapi/v1/openInterest', params);\nexport interface ISpotBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n}\n\n/**\n * 当前最优挂单 (Spot)\n *\n * https://binance-docs.github.io/apidocs/spot/cn/#5393cd0851\n */\nexport const getSpotBookTicker = (params?: { symbol?: string }): Promise<ISpotBookTickerEntry[]> =>\n requestPublic<ISpotBookTickerEntry[]>('GET', 'https://api.binance.com/api/v3/ticker/bookTicker', params);\n"]}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/api/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgGzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAiC,EAAE,CACtE,aAAa,CAAsB,KAAK,EAAE,+CAA+C,CAAC,CAAC;AAE7F;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAKpC,EAAsC,EAAE,CACvC,aAAa,CAA4B,KAAK,EAAE,8CAA8C,EAAE,MAAM,CAAC,CAAC;AAE1G;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAA2B,EAAuC,EAAE,CACxG,aAAa,CAA6B,KAAK,EAAE,+CAA+C,EAAE,MAAM,CAAC,CAAC;AAE5G;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA4B,EAAqC,EAAE,CACrG,aAAa,CACX,KAAK,EACL,oDAAoD,EACpD,MAAM,CACP,CAAC;AAEJ;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAA0B,EAAgC,EAAE,CAChG,aAAa,CAAsB,KAAK,EAAE,+CAA+C,EAAE,MAAM,CAAC,CAAC;AASrG;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAA4B,EAAmC,EAAE,CACjG,aAAa,CAAyB,KAAK,EAAE,kDAAkD,EAAE,MAAM,CAAC,CAAC;AAwC3G;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAA+B,EAAE,CAClE,aAAa,CAAoB,KAAK,EAAE,6CAA6C,CAAC,CAAC","sourcesContent":["import { requestPublic } from './client';\n\nexport interface IFutureExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface IFutureExchangeSymbol {\n symbol: string;\n pair: string;\n contractType: string;\n deliveryDate: number;\n onboardDate: number;\n status: string;\n maintMarginPercent: string;\n requiredMarginPercent: string;\n baseAsset: string;\n quoteAsset: string;\n marginAsset: string;\n pricePrecision: number;\n quantityPrecision: number;\n baseAssetPrecision: number;\n quotePrecision: number;\n underlyingType: string;\n underlyingSubType: string[];\n settlePlan: number;\n triggerProtect: string;\n liquidationFee: string;\n marketTakeBound: string;\n maxMoveOrderLimit: number;\n filters: IFutureExchangeFilter[];\n orderTypes: string[];\n timeInForce: string[];\n}\n\nexport interface IFutureExchangeInfo {\n timezone: string;\n serverTime: number;\n futuresType: string;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n assets: {\n asset: string;\n marginAvailable: boolean;\n autoAssetExchange: string;\n }[];\n symbols: IFutureExchangeSymbol[];\n}\n\nexport interface IFutureFundingRateEntry {\n symbol: string;\n fundingTime: number;\n fundingRate: string;\n markPrice: string;\n}\n\nexport interface IFuturePremiumIndexEntry {\n symbol: string;\n markPrice: string;\n indexPrice: string;\n estimatedSettlePrice: string;\n lastFundingRate: string;\n interestRate: string;\n nextFundingTime: number;\n time: number;\n}\n\nexport interface IFutureBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n time: number;\n}\n\nexport interface IFutureOpenInterest {\n openInterest: string;\n symbol: string;\n time: number;\n}\n\nexport interface IMarginPair {\n id: string;\n symbol: string;\n base: string;\n quote: string;\n isMarginTrade: boolean;\n isBuyAllowed: boolean;\n isSellAllowed: boolean;\n}\n\n/**\n * 获取交易规则和交易对\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#0f3f2d5ee7\n */\nexport const getFutureExchangeInfo = (): Promise<IFutureExchangeInfo> =>\n requestPublic<IFutureExchangeInfo>('GET', 'https://fapi.binance.com/fapi/v1/exchangeInfo');\n\n/**\n * 查询资金费率历史\n *\n * https://binance-docs.github.io/apidocs/futures/cn/#31dbeb24c4\n */\nexport const getFutureFundingRate = (params: {\n symbol?: string;\n startTime?: number;\n endTime?: number;\n limit?: number;\n}): Promise<IFutureFundingRateEntry[]> =>\n requestPublic<IFutureFundingRateEntry[]>('GET', 'https://fapi.binance.com/fapi/v1/fundingRate', params);\n\n/**\n * 最新标记价格和资金费率\n *\n * 采集各大交易所数据加权平均\n *\n * 权重: 带symbol为1;不带symbol为10\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Mark-Price\n */\nexport const getFuturePremiumIndex = (params: { symbol?: string }): Promise<IFuturePremiumIndexEntry[]> =>\n requestPublic<IFuturePremiumIndexEntry[]>('GET', 'https://fapi.binance.com/fapi/v1/premiumIndex', params);\n\n/**\n * 当前最优挂单\n *\n * 返回当前最优的挂单(最高买单,最低卖单)\n *\n * 权重: 单交易对2,无交易对5\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Symbol-Order-Book-Ticker\n */\nexport const getFutureBookTicker = (params?: { symbol?: string }): Promise<IFutureBookTickerEntry[]> =>\n requestPublic<IFutureBookTickerEntry[]>(\n 'GET',\n 'https://fapi.binance.com/fapi/v1/ticker/bookTicker',\n params,\n );\n\n/**\n * 获取未平仓合约数\n *\n * 权重: 1\n *\n * 更新速率: 3s\n *\n * https://developers.binance.com/docs/zh-CN/derivatives/usds-margined-futures/market-data/rest-api/Open-Interest\n */\nexport const getFutureOpenInterest = (params: { symbol: string }): Promise<IFutureOpenInterest> =>\n requestPublic<IFutureOpenInterest>('GET', 'https://fapi.binance.com/fapi/v1/openInterest', params);\nexport interface ISpotBookTickerEntry {\n symbol: string;\n bidPrice: string;\n bidQty: string;\n askPrice: string;\n askQty: string;\n}\n\n/**\n * 当前最优挂单 (Spot)\n *\n * https://binance-docs.github.io/apidocs/spot/cn/#5393cd0851\n */\nexport const getSpotBookTicker = (params?: { symbol?: string }): Promise<ISpotBookTickerEntry[]> =>\n requestPublic<ISpotBookTickerEntry[]>('GET', 'https://api.binance.com/api/v3/ticker/bookTicker', params);\n\nexport interface ISpotExchangeFilter extends Record<string, string | number | boolean | undefined> {\n filterType: string;\n}\n\nexport interface ISpotExchangeSymbol {\n symbol: string;\n status: string;\n baseAsset: string;\n baseAssetPrecision: number;\n quoteAsset: string;\n quotePrecision: number;\n baseCommissionPrecision: number;\n quoteCommissionPrecision: number;\n orderTypes: string[];\n icebergAllowed: boolean;\n ocoAllowed: boolean;\n quoteOrderQtyMarketAllowed: boolean;\n allowTrailingStop: boolean;\n cancelReplaceAllowed: boolean;\n isSpotTradingAllowed: boolean;\n isMarginTradingAllowed: boolean;\n filters: ISpotExchangeFilter[];\n permissions: string[];\n}\n\nexport interface ISpotExchangeInfo {\n timezone: string;\n serverTime: number;\n rateLimits: {\n rateLimitType: string;\n interval: string;\n intervalNum: number;\n limit: number;\n }[];\n exchangeFilters: unknown[];\n symbols: ISpotExchangeSymbol[];\n}\n\n/**\n * 获取现货交易规则和交易对\n *\n * https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/rest-api/general-endpoints#%E4%BA%A4%E6%98%93%E8%A7%84%E8%8C%83%E4%BF%A1%E6%81%AF\n */\nexport const getSpotExchangeInfo = (): Promise<ISpotExchangeInfo> =>\n requestPublic<ISpotExchangeInfo>('GET', 'https://api.binance.com/api/v3/exchangeInfo');\n"]}
package/dist/index.js CHANGED
@@ -2,6 +2,5 @@ import './public-data/interest_rate';
2
2
  import './public-data/ohlc';
3
3
  import './public-data/product';
4
4
  import './public-data/quote';
5
- import './services/account-actions-with-credential';
6
- import './services/order-actions-with-credential';
5
+ import './services/exchange';
7
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,oBAAoB,CAAC;AAC5B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,4CAA4C,CAAC;AACpD,OAAO,0CAA0C,CAAC","sourcesContent":["import './public-data/interest_rate';\nimport './public-data/ohlc';\nimport './public-data/product';\nimport './public-data/quote';\nimport './services/account-actions-with-credential';\nimport './services/order-actions-with-credential';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,oBAAoB,CAAC;AAC5B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,qBAAqB,CAAC;AAC7B,OAAO,qBAAqB,CAAC","sourcesContent":["import './public-data/interest_rate';\nimport './public-data/ohlc';\nimport './public-data/product';\nimport './public-data/quote';\nimport './services/exchange';\n"]}
@@ -1,198 +1,164 @@
1
- import { addAccountMarket, provideAccountInfoService } from '@yuants/data-account';
2
- import { providePendingOrdersService } from '@yuants/data-order';
3
- import { Terminal } from '@yuants/protocol';
4
- import { addAccountTransferAddress } from '@yuants/transfer';
5
- import { getDefaultCredential, isApiError } from './api/client';
6
- import { getDepositAddress, getDepositHistory, getSpotAccountInfo, getSubAccountList, getWithdrawHistory, postAssetTransfer, postWithdraw, } from './api/private-api';
7
- import { getSpotAccountInfoSnapshot } from './services/accounts/spot';
8
- import { getUnifiedAccountInfo } from './services/accounts/unified';
9
- import { cancelOrder } from './services/orders/cancelOrder';
10
- import { listOrders } from './services/orders/listOrders';
11
- import { submitOrder } from './services/orders/submitOrder';
12
- const terminal = Terminal.fromNodeEnv();
13
- const isPublicOnly = process.env.PUBLIC_ONLY === 'true';
14
- // provideTicks(terminal, 'binance', (product_id) => {
15
- // const [instType, symbol] = decodePath(product_id);
16
- // if (instType === 'usdt-future') {
17
- // return combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(
18
- // combineLatestWith(defer(() => getOpenInterest(symbol))),
19
- // map(([[mapSymbolToFuturePremiumIndex, mapSymbolToFutureBookTicker], openInterestVolume]): ITick => {
20
- // const premiumIndex = mapSymbolToFuturePremiumIndex.get(symbol);
21
- // const bookTicker = mapSymbolToFutureBookTicker.get(symbol);
22
- // if (!premiumIndex) {
23
- // throw new Error(`Premium Index Not Found: ${symbol}`);
24
- // }
25
- // if (!bookTicker) {
26
- // throw new Error(`Book Ticker Not Found: ${symbol}`);
27
- // }
28
- // return {
29
- // datasource_id: 'binance',
30
- // product_id,
31
- // updated_at: Date.now(),
32
- // price: +premiumIndex.markPrice,
33
- // ask: +bookTicker.askPrice,
34
- // bid: +bookTicker.bidPrice,
35
- // interest_rate_for_long: -+premiumIndex.lastFundingRate,
36
- // interest_rate_for_short: +premiumIndex.lastFundingRate,
37
- // settlement_scheduled_at: premiumIndex.nextFundingTime,
38
- // open_interest: openInterestVolume,
39
- // };
40
- // }),
41
- // );
42
- // }
43
- // return EMPTY;
44
- // });
45
- if (isPublicOnly) {
46
- console.info('PUBLIC_ONLY=1, skip Binance legacy services');
47
- }
48
- else {
49
- const credential = getDefaultCredential();
50
- (async () => {
51
- const spotAccountInfo = await getSpotAccountInfo(credential);
52
- if (isApiError(spotAccountInfo)) {
53
- throw new Error(spotAccountInfo.msg);
54
- }
55
- const uid = spotAccountInfo.uid;
56
- const SPOT_ACCOUNT_ID = `binance/${uid}/spot/usdt`;
57
- const UNIFIED_ACCOUNT_ID = `binance/${uid}/unified/usdt`;
58
- {
59
- // unified accountInfo
60
- provideAccountInfoService(terminal, UNIFIED_ACCOUNT_ID, async () => getUnifiedAccountInfo(credential, UNIFIED_ACCOUNT_ID), { auto_refresh_interval: 1000 });
61
- addAccountMarket(terminal, { account_id: UNIFIED_ACCOUNT_ID, market_id: 'BINANCE/UNIFIED' });
62
- }
63
- {
64
- // spot account info
65
- provideAccountInfoService(terminal, SPOT_ACCOUNT_ID, async () => getSpotAccountInfoSnapshot(credential, SPOT_ACCOUNT_ID), {
66
- auto_refresh_interval: 5000,
67
- });
68
- addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'BINANCE/SPOT' });
69
- }
70
- // transfer
71
- {
72
- // spot -> unified
73
- const SPOT_UNIFIED_NETWORK_ID = `binance/${uid}/spot/unified`;
74
- addAccountTransferAddress({
75
- terminal,
76
- account_id: SPOT_ACCOUNT_ID,
77
- network_id: SPOT_UNIFIED_NETWORK_ID,
78
- currency: 'USDT',
79
- address: `unified`,
80
- onApply: {
81
- INIT: async (order) => {
82
- const transferResult = await postAssetTransfer(credential, {
83
- type: 'MAIN_PORTFOLIO_MARGIN',
84
- asset: 'USDT',
85
- amount: order.current_amount,
86
- });
87
- if (isApiError(transferResult)) {
88
- return { state: 'INIT', message: transferResult.msg };
89
- }
90
- return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };
91
- },
92
- },
93
- onEval: async (order) => {
94
- return { state: 'COMPLETE', received_amount: order.current_amount };
95
- },
96
- });
97
- // unified -> spot
98
- addAccountTransferAddress({
99
- terminal,
100
- account_id: UNIFIED_ACCOUNT_ID,
101
- network_id: SPOT_UNIFIED_NETWORK_ID,
102
- currency: 'USDT',
103
- address: `spot`,
104
- onApply: {
105
- INIT: async (order) => {
106
- const transferResult = await postAssetTransfer(credential, {
107
- type: 'PORTFOLIO_MARGIN_MAIN',
108
- asset: 'USDT',
109
- amount: order.current_amount,
110
- });
111
- if (isApiError(transferResult)) {
112
- return { state: 'INIT', message: transferResult.msg };
113
- }
114
- return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };
115
- },
116
- },
117
- onEval: async (order) => {
118
- return { state: 'COMPLETE', received_amount: order.current_amount };
119
- },
120
- });
121
- const subAccountsResult = await getSubAccountList(credential);
122
- const isMain = !isApiError(subAccountsResult);
123
- // main -> sub
124
- // TODO...
125
- // blockchain
126
- if (isMain) {
127
- const depositAddressResult = await getDepositAddress(credential, { coin: 'USDT', network: 'TRX' });
128
- addAccountTransferAddress({
129
- terminal,
130
- account_id: SPOT_ACCOUNT_ID,
131
- network_id: 'TRC20',
132
- currency: 'USDT',
133
- address: depositAddressResult.address,
134
- onApply: {
135
- INIT: async (order) => {
136
- const transferResult = await postWithdraw(credential, {
137
- coin: 'USDT',
138
- network: 'TRX',
139
- address: order.current_rx_address,
140
- amount: order.current_amount,
141
- });
142
- if (isApiError(transferResult)) {
143
- return { state: 'ERROR', message: transferResult.msg };
144
- }
145
- const wdId = transferResult.id;
146
- return { state: 'PENDING', context: wdId };
147
- },
148
- PENDING: async (order) => {
149
- const wdId = order.current_tx_context;
150
- const withdrawResult = await getWithdrawHistory(credential, { coin: 'USDT' });
151
- const record = withdrawResult === null || withdrawResult === void 0 ? void 0 : withdrawResult.find((v) => v.id === wdId);
152
- const txId = record === null || record === void 0 ? void 0 : record.txId;
153
- if (!txId) {
154
- return { state: 'PENDING', context: wdId };
155
- }
156
- return { state: 'COMPLETE', transaction_id: txId };
157
- },
158
- },
159
- onEval: async (order) => {
160
- var _a;
161
- const checkResult = await getDepositHistory(credential, {
162
- coin: 'USDT',
163
- txId: order.current_transaction_id,
164
- });
165
- if (((_a = checkResult === null || checkResult === void 0 ? void 0 : checkResult[0]) === null || _a === void 0 ? void 0 : _a.status) !== 1) {
166
- return { state: 'PENDING' };
167
- }
168
- const received_amount = +checkResult[0].amount;
169
- return { state: 'COMPLETE', received_amount };
170
- },
171
- });
172
- }
173
- }
174
- // order related
175
- {
176
- providePendingOrdersService(terminal, UNIFIED_ACCOUNT_ID, async () => listOrders(credential, UNIFIED_ACCOUNT_ID), { auto_refresh_interval: 1000 });
177
- terminal.server.provideService('SubmitOrder', {
178
- required: ['account_id'],
179
- properties: {
180
- account_id: { const: UNIFIED_ACCOUNT_ID },
181
- },
182
- }, async (msg) => {
183
- return { res: { code: 0, message: 'OK', order_id: await submitOrder(credential, msg.req) } };
184
- });
185
- }
186
- {
187
- terminal.server.provideService('CancelOrder', {
188
- required: ['account_id', 'order_id', 'product_id'],
189
- properties: {
190
- account_id: { const: UNIFIED_ACCOUNT_ID },
191
- },
192
- }, async (msg) => {
193
- return { res: { code: 0, message: 'OK', data: await cancelOrder(credential, msg.req) } };
194
- });
195
- }
196
- })();
197
- }
1
+ "use strict";
2
+ // import { Terminal } from '@yuants/protocol';
3
+ // import { addAccountTransferAddress } from '@yuants/transfer';
4
+ // import { getDefaultCredential, isApiError } from './api/client';
5
+ // import {
6
+ // getDepositAddress,
7
+ // getDepositHistory,
8
+ // getSpotAccountInfo,
9
+ // getSubAccountList,
10
+ // getWithdrawHistory,
11
+ // postAssetTransfer,
12
+ // postWithdraw,
13
+ // } from './api/private-api';
14
+ // const terminal = Terminal.fromNodeEnv();
15
+ // const isPublicOnly = process.env.PUBLIC_ONLY === 'true';
16
+ // // provideTicks(terminal, 'binance', (product_id) => {
17
+ // // const [instType, symbol] = decodePath(product_id);
18
+ // // if (instType === 'usdt-future') {
19
+ // // return combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(
20
+ // // combineLatestWith(defer(() => getOpenInterest(symbol))),
21
+ // // map(([[mapSymbolToFuturePremiumIndex, mapSymbolToFutureBookTicker], openInterestVolume]): ITick => {
22
+ // // const premiumIndex = mapSymbolToFuturePremiumIndex.get(symbol);
23
+ // // const bookTicker = mapSymbolToFutureBookTicker.get(symbol);
24
+ // // if (!premiumIndex) {
25
+ // // throw new Error(`Premium Index Not Found: ${symbol}`);
26
+ // // }
27
+ // // if (!bookTicker) {
28
+ // // throw new Error(`Book Ticker Not Found: ${symbol}`);
29
+ // // }
30
+ // // return {
31
+ // // datasource_id: 'binance',
32
+ // // product_id,
33
+ // // updated_at: Date.now(),
34
+ // // price: +premiumIndex.markPrice,
35
+ // // ask: +bookTicker.askPrice,
36
+ // // bid: +bookTicker.bidPrice,
37
+ // // interest_rate_for_long: -+premiumIndex.lastFundingRate,
38
+ // // interest_rate_for_short: +premiumIndex.lastFundingRate,
39
+ // // settlement_scheduled_at: premiumIndex.nextFundingTime,
40
+ // // open_interest: openInterestVolume,
41
+ // // };
42
+ // // }),
43
+ // // );
44
+ // // }
45
+ // // return EMPTY;
46
+ // // });
47
+ // if (isPublicOnly) {
48
+ // console.info('PUBLIC_ONLY=1, skip Binance legacy services');
49
+ // } else {
50
+ // const credential = getDefaultCredential();
51
+ // (async () => {
52
+ // const spotAccountInfo = await getSpotAccountInfo(credential);
53
+ // if (isApiError(spotAccountInfo)) {
54
+ // throw new Error(spotAccountInfo.msg);
55
+ // }
56
+ // const uid = spotAccountInfo.uid;
57
+ // const SPOT_ACCOUNT_ID = `binance/${uid}/spot/usdt`;
58
+ // const UNIFIED_ACCOUNT_ID = `binance/${uid}/unified/usdt`;
59
+ // // transfer
60
+ // {
61
+ // // spot -> unified
62
+ // const SPOT_UNIFIED_NETWORK_ID = `binance/${uid}/spot/unified`;
63
+ // addAccountTransferAddress({
64
+ // terminal,
65
+ // account_id: SPOT_ACCOUNT_ID,
66
+ // network_id: SPOT_UNIFIED_NETWORK_ID,
67
+ // currency: 'USDT',
68
+ // address: `unified`,
69
+ // onApply: {
70
+ // INIT: async (order) => {
71
+ // const transferResult = await postAssetTransfer(credential, {
72
+ // type: 'MAIN_PORTFOLIO_MARGIN',
73
+ // asset: 'USDT',
74
+ // amount: order.current_amount!,
75
+ // });
76
+ // if (isApiError(transferResult)) {
77
+ // return { state: 'INIT', message: transferResult.msg };
78
+ // }
79
+ // return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };
80
+ // },
81
+ // },
82
+ // onEval: async (order) => {
83
+ // return { state: 'COMPLETE', received_amount: order.current_amount };
84
+ // },
85
+ // });
86
+ // // unified -> spot
87
+ // addAccountTransferAddress({
88
+ // terminal,
89
+ // account_id: UNIFIED_ACCOUNT_ID,
90
+ // network_id: SPOT_UNIFIED_NETWORK_ID,
91
+ // currency: 'USDT',
92
+ // address: `spot`,
93
+ // onApply: {
94
+ // INIT: async (order) => {
95
+ // const transferResult = await postAssetTransfer(credential, {
96
+ // type: 'PORTFOLIO_MARGIN_MAIN',
97
+ // asset: 'USDT',
98
+ // amount: order.current_amount!,
99
+ // });
100
+ // if (isApiError(transferResult)) {
101
+ // return { state: 'INIT', message: transferResult.msg };
102
+ // }
103
+ // return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };
104
+ // },
105
+ // },
106
+ // onEval: async (order) => {
107
+ // return { state: 'COMPLETE', received_amount: order.current_amount };
108
+ // },
109
+ // });
110
+ // const subAccountsResult = await getSubAccountList(credential);
111
+ // const isMain = !isApiError(subAccountsResult);
112
+ // // main -> sub
113
+ // // TODO...
114
+ // // blockchain
115
+ // if (isMain) {
116
+ // const depositAddressResult = await getDepositAddress(credential, { coin: 'USDT', network: 'TRX' });
117
+ // addAccountTransferAddress({
118
+ // terminal,
119
+ // account_id: SPOT_ACCOUNT_ID,
120
+ // network_id: 'TRC20',
121
+ // currency: 'USDT',
122
+ // address: depositAddressResult.address,
123
+ // onApply: {
124
+ // INIT: async (order) => {
125
+ // const transferResult = await postWithdraw(credential, {
126
+ // coin: 'USDT',
127
+ // network: 'TRX',
128
+ // address: order.current_rx_address!,
129
+ // amount: order.current_amount!,
130
+ // });
131
+ // if (isApiError(transferResult)) {
132
+ // return { state: 'ERROR', message: transferResult.msg };
133
+ // }
134
+ // const wdId = transferResult.id;
135
+ // return { state: 'PENDING', context: wdId };
136
+ // },
137
+ // PENDING: async (order) => {
138
+ // const wdId = order.current_tx_context;
139
+ // const withdrawResult = await getWithdrawHistory(credential, { coin: 'USDT' });
140
+ // const record = withdrawResult?.find((v) => v.id === wdId);
141
+ // const txId = record?.txId;
142
+ // if (!txId) {
143
+ // return { state: 'PENDING', context: wdId };
144
+ // }
145
+ // return { state: 'COMPLETE', transaction_id: txId };
146
+ // },
147
+ // },
148
+ // onEval: async (order) => {
149
+ // const checkResult = await getDepositHistory(credential, {
150
+ // coin: 'USDT',
151
+ // txId: order.current_transaction_id,
152
+ // });
153
+ // if (checkResult?.[0]?.status !== 1) {
154
+ // return { state: 'PENDING' };
155
+ // }
156
+ // const received_amount = +checkResult[0].amount;
157
+ // return { state: 'COMPLETE', received_amount };
158
+ // },
159
+ // });
160
+ // }
161
+ // }
162
+ // })();
163
+ // }
198
164
  //# sourceMappingURL=legacy_index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"legacy_index.js","sourceRoot":"","sources":["../src/legacy_index.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 { addAccountTransferAddress } from '@yuants/transfer';\nimport { getDefaultCredential, isApiError } from './api/client';\nimport {\n getDepositAddress,\n getDepositHistory,\n getSpotAccountInfo,\n getSubAccountList,\n getWithdrawHistory,\n postAssetTransfer,\n postWithdraw,\n} from './api/private-api';\nimport { getSpotAccountInfoSnapshot } from './services/accounts/spot';\nimport { getUnifiedAccountInfo } from './services/accounts/unified';\nimport { cancelOrder } from './services/orders/cancelOrder';\nimport { listOrders } from './services/orders/listOrders';\nimport { submitOrder } from './services/orders/submitOrder';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst isPublicOnly = process.env.PUBLIC_ONLY === 'true';\n\n// provideTicks(terminal, 'binance', (product_id) => {\n// const [instType, symbol] = decodePath(product_id);\n// if (instType === 'usdt-future') {\n// return combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(\n// combineLatestWith(defer(() => getOpenInterest(symbol))),\n// map(([[mapSymbolToFuturePremiumIndex, mapSymbolToFutureBookTicker], openInterestVolume]): ITick => {\n// const premiumIndex = mapSymbolToFuturePremiumIndex.get(symbol);\n// const bookTicker = mapSymbolToFutureBookTicker.get(symbol);\n// if (!premiumIndex) {\n// throw new Error(`Premium Index Not Found: ${symbol}`);\n// }\n// if (!bookTicker) {\n// throw new Error(`Book Ticker Not Found: ${symbol}`);\n// }\n// return {\n// datasource_id: 'binance',\n// product_id,\n// updated_at: Date.now(),\n// price: +premiumIndex.markPrice,\n// ask: +bookTicker.askPrice,\n// bid: +bookTicker.bidPrice,\n// interest_rate_for_long: -+premiumIndex.lastFundingRate,\n// interest_rate_for_short: +premiumIndex.lastFundingRate,\n// settlement_scheduled_at: premiumIndex.nextFundingTime,\n// open_interest: openInterestVolume,\n// };\n// }),\n// );\n// }\n// return EMPTY;\n// });\n\nif (isPublicOnly) {\n console.info('PUBLIC_ONLY=1, skip Binance legacy services');\n} else {\n const credential = getDefaultCredential();\n (async () => {\n const spotAccountInfo = await getSpotAccountInfo(credential);\n if (isApiError(spotAccountInfo)) {\n throw new Error(spotAccountInfo.msg);\n }\n const uid = spotAccountInfo.uid;\n\n const SPOT_ACCOUNT_ID = `binance/${uid}/spot/usdt`;\n const UNIFIED_ACCOUNT_ID = `binance/${uid}/unified/usdt`;\n\n {\n // unified accountInfo\n\n provideAccountInfoService(\n terminal,\n UNIFIED_ACCOUNT_ID,\n async () => getUnifiedAccountInfo(credential, UNIFIED_ACCOUNT_ID),\n { auto_refresh_interval: 1000 },\n );\n\n addAccountMarket(terminal, { account_id: UNIFIED_ACCOUNT_ID, market_id: 'BINANCE/UNIFIED' });\n }\n\n {\n // spot account info\n\n provideAccountInfoService(\n terminal,\n SPOT_ACCOUNT_ID,\n async () => getSpotAccountInfoSnapshot(credential, SPOT_ACCOUNT_ID),\n {\n auto_refresh_interval: 5_000,\n },\n );\n\n addAccountMarket(terminal, { account_id: SPOT_ACCOUNT_ID, market_id: 'BINANCE/SPOT' });\n }\n\n // transfer\n {\n // spot -> unified\n const SPOT_UNIFIED_NETWORK_ID = `binance/${uid}/spot/unified`;\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n network_id: SPOT_UNIFIED_NETWORK_ID,\n currency: 'USDT',\n address: `unified`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: 'MAIN_PORTFOLIO_MARGIN',\n asset: 'USDT',\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n },\n },\n onEval: async (order) => {\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n\n // unified -> spot\n addAccountTransferAddress({\n terminal,\n account_id: UNIFIED_ACCOUNT_ID,\n network_id: SPOT_UNIFIED_NETWORK_ID,\n currency: 'USDT',\n address: `spot`,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postAssetTransfer(credential, {\n type: 'PORTFOLIO_MARGIN_MAIN',\n asset: 'USDT',\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'INIT', message: transferResult.msg };\n }\n return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n },\n },\n onEval: async (order) => {\n return { state: 'COMPLETE', received_amount: order.current_amount };\n },\n });\n\n const subAccountsResult = await getSubAccountList(credential);\n const isMain = !isApiError(subAccountsResult);\n // main -> sub\n // TODO...\n\n // blockchain\n if (isMain) {\n const depositAddressResult = await getDepositAddress(credential, { coin: 'USDT', network: 'TRX' });\n addAccountTransferAddress({\n terminal,\n account_id: SPOT_ACCOUNT_ID,\n network_id: 'TRC20',\n currency: 'USDT',\n address: depositAddressResult.address,\n onApply: {\n INIT: async (order) => {\n const transferResult = await postWithdraw(credential, {\n coin: 'USDT',\n network: 'TRX',\n address: order.current_rx_address!,\n amount: order.current_amount!,\n });\n if (isApiError(transferResult)) {\n return { state: 'ERROR', message: transferResult.msg };\n }\n const wdId = transferResult.id;\n return { state: 'PENDING', context: wdId };\n },\n PENDING: async (order) => {\n const wdId = order.current_tx_context;\n const withdrawResult = await getWithdrawHistory(credential, { coin: 'USDT' });\n const record = withdrawResult?.find((v) => v.id === wdId);\n const txId = record?.txId;\n if (!txId) {\n return { state: 'PENDING', context: wdId };\n }\n return { state: 'COMPLETE', transaction_id: txId };\n },\n },\n onEval: async (order) => {\n const checkResult = await getDepositHistory(credential, {\n coin: 'USDT',\n txId: order.current_transaction_id,\n });\n if (checkResult?.[0]?.status !== 1) {\n return { state: 'PENDING' };\n }\n const received_amount = +checkResult[0].amount;\n return { state: 'COMPLETE', received_amount };\n },\n });\n }\n }\n\n // order related\n {\n providePendingOrdersService(\n terminal,\n UNIFIED_ACCOUNT_ID,\n async () => listOrders(credential, UNIFIED_ACCOUNT_ID),\n { auto_refresh_interval: 1000 },\n );\n\n terminal.server.provideService<IOrder>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: UNIFIED_ACCOUNT_ID },\n },\n },\n async (msg) => {\n return { res: { code: 0, message: 'OK', order_id: await submitOrder(credential, msg.req) } };\n },\n );\n }\n\n {\n terminal.server.provideService<IOrder>(\n 'CancelOrder',\n {\n required: ['account_id', 'order_id', 'product_id'],\n properties: {\n account_id: { const: UNIFIED_ACCOUNT_ID },\n },\n },\n async (msg) => {\n return { res: { code: 0, message: 'OK', data: await cancelOrder(credential, msg.req) } };\n },\n );\n }\n })();\n}\n"]}
1
+ {"version":3,"file":"legacy_index.js","sourceRoot":"","sources":["../src/legacy_index.ts"],"names":[],"mappings":"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","sourcesContent":["// import { Terminal } from '@yuants/protocol';\n// import { addAccountTransferAddress } from '@yuants/transfer';\n// import { getDefaultCredential, isApiError } from './api/client';\n// import {\n// getDepositAddress,\n// getDepositHistory,\n// getSpotAccountInfo,\n// getSubAccountList,\n// getWithdrawHistory,\n// postAssetTransfer,\n// postWithdraw,\n// } from './api/private-api';\n\n// const terminal = Terminal.fromNodeEnv();\n\n// const isPublicOnly = process.env.PUBLIC_ONLY === 'true';\n\n// // provideTicks(terminal, 'binance', (product_id) => {\n// // const [instType, symbol] = decodePath(product_id);\n// // if (instType === 'usdt-future') {\n// // return combineLatest([mapSymbolToFuturePremiumIndex$, mapSymbolToFutureBookTicker$]).pipe(\n// // combineLatestWith(defer(() => getOpenInterest(symbol))),\n// // map(([[mapSymbolToFuturePremiumIndex, mapSymbolToFutureBookTicker], openInterestVolume]): ITick => {\n// // const premiumIndex = mapSymbolToFuturePremiumIndex.get(symbol);\n// // const bookTicker = mapSymbolToFutureBookTicker.get(symbol);\n// // if (!premiumIndex) {\n// // throw new Error(`Premium Index Not Found: ${symbol}`);\n// // }\n// // if (!bookTicker) {\n// // throw new Error(`Book Ticker Not Found: ${symbol}`);\n// // }\n// // return {\n// // datasource_id: 'binance',\n// // product_id,\n// // updated_at: Date.now(),\n// // price: +premiumIndex.markPrice,\n// // ask: +bookTicker.askPrice,\n// // bid: +bookTicker.bidPrice,\n// // interest_rate_for_long: -+premiumIndex.lastFundingRate,\n// // interest_rate_for_short: +premiumIndex.lastFundingRate,\n// // settlement_scheduled_at: premiumIndex.nextFundingTime,\n// // open_interest: openInterestVolume,\n// // };\n// // }),\n// // );\n// // }\n// // return EMPTY;\n// // });\n\n// if (isPublicOnly) {\n// console.info('PUBLIC_ONLY=1, skip Binance legacy services');\n// } else {\n// const credential = getDefaultCredential();\n// (async () => {\n// const spotAccountInfo = await getSpotAccountInfo(credential);\n// if (isApiError(spotAccountInfo)) {\n// throw new Error(spotAccountInfo.msg);\n// }\n// const uid = spotAccountInfo.uid;\n\n// const SPOT_ACCOUNT_ID = `binance/${uid}/spot/usdt`;\n// const UNIFIED_ACCOUNT_ID = `binance/${uid}/unified/usdt`;\n\n// // transfer\n// {\n// // spot -> unified\n// const SPOT_UNIFIED_NETWORK_ID = `binance/${uid}/spot/unified`;\n// addAccountTransferAddress({\n// terminal,\n// account_id: SPOT_ACCOUNT_ID,\n// network_id: SPOT_UNIFIED_NETWORK_ID,\n// currency: 'USDT',\n// address: `unified`,\n// onApply: {\n// INIT: async (order) => {\n// const transferResult = await postAssetTransfer(credential, {\n// type: 'MAIN_PORTFOLIO_MARGIN',\n// asset: 'USDT',\n// amount: order.current_amount!,\n// });\n// if (isApiError(transferResult)) {\n// return { state: 'INIT', message: transferResult.msg };\n// }\n// return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n// },\n// },\n// onEval: async (order) => {\n// return { state: 'COMPLETE', received_amount: order.current_amount };\n// },\n// });\n\n// // unified -> spot\n// addAccountTransferAddress({\n// terminal,\n// account_id: UNIFIED_ACCOUNT_ID,\n// network_id: SPOT_UNIFIED_NETWORK_ID,\n// currency: 'USDT',\n// address: `spot`,\n// onApply: {\n// INIT: async (order) => {\n// const transferResult = await postAssetTransfer(credential, {\n// type: 'PORTFOLIO_MARGIN_MAIN',\n// asset: 'USDT',\n// amount: order.current_amount!,\n// });\n// if (isApiError(transferResult)) {\n// return { state: 'INIT', message: transferResult.msg };\n// }\n// return { state: 'COMPLETE', transaction_id: '' + transferResult.tranId };\n// },\n// },\n// onEval: async (order) => {\n// return { state: 'COMPLETE', received_amount: order.current_amount };\n// },\n// });\n\n// const subAccountsResult = await getSubAccountList(credential);\n// const isMain = !isApiError(subAccountsResult);\n// // main -> sub\n// // TODO...\n\n// // blockchain\n// if (isMain) {\n// const depositAddressResult = await getDepositAddress(credential, { coin: 'USDT', network: 'TRX' });\n// addAccountTransferAddress({\n// terminal,\n// account_id: SPOT_ACCOUNT_ID,\n// network_id: 'TRC20',\n// currency: 'USDT',\n// address: depositAddressResult.address,\n// onApply: {\n// INIT: async (order) => {\n// const transferResult = await postWithdraw(credential, {\n// coin: 'USDT',\n// network: 'TRX',\n// address: order.current_rx_address!,\n// amount: order.current_amount!,\n// });\n// if (isApiError(transferResult)) {\n// return { state: 'ERROR', message: transferResult.msg };\n// }\n// const wdId = transferResult.id;\n// return { state: 'PENDING', context: wdId };\n// },\n// PENDING: async (order) => {\n// const wdId = order.current_tx_context;\n// const withdrawResult = await getWithdrawHistory(credential, { coin: 'USDT' });\n// const record = withdrawResult?.find((v) => v.id === wdId);\n// const txId = record?.txId;\n// if (!txId) {\n// return { state: 'PENDING', context: wdId };\n// }\n// return { state: 'COMPLETE', transaction_id: txId };\n// },\n// },\n// onEval: async (order) => {\n// const checkResult = await getDepositHistory(credential, {\n// coin: 'USDT',\n// txId: order.current_transaction_id,\n// });\n// if (checkResult?.[0]?.status !== 1) {\n// return { state: 'PENDING' };\n// }\n// const received_amount = +checkResult[0].amount;\n// return { state: 'COMPLETE', received_amount };\n// },\n// });\n// }\n// }\n// })();\n// }\n"]}