@dydxprotocol/v4-client-js 3.0.2 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -2
- package/build/cjs/src/index.js +3 -2
- package/build/cjs/src/lib/trading-key-utils.js +108 -0
- package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/build/esm/src/index.d.ts +1 -0
- package/build/esm/src/index.d.ts.map +1 -1
- package/build/esm/src/index.js +2 -1
- package/build/esm/src/lib/trading-key-utils.d.ts +22 -0
- package/build/esm/src/lib/trading-key-utils.d.ts.map +1 -0
- package/build/esm/src/lib/trading-key-utils.js +99 -0
- package/build/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/lib/trading-key-utils.ts +136 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
## [3.0.
|
|
1
|
+
## [3.0.3](https://github.com/dydxprotocol/v4-clients/compare/v4-client-js@3.0.2...v4-client-js@3.0.3) (2025-09-12)
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
### Bug Fixes
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* trading key helpers ([#426](https://github.com/dydxprotocol/v4-clients/issues/426)) ([9a2f312](https://github.com/dydxprotocol/v4-clients/commit/9a2f3120bc3f4ebeb541078ed992c616993b7921))
|
package/build/cjs/src/index.js
CHANGED
|
@@ -39,12 +39,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
39
39
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
40
|
};
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.NetworkOptimizer = exports.ByteArrayEncoding = exports.encodeJson = exports.ValidatorClient = exports.SubaccountInfo = exports.SubaccountClient = exports.SocketClient = exports.NobleClient = exports.LocalWallet = exports.IndexerClient = exports.FaucetClient = exports.CompositeClient = exports.validation = exports.utils = exports.onboarding = exports.helpers = void 0;
|
|
42
|
+
exports.NetworkOptimizer = exports.ByteArrayEncoding = exports.encodeJson = exports.ValidatorClient = exports.SubaccountInfo = exports.SubaccountClient = exports.SocketClient = exports.NobleClient = exports.LocalWallet = exports.IndexerClient = exports.FaucetClient = exports.CompositeClient = exports.validation = exports.utils = exports.tradingKeyUtils = exports.onboarding = exports.helpers = void 0;
|
|
43
43
|
// Types.
|
|
44
44
|
__exportStar(require("./types"), exports);
|
|
45
45
|
// Utility functions.
|
|
46
46
|
exports.helpers = __importStar(require("./lib/helpers"));
|
|
47
47
|
exports.onboarding = __importStar(require("./lib/onboarding"));
|
|
48
|
+
exports.tradingKeyUtils = __importStar(require("./lib/trading-key-utils"));
|
|
48
49
|
exports.utils = __importStar(require("./lib/utils"));
|
|
49
50
|
exports.validation = __importStar(require("./lib/validation"));
|
|
50
51
|
var composite_client_1 = require("./clients/composite-client");
|
|
@@ -69,4 +70,4 @@ Object.defineProperty(exports, "encodeJson", { enumerable: true, get: function (
|
|
|
69
70
|
Object.defineProperty(exports, "ByteArrayEncoding", { enumerable: true, get: function () { return helpers_1.ByteArrayEncoding; } });
|
|
70
71
|
var network_optimizer_1 = require("./network_optimizer");
|
|
71
72
|
Object.defineProperty(exports, "NetworkOptimizer", { enumerable: true, get: function () { return network_optimizer_1.NetworkOptimizer; } });
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUztBQUNULDBDQUF3QjtBQUV4QixxQkFBcUI7QUFDckIseURBQXlDO0FBQ3pDLCtEQUErQztBQUMvQywyRUFBMkQ7QUFDM0QscURBQXFDO0FBQ3JDLCtEQUErQztBQUUvQywrREFBNkQ7QUFBcEQsbUhBQUEsZUFBZSxPQUFBO0FBQ3hCLHlEQUF1RDtBQUE5Qyw2R0FBQSxZQUFZLE9BQUE7QUFDckIsMkRBQXlEO0FBQWhELCtHQUFBLGFBQWEsT0FBQTtBQUN0QiwrREFBd0U7QUFBL0QsNEhBQUEsT0FBTyxPQUFlO0FBQy9CLHVEQUFxRDtBQUE1QywyR0FBQSxXQUFXLE9BQUE7QUFDcEIseURBQXVEO0FBQTlDLDZHQUFBLFlBQVksT0FBQTtBQUNyQixtREFBMEY7QUFBakYsOEdBQUEsY0FBYyxPQUFvQjtBQUFFLDRHQUFBLGNBQWMsT0FBQTtBQUMzRCwrREFBNkQ7QUFBcEQsbUhBQUEsZUFBZSxPQUFBO0FBQ3hCLHlDQUE4RDtBQUFyRCxxR0FBQSxVQUFVLE9BQUE7QUFBRSw0R0FBQSxpQkFBaUIsT0FBQTtBQUN0Qyx5REFBdUQ7QUFBOUMscUhBQUEsZ0JBQWdCLE9BQUEifQ==
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getAuthorizedTradingKeysMetadata = exports.getAuthorizeNewTradingKeyArguments = exports.createNewRandomDydxWallet = void 0;
|
|
7
|
+
const encoding_1 = require("@cosmjs/encoding");
|
|
8
|
+
const tendermint_rpc_1 = require("@cosmjs/tendermint-rpc");
|
|
9
|
+
const bip39_1 = require("@scure/bip39");
|
|
10
|
+
const english_1 = require("@scure/bip39/wordlists/english");
|
|
11
|
+
const constants_1 = require("../clients/constants");
|
|
12
|
+
const local_wallet_1 = __importDefault(require("../clients/modules/local-wallet"));
|
|
13
|
+
const constants_2 = require("./constants");
|
|
14
|
+
const onboarding_1 = require("./onboarding");
|
|
15
|
+
const createNewRandomDydxWallet = async () => {
|
|
16
|
+
const mnemonic = (0, bip39_1.generateMnemonic)(english_1.wordlist, 128);
|
|
17
|
+
const { privateKey: privateKeyRaw } = (0, onboarding_1.deriveHDKeyFromMnemonic)(mnemonic);
|
|
18
|
+
const wallet = await local_wallet_1.default.fromMnemonic(mnemonic, constants_2.BECH32_PREFIX);
|
|
19
|
+
const privateKeyHex = privateKeyRaw != null ? `0x${(0, encoding_1.toHex)(privateKeyRaw)}` : undefined;
|
|
20
|
+
const publicKey = wallet.pubKey;
|
|
21
|
+
const address = wallet.address;
|
|
22
|
+
if (privateKeyHex == null || publicKey == null || address == null) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
// 12 english words
|
|
27
|
+
mnemonic,
|
|
28
|
+
// toHex of the raw private key bits
|
|
29
|
+
privateKeyHex,
|
|
30
|
+
// base64, not hex
|
|
31
|
+
publicKey: publicKey.value,
|
|
32
|
+
// valid dydx address corresponding to the key pair
|
|
33
|
+
address,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
exports.createNewRandomDydxWallet = createNewRandomDydxWallet;
|
|
37
|
+
// arguments to authorize a given wallet public key to trade on behalf of the user.
|
|
38
|
+
// allows place order, cancel order, batch cancel on subaccount 0 only.
|
|
39
|
+
const getAuthorizeNewTradingKeyArguments = ({ generatedWalletPubKey, }) => {
|
|
40
|
+
const wrapAndEncode64 = (s) => (0, encoding_1.toBase64)(new TextEncoder().encode(s));
|
|
41
|
+
const messageFilterSubAuth = [
|
|
42
|
+
{
|
|
43
|
+
type: constants_1.AuthenticatorType.MESSAGE_FILTER,
|
|
44
|
+
config: wrapAndEncode64(constants_1.TYPE_URL_MSG_PLACE_ORDER),
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
type: constants_1.AuthenticatorType.MESSAGE_FILTER,
|
|
48
|
+
config: wrapAndEncode64(constants_1.TYPE_URL_MSG_CANCEL_ORDER),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
type: constants_1.AuthenticatorType.MESSAGE_FILTER,
|
|
52
|
+
config: wrapAndEncode64(constants_1.TYPE_URL_BATCH_CANCEL),
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
const anyOfMessageFilterConfigB64 = wrapAndEncode64(JSON.stringify(messageFilterSubAuth));
|
|
56
|
+
const subAuth = [
|
|
57
|
+
{
|
|
58
|
+
type: constants_1.AuthenticatorType.SIGNATURE_VERIFICATION,
|
|
59
|
+
config: generatedWalletPubKey,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: constants_1.AuthenticatorType.ANY_OF,
|
|
63
|
+
config: anyOfMessageFilterConfigB64,
|
|
64
|
+
},
|
|
65
|
+
// we limit to cross markets to make it slightly harder to drain user funds on low liquidity markets with trading keys
|
|
66
|
+
// could undo this in the future if people are angry about it
|
|
67
|
+
{
|
|
68
|
+
type: constants_1.AuthenticatorType.SUBACCOUNT_FILTER,
|
|
69
|
+
config: wrapAndEncode64('0'),
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
const jsonString = JSON.stringify(subAuth);
|
|
73
|
+
const encodedData = new TextEncoder().encode(jsonString);
|
|
74
|
+
const topLevelType = constants_1.AuthenticatorType.ALL_OF;
|
|
75
|
+
return {
|
|
76
|
+
type: topLevelType,
|
|
77
|
+
data: encodedData,
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
exports.getAuthorizeNewTradingKeyArguments = getAuthorizeNewTradingKeyArguments;
|
|
81
|
+
const isTruthy = (n) => Boolean(n);
|
|
82
|
+
// just parses out keys that match the format created in getAuthorizeNewTradingKeyArguments
|
|
83
|
+
const getAuthorizedTradingKeysMetadata = (authorizedKeys) => {
|
|
84
|
+
return authorizedKeys
|
|
85
|
+
.map(({ config, id, type }) => {
|
|
86
|
+
var _a;
|
|
87
|
+
if (type !== constants_1.AuthenticatorType.ALL_OF) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const parsedConfig = JSON.parse(new TextDecoder().decode(config));
|
|
91
|
+
if (parsedConfig == null) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const publicKey = (_a = parsedConfig.find((t) => t.type === constants_1.AuthenticatorType.SIGNATURE_VERIFICATION)) === null || _a === void 0 ? void 0 : _a.config;
|
|
95
|
+
if (publicKey == null || typeof publicKey !== 'string') {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const address = (0, encoding_1.toBech32)(constants_2.BECH32_PREFIX, (0, tendermint_rpc_1.rawSecp256k1PubkeyToRawAddress)((0, encoding_1.fromBase64)(publicKey)));
|
|
99
|
+
return {
|
|
100
|
+
id: id.toString(),
|
|
101
|
+
publicKey,
|
|
102
|
+
address,
|
|
103
|
+
};
|
|
104
|
+
})
|
|
105
|
+
.filter(isTruthy);
|
|
106
|
+
};
|
|
107
|
+
exports.getAuthorizedTradingKeysMetadata = getAuthorizedTradingKeysMetadata;
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGluZy1rZXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RyYWRpbmcta2V5LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtDQUF5RTtBQUN6RSwyREFBd0U7QUFDeEUsd0NBQWdEO0FBQ2hELDREQUEwRDtBQUUxRCxvREFNOEI7QUFFOUIsbUZBQTBEO0FBQzFELDJDQUE0QztBQUM1Qyw2Q0FBdUQ7QUFFaEQsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLElBRTVDLEVBQUU7SUFDRixNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFnQixFQUFDLGtCQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsR0FBRyxJQUFBLG9DQUF1QixFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLHlCQUFhLENBQUMsQ0FBQztJQUV2RSxNQUFNLGFBQWEsR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUEsZ0JBQUssRUFBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBRS9CLElBQUksYUFBYSxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsRSxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTztRQUNMLG1CQUFtQjtRQUNuQixRQUFRO1FBQ1Isb0NBQW9DO1FBQ3BDLGFBQWE7UUFDYixrQkFBa0I7UUFDbEIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxLQUFLO1FBQzFCLG1EQUFtRDtRQUNuRCxPQUFPO0tBQ1IsQ0FBQztBQUNKLENBQUMsQ0FBQztBQXpCVyxRQUFBLHlCQUF5Qiw2QkF5QnBDO0FBRUYsbUZBQW1GO0FBQ25GLHVFQUF1RTtBQUNoRSxNQUFNLGtDQUFrQyxHQUFHLENBQUMsRUFDakQscUJBQXFCLEdBR3RCLEVBQWlELEVBQUU7SUFDbEQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLElBQUEsbUJBQVEsRUFBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJGLE1BQU0sb0JBQW9CLEdBQUc7UUFDM0I7WUFDRSxJQUFJLEVBQUUsNkJBQWlCLENBQUMsY0FBYztZQUN0QyxNQUFNLEVBQUUsZUFBZSxDQUFDLG9DQUF3QixDQUFDO1NBQ2xEO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsNkJBQWlCLENBQUMsY0FBYztZQUN0QyxNQUFNLEVBQUUsZUFBZSxDQUFDLHFDQUF5QixDQUFDO1NBQ25EO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsNkJBQWlCLENBQUMsY0FBYztZQUN0QyxNQUFNLEVBQUUsZUFBZSxDQUFDLGlDQUFxQixDQUFDO1NBQy9DO0tBQ0YsQ0FBQztJQUVGLE1BQU0sMkJBQTJCLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBRTFGLE1BQU0sT0FBTyxHQUFHO1FBQ2Q7WUFDRSxJQUFJLEVBQUUsNkJBQWlCLENBQUMsc0JBQXNCO1lBQzlDLE1BQU0sRUFBRSxxQkFBcUI7U0FDOUI7UUFDRDtZQUNFLElBQUksRUFBRSw2QkFBaUIsQ0FBQyxNQUFNO1lBQzlCLE1BQU0sRUFBRSwyQkFBMkI7U0FDcEM7UUFDRCxzSEFBc0g7UUFDdEgsNkRBQTZEO1FBQzdEO1lBQ0UsSUFBSSxFQUFFLDZCQUFpQixDQUFDLGlCQUFpQjtZQUN6QyxNQUFNLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQztTQUM3QjtLQUNGLENBQUM7SUFFRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLDZCQUFpQixDQUFDLE1BQU0sQ0FBQztJQUU5QyxPQUFPO1FBQ0wsSUFBSSxFQUFFLFlBQVk7UUFDbEIsSUFBSSxFQUFFLFdBQVc7S0FDbEIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQWpEVyxRQUFBLGtDQUFrQyxzQ0FpRDdDO0FBSUYsTUFBTSxRQUFRLEdBQUcsQ0FBSSxDQUFvQyxFQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFakYsMkZBQTJGO0FBQ3BGLE1BQU0sZ0NBQWdDLEdBQUcsQ0FDOUMsY0FBc0YsRUFDM0IsRUFBRTtJQUM3RCxPQUFPLGNBQWM7U0FDbEIsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7O1FBQzVCLElBQUksSUFBSSxLQUFLLDZCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBRW5ELENBQUM7UUFDZCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFBLFlBQVksQ0FBQyxJQUFJLENBQ2pDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFpQixDQUFDLHNCQUFzQixDQUMzRCwwQ0FBRSxNQUFNLENBQUM7UUFDVixJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSxtQkFBUSxFQUN0Qix5QkFBYSxFQUNiLElBQUEsK0NBQThCLEVBQUMsSUFBQSxxQkFBVSxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3RELENBQUM7UUFDRixPQUFPO1lBQ0wsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDakIsU0FBUztZQUNULE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQyxDQUFDO1NBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQWpDVyxRQUFBLGdDQUFnQyxvQ0FpQzNDIn0=
|