@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.
- package/__native__/__ios__/v4-native-client.js +2 -2
- package/build/examples/gov_add_new_market.d.ts +1 -0
- package/build/examples/gov_add_new_market.js +75 -0
- package/build/src/clients/composite-client.d.ts +13 -1
- package/build/src/clients/composite-client.js +44 -1
- package/build/src/clients/constants.d.ts +14 -0
- package/build/src/clients/constants.js +28 -2
- package/build/src/clients/lib/registry.js +19 -7
- package/build/src/clients/modules/composer.d.ts +11 -1
- package/build/src/clients/modules/composer.js +131 -7
- package/build/src/clients/modules/get.d.ts +11 -1
- package/build/src/clients/modules/get.js +23 -1
- package/build/src/clients/modules/proto-includes.d.ts +3 -1
- package/build/src/clients/modules/proto-includes.js +5 -3
- package/build/src/clients/native.js +2 -2
- package/build/src/clients/types.d.ts +14 -0
- package/build/src/clients/types.js +1 -1
- package/build/src/lib/helpers.js +2 -2
- package/build/src/lib/utils.d.ts +15 -0
- package/build/src/lib/utils.js +23 -2
- package/examples/gov_add_new_market.json +64 -0
- package/examples/gov_add_new_market.ts +93 -0
- package/package.json +1 -1
- package/src/clients/composite-client.ts +97 -2
- package/src/clients/constants.ts +42 -8
- package/src/clients/lib/registry.ts +34 -7
- package/src/clients/modules/composer.ts +218 -7
- package/src/clients/modules/get.ts +36 -3
- package/src/clients/modules/proto-includes.ts +5 -3
- package/src/clients/native.ts +1 -1
- package/src/clients/types.ts +26 -0
- package/src/lib/helpers.ts +1 -1
- package/src/lib/utils.ts +24 -0
package/build/src/lib/helpers.js
CHANGED
|
@@ -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
|
|
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,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrQ0FBeUM7QUFDekMsZ0VBQXFDO0FBQ3JDLGdEQUF3QjtBQUd4QiwyQ0FBK0M7QUFFL0M7Ozs7O0dBS0c7QUFDSCxTQUFnQixzQ0FBc0MsQ0FDcEQseUJBQXFEO0lBRXJELElBQUkseUJBQXlCLEtBQUssU0FBUyxFQUFFO1FBQzNDLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsT0FBTztRQUNMLFFBQVEsRUFBRSw0QkFBZ0I7UUFDMUIsR0FBRyx5QkFBeUI7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFYRCx3RkFXQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEtBQWE7SUFDMUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFORCx3Q0FNQztBQUVELFNBQVMsUUFBUSxDQUFDLENBQWE7SUFDN0IsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNqQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsQjtJQUNELHNDQUFzQztJQUN0QyxNQUFNLE9BQU8sR0FBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxHQUFHLEdBQVcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELE1BQU0sR0FBRyxHQUFXLE1BQU0sQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDOUIsQ0FBQztBQUVELElBQVksaUJBR1g7QUFIRCxXQUFZLGlCQUFpQjtJQUMzQixnQ0FBVyxDQUFBO0lBQ1gsc0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUhXLGlCQUFpQixHQUFqQix5QkFBaUIsS0FBakIseUJBQWlCLFFBRzVCO0FBRUQsU0FBZ0IsVUFBVSxDQUN4QixNQUFlLEVBQ2Ysb0JBQXVDLGlCQUFpQixDQUFDLEdBQUc7SUFFNUQsaURBQWlEO0lBQ2pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDekQscURBQXFEO1FBQ3JELHdFQUF3RTtRQUN4RSxJQUFJLEtBQUssWUFBWSxzQkFBUyxFQUFFO1lBQzlCLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLEtBQUssWUFBWSxjQUFJLEVBQUU7WUFDekIsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE1BQU0sYUFBWSxVQUFVLEVBQUU7WUFDdkMsSUFBSSxpQkFBaUIsS0FBSyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQy9DLE9BQU8sSUFBQSxnQkFBSyxFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtpQkFBTTtnQkFDTCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDMUM7U0FDRjthQUFNLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRTtZQUN0QyxJQUFJLGlCQUFpQixLQUFLLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDL0MsT0FBTyxJQUFBLGdCQUFLLEVBQUMsS0FBSyxDQUFDLENBQUM7YUFDckI7aUJBQU07Z0JBQ0wsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDbkM7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBaENELGdDQWdDQyJ9
|
package/build/src/lib/utils.d.ts
CHANGED
|
@@ -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;
|
package/build/src/lib/utils.js
CHANGED
|
@@ -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
|
-
|
|
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
|
@@ -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
|
}
|
package/src/clients/constants.ts
CHANGED
|
@@ -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
|
-
|
|
135
|
-
|
|
168
|
+
public restEndpoint: string;
|
|
169
|
+
public websocketEndpoint: string;
|
|
136
170
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
13
|
-
|
|
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
|
-
[
|
|
20
|
-
[
|
|
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
|
-
[
|
|
24
|
-
[
|
|
25
|
-
[
|
|
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,
|