@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.
- package/CHANGELOG.md +3 -3
- package/build/examples/constants.d.ts +1 -0
- package/build/examples/constants.js +3 -2
- package/build/examples/permissioned_keys_example.d.ts +1 -0
- package/build/examples/permissioned_keys_example.js +85 -0
- package/build/examples/websocket_orderbook_example.d.ts +1 -0
- package/build/examples/websocket_orderbook_example.js +198 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/cosmos/bundle.d.ts +158 -158
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/cosmos/bundle.js +126 -126
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.lcd.d.ts +12 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.lcd.js +34 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/params.d.ts +21 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/params.js +37 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.d.ts +34 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.js +72 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.rpc.msg.d.ts +4 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/blocktime/tx.rpc.msg.js +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/bundle.d.ts +2021 -1711
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/bundle.js +272 -266
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/finalize_block.d.ts +23 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/finalize_block.js +64 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order_removals.d.ts +5 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order_removals.js +11 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.d.ts +31 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.js +94 -5
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.lcd.d.ts +2 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.lcd.js +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.rpc.Query.d.ts +5 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.rpc.Query.js +10 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/streaming.d.ts +6 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/streaming.js +19 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/events/events.d.ts +79 -6
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/events/events.js +78 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/lcd.d.ts +1 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/lcd.js +4 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/genesis.d.ts +4 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/genesis.js +11 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.lcd.d.ts +2 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.lcd.js +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.d.ts +39 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.js +72 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.rpc.msg.d.ts +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.rpc.msg.js +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.d.ts +25 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.js +64 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.lcd.d.ts +2 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.lcd.js +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.rpc.Query.d.ts +5 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/query.rpc.Query.js +10 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_param.d.ts +8 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_param.js +1 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_price.d.ts +3 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/market_price.js +1 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.d.ts +34 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.js +64 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.lcd.d.ts +2 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.lcd.js +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.rpc.Query.d.ts +5 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/query.rpc.Query.js +10 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/streaming.d.ts +23 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/streaming.js +81 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.d.ts +25 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.js +63 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.lcd.d.ts +2 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.lcd.js +7 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.rpc.Query.d.ts +5 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/query.rpc.Query.js +10 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/tx.rpc.msg.d.ts +1 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/rpc.query.d.ts +4 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/subaccounts/streaming.d.ts +1 -1
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/subaccounts/streaming.js +5 -5
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/params.d.ts +21 -0
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/params.js +55 -3
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.d.ts +1 -6
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.js +4 -12
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.lcd.d.ts +1 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.lcd.js +1 -13
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.d.ts +51 -24
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.js +98 -46
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/gogoproto/bundle.js +2 -2
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/google/bundle.d.ts +174 -174
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/google/bundle.js +12 -12
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/tendermint/bundle.d.ts +365 -365
- package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/tendermint/bundle.js +21 -21
- package/build/src/clients/composite-client.d.ts +12 -3
- package/build/src/clients/composite-client.js +22 -8
- package/build/src/clients/constants.d.ts +10 -0
- package/build/src/clients/constants.js +17 -4
- package/build/src/clients/lib/registry.js +26 -22
- package/build/src/clients/modules/composer.d.ts +3 -0
- package/build/src/clients/modules/composer.js +23 -1
- package/build/src/clients/modules/get.d.ts +2 -0
- package/build/src/clients/modules/get.js +9 -1
- package/build/src/clients/modules/local-wallet.d.ts +4 -4
- package/build/src/clients/modules/local-wallet.js +3 -3
- package/build/src/clients/modules/post.d.ts +4 -2
- package/build/src/clients/modules/post.js +15 -6
- package/build/src/clients/modules/signer.d.ts +5 -3
- package/build/src/clients/modules/signer.js +53 -14
- package/build/src/clients/modules/utility.d.ts +7 -1
- package/build/src/clients/modules/utility.js +10 -1
- package/build/src/clients/types.d.ts +22 -0
- package/build/src/clients/types.js +19 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/examples/constants.ts +2 -0
- package/examples/permissioned_keys_example.ts +110 -0
- package/examples/websocket_orderbook_example.ts +252 -0
- package/package.json +2 -2
- package/src/clients/composite-client.ts +40 -3
- package/src/clients/constants.ts +16 -1
- package/src/clients/lib/registry.ts +8 -0
- package/src/clients/modules/composer.ts +39 -0
- package/src/clients/modules/get.ts +16 -0
- package/src/clients/modules/local-wallet.ts +6 -6
- package/src/clients/modules/post.ts +44 -1
- package/src/clients/modules/signer.ts +79 -13
- package/src/clients/modules/utility.ts +16 -1
- package/src/clients/types.ts +25 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
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
|
-
###
|
|
4
|
+
### Features
|
|
5
5
|
|
|
6
|
-
*
|
|
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,
|
|
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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
|