@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.
@@ -1,6 +1,7 @@
1
1
  export * from './types';
2
2
  export * as helpers from './lib/helpers';
3
3
  export * as onboarding from './lib/onboarding';
4
+ export * as tradingKeyUtils from './lib/trading-key-utils';
4
5
  export * as utils from './lib/utils';
5
6
  export * as validation from './lib/validation';
6
7
  export { CompositeClient } from './clients/composite-client';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,IAAI,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,OAAO,KAAK,OAAO,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,eAAe,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,IAAI,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -3,6 +3,7 @@ export * from './types';
3
3
  // Utility functions.
4
4
  export * as helpers from './lib/helpers';
5
5
  export * as onboarding from './lib/onboarding';
6
+ export * as tradingKeyUtils from './lib/trading-key-utils';
6
7
  export * as utils from './lib/utils';
7
8
  export * as validation from './lib/validation';
8
9
  export { CompositeClient } from './clients/composite-client';
@@ -15,4 +16,4 @@ export { SubaccountInfo as SubaccountClient, SubaccountInfo } from './clients/su
15
16
  export { ValidatorClient } from './clients/validator-client';
16
17
  export { encodeJson, ByteArrayEncoding } from './lib/helpers';
17
18
  export { NetworkOptimizer } from './network_optimizer';
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUztBQUNULGNBQWMsU0FBUyxDQUFDO0FBRXhCLHFCQUFxQjtBQUNyQixPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssVUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sS0FBSyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLElBQUksZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUMifQ==
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsU0FBUztBQUNULGNBQWMsU0FBUyxDQUFDO0FBRXhCLHFCQUFxQjtBQUNyQixPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssVUFBVSxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxlQUFlLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxLQUFLLFVBQVUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsSUFBSSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyJ9
@@ -0,0 +1,22 @@
1
+ import { AuthenticatorType } from '../clients/constants';
2
+ import { type Get } from '../clients/modules/get';
3
+ export declare const createNewRandomDydxWallet: () => Promise<{
4
+ privateKeyHex: string;
5
+ mnemonic: string;
6
+ publicKey: string;
7
+ address: string;
8
+ } | undefined>;
9
+ export declare const getAuthorizeNewTradingKeyArguments: ({ generatedWalletPubKey, }: {
10
+ generatedWalletPubKey: string;
11
+ }) => {
12
+ type: AuthenticatorType;
13
+ data: Uint8Array;
14
+ };
15
+ type Awaited<T> = T extends Promise<infer U> ? U : T;
16
+ export declare const getAuthorizedTradingKeysMetadata: (authorizedKeys: Awaited<ReturnType<Get["getAuthenticators"]>>["accountAuthenticators"]) => Array<{
17
+ id: string;
18
+ publicKey: string;
19
+ address: string;
20
+ }>;
21
+ export {};
22
+ //# sourceMappingURL=trading-key-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading-key-utils.d.ts","sourceRoot":"","sources":["../../../../src/lib/trading-key-utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAIlB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAKlD,eAAO,MAAM,yBAAyB,QAAa,OAAO,CACxD;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAwB5F,CAAC;AAIF,eAAO,MAAM,kCAAkC,GAAI,4BAEhD;IACD,qBAAqB,EAAE,MAAM,CAAC;CAC/B,KAAG;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CA6C9C,CAAC;AAGF,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAIrD,eAAO,MAAM,gCAAgC,GAC3C,gBAAgB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,KACrF,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA+B1D,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { fromBase64, toBase64, toBech32, toHex } from '@cosmjs/encoding';
2
+ import { rawSecp256k1PubkeyToRawAddress } from '@cosmjs/tendermint-rpc';
3
+ import { generateMnemonic } from '@scure/bip39';
4
+ import { wordlist } from '@scure/bip39/wordlists/english';
5
+ import { AuthenticatorType, TYPE_URL_BATCH_CANCEL, TYPE_URL_MSG_CANCEL_ORDER, TYPE_URL_MSG_PLACE_ORDER, } from '../clients/constants';
6
+ import LocalWallet from '../clients/modules/local-wallet';
7
+ import { BECH32_PREFIX } from './constants';
8
+ import { deriveHDKeyFromMnemonic } from './onboarding';
9
+ export const createNewRandomDydxWallet = async () => {
10
+ const mnemonic = generateMnemonic(wordlist, 128);
11
+ const { privateKey: privateKeyRaw } = deriveHDKeyFromMnemonic(mnemonic);
12
+ const wallet = await LocalWallet.fromMnemonic(mnemonic, BECH32_PREFIX);
13
+ const privateKeyHex = privateKeyRaw != null ? `0x${toHex(privateKeyRaw)}` : undefined;
14
+ const publicKey = wallet.pubKey;
15
+ const address = wallet.address;
16
+ if (privateKeyHex == null || publicKey == null || address == null) {
17
+ return undefined;
18
+ }
19
+ return {
20
+ // 12 english words
21
+ mnemonic,
22
+ // toHex of the raw private key bits
23
+ privateKeyHex,
24
+ // base64, not hex
25
+ publicKey: publicKey.value,
26
+ // valid dydx address corresponding to the key pair
27
+ address,
28
+ };
29
+ };
30
+ // arguments to authorize a given wallet public key to trade on behalf of the user.
31
+ // allows place order, cancel order, batch cancel on subaccount 0 only.
32
+ export const getAuthorizeNewTradingKeyArguments = ({ generatedWalletPubKey, }) => {
33
+ const wrapAndEncode64 = (s) => toBase64(new TextEncoder().encode(s));
34
+ const messageFilterSubAuth = [
35
+ {
36
+ type: AuthenticatorType.MESSAGE_FILTER,
37
+ config: wrapAndEncode64(TYPE_URL_MSG_PLACE_ORDER),
38
+ },
39
+ {
40
+ type: AuthenticatorType.MESSAGE_FILTER,
41
+ config: wrapAndEncode64(TYPE_URL_MSG_CANCEL_ORDER),
42
+ },
43
+ {
44
+ type: AuthenticatorType.MESSAGE_FILTER,
45
+ config: wrapAndEncode64(TYPE_URL_BATCH_CANCEL),
46
+ },
47
+ ];
48
+ const anyOfMessageFilterConfigB64 = wrapAndEncode64(JSON.stringify(messageFilterSubAuth));
49
+ const subAuth = [
50
+ {
51
+ type: AuthenticatorType.SIGNATURE_VERIFICATION,
52
+ config: generatedWalletPubKey,
53
+ },
54
+ {
55
+ type: AuthenticatorType.ANY_OF,
56
+ config: anyOfMessageFilterConfigB64,
57
+ },
58
+ // we limit to cross markets to make it slightly harder to drain user funds on low liquidity markets with trading keys
59
+ // could undo this in the future if people are angry about it
60
+ {
61
+ type: AuthenticatorType.SUBACCOUNT_FILTER,
62
+ config: wrapAndEncode64('0'),
63
+ },
64
+ ];
65
+ const jsonString = JSON.stringify(subAuth);
66
+ const encodedData = new TextEncoder().encode(jsonString);
67
+ const topLevelType = AuthenticatorType.ALL_OF;
68
+ return {
69
+ type: topLevelType,
70
+ data: encodedData,
71
+ };
72
+ };
73
+ const isTruthy = (n) => Boolean(n);
74
+ // just parses out keys that match the format created in getAuthorizeNewTradingKeyArguments
75
+ export const getAuthorizedTradingKeysMetadata = (authorizedKeys) => {
76
+ return authorizedKeys
77
+ .map(({ config, id, type }) => {
78
+ var _a;
79
+ if (type !== AuthenticatorType.ALL_OF) {
80
+ return null;
81
+ }
82
+ const parsedConfig = JSON.parse(new TextDecoder().decode(config));
83
+ if (parsedConfig == null) {
84
+ return null;
85
+ }
86
+ const publicKey = (_a = parsedConfig.find((t) => t.type === AuthenticatorType.SIGNATURE_VERIFICATION)) === null || _a === void 0 ? void 0 : _a.config;
87
+ if (publicKey == null || typeof publicKey !== 'string') {
88
+ return null;
89
+ }
90
+ const address = toBech32(BECH32_PREFIX, rawSecp256k1PubkeyToRawAddress(fromBase64(publicKey)));
91
+ return {
92
+ id: id.toString(),
93
+ publicKey,
94
+ address,
95
+ };
96
+ })
97
+ .filter(isTruthy);
98
+ };
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGluZy1rZXktdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RyYWRpbmcta2V5LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTFELE9BQU8sRUFFTCxpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsR0FDekIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLElBRTVDLEVBQUU7SUFDRixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakQsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXZFLE1BQU0sYUFBYSxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN0RixN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