strategy-tools 1.0.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 (44) hide show
  1. package/README.md +2 -0
  2. package/__mocks__/jose.js +17 -0
  3. package/dist/Signer.d.ts +4 -0
  4. package/dist/Signer.js +3 -0
  5. package/dist/Signer.js.map +1 -0
  6. package/dist/binance/BinanceApiSigner.d.ts +6 -0
  7. package/dist/binance/BinanceApiSigner.js +20 -0
  8. package/dist/binance/BinanceApiSigner.js.map +1 -0
  9. package/dist/binance/BinanceConnection.d.ts +21 -0
  10. package/dist/binance/BinanceConnection.js +77 -0
  11. package/dist/binance/BinanceConnection.js.map +1 -0
  12. package/dist/binance/BinanceSapiSigner.d.ts +6 -0
  13. package/dist/binance/BinanceSapiSigner.js +22 -0
  14. package/dist/binance/BinanceSapiSigner.js.map +1 -0
  15. package/dist/binance/BinanceTypes.d.ts +159 -0
  16. package/dist/binance/BinanceTypes.js +44 -0
  17. package/dist/binance/BinanceTypes.js.map +1 -0
  18. package/dist/binance/connection/BinanceOperationConnection.d.ts +121 -0
  19. package/dist/binance/connection/BinanceOperationConnection.js +83 -0
  20. package/dist/binance/connection/BinanceOperationConnection.js.map +1 -0
  21. package/dist/binance/connection/BinanceRfqConnection.d.ts +2 -0
  22. package/dist/binance/connection/BinanceRfqConnection.js +7 -0
  23. package/dist/binance/connection/BinanceRfqConnection.js.map +1 -0
  24. package/dist/cetus/CetusStrategyApiConnection.d.ts +25 -0
  25. package/dist/cetus/CetusStrategyApiConnection.js +22 -0
  26. package/dist/cetus/CetusStrategyApiConnection.js.map +1 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.js +20 -0
  29. package/dist/index.js.map +1 -0
  30. package/jest.config.js +19 -0
  31. package/package.json +44 -0
  32. package/src/Signer.ts +4 -0
  33. package/src/binance/BinanceApiSigner.ts +20 -0
  34. package/src/binance/BinanceConnection.ts +86 -0
  35. package/src/binance/BinanceSapiSigner.ts +21 -0
  36. package/src/binance/BinanceTypes.ts +168 -0
  37. package/src/binance/connection/BinanceOperationConnection.ts +122 -0
  38. package/src/binance/connection/BinanceRfqConnection.ts +1 -0
  39. package/src/cetus/CetusStrategyApiConnection.ts +30 -0
  40. package/src/index.ts +6 -0
  41. package/test/binance/BinanceOperationConnection.test.ts +73 -0
  42. package/test/binance/BinanceSigner.test.ts +45 -0
  43. package/test/cetus/CetusStrategyApiConnection.test.ts +27 -0
  44. package/tsconfig.json +23 -0
@@ -0,0 +1,73 @@
1
+ import { BinanceOperationConnection, BinanceAccountResponse, BinanceOrderSide, BinanceOrderType, BinanceTimeInForce, BinanceOrder, BinanceOrderStatus } from "../../dist";
2
+ import 'dotenv/config';
3
+
4
+ const BINANCE_SECRET_KEY = process.env.BINANCE_SECRET_KEY || "";
5
+ const BINANCE_PRIVATE_KEY = process.env.BINANCE_PRIVATE_KEY || "";
6
+ const BINANCE_BASE_URL = process.env.BINANCE_BASE_URL || "";
7
+ const SUBACCOUNT_TO_EMAIL = process.env.SUBACCOUNT_TO_EMAIL || "";
8
+
9
+ describe('testing Binance Signer', () => {
10
+ const connection = new BinanceOperationConnection({
11
+ baseUrl: BINANCE_BASE_URL,
12
+ privateKey: BINANCE_PRIVATE_KEY,
13
+ secretKey: BINANCE_SECRET_KEY
14
+ });
15
+ var order: BinanceOrder | undefined;
16
+ test("> test GET account", async () => {
17
+ let response = await connection.getAccount({ recvWindow: 30000, omitZeroBalances: true });
18
+ //console.log("> response:", response);
19
+ expect(typeof response.accountType).toBe("string");
20
+ }, 30000);
21
+ test("> test GET book ticker", async () => {
22
+ let symbols = ["USDCUSDT", "USDTCOP"];
23
+ let response = await connection.getBookTicker(symbols);
24
+ //console.log("> response:", response);
25
+ expect(response.length).toBe(symbols.length);
26
+ for (let i = 0; i < symbols.length; i++) {
27
+ expect(response[i]).toBeDefined();
28
+ expect(response[i].symbol).toBe(symbols[i]);
29
+ }
30
+ }, 30000);
31
+ test("> test POST order", async () => {
32
+ let tickers = await connection.getBookTicker(["USDTCOP"]);
33
+ order = await connection.createOrder({
34
+ symbol: 'USDTCOP',
35
+ side: BinanceOrderSide.SELL,
36
+ type: BinanceOrderType.LIMIT,
37
+ timeInForce: BinanceTimeInForce.GOOD_TILL_CANCELED,
38
+ price: tickers[0].askPrice,
39
+ quantity: 10,
40
+ recvWindow: 30000
41
+ });
42
+ console.log("> order:", order);
43
+ }, 30000);
44
+ test("> test GET open orders", async () => {
45
+ let orders = await connection.getOpenOrders({ recvWindow: 30000 });
46
+ console.log("> open orders:", orders);
47
+ for (let order of orders)
48
+ expect(order.status).not.toBe(BinanceOrderStatus.CANCELED);
49
+ }, 30000);
50
+ test("> test DELETE order", async () => {
51
+ if (order) {
52
+ let response = await connection.cancelOrder({ orderId: order.orderId, symbol: order.symbol, recvWindow: 30000 });
53
+ console.log("> cancel order response:", response);
54
+ expect(response.status).toBe(BinanceOrderStatus.CANCELED);
55
+ }
56
+ }, 30000);
57
+ test("> test POST transfer to subaccount of the same master", async () => {
58
+ try {
59
+ let account = await connection.getAccount({ recvWindow: 30000 });
60
+ for (let balance of account.balances)
61
+ if (balance.asset === 'COP') {
62
+ console.log("> balance to transfer:", balance);
63
+ let response = await connection.transferToSubaccountOfSameMaster({
64
+ amount: balance.free,
65
+ asset: balance.asset,
66
+ toEmail: SUBACCOUNT_TO_EMAIL,
67
+ recvWindow: 30000
68
+ });
69
+ console.log("> response:", response);
70
+ }
71
+ } catch (err) { console.log("> error:", err); }
72
+ }, 90000);
73
+ });
@@ -0,0 +1,45 @@
1
+ import { BinanceOrderSide, BinanceParams, BinanceApiSigner } from "../../dist";
2
+ const { KJUR, hextob64 } = require('jsrsasign');
3
+
4
+ const PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDBZYTY8h87zTnN\npXLY8aFyQKyqtPLgLGVNz8kft4MzCSHRc956oakGPAgkqREUeYePsOgqvLkobv/c\nbXCfLK2g+7VzSewdJngDAibhm4/vHPUQZWMJQdEj1/HvWoUDnDaEWdxmzJ7cYHqU\nJm/QWKfGe0h/XTnwfmm+EoEjgpH3POCVTIhIe44xc/IawB8QgtfWtdcqDuVaVPG1\nV9a8wOBWUEnbg8tMVLk2q7fLQuQAeCJ5tthTHBvxnWJN+W3BAKnvAyp3PGHLD7sc\nHSbEJGqgY/3OpPySrn223STAJKO/VbOoaMGpC40gfEzvIqXzdiY28OpR2iIjVzXu\nxourugl9AgMBAAECggEABUBP7KIaZgHLDYHuDeT1uMf3yETUiXC7KXM4Z1OQzOx1\nDh5izpqgH8q2f+RVUeSA4U5w52QrdOUarm4MTk4kwsfC5AgAUMRQIujGjH6wWFJF\ndzYBi+lNF/ePmquvC+uMcWiNOv9YWuyFt4sZoyMdHx8O12J9JcIQ9ffDqOatNvTU\noE0+ZsgkMNZI2g6aMk4c8h9UC/kK1e7/Ob1qjPawUvHlRtgbzKhv5ACj05RsK6gm\nOisaIzIZY6R6y7QqDjQcmthIVE8dFGCduAELExK/s05IHHWCfb8hOeTPJfjgRZ2E\nThKy7omWumJD7B6c55Jw26+p2iOSOKQzo0yHis0zkwKBgQDi+N4+9h0RjSe/Tv/v\n0Q6TA2Ei32+eQlKOpee2hVWB8j+Ss1vlwq0e94Dp7BfE9Ip+sg9kMvczpG2sm1lU\nN5RSzs9TQHp+rQnJffYtkcN+6Dd/4pkOP7UsSexf9/858B7xaSRxW1QQNEN3Zlax\nOlB6yWhCC0Osy6EKtgqMElXvLwKBgQDaIWByUX/wPKZMyRiM6hmsJ88/ywFGO+03\nb7t3jqLt8c7wc2lVIp3QIZl1JmpiSj7wDWEPz9X81rxqEpYQa7EiHpB2PRhvdGIl\nB9oj+oOfrmTTRMqNr1ClOJH1XcH4ctBXau2Qpa8/7gVui/ThfcFD1HaGfzU6i4Mz\ntZTRu2EHEwKBgCbgC2jrTJVKAQnSZSHVQ9LIXGXVsU+A+pT2M5behYPJUzw0PkQ/\nMNnB+LGYP4X7gJEsvFgkJpUQz7wlq4oyLtR0GayfuZti1e9OBNFPSxW8fm0ICcEY\nBlb8nmDdoDhzOUmOAbDsvJw952RXAfg/DbPKNXJCbaf2BLJJ9cqCBXf/AoGAdxeD\n9cZDaKFkVkXwzna9n314rKakQnlTcVHic0r/75N23VbVqnKk4M6HXyujJ5jLtfpI\nBP7/IPUIl40gO0Tgx/USAEwo/Cj5sKgR1FTg6hyn1aUYRbTy/dHd9q3Cyme9Eg1C\nORgMj4Xfl1R4VWh4TRVBxPrMz/L9pgy8fKmmNtsCgYA2QODa38wUkXUc/UiITHG7\nK55+oDy4PYGXt/IxcFe9O9Jac20HweecqI7WufCidRwXNo0veFV4sNhwR/vEV8xd\nSSbNPEx6yyRaLGQk9PjDb/Q7R6ujoUkyc3JIdhpHvNv4Dg8d9CvKhfpWO1O99aTL\nOYlYvFINXEfNvjaDvIWyGQ==\n-----END PRIVATE KEY-----";
5
+
6
+ describe('testing Binance Signer', () => {
7
+ const binanceApiSigner = new BinanceApiSigner();
8
+ test("> test GET params", async () => {
9
+ const params: BinanceParams = {
10
+ quoteId: "9131bdc6cd264542aeb572ecea2113f1",
11
+ timestamp: Date.now()
12
+ };
13
+ const queryString = `quoteId=${params.quoteId}&timestamp=${params.timestamp}`;
14
+
15
+ const signer = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
16
+ signer.init(PRIVATE_KEY);
17
+ signer.updateString(queryString);
18
+ const signatureHex = signer.sign();
19
+ const signature = hextob64(signatureHex);
20
+
21
+ const encodedSignature = encodeURIComponent(signature);
22
+ expect(binanceApiSigner.sign(params, PRIVATE_KEY)).toMatch(encodedSignature);
23
+ });
24
+ test("> test POST params", async () => {
25
+ const params: BinanceParams = {
26
+ rfqId: "a98d77089cec4d55a918ae20a6994747",
27
+ baseAsset: 'USDC',
28
+ quoteAsset: 'USDT',
29
+ side: BinanceOrderSide.SELL,
30
+ quantity: 1,
31
+ price: 1.1,
32
+ settleTime: 5000,
33
+ timestamp: Date.now()
34
+ };
35
+ const queryString = new URLSearchParams(params as URLSearchParams).toString();
36
+ const signer = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
37
+ signer.init(PRIVATE_KEY);
38
+ signer.updateString(queryString);
39
+ const signatureHex = signer.sign();
40
+ const signature = hextob64(signatureHex);
41
+
42
+ const encodedSignature = encodeURIComponent(signature);
43
+ expect(binanceApiSigner.sign(params, PRIVATE_KEY)).toMatch(encodedSignature);
44
+ });
45
+ });
@@ -0,0 +1,27 @@
1
+ import { CetusStrategy, CetusStrategyApiConnection } from "../../dist";
2
+
3
+ const API_URL = "https://api.cetus.mcvc.ai";
4
+ const PUBLIC_KEY = "24df533e3b1ffa697bb98201ca7eeb9c6a25b0d5322b3817280fd78ac61f499b";
5
+ const SECRET_KEY = "WFCbWEDq4hJLrVjYZAOVWZlZou+Wly6Zpn9IR1DCoQzG4uireyxuYbqZeIj1JmLbbehzth+wIXU0Trve54fI1Q==";
6
+ const SIGN_KEY = "EYox9cKS3ZPk5KC6zGXYrxjOS9g5S21ik7CHcKtuip6cuhtsNYKM6kSrWH5R7d4qGTB07M/S1V7QC9G6VHyJRA==";
7
+
8
+ describe('testing Binance Signer', () => {
9
+ const connection = new CetusStrategyApiConnection(API_URL, { publicKey: PUBLIC_KEY, secretKey: SECRET_KEY, signKey: SIGN_KEY });
10
+ var strategy: CetusStrategy;
11
+ test("> test GET Strategies", async () => {
12
+ try {
13
+ let strategies = await connection.getStrategies({ name: "CMA Streamer", pair: "USDCOP", account: "CETUS" });
14
+ for (let strategy of strategies) {
15
+ console.log("> strategy:", strategy);
16
+ expect(strategy.id).toBeGreaterThan(0);
17
+ expect(strategy.name).toBe("CMA Streamer");
18
+ expect(strategy.account).toBe("CETUS");
19
+ expect(strategy.pair).toBe("USDCOP");
20
+ }
21
+ strategy = strategies[0];
22
+ } catch (err: any) { console.log("> err:", err.response); }
23
+ });
24
+ /*test("> test PUT strategies", async () => {
25
+
26
+ });*/
27
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "nodenext",
4
+ "target": "esnext",
5
+ "declaration": true,
6
+ "moduleResolution": "nodenext",
7
+ "sourceMap": true,
8
+ "emitDecoratorMetadata": true,
9
+ "experimentalDecorators": true,
10
+ "outDir": "./dist",
11
+ "rootDir": "./src",
12
+ "allowJs": false,
13
+ "strict": true,
14
+ "esModuleInterop": true,
15
+ },
16
+ "include": [
17
+ "src/**/*.ts"
18
+ ],
19
+ "exclude": [
20
+ "node_modules",
21
+ "**/*.spec.ts"
22
+ ]
23
+ }