@dydxprotocol/v4-client-js 1.0.14 → 1.0.16

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 (33) hide show
  1. package/__native__/__ios__/v4-native-client.js +2 -2
  2. package/build/examples/gov_add_new_market.d.ts +1 -0
  3. package/build/examples/gov_add_new_market.js +75 -0
  4. package/build/src/clients/composite-client.d.ts +13 -1
  5. package/build/src/clients/composite-client.js +44 -1
  6. package/build/src/clients/constants.d.ts +14 -0
  7. package/build/src/clients/constants.js +28 -2
  8. package/build/src/clients/lib/registry.js +19 -7
  9. package/build/src/clients/modules/composer.d.ts +11 -1
  10. package/build/src/clients/modules/composer.js +131 -7
  11. package/build/src/clients/modules/get.d.ts +11 -1
  12. package/build/src/clients/modules/get.js +23 -1
  13. package/build/src/clients/modules/proto-includes.d.ts +3 -1
  14. package/build/src/clients/modules/proto-includes.js +5 -3
  15. package/build/src/clients/native.js +2 -2
  16. package/build/src/clients/types.d.ts +14 -0
  17. package/build/src/clients/types.js +1 -1
  18. package/build/src/lib/helpers.js +2 -2
  19. package/build/src/lib/utils.d.ts +15 -0
  20. package/build/src/lib/utils.js +23 -2
  21. package/examples/gov_add_new_market.json +64 -0
  22. package/examples/gov_add_new_market.ts +93 -0
  23. package/package.json +1 -1
  24. package/src/clients/composite-client.ts +97 -2
  25. package/src/clients/constants.ts +42 -8
  26. package/src/clients/lib/registry.ts +34 -7
  27. package/src/clients/modules/composer.ts +218 -7
  28. package/src/clients/modules/get.ts +36 -3
  29. package/src/clients/modules/proto-includes.ts +5 -3
  30. package/src/clients/native.ts +1 -1
  31. package/src/clients/types.ts +26 -0
  32. package/src/lib/helpers.ts +1 -1
  33. package/src/lib/utils.ts +24 -0
@@ -60,7 +60,7 @@ function encodeJson(object, byteArrayEncoding = ByteArrayEncoding.HEX) {
60
60
  if (value instanceof bignumber_js_1.default) {
61
61
  return value.toString();
62
62
  }
63
- if (value instanceof BigInt) {
63
+ if (typeof value === 'bigint') {
64
64
  return value.toString();
65
65
  }
66
66
  if (value instanceof long_1.default) {
@@ -86,4 +86,4 @@ function encodeJson(object, byteArrayEncoding = ByteArrayEncoding.HEX) {
86
86
  });
87
87
  }
88
88
  exports.encodeJson = encodeJson;
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrQ0FBeUM7QUFDekMsZ0VBQXFDO0FBQ3JDLGdEQUF3QjtBQUd4QiwyQ0FBK0M7QUFFL0M7Ozs7O0dBS0c7QUFDSCxTQUFnQixzQ0FBc0MsQ0FDcEQseUJBQXFEO0lBRXJELElBQUkseUJBQXlCLEtBQUssU0FBUyxFQUFFO1FBQzNDLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsT0FBTztRQUNMLFFBQVEsRUFBRSw0QkFBZ0I7UUFDMUIsR0FBRyx5QkFBeUI7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFYRCx3RkFXQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEtBQWE7SUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFORCx3Q0FNQztBQUVELFNBQVMsUUFBUSxDQUFDLENBQWE7SUFDN0IsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNqQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsQjtJQUNELHNDQUFzQztJQUN0QyxNQUFNLE9BQU8sR0FBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELE1BQU0sR0FBRyxHQUFXLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDOUIsQ0FBQztBQUVELElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQixnQ0FBVyxDQUFBO0lBQ1gsc0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGlCQUFpQixHQUFqQix5QkFBaUIsS0FBakIseUJBQWlCLFFBRzVCO0FBRUQsU0FBZ0IsVUFBVSxDQUN4QixNQUFlLEVBQ2Ysb0JBQXVDLGlCQUFpQixDQUFDLEdBQUc7SUFFNUQsaURBQWlEO0lBQ2pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDekQscURBQXFEO1FBQ3JELHdFQUF3RTtRQUN4RSxJQUFJLEtBQUssWUFBWSxzQkFBUyxFQUFFO1lBQzlCLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxLQUFLLFlBQVksTUFBTSxFQUFFO1lBQzNCLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxLQUFLLFlBQVksY0FBSSxFQUFFO1lBQ3pCLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLGFBQVksVUFBVSxFQUFFO1lBQ3ZDLElBQUksaUJBQWlCLEtBQUssaUJBQWlCLENBQUMsR0FBRyxFQUFFO2dCQUMvQyxPQUFPLElBQUEsZ0JBQUssRUFBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDNUI7aUJBQU07Z0JBQ0wsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQzFDO1NBQ0Y7YUFBTSxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUU7WUFDdEMsSUFBSSxpQkFBaUIsS0FBSyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQy9DLE9BQU8sSUFBQSxnQkFBSyxFQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3JCO2lCQUFNO2dCQUNMLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ25DO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWhDRCxnQ0FnQ0MifQ==
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrQ0FBeUM7QUFDekMsZ0VBQXFDO0FBQ3JDLGdEQUF3QjtBQUd4QiwyQ0FBK0M7QUFFL0M7Ozs7O0dBS0c7QUFDSCxTQUFnQixzQ0FBc0MsQ0FDcEQseUJBQXFEO0lBRXJELElBQUkseUJBQXlCLEtBQUssU0FBUyxFQUFFO1FBQzNDLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsT0FBTztRQUNMLFFBQVEsRUFBRSw0QkFBZ0I7UUFDMUIsR0FBRyx5QkFBeUI7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFYRCx3RkFXQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEtBQWE7SUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFORCx3Q0FNQztBQUVELFNBQVMsUUFBUSxDQUFDLENBQWE7SUFDN0IsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNqQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsQjtJQUNELHNDQUFzQztJQUN0QyxNQUFNLE9BQU8sR0FBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELE1BQU0sR0FBRyxHQUFXLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDOUIsQ0FBQztBQUVELElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQixnQ0FBVyxDQUFBO0lBQ1gsc0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGlCQUFpQixHQUFqQix5QkFBaUIsS0FBakIseUJBQWlCLFFBRzVCO0FBRUQsU0FBZ0IsVUFBVSxDQUN4QixNQUFlLEVBQ2Ysb0JBQXVDLGlCQUFpQixDQUFDLEdBQUc7SUFFNUQsaURBQWlEO0lBQ2pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDekQscURBQXFEO1FBQ3JELHdFQUF3RTtRQUN4RSxJQUFJLEtBQUssWUFBWSxzQkFBUyxFQUFFO1lBQzlCLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLEtBQUssWUFBWSxjQUFJLEVBQUU7WUFDekIsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE1BQU0sYUFBWSxVQUFVLEVBQUU7WUFDdkMsSUFBSSxpQkFBaUIsS0FBSyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQy9DLE9BQU8sSUFBQSxnQkFBSyxFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtpQkFBTTtnQkFDTCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDMUM7U0FDRjthQUFNLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRTtZQUN0QyxJQUFJLGlCQUFpQixLQUFLLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDL0MsT0FBTyxJQUFBLGdCQUFLLEVBQUMsS0FBSyxDQUFDLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDbkM7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBaENELGdDQWdDQyJ9
@@ -17,3 +17,18 @@ export declare function clientIdFromString(input: string): number;
17
17
  * @returns A promise that resolves after the specified number of milliseconds.
18
18
  */
19
19
  export declare function sleep(ms: number): Promise<void>;
20
+ /**
21
+ * Returns a title to use for a gov proposal that adds a new market.
22
+ *
23
+ * @param ticker ticker symbol for the new market.
24
+ * @returns title for the gov proposal.
25
+ */
26
+ export declare function getGovAddNewMarketTitle(ticker: string): string;
27
+ /**
28
+ * Returns a summary to use for a gov proposal that adds a new market.
29
+ *
30
+ * @param ticker ticker symbol for the new market.
31
+ * @param delayBlocks number of blocks to wait before activating the market.
32
+ * @returns summary for the gov proposal.
33
+ */
34
+ export declare function getGovAddNewMarketSummary(ticker: string, delayBlocks: number): string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sleep = exports.clientIdFromString = exports.generateRandomClientId = exports.randomInt = void 0;
3
+ exports.getGovAddNewMarketSummary = exports.getGovAddNewMarketTitle = exports.sleep = exports.clientIdFromString = exports.generateRandomClientId = exports.randomInt = void 0;
4
4
  const constants_1 = require("../clients/constants");
5
5
  /**
6
6
  * Returns a random integer value between 0 and (n-1).
@@ -42,4 +42,25 @@ async function sleep(ms) {
42
42
  return new Promise((resolve) => setTimeout(resolve, ms));
43
43
  }
44
44
  exports.sleep = sleep;
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUFtRDtBQUVuRDs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FDdkIsQ0FBUztJQUVULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUpELDhCQUlDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixzQkFBc0I7SUFDcEMsT0FBTyxTQUFTLENBQUMsdUJBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRkQsd0RBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsS0FBYTtJQUViLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztJQUNyQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFDcEYsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztLQUM3QztJQUVELDBEQUEwRDtJQUMxRCxzREFBc0Q7SUFDdEQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQWJELGdEQWFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxLQUFLLENBQUMsRUFBVTtJQUNwQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELHNCQUVDIn0=
45
+ /**
46
+ * Returns a title to use for a gov proposal that adds a new market.
47
+ *
48
+ * @param ticker ticker symbol for the new market.
49
+ * @returns title for the gov proposal.
50
+ */
51
+ function getGovAddNewMarketTitle(ticker) {
52
+ return `Add ${ticker} perpetual market`;
53
+ }
54
+ exports.getGovAddNewMarketTitle = getGovAddNewMarketTitle;
55
+ /**
56
+ * Returns a summary to use for a gov proposal that adds a new market.
57
+ *
58
+ * @param ticker ticker symbol for the new market.
59
+ * @param delayBlocks number of blocks to wait before activating the market.
60
+ * @returns summary for the gov proposal.
61
+ */
62
+ function getGovAddNewMarketSummary(ticker, delayBlocks) {
63
+ return `Add the x/prices, x/perpetuals and x/clob parameters needed for a ${ticker} perpetual market. Create the market in INITIALIZING status and transition it to ACTIVE status after ${delayBlocks} blocks.`;
64
+ }
65
+ exports.getGovAddNewMarketSummary = getGovAddNewMarketSummary;
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUFtRDtBQUVuRDs7R0FFRztBQUNILFNBQWdCLFNBQVMsQ0FDdkIsQ0FBUztJQUVULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUpELDhCQUlDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixzQkFBc0I7SUFDcEMsT0FBTyxTQUFTLENBQUMsdUJBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRkQsd0RBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsS0FBYTtJQUViLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztJQUNyQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFDcEYsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztLQUM3QztJQUVELDBEQUEwRDtJQUMxRCxzREFBc0Q7SUFDdEQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQWJELGdEQWFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxLQUFLLENBQUMsRUFBVTtJQUNwQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELHNCQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FBQyxNQUFjO0lBQ3BELE9BQU8sT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLENBQUM7QUFGRCwwREFFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHlCQUF5QixDQUN2QyxNQUFjLEVBQ2QsV0FBbUI7SUFFbkIsT0FBTyxxRUFBcUUsTUFBTSx3R0FBd0csV0FBVyxVQUFVLENBQUM7QUFDbE4sQ0FBQztBQUxELDhEQUtDIn0=
@@ -0,0 +1,64 @@
1
+ {
2
+ "title": "Add BONK-USD perpetual market",
3
+ "deposit": "10000000000000adv4tnt",
4
+ "summary": "Add the x/prices, x/perpetuals and x/clob parameters needed for a BONK-USD perpetual market. Create the market in INITIALIZING status and transition it to ACTIVE status after 5 blocks.",
5
+ "messages": [
6
+ {
7
+ "@type": "/dydxprotocol.prices.MsgCreateOracleMarket",
8
+ "authority": "dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky",
9
+ "params": {
10
+ "id": 34,
11
+ "pair": "BONK-USD",
12
+ "exponent": -14,
13
+ "minExchanges": 3,
14
+ "minPriceChangePpm": 4000,
15
+ "exchangeConfigJson": "{\"exchanges\":[{\"exchangeName\":\"Binance\",\"ticker\":\"BONKUSDT\",\"adjustByMarket\":\"USDT-USD\"},{\"exchangeName\":\"Bybit\",\"ticker\":\"BONKUSDT\",\"adjustByMarket\":\"USDT-USD\"},{\"exchangeName\":\"CoinbasePro\",\"ticker\":\"BONK-USD\"},{\"exchangeName\":\"Kucoin\",\"ticker\":\"BONK-USDT\",\"adjustByMarket\":\"USDT-USD\"},{\"exchangeName\":\"Okx\",\"ticker\":\"BONK-USDT\",\"adjustByMarket\":\"USDT-USD\"},{\"exchangeName\":\"Mexc\",\"ticker\":\"BONK_USDT\",\"adjustByMarket\":\"USDT-USD\"}]}"
16
+ }
17
+ },
18
+ {
19
+ "@type": "/dydxprotocol.perpetuals.MsgCreatePerpetual",
20
+ "authority": "dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky",
21
+ "params": {
22
+ "id": 34,
23
+ "marketId": 34,
24
+ "ticker": "BONK-USD",
25
+ "atomicResolution": -1,
26
+ "defaultFundingPpm": 0,
27
+ "liquidityTier": 2
28
+ }
29
+ },
30
+ {
31
+ "@type": "/dydxprotocol.clob.MsgCreateClobPair",
32
+ "authority": "dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky",
33
+ "clob_pair": {
34
+ "id": 34,
35
+ "perpetual_clob_metadata": {
36
+ "perpetual_id": 34
37
+ },
38
+ "quantum_conversion_exponent": -9,
39
+ "status": "STATUS_INITIALIZING",
40
+ "step_base_quantums": 1000000,
41
+ "subticks_per_tick": 1000000
42
+ }
43
+ },
44
+ {
45
+ "@type": "/dydxprotocol.delaymsg.MsgDelayMessage",
46
+ "authority": "dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky",
47
+ "msg": {
48
+ "@type": "/dydxprotocol.clob.MsgUpdateClobPair",
49
+ "authority": "dydx1mkkvp26dngu6n8rmalaxyp3gwkjuzztq5zx6tr",
50
+ "clob_pair": {
51
+ "id": 34,
52
+ "perpetual_clob_metadata": {
53
+ "perpetual_id": 34
54
+ },
55
+ "quantum_conversion_exponent": -9,
56
+ "status": "STATUS_ACTIVE",
57
+ "step_base_quantums": 1000000,
58
+ "subticks_per_tick": 1000000
59
+ }
60
+ },
61
+ "delay_blocks": 5
62
+ }
63
+ ]
64
+ }
@@ -0,0 +1,93 @@
1
+ import Long from 'long';
2
+
3
+ import { GovAddNewMarketParams, LocalWallet, ProposalStatus } from '../src';
4
+ import { CompositeClient } from '../src/clients/composite-client';
5
+ import { BECH32_PREFIX, Network } from '../src/clients/constants';
6
+ import { getGovAddNewMarketSummary, getGovAddNewMarketTitle, sleep } from '../src/lib/utils';
7
+ import { DYDX_LOCAL_MNEMONIC } from './constants';
8
+
9
+ const INITIAL_DEPOSIT_AMOUNT = 10_000_000_000_000; // 10,000 whole native tokens.
10
+ const MOCK_DATA: GovAddNewMarketParams = {
11
+ // common
12
+ id: 34,
13
+ ticker: 'BONK-USD',
14
+
15
+ // x/prices
16
+ priceExponent: -14,
17
+ minExchanges: 3,
18
+ minPriceChange: 4_000,
19
+ exchangeConfigJson: JSON.stringify({
20
+ exchanges: [
21
+ { exchangeName: 'Binance', ticker: 'BONKUSDT', adjustByMarket: 'USDT-USD' },
22
+ { exchangeName: 'Bybit', ticker: 'BONKUSDT', adjustByMarket: 'USDT-USD' },
23
+ { exchangeName: 'CoinbasePro', ticker: 'BONK-USD' },
24
+ { exchangeName: 'Kucoin', ticker: 'BONK-USDT', adjustByMarket: 'USDT-USD' },
25
+ { exchangeName: 'Okx', ticker: 'BONK-USDT', adjustByMarket: 'USDT-USD' },
26
+ { exchangeName: 'Mexc', ticker: 'BONK_USDT', adjustByMarket: 'USDT-USD' },
27
+ ],
28
+ }),
29
+
30
+ // x/perpetuals
31
+ liquidityTier: 2,
32
+ atomicResolution: -1,
33
+
34
+ // x/clob
35
+ quantumConversionExponent: -9,
36
+ stepBaseQuantums: Long.fromNumber(1_000_000),
37
+ subticksPerTick: 1_000_000,
38
+
39
+ // x/delaymsg
40
+ delayBlocks: 5,
41
+ };
42
+
43
+ // To run this test:
44
+ // npm run build && node build/examples/gov_add_new_market.js
45
+ //
46
+ // Confirmed that the proposals have the exact same content.
47
+ // 1. submit using an example json file
48
+ // dydxprotocold tx gov submit-proposal gov_add_new_market.json \
49
+ // --from alice --keyring-backend test --gas auto --fees 9553225000000000adv4tnt
50
+ // dydxprotocold query gov proposals
51
+ // 2. submit using the file's mock data
52
+ // npm run build && node build/examples/gov_add_new_market.js
53
+ // dydxprotocold query gov proposals
54
+ // 3. then compare the two proposals and ensure they match
55
+ async function test(): Promise<void> {
56
+ console.log('**Start**');
57
+
58
+ const wallet = await LocalWallet.fromMnemonic(DYDX_LOCAL_MNEMONIC, BECH32_PREFIX);
59
+ console.log(wallet);
60
+
61
+ const network = Network.local();
62
+ const client = await CompositeClient.connect(network);
63
+ console.log('**Client**');
64
+ console.log(client);
65
+
66
+ const tx = await client.submitGovAddNewMarketProposal(
67
+ wallet,
68
+ MOCK_DATA,
69
+ getGovAddNewMarketTitle(MOCK_DATA.ticker),
70
+ getGovAddNewMarketSummary(MOCK_DATA.ticker, MOCK_DATA.delayBlocks),
71
+ INITIAL_DEPOSIT_AMOUNT,
72
+ );
73
+ console.log('**Tx**');
74
+ console.log(tx);
75
+
76
+ await sleep(5000);
77
+
78
+ const depositProposals = await client.validatorClient.get.getAllGovProposals(
79
+ ProposalStatus.PROPOSAL_STATUS_DEPOSIT_PERIOD,
80
+ );
81
+ console.log('**Deposit Proposals**');
82
+ console.log(depositProposals);
83
+
84
+ const votingProposals = await client.validatorClient.get.getAllGovProposals(
85
+ ProposalStatus.PROPOSAL_STATUS_VOTING_PERIOD,
86
+ );
87
+ console.log('**Voting Proposals**');
88
+ console.log(votingProposals);
89
+ }
90
+
91
+ test().catch((error) => {
92
+ console.error(error);
93
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dydxprotocol/v4-client-js",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "General client library for the new dYdX system (v4 decentralized)",
5
5
  "main": "build/src/index.js",
6
6
  "scripts": {
@@ -9,7 +9,7 @@ import Long from 'long';
9
9
  import protobuf from 'protobufjs';
10
10
 
11
11
  import { isStatefulOrder, verifyOrderFlags } from '../lib/validation';
12
- import { OrderFlags } from '../types';
12
+ import { GovAddNewMarketParams, OrderFlags } from '../types';
13
13
  import {
14
14
  Network,
15
15
  OrderExecution,
@@ -31,6 +31,7 @@ import {
31
31
  } from './helpers/chain-helpers';
32
32
  import { IndexerClient } from './indexer-client';
33
33
  import { UserError } from './lib/errors';
34
+ import { generateRegistry } from './lib/registry';
34
35
  import LocalWallet from './modules/local-wallet';
35
36
  import { SubaccountInfo } from './subaccount';
36
37
  import { ValidatorClient } from './validator-client';
@@ -498,7 +499,7 @@ export class CompositeClient {
498
499
  );
499
500
  }
500
501
 
501
- private async retrieveMarketInfo(marketId: string, marketInfo?:MarketInfo): Promise<MarketInfo> {
502
+ private async retrieveMarketInfo(marketId: string, marketInfo?: MarketInfo): Promise<MarketInfo> {
502
503
  if (marketInfo) {
503
504
  return Promise.resolve(marketInfo);
504
505
  } else {
@@ -1000,4 +1001,98 @@ export class CompositeClient {
1000
1001
 
1001
1002
  return Buffer.from(signature).toString('base64');
1002
1003
  }
1004
+
1005
+ /**
1006
+ * @description Submit a governance proposal to add a new market.
1007
+ *
1008
+ * @param params Parameters neeeded to create a new market.
1009
+ * @param title Title of the gov proposal.
1010
+ * @param summary Summary of the gov proposal.
1011
+ * @param initialDepositAmount Initial deposit amount of the gov proposal.
1012
+ * @param proposer proposer of the gov proposal.
1013
+ *
1014
+ * @returns the transaction hash.
1015
+ */
1016
+ async submitGovAddNewMarketProposal(
1017
+ wallet: LocalWallet,
1018
+ params: GovAddNewMarketParams,
1019
+ title: string,
1020
+ summary: string,
1021
+ initialDepositAmount: number,
1022
+ ): Promise<BroadcastTxAsyncResponse | BroadcastTxSyncResponse | IndexedTx> {
1023
+ const msg: Promise<EncodeObject[]> = new Promise((resolve) => {
1024
+ const composer = this.validatorClient.post.composer;
1025
+ const registry = generateRegistry();
1026
+ const msgs: EncodeObject[] = [];
1027
+
1028
+ // x/prices.MsgCreateOracleMarket
1029
+ const createOracleMarket = composer.composeMsgCreateOracleMarket(
1030
+ params.id,
1031
+ params.ticker,
1032
+ params.priceExponent,
1033
+ params.minExchanges,
1034
+ params.minPriceChange,
1035
+ params.exchangeConfigJson,
1036
+ );
1037
+
1038
+ // x/perpetuals.MsgCreatePerpetual
1039
+ const createPerpetual = composer.composeMsgCreatePerpetual(
1040
+ params.id,
1041
+ params.id,
1042
+ params.ticker,
1043
+ params.atomicResolution,
1044
+ params.liquidityTier,
1045
+ );
1046
+
1047
+ // x/clob.MsgCreateClobPair
1048
+ const createClobPair = composer.composeMsgCreateClobPair(
1049
+ params.id,
1050
+ params.id,
1051
+ params.quantumConversionExponent,
1052
+ params.stepBaseQuantums,
1053
+ params.subticksPerTick,
1054
+ );
1055
+
1056
+ // x/clob.MsgUpdateClobPair
1057
+ const updateClobPair = composer.composeMsgUpdateClobPair(
1058
+ params.id,
1059
+ params.id,
1060
+ params.quantumConversionExponent,
1061
+ params.stepBaseQuantums,
1062
+ params.subticksPerTick,
1063
+ );
1064
+
1065
+ // x/delaymsg.MsgDelayMessage
1066
+ const delayMessage = composer.composeMsgDelayMessage(
1067
+ // IMPORTANT: must wrap messages in Any type to fit into delaymsg.
1068
+ composer.wrapMessageAsAny(registry, updateClobPair),
1069
+ params.delayBlocks,
1070
+ );
1071
+
1072
+ // The order matters.
1073
+ msgs.push(createOracleMarket);
1074
+ msgs.push(createPerpetual);
1075
+ msgs.push(createClobPair);
1076
+ msgs.push(delayMessage);
1077
+
1078
+ // x/gov.v1.MsgSubmitProposal
1079
+ const submitProposal = composer.composeMsgSubmitProposal(
1080
+ title,
1081
+ initialDepositAmount,
1082
+ this.validatorClient.config.denoms, // use the client denom.
1083
+ summary,
1084
+ // IMPORTANT: must wrap messages in Any type for gov's submit proposal.
1085
+ composer.wrapMessageArrAsAny(registry, msgs),
1086
+ wallet.address!, // proposer
1087
+ );
1088
+
1089
+ resolve([submitProposal]);
1090
+ });
1091
+
1092
+ return this.send(
1093
+ wallet,
1094
+ () => msg,
1095
+ false,
1096
+ );
1097
+ }
1003
1098
  }
@@ -43,6 +43,40 @@ export enum NetworkId {
43
43
  export const NETWORK_ID_MAINNET: string | null = null;
44
44
  export const NETWORK_ID_TESTNET: string = 'dydxprotocol-testnet';
45
45
 
46
+ // ------------ MsgType URLs ------------
47
+ // Default CosmosSDK
48
+ // x/bank
49
+ export const TYPE_URL_MSG_SEND = '/cosmos.bank.v1beta1.MsgSend';
50
+
51
+ // x/gov
52
+ export const TYPE_URL_MSG_SUBMIT_PROPOSAL = '/cosmos.gov.v1.MsgSubmitProposal';
53
+
54
+ // dYdX Specific
55
+ // x/clob
56
+ export const TYPE_URL_MSG_PLACE_ORDER = '/dydxprotocol.clob.MsgPlaceOrder';
57
+ export const TYPE_URL_MSG_CANCEL_ORDER = '/dydxprotocol.clob.MsgCancelOrder';
58
+ export const TYPE_URL_MSG_CREATE_CLOB_PAIR = '/dydxprotocol.clob.MsgCreateClobPair';
59
+ export const TYPE_URL_MSG_UPDATE_CLOB_PAIR = '/dydxprotocol.clob.MsgUpdateClobPair';
60
+
61
+ // x/delaymsg
62
+ export const TYPE_URL_MSG_DELAY_MESSAGE = '/dydxprotocol.delaymsg.MsgDelayMessage';
63
+
64
+ // x/perpetuals
65
+ export const TYPE_URL_MSG_CREATE_PERPETUAL = '/dydxprotocol.perpetuals.MsgCreatePerpetual';
66
+
67
+ // x/prices
68
+ export const TYPE_URL_MSG_CREATE_ORACLE_MARKET = '/dydxprotocol.prices.MsgCreateOracleMarket';
69
+
70
+ // x/sending
71
+ export const TYPE_URL_MSG_CREATE_TRANSFER = '/dydxprotocol.sending.MsgCreateTransfer';
72
+ export const TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT = '/dydxprotocol.sending.MsgWithdrawFromSubaccount';
73
+ export const TYPE_URL_MSG_DEPOSIT_TO_SUBACCOUNT = '/dydxprotocol.sending.MsgDepositToSubaccount';
74
+
75
+ // ------------ Chain Constants ------------
76
+ // The following are same across different networks / deployments.
77
+ export const GOV_MODULE_ADDRESS = 'dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky';
78
+ export const DELAYMSG_MODULE_ADDRESS = 'dydx1mkkvp26dngu6n8rmalaxyp3gwkjuzztq5zx6tr';
79
+
46
80
  // ------------ Market Statistic Day Types ------------
47
81
  export enum MarketStatisticDay {
48
82
  ONE = '1',
@@ -131,14 +165,14 @@ export const PAGE_REQUEST: PageRequest = {
131
165
  };
132
166
 
133
167
  export class IndexerConfig {
134
- public restEndpoint: string;
135
- public websocketEndpoint: string;
168
+ public restEndpoint: string;
169
+ public websocketEndpoint: string;
136
170
 
137
- constructor(restEndpoint: string,
138
- websocketEndpoint: string) {
139
- this.restEndpoint = restEndpoint;
140
- this.websocketEndpoint = websocketEndpoint;
141
- }
171
+ constructor(restEndpoint: string,
172
+ websocketEndpoint: string) {
173
+ this.restEndpoint = restEndpoint;
174
+ this.websocketEndpoint = websocketEndpoint;
175
+ }
142
176
  }
143
177
 
144
178
  export class ValidatorConfig {
@@ -166,7 +200,7 @@ export class Network {
166
200
  public env: string,
167
201
  public indexerConfig: IndexerConfig,
168
202
  public validatorConfig: ValidatorConfig,
169
- ) {}
203
+ ) { }
170
204
 
171
205
  static testnet(): Network {
172
206
  const indexerConfig = new IndexerConfig(
@@ -3,26 +3,53 @@ import { defaultRegistryTypes } from '@cosmjs/stargate';
3
3
  import {
4
4
  MsgPlaceOrder,
5
5
  MsgCancelOrder,
6
+ MsgCreateClobPair,
7
+ MsgUpdateClobPair,
6
8
  } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/tx';
9
+ import { MsgDelayMessage } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/delaymsg/tx';
10
+ import { MsgCreatePerpetual } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/tx';
11
+ import { MsgCreateOracleMarket } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/tx';
7
12
  import {
8
13
  MsgWithdrawFromSubaccount,
9
14
  MsgDepositToSubaccount,
10
15
  } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/sending/transfer';
16
+ import { MsgCreateTransfer } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/sending/tx';
17
+
11
18
  import {
12
- MsgCreateTransfer,
13
- } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/sending/tx';
19
+ TYPE_URL_MSG_PLACE_ORDER,
20
+ TYPE_URL_MSG_CANCEL_ORDER,
21
+ TYPE_URL_MSG_CREATE_CLOB_PAIR,
22
+ TYPE_URL_MSG_UPDATE_CLOB_PAIR,
23
+ TYPE_URL_MSG_DELAY_MESSAGE,
24
+ TYPE_URL_MSG_CREATE_PERPETUAL,
25
+ TYPE_URL_MSG_CREATE_ORACLE_MARKET,
26
+ TYPE_URL_MSG_CREATE_TRANSFER,
27
+ TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT,
28
+ TYPE_URL_MSG_DEPOSIT_TO_SUBACCOUNT,
29
+ } from '../constants';
14
30
 
15
31
  export const registry: ReadonlyArray<[string, GeneratedType]> = [];
16
32
  export function generateRegistry(): Registry {
17
33
  return new Registry([
18
34
  // clob
19
- ['/dydxprotocol.clob.MsgPlaceOrder', MsgPlaceOrder as GeneratedType],
20
- ['/dydxprotocol.clob.MsgCancelOrder', MsgCancelOrder as GeneratedType],
35
+ [TYPE_URL_MSG_PLACE_ORDER, MsgPlaceOrder as GeneratedType],
36
+ [TYPE_URL_MSG_CANCEL_ORDER, MsgCancelOrder as GeneratedType],
37
+ [TYPE_URL_MSG_CREATE_CLOB_PAIR, MsgCreateClobPair as GeneratedType],
38
+ [TYPE_URL_MSG_UPDATE_CLOB_PAIR, MsgUpdateClobPair as GeneratedType],
39
+
40
+ // delaymsg
41
+ [TYPE_URL_MSG_DELAY_MESSAGE, MsgDelayMessage as GeneratedType],
42
+
43
+ // perpetuals
44
+ [TYPE_URL_MSG_CREATE_PERPETUAL, MsgCreatePerpetual as GeneratedType],
45
+
46
+ // prices
47
+ [TYPE_URL_MSG_CREATE_ORACLE_MARKET, MsgCreateOracleMarket as GeneratedType],
21
48
 
22
49
  // sending
23
- ['/dydxprotocol.sending.MsgCreateTransfer', MsgCreateTransfer as GeneratedType],
24
- ['/dydxprotocol.sending.MsgWithdrawFromSubaccount', MsgWithdrawFromSubaccount as GeneratedType],
25
- ['/dydxprotocol.sending.MsgDepositToSubaccount', MsgDepositToSubaccount as GeneratedType],
50
+ [TYPE_URL_MSG_CREATE_TRANSFER, MsgCreateTransfer as GeneratedType],
51
+ [TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT, MsgWithdrawFromSubaccount as GeneratedType],
52
+ [TYPE_URL_MSG_DEPOSIT_TO_SUBACCOUNT, MsgDepositToSubaccount as GeneratedType],
26
53
 
27
54
  // default types
28
55
  ...defaultRegistryTypes,