@dydxprotocol/v4-client-js 1.16.3 → 1.18.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 (118) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/build/examples/constants.d.ts +1 -0
  3. package/build/examples/constants.js +3 -2
  4. package/build/examples/permissioned_keys_example.d.ts +1 -0
  5. package/build/examples/permissioned_keys_example.js +85 -0
  6. package/build/examples/websocket_orderbook_example.d.ts +1 -0
  7. package/build/examples/websocket_orderbook_example.js +198 -0
  8. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/cosmos/bundle.d.ts +158 -158
  9. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/cosmos/bundle.js +126 -126
  10. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.lcd.d.ts +12 -0
  11. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.lcd.js +34 -0
  12. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/params.d.ts +21 -0
  13. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/params.js +37 -2
  14. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.d.ts +34 -1
  15. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.js +72 -2
  16. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.rpc.msg.d.ts +4 -1
  17. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.rpc.msg.js +7 -1
  18. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/bundle.d.ts +2021 -1711
  19. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/bundle.js +272 -266
  20. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/finalize_block.d.ts +23 -0
  21. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/finalize_block.js +64 -0
  22. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order_removals.d.ts +5 -0
  23. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order_removals.js +11 -1
  24. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.d.ts +31 -0
  25. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.js +94 -5
  26. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.lcd.d.ts +2 -1
  27. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.lcd.js +7 -1
  28. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.rpc.Query.d.ts +5 -1
  29. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.rpc.Query.js +10 -1
  30. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/streaming.d.ts +6 -1
  31. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/streaming.js +19 -2
  32. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/events/events.d.ts +79 -6
  33. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/events/events.js +78 -2
  34. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/lcd.d.ts +1 -0
  35. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/lcd.js +4 -1
  36. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/genesis.d.ts +4 -0
  37. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/genesis.js +11 -2
  38. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.lcd.d.ts +2 -1
  39. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.lcd.js +7 -1
  40. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.d.ts +39 -0
  41. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.js +72 -2
  42. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.rpc.msg.d.ts +7 -1
  43. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.rpc.msg.js +7 -1
  44. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.d.ts +25 -0
  45. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.js +64 -2
  46. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.lcd.d.ts +2 -1
  47. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.lcd.js +7 -1
  48. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.rpc.Query.d.ts +5 -1
  49. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.rpc.Query.js +10 -1
  50. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_param.d.ts +8 -0
  51. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_param.js +1 -1
  52. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_price.d.ts +3 -0
  53. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_price.js +1 -1
  54. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.d.ts +34 -0
  55. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.js +64 -2
  56. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.lcd.d.ts +2 -1
  57. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.lcd.js +7 -1
  58. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.rpc.Query.d.ts +5 -1
  59. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.rpc.Query.js +10 -1
  60. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/streaming.d.ts +23 -0
  61. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/streaming.js +81 -0
  62. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.d.ts +25 -1
  63. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.js +63 -2
  64. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.lcd.d.ts +2 -1
  65. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.lcd.js +7 -1
  66. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.rpc.Query.d.ts +5 -1
  67. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.rpc.Query.js +10 -1
  68. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/tx.rpc.msg.d.ts +1 -1
  69. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/rpc.query.d.ts +4 -0
  70. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/subaccounts/streaming.d.ts +1 -1
  71. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/subaccounts/streaming.js +5 -5
  72. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/params.d.ts +21 -0
  73. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/params.js +55 -3
  74. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.d.ts +1 -6
  75. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.js +4 -12
  76. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.lcd.d.ts +1 -2
  77. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.lcd.js +1 -13
  78. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.d.ts +51 -24
  79. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.js +98 -46
  80. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/gogoproto/bundle.js +2 -2
  81. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/google/bundle.d.ts +174 -174
  82. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/google/bundle.js +12 -12
  83. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/tendermint/bundle.d.ts +365 -365
  84. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/tendermint/bundle.js +21 -21
  85. package/build/src/clients/composite-client.d.ts +12 -3
  86. package/build/src/clients/composite-client.js +22 -8
  87. package/build/src/clients/constants.d.ts +10 -0
  88. package/build/src/clients/constants.js +17 -4
  89. package/build/src/clients/lib/registry.js +26 -22
  90. package/build/src/clients/modules/composer.d.ts +3 -0
  91. package/build/src/clients/modules/composer.js +23 -1
  92. package/build/src/clients/modules/get.d.ts +2 -0
  93. package/build/src/clients/modules/get.js +9 -1
  94. package/build/src/clients/modules/local-wallet.d.ts +4 -4
  95. package/build/src/clients/modules/local-wallet.js +3 -3
  96. package/build/src/clients/modules/post.d.ts +4 -2
  97. package/build/src/clients/modules/post.js +15 -6
  98. package/build/src/clients/modules/signer.d.ts +5 -3
  99. package/build/src/clients/modules/signer.js +53 -14
  100. package/build/src/clients/modules/utility.d.ts +7 -1
  101. package/build/src/clients/modules/utility.js +10 -1
  102. package/build/src/clients/types.d.ts +22 -0
  103. package/build/src/clients/types.js +19 -2
  104. package/build/tsconfig.tsbuildinfo +1 -1
  105. package/examples/constants.ts +2 -0
  106. package/examples/permissioned_keys_example.ts +110 -0
  107. package/examples/websocket_orderbook_example.ts +252 -0
  108. package/package.json +2 -2
  109. package/src/clients/composite-client.ts +40 -3
  110. package/src/clients/constants.ts +16 -1
  111. package/src/clients/lib/registry.ts +8 -0
  112. package/src/clients/modules/composer.ts +39 -0
  113. package/src/clients/modules/get.ts +16 -0
  114. package/src/clients/modules/local-wallet.ts +6 -6
  115. package/src/clients/modules/post.ts +44 -1
  116. package/src/clients/modules/signer.ts +79 -13
  117. package/src/clients/modules/utility.ts +16 -1
  118. package/src/clients/types.ts +25 -0
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
- ## [1.16.3](https://github.com/dydxprotocol/v4-clients/compare/v4-client-js@1.16.2...v4-client-js@1.16.3) (2025-02-06)
1
+ # [1.18.0](https://github.com/dydxprotocol/v4-clients/compare/v4-client-js@1.17.0...v4-client-js@1.18.0) (2025-02-12)
2
2
 
3
3
 
4
- ### Bug Fixes
4
+ ### Features
5
5
 
6
- * comment ([#327](https://github.com/dydxprotocol/v4-clients/issues/327)) ([fb27e35](https://github.com/dydxprotocol/v4-clients/commit/fb27e35671276f720cd5ba7e72032385e216947e))
6
+ * add crossed orderbook resolving example using websocket ([#301](https://github.com/dydxprotocol/v4-clients/issues/301)) ([88aabad](https://github.com/dydxprotocol/v4-clients/commit/88aabadc23deb0401fa8a6fb9e08826cbba09197))
@@ -4,6 +4,7 @@ export declare const DYDX_TEST_PRIVATE_KEY = "e92a6595c934c991d3b3e987ea9b3125bf
4
4
  export declare const DYDX_TEST_MNEMONIC = "mirror actor skill push coach wait confirm orchard lunch mobile athlete gossip awake miracle matter bus reopen team ladder lazy list timber render wait";
5
5
  export declare const DYDX_LOCAL_ADDRESS = "dydx199tqg4wdlnu4qjlxchpd7seg454937hjrknju4";
6
6
  export declare const DYDX_LOCAL_MNEMONIC = "merge panther lobster crazy road hollow amused security before critic about cliff exhibit cause coyote talent happy where lion river tobacco option coconut small";
7
+ export declare const DYDX_TEST_MNEMONIC_2 = "movie yard still copper exile wear brisk chest ride dizzy novel future menu finish radar lunar claim hub middle force turtle mouse frequent embark";
7
8
  export declare const MARKET_BTC_USD: string;
8
9
  export declare const PERPETUAL_PAIR_BTC_USD: number;
9
10
  export declare const MAX_CLIENT_ID: number;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.defaultOrder = exports.MAX_CLIENT_ID = exports.PERPETUAL_PAIR_BTC_USD = exports.MARKET_BTC_USD = exports.DYDX_LOCAL_MNEMONIC = exports.DYDX_LOCAL_ADDRESS = exports.DYDX_TEST_MNEMONIC = exports.DYDX_TEST_PRIVATE_KEY = exports.DYDX_TEST_ADDRESS = void 0;
6
+ exports.defaultOrder = exports.MAX_CLIENT_ID = exports.PERPETUAL_PAIR_BTC_USD = exports.MARKET_BTC_USD = exports.DYDX_TEST_MNEMONIC_2 = exports.DYDX_LOCAL_MNEMONIC = exports.DYDX_LOCAL_ADDRESS = exports.DYDX_TEST_MNEMONIC = exports.DYDX_TEST_PRIVATE_KEY = exports.DYDX_TEST_ADDRESS = void 0;
7
7
  const order_1 = require("@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order");
8
8
  const long_1 = __importDefault(require("long"));
9
9
  const types_1 = require("../src/clients/types");
@@ -12,6 +12,7 @@ exports.DYDX_TEST_PRIVATE_KEY = 'e92a6595c934c991d3b3e987ea9b3125bf61a076deab3a9
12
12
  exports.DYDX_TEST_MNEMONIC = 'mirror actor skill push coach wait confirm orchard lunch mobile athlete gossip awake miracle matter bus reopen team ladder lazy list timber render wait';
13
13
  exports.DYDX_LOCAL_ADDRESS = 'dydx199tqg4wdlnu4qjlxchpd7seg454937hjrknju4';
14
14
  exports.DYDX_LOCAL_MNEMONIC = 'merge panther lobster crazy road hollow amused security before critic about cliff exhibit cause coyote talent happy where lion river tobacco option coconut small';
15
+ exports.DYDX_TEST_MNEMONIC_2 = 'movie yard still copper exile wear brisk chest ride dizzy novel future menu finish radar lunar claim hub middle force turtle mouse frequent embark';
15
16
  exports.MARKET_BTC_USD = 'BTC-USD';
16
17
  exports.PERPETUAL_PAIR_BTC_USD = 0;
17
18
  const quantums = new long_1.default(1000000000);
@@ -29,4 +30,4 @@ exports.defaultOrder = {
29
30
  reduceOnly: false,
30
31
  clientMetadata: 0,
31
32
  };
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZXhhbXBsZXMvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNGQUdvRTtBQUNwRSxnREFBd0I7QUFFeEIsZ0RBQStEO0FBRWxELFFBQUEsaUJBQWlCLEdBQUcsNkNBQTZDLENBQUM7QUFDbEUsUUFBQSxxQkFBcUIsR0FDaEMsa0VBQWtFLENBQUM7QUFDeEQsUUFBQSxrQkFBa0IsR0FDN0IseUpBQXlKLENBQUM7QUFDL0ksUUFBQSxrQkFBa0IsR0FBRyw2Q0FBNkMsQ0FBQztBQUNuRSxRQUFBLG1CQUFtQixHQUM5QixtS0FBbUssQ0FBQztBQUV6SixRQUFBLGNBQWMsR0FBVyxTQUFTLENBQUM7QUFDbkMsUUFBQSxzQkFBc0IsR0FBVyxDQUFDLENBQUM7QUFFaEQsTUFBTSxRQUFRLEdBQVMsSUFBSSxjQUFJLENBQUMsVUFBYSxDQUFDLENBQUM7QUFDL0MsTUFBTSxRQUFRLEdBQVMsSUFBSSxjQUFJLENBQUMsVUFBYSxDQUFDLENBQUM7QUFFbEMsUUFBQSxhQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFFekMsdUJBQXVCO0FBQ1YsUUFBQSxZQUFZLEdBQWdCO0lBQ3ZDLFFBQVEsRUFBRSxDQUFDO0lBQ1gsVUFBVSxFQUFFLGtCQUFVLENBQUMsVUFBVTtJQUNqQyxVQUFVLEVBQUUsOEJBQXNCO0lBQ2xDLElBQUksRUFBRSxrQkFBVSxDQUFDLFFBQVE7SUFDekIsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXLEVBQUUseUJBQWlCLENBQUMseUJBQXlCO0lBQ3hELFVBQVUsRUFBRSxLQUFLO0lBQ2pCLGNBQWMsRUFBRSxDQUFDO0NBQ2xCLENBQUMifQ==
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZXhhbXBsZXMvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNGQUdvRTtBQUNwRSxnREFBd0I7QUFFeEIsZ0RBQStEO0FBRWxELFFBQUEsaUJBQWlCLEdBQUcsNkNBQTZDLENBQUM7QUFDbEUsUUFBQSxxQkFBcUIsR0FDaEMsa0VBQWtFLENBQUM7QUFDeEQsUUFBQSxrQkFBa0IsR0FDN0IseUpBQXlKLENBQUM7QUFDL0ksUUFBQSxrQkFBa0IsR0FBRyw2Q0FBNkMsQ0FBQztBQUNuRSxRQUFBLG1CQUFtQixHQUM5QixtS0FBbUssQ0FBQztBQUV6SixRQUFBLG9CQUFvQixHQUFHLG9KQUFvSixDQUFDO0FBRTVLLFFBQUEsY0FBYyxHQUFXLFNBQVMsQ0FBQztBQUNuQyxRQUFBLHNCQUFzQixHQUFXLENBQUMsQ0FBQztBQUVoRCxNQUFNLFFBQVEsR0FBUyxJQUFJLGNBQUksQ0FBQyxVQUFhLENBQUMsQ0FBQztBQUMvQyxNQUFNLFFBQVEsR0FBUyxJQUFJLGNBQUksQ0FBQyxVQUFhLENBQUMsQ0FBQztBQUVsQyxRQUFBLGFBQWEsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUV6Qyx1QkFBdUI7QUFDVixRQUFBLFlBQVksR0FBZ0I7SUFDdkMsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsa0JBQVUsQ0FBQyxVQUFVO0lBQ2pDLFVBQVUsRUFBRSw4QkFBc0I7SUFDbEMsSUFBSSxFQUFFLGtCQUFVLENBQUMsUUFBUTtJQUN6QixRQUFRO0lBQ1IsUUFBUTtJQUNSLFdBQVcsRUFBRSx5QkFBaUIsQ0FBQyx5QkFBeUI7SUFDeEQsVUFBVSxFQUFFLEtBQUs7SUFDakIsY0FBYyxFQUFFLENBQUM7Q0FDbEIsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,85 @@
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
+ const util_1 = require("util");
7
+ const encoding_1 = require("@cosmjs/encoding");
8
+ const order_1 = require("@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order");
9
+ const src_1 = require("../src");
10
+ const composite_client_1 = require("../src/clients/composite-client");
11
+ const constants_1 = require("../src/clients/constants");
12
+ const local_wallet_1 = __importDefault(require("../src/clients/modules/local-wallet"));
13
+ const subaccount_1 = require("../src/clients/subaccount");
14
+ const constants_2 = require("./constants");
15
+ async function test() {
16
+ const wallet1 = await local_wallet_1.default.fromMnemonic(constants_2.DYDX_TEST_MNEMONIC, src_1.BECH32_PREFIX);
17
+ const wallet2 = await local_wallet_1.default.fromMnemonic(constants_2.DYDX_TEST_MNEMONIC_2, src_1.BECH32_PREFIX);
18
+ const network = constants_1.Network.staging();
19
+ const client = await composite_client_1.CompositeClient.connect(network);
20
+ client.setSelectedGasDenom(constants_1.SelectedGasDenom.NATIVE);
21
+ console.log('**Client**');
22
+ console.log(client);
23
+ const subaccount1 = new subaccount_1.SubaccountInfo(wallet1, 0);
24
+ const subaccount2 = new subaccount_1.SubaccountInfo(wallet2, 0);
25
+ // Change second wallet pubkey
26
+ // Add an authenticator to allow wallet2 to place orders
27
+ console.log("** Adding authenticator **");
28
+ await addAuthenticator(client, subaccount1, wallet2.pubKey.value);
29
+ const authenticators = await client.getAuthenticators(wallet1.address);
30
+ // Last element in authenticators array is the most recently created
31
+ const lastElement = authenticators.accountAuthenticators.length - 1;
32
+ const authenticatorID = authenticators.accountAuthenticators[lastElement].id;
33
+ // Placing order using subaccount2 for subaccount1 succeeds
34
+ console.log("** Placing order with authenticator **");
35
+ await placeOrder(client, subaccount2, subaccount1, authenticatorID);
36
+ // Remove authenticator
37
+ console.log("** Removing authenticator **");
38
+ await removeAuthenticator(client, subaccount1, authenticatorID);
39
+ // Placing an order using subaccount2 will now fail
40
+ console.log("** Placing order with invalid authenticator should fail **");
41
+ await placeOrder(client, subaccount2, subaccount1, authenticatorID);
42
+ }
43
+ async function removeAuthenticator(client, subaccount, id) {
44
+ await client.removeAuthenticator(subaccount, id);
45
+ }
46
+ async function addAuthenticator(client, subaccount, authedPubKey) {
47
+ const subAuthenticators = [{
48
+ type: constants_1.AuthenticatorType.SIGNATURE_VERIFICATION,
49
+ config: authedPubKey,
50
+ },
51
+ {
52
+ type: constants_1.AuthenticatorType.MESSAGE_FILTER,
53
+ config: (0, encoding_1.toBase64)(new util_1.TextEncoder().encode("/dydxprotocol.clob.MsgPlaceOrder")),
54
+ },
55
+ ];
56
+ const jsonString = JSON.stringify(subAuthenticators);
57
+ const encodedData = new util_1.TextEncoder().encode(jsonString);
58
+ await client.addAuthenticator(subaccount, constants_1.AuthenticatorType.ALL_OF, encodedData);
59
+ }
60
+ async function placeOrder(client, fromAccount, forAccount, authenticatorId) {
61
+ try {
62
+ const side = constants_1.OrderSide.BUY;
63
+ const price = Number("1000");
64
+ const currentBlock = await client.validatorClient.get.latestBlockHeight();
65
+ const nextValidBlockHeight = currentBlock + 5;
66
+ const goodTilBlock = nextValidBlockHeight + 10;
67
+ const timeInForce = order_1.Order_TimeInForce.TIME_IN_FORCE_UNSPECIFIED;
68
+ const clientId = Math.floor(Math.random() * 10000);
69
+ const tx = await client.placeShortTermOrder(fromAccount, 'ETH-USD', side, price, 0.01, clientId, goodTilBlock, timeInForce, false, undefined, {
70
+ authenticators: [authenticatorId],
71
+ accountForOrder: forAccount,
72
+ });
73
+ console.log('**Order Tx**');
74
+ console.log(Buffer.from(tx.hash).toString('hex'));
75
+ }
76
+ catch (error) {
77
+ console.log(error.message);
78
+ }
79
+ }
80
+ test()
81
+ .then(() => { })
82
+ .catch((error) => {
83
+ console.log(error.message);
84
+ });
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmVkX2tleXNfZXhhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2V4YW1wbGVzL3Blcm1pc3Npb25lZF9rZXlzX2V4YW1wbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFBbUM7QUFFbkMsK0NBQTRDO0FBQzVDLHNGQUErRjtBQUUvRixnQ0FBdUM7QUFDdkMsc0VBQWtFO0FBQ2xFLHdEQUFtRztBQUNuRyx1RkFBOEQ7QUFDOUQsMERBQTJEO0FBQzNELDJDQUF1RTtBQUV2RSxLQUFLLFVBQVUsSUFBSTtJQUNqQixNQUFNLE9BQU8sR0FBRyxNQUFNLHNCQUFXLENBQUMsWUFBWSxDQUFDLDhCQUFrQixFQUFFLG1CQUFhLENBQUMsQ0FBQztJQUNsRixNQUFNLE9BQU8sR0FBRyxNQUFNLHNCQUFXLENBQUMsWUFBWSxDQUFDLGdDQUFvQixFQUFFLG1CQUFhLENBQUMsQ0FBQztJQUVwRixNQUFNLE9BQU8sR0FBRyxtQkFBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0NBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLDRCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXBELE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVwQixNQUFNLFdBQVcsR0FBRyxJQUFJLDJCQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksMkJBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbkQsOEJBQThCO0lBQzlCLHdEQUF3RDtJQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDMUMsTUFBTSxnQkFBZ0IsQ0FB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
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const constants_1 = require("../src/clients/constants");
4
+ const socket_client_1 = require("../src/clients/socket-client");
5
+ function test() {
6
+ let orderBookBidList = [];
7
+ let orderBookAskList = [];
8
+ const mySocket = new socket_client_1.SocketClient(constants_1.Network.mainnet().indexerConfig, () => {
9
+ console.log('socket opened');
10
+ mySocket.subscribeToOrderbook('ETH-USD');
11
+ }, () => {
12
+ console.log('socket closed');
13
+ }, (message) => {
14
+ try {
15
+ if (typeof message.data === "string") {
16
+ const jsonString = message.data;
17
+ const parsingData = JSON.parse(jsonString);
18
+ const messageId = parsingData.message_id;
19
+ const orderBookDataList = parsingData.contents;
20
+ if (orderBookDataList instanceof Array) {
21
+ // common orderBook data;
22
+ [orderBookBidList, orderBookAskList] = updateOrderBook(orderBookDataList, orderBookBidList, orderBookAskList, messageId);
23
+ // sort
24
+ orderBookBidList = sortByNthElementDesc(orderBookBidList, 0);
25
+ orderBookAskList = sortByNthElementAsc(orderBookAskList, 0);
26
+ // resolving crossed orderBook
27
+ if (orderBookBidList &&
28
+ orderBookAskList &&
29
+ orderBookBidList.length > 0 &&
30
+ orderBookAskList.length > 0 &&
31
+ orderBookBidList[0][0] >= orderBookAskList[0][0]) {
32
+ [orderBookBidList, orderBookAskList] =
33
+ resolveCrossedOrderBook(orderBookBidList, orderBookAskList);
34
+ }
35
+ printOrderBook(orderBookBidList, orderBookAskList);
36
+ if (orderBookBidList.length > 300) {
37
+ orderBookBidList.splice(50);
38
+ }
39
+ if (orderBookAskList.length > 300) {
40
+ orderBookAskList.splice(50);
41
+ }
42
+ }
43
+ else if (orderBookDataList !== null &&
44
+ orderBookDataList !== undefined) {
45
+ // initial OrderBook data
46
+ setInitialOrderBook(orderBookDataList, orderBookBidList, orderBookAskList, messageId);
47
+ }
48
+ }
49
+ }
50
+ catch (e) {
51
+ console.error('Error parsing JSON message:', e);
52
+ }
53
+ }, (event) => {
54
+ console.error('Encountered error:', event.message);
55
+ });
56
+ mySocket.connect();
57
+ }
58
+ const sortByNthElementAsc = (arr, n) => {
59
+ return arr.sort((a, b) => {
60
+ if (a[n] < b[n])
61
+ return -1;
62
+ if (a[n] > b[n])
63
+ return 1;
64
+ return 0;
65
+ });
66
+ };
67
+ const sortByNthElementDesc = (arr, n) => {
68
+ return arr.sort((a, b) => {
69
+ if (a[n] > b[n])
70
+ return -1;
71
+ if (a[n] < b[n])
72
+ return 1;
73
+ return 0;
74
+ });
75
+ };
76
+ const printOrderBook = (orderBookBidList, orderBookAskList) => {
77
+ // print
78
+ console.log(`OrderBook for ETH-USD:`);
79
+ console.log(`Price Qty`);
80
+ for (let i = 4; i > -1; i--) {
81
+ const priceStr = String(orderBookAskList[i][0]);
82
+ const spaces = createSpaces(10 - priceStr.length);
83
+ console.log(`${priceStr}${spaces}${orderBookAskList[i][1]}`);
84
+ }
85
+ console.log('---------------------');
86
+ for (let i = 0; i < 5; i++) {
87
+ const priceStr = String(orderBookBidList[i][0]);
88
+ const spaces = createSpaces(10 - priceStr.length);
89
+ console.log(`${priceStr}${spaces}${orderBookBidList[i][1]}`);
90
+ }
91
+ console.log('');
92
+ };
93
+ function createSpaces(count) {
94
+ if (count <= 0) {
95
+ return "";
96
+ }
97
+ let spaces = "";
98
+ for (let i = 0; i < count; i++) {
99
+ spaces += " ";
100
+ }
101
+ return spaces;
102
+ }
103
+ const resolveCrossedOrderBook = (orderBookBidList, orderBookAskList) => {
104
+ while (orderBookBidList[0][0] >= orderBookAskList[0][0]) {
105
+ if (orderBookBidList[0][2] < orderBookAskList[0][2]) {
106
+ orderBookBidList.shift();
107
+ }
108
+ else if (orderBookBidList[0][2] > orderBookAskList[0][2]) {
109
+ orderBookAskList.shift();
110
+ }
111
+ else {
112
+ if (orderBookBidList[0][1] > orderBookAskList[0][1]) {
113
+ orderBookBidList[0][1] -= orderBookAskList[0][1];
114
+ orderBookAskList.shift();
115
+ }
116
+ else if (orderBookBidList[0][1] < orderBookAskList[0][1]) {
117
+ orderBookAskList[0][1] -= orderBookBidList[0][1];
118
+ orderBookBidList.shift();
119
+ }
120
+ else {
121
+ orderBookAskList.shift();
122
+ orderBookBidList.shift();
123
+ }
124
+ }
125
+ }
126
+ return [orderBookBidList, orderBookAskList];
127
+ };
128
+ const setInitialOrderBook = (orderBookDataList, orderBookBidList, orderBookAskList, messageId) => {
129
+ orderBookDataList.bids.forEach((item) => {
130
+ orderBookBidList.push([Number(item.price), Number(item.size), messageId]);
131
+ });
132
+ orderBookDataList.asks.forEach((item) => {
133
+ orderBookAskList.push([Number(item.price), Number(item.size), messageId]);
134
+ });
135
+ };
136
+ const updateOrderBook = (orderBookDataList, orderBookBidList, orderBookAskList, messageId) => {
137
+ orderBookDataList.forEach((entry) => {
138
+ if (entry.bids !== null && entry.bids !== undefined) {
139
+ const flattened = entry.bids.reduce((acc, val) => acc.concat(val), []);
140
+ const entryBidPrice = Number(flattened[0]);
141
+ const entryBidSize = Number(flattened[1]);
142
+ // remove prices with zero Qty
143
+ if (entryBidSize === 0) {
144
+ for (let i = orderBookBidList.length - 1; i >= 0; i--) {
145
+ if (orderBookBidList[i][0] === entryBidPrice) {
146
+ orderBookBidList.splice(i, 1);
147
+ }
148
+ }
149
+ }
150
+ else {
151
+ // The price that already exists in the order book is modified only Qty
152
+ if (orderBookBidList.some((innerArray) => innerArray[0] === entryBidPrice)) {
153
+ orderBookBidList.forEach((item, index) => {
154
+ if (item[0] === entryBidPrice) {
155
+ orderBookBidList[index][1] = entryBidSize;
156
+ orderBookBidList[index][2] = messageId;
157
+ }
158
+ });
159
+ }
160
+ else {
161
+ // Add new data to order book
162
+ orderBookBidList.push([entryBidPrice, entryBidSize, messageId]);
163
+ }
164
+ }
165
+ }
166
+ if (entry.asks !== null && entry.asks !== undefined) {
167
+ const flattened = entry.asks.reduce((acc, val) => acc.concat(val), []);
168
+ const entryAskPrice = Number(flattened[0]);
169
+ const entryAskSize = Number(flattened[1]);
170
+ if (entryAskSize === 0) {
171
+ // remove prices with zero Qty
172
+ for (let i = orderBookAskList.length - 1; i >= 0; i--) {
173
+ if (orderBookAskList[i][0] === entryAskPrice) {
174
+ orderBookAskList.splice(i, 1);
175
+ }
176
+ }
177
+ }
178
+ else {
179
+ // The price that already exists in the order book is modified only Qty
180
+ if (orderBookAskList.some((innerArray) => innerArray[0] === entryAskPrice)) {
181
+ orderBookAskList.forEach((item, index) => {
182
+ if (item[0] === entryAskPrice) {
183
+ orderBookAskList[index][1] = entryAskSize;
184
+ orderBookAskList[index][2] = messageId;
185
+ }
186
+ });
187
+ }
188
+ else {
189
+ // Add new data to order book
190
+ orderBookAskList.push([entryAskPrice, entryAskSize, messageId]);
191
+ }
192
+ }
193
+ }
194
+ });
195
+ return [orderBookBidList, orderBookAskList];
196
+ };
197
+ test();
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0X29yZGVyYm9va19leGFtcGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZXhhbXBsZXMvd2Vic29ja2V0X29yZGVyYm9va19leGFtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsd0RBQW1EO0FBQ25ELGdFQUE0RDtBQUU1RCxTQUFTLElBQUk7SUFDVCxJQUFJLGdCQUFnQixHQUErQixFQUFFLENBQUM7SUFDdEQsSUFBSSxnQkFBZ0IsR0FBK0IsRUFBRSxDQUFDO0lBRXRELE1BQU0sUUFBUSxHQUFHLElBQUksNEJBQVksQ0FDN0IsbUJBQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLEVBQy9CLEdBQUcsRUFBRTtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFN0IsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsRUFDRCxHQUFHLEVBQUU7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsRUFDRCxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ1IsSUFBSTtZQUNBLElBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDbEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztnQkFDekMsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO2dCQUUvQyxJQUFJLGlCQUFpQixZQUFZLEtBQUssRUFBRTtvQkFDcEMseUJBQXlCO29CQUN6QixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLEdBQUcsZUFBZSxDQUNsRCxpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGdC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