@dydxprotocol/v4-client-js 1.4.0 → 1.6.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.
Files changed (126) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/__native__/__ios__/v4-native-client.js +3062 -173
  3. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/cosmos/bundle.d.ts +158 -158
  4. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/cosmos/bundle.js +126 -126
  5. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/genesis.d.ts +44 -1
  6. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/genesis.js +75 -4
  7. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/models.d.ts +40 -0
  8. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/models.js +81 -0
  9. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/params.d.ts +20 -0
  10. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/params.js +64 -0
  11. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/query.d.ts +85 -0
  12. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/query.js +243 -0
  13. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/query.lcd.d.ts +11 -0
  14. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/query.lcd.js +28 -0
  15. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/query.rpc.Query.d.ts +24 -0
  16. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/query.rpc.Query.js +70 -0
  17. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/tx.d.ts +128 -0
  18. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/tx.js +313 -0
  19. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/tx.rpc.msg.d.ts +21 -0
  20. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/accountplus/tx.rpc.msg.js +53 -0
  21. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/affiliates.d.ts +76 -0
  22. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/affiliates.js +197 -0
  23. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/genesis.d.ts +17 -0
  24. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/genesis.js +64 -0
  25. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.d.ts +161 -0
  26. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.js +327 -0
  27. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.rpc.Query.d.ts +28 -0
  28. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/query.rpc.Query.js +79 -0
  29. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/tx.d.ts +87 -0
  30. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/tx.js +239 -0
  31. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/tx.rpc.msg.d.ts +18 -0
  32. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/affiliates/tx.rpc.msg.js +53 -0
  33. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/bundle.d.ts +2929 -1778
  34. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/bundle.js +321 -284
  35. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order.d.ts +39 -0
  36. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/order.js +71 -2
  37. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.d.ts +87 -11
  38. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/query.js +157 -28
  39. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/streaming.d.ts +19 -0
  40. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/clob/streaming.js +73 -0
  41. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/events/events.d.ts +41 -0
  42. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/events/events.js +107 -3
  43. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/protocol/v1/vault.d.ts +17 -0
  44. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/indexer/protocol/v1/vault.js +62 -0
  45. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/lcd.d.ts +2 -0
  46. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/lcd.js +7 -1
  47. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/params.d.ts +25 -0
  48. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/params.js +80 -0
  49. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.d.ts +25 -0
  50. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.js +64 -2
  51. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.lcd.d.ts +9 -0
  52. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.lcd.js +16 -0
  53. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.rpc.Query.d.ts +5 -1
  54. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/query.rpc.Query.js +10 -1
  55. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.d.ts +81 -0
  56. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.js +144 -2
  57. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.rpc.msg.d.ts +7 -1
  58. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/listing/tx.rpc.msg.js +13 -1
  59. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/revshare.d.ts +37 -0
  60. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/revshare.js +82 -2
  61. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/tx.d.ts +28 -1
  62. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/tx.js +72 -2
  63. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/tx.rpc.msg.d.ts +4 -1
  64. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/revshare/tx.rpc.msg.js +7 -1
  65. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/rpc.query.d.ts +17 -1
  66. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/rpc.query.js +3 -1
  67. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/rpc.tx.d.ts +2 -0
  68. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/rpc.tx.js +3 -1
  69. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/stats/stats.d.ts +20 -0
  70. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/stats/stats.js +46 -2
  71. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/subaccounts/streaming.d.ts +86 -0
  72. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/subaccounts/streaming.js +178 -0
  73. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/genesis.d.ts +69 -8
  74. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/genesis.js +153 -15
  75. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/params.d.ts +31 -0
  76. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/params.js +82 -2
  77. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.d.ts +214 -26
  78. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.js +385 -37
  79. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.lcd.d.ts +6 -2
  80. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.lcd.js +37 -5
  81. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.rpc.Query.d.ts +21 -5
  82. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query.rpc.Query.js +46 -8
  83. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/share.d.ts +44 -4
  84. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/share.js +90 -2
  85. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.d.ts +230 -45
  86. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.js +476 -37
  87. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.rpc.msg.d.ts +25 -7
  88. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx.rpc.msg.js +41 -11
  89. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/vault.d.ts +20 -0
  90. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/vault.js +63 -2
  91. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/gogoproto/bundle.js +2 -2
  92. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/google/bundle.d.ts +174 -174
  93. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/google/bundle.js +12 -12
  94. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/tendermint/bundle.d.ts +365 -365
  95. package/build/node_modules/@dydxprotocol/v4-proto/src/codegen/tendermint/bundle.js +22 -22
  96. package/build/src/clients/composite-client.d.ts +12 -7
  97. package/build/src/clients/composite-client.js +28 -9
  98. package/build/src/clients/constants.d.ts +3 -0
  99. package/build/src/clients/constants.js +7 -2
  100. package/build/src/clients/helpers/chain-helpers.d.ts +1 -0
  101. package/build/src/clients/helpers/chain-helpers.js +11 -3
  102. package/build/src/clients/lib/registry.js +5 -1
  103. package/build/src/clients/modules/composer.d.ts +2 -0
  104. package/build/src/clients/modules/composer.js +31 -1
  105. package/build/src/clients/modules/get.d.ts +3 -1
  106. package/build/src/clients/modules/get.js +22 -4
  107. package/build/src/clients/modules/post.d.ts +10 -0
  108. package/build/src/clients/modules/post.js +27 -1
  109. package/build/src/clients/modules/proto-includes.d.ts +1 -0
  110. package/build/src/clients/modules/proto-includes.js +3 -2
  111. package/build/src/clients/validator-client.d.ts +4 -0
  112. package/build/src/clients/validator-client.js +9 -1
  113. package/build/src/lib/helpers.d.ts +1 -0
  114. package/build/src/lib/helpers.js +11 -2
  115. package/build/tsconfig.tsbuildinfo +1 -1
  116. package/package.json +2 -2
  117. package/src/clients/composite-client.ts +86 -29
  118. package/src/clients/constants.ts +7 -2
  119. package/src/clients/helpers/chain-helpers.ts +12 -2
  120. package/src/clients/lib/registry.ts +9 -0
  121. package/src/clients/modules/composer.ts +50 -0
  122. package/src/clients/modules/get.ts +45 -4
  123. package/src/clients/modules/post.ts +67 -0
  124. package/src/clients/modules/proto-includes.ts +1 -0
  125. package/src/clients/validator-client.ts +9 -0
  126. package/src/lib/helpers.ts +10 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dydxprotocol/v4-client-js",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "General client library for the new dYdX system (v4 decentralized)",
5
5
  "main": "build/src/index.js",
6
6
  "scripts": {
@@ -39,7 +39,7 @@
39
39
  "@cosmjs/tendermint-rpc": "^0.32.1",
40
40
  "@cosmjs/utils": "^0.32.1",
41
41
  "@osmonauts/lcd": "^0.6.0",
42
- "@dydxprotocol/v4-proto": "6.0.1",
42
+ "@dydxprotocol/v4-proto": "7.0.0-dev.0",
43
43
  "@scure/bip32": "^1.1.5",
44
44
  "@scure/bip39": "^1.1.1",
45
45
  "axios": "1.1.3",
@@ -13,6 +13,7 @@ import { parseUnits } from 'ethers';
13
13
  import Long from 'long';
14
14
  import protobuf from 'protobufjs';
15
15
 
16
+ import { bigIntToBytes } from '../lib/helpers';
16
17
  import { isStatefulOrder, verifyOrderFlags } from '../lib/validation';
17
18
  import { GovAddNewMarketParams, OrderFlags } from '../types';
18
19
  import {
@@ -34,6 +35,7 @@ import {
34
35
  calculateClientMetadata,
35
36
  calculateConditionType,
36
37
  calculateConditionalOrderTriggerSubticks,
38
+ calculateVaultQuantums,
37
39
  } from './helpers/chain-helpers';
38
40
  import { IndexerClient } from './indexer-client';
39
41
  import { UserError } from './lib/errors';
@@ -109,6 +111,11 @@ export class CompositeClient {
109
111
  this._validatorClient.setSelectedGasDenom(gasDenom);
110
112
  }
111
113
 
114
+ async populateAccountNumberCache(address: string): Promise<void> {
115
+ if (!this._validatorClient) throw new Error('Validator client not initialized');
116
+ await this._validatorClient.populateAccountNumberCache(address);
117
+ }
118
+
112
119
  /**
113
120
  * @description Sign a list of messages with a wallet.
114
121
  * the calling function is responsible for creating the messages.
@@ -703,35 +710,36 @@ export class CompositeClient {
703
710
  }
704
711
 
705
712
  /**
706
- * @description Batch cancel short term orders using marketId to clobPairId translation.
707
- *
708
- * @param subaccount The subaccount to cancel the order from
709
- * @param shortTermOrders The list of short term order batches to cancel with marketId
710
- * @param goodTilBlock The goodTilBlock of the order to cancel
711
- * @returns The transaction hash.
712
- */
713
- async batchCancelShortTermOrdersWithMarketId(
714
- subaccount: SubaccountInfo,
715
- shortTermOrders: OrderBatchWithMarketId[],
716
- goodTilBlock: number,
717
- broadcastMode?: BroadcastMode,
718
- ): Promise<BroadcastTxAsyncResponse | BroadcastTxSyncResponse | IndexedTx> {
719
- const orderBatches = await Promise.all(
720
- shortTermOrders.map(async ({ marketId, clobPairId, clientIds }) => ({
721
- clobPairId: (
722
- clobPairId ??
723
- (await this.indexerClient.markets.getPerpetualMarkets(marketId)).markets[marketId]
724
- ).clobPairId,
725
- clientIds }))
726
- );
727
-
728
- return this.validatorClient.post.batchCancelShortTermOrders(
729
- subaccount,
730
- orderBatches,
731
- goodTilBlock,
732
- broadcastMode
733
- );
734
- }
713
+ * @description Batch cancel short term orders using marketId to clobPairId translation.
714
+ *
715
+ * @param subaccount The subaccount to cancel the order from
716
+ * @param shortTermOrders The list of short term order batches to cancel with marketId
717
+ * @param goodTilBlock The goodTilBlock of the order to cancel
718
+ * @returns The transaction hash.
719
+ */
720
+ async batchCancelShortTermOrdersWithMarketId(
721
+ subaccount: SubaccountInfo,
722
+ shortTermOrders: OrderBatchWithMarketId[],
723
+ goodTilBlock: number,
724
+ broadcastMode?: BroadcastMode,
725
+ ): Promise<BroadcastTxAsyncResponse | BroadcastTxSyncResponse | IndexedTx> {
726
+ const orderBatches = await Promise.all(
727
+ shortTermOrders.map(async ({ marketId, clobPairId, clientIds }) => ({
728
+ clobPairId: (
729
+ clobPairId ??
730
+ (await this.indexerClient.markets.getPerpetualMarkets(marketId)).markets[marketId]
731
+ ).clobPairId,
732
+ clientIds,
733
+ })),
734
+ );
735
+
736
+ return this.validatorClient.post.batchCancelShortTermOrders(
737
+ subaccount,
738
+ orderBatches,
739
+ goodTilBlock,
740
+ broadcastMode,
741
+ );
742
+ }
735
743
 
736
744
  /**
737
745
  * @description Batch cancel short term orders using clobPairId.
@@ -1051,6 +1059,55 @@ async batchCancelShortTermOrdersWithMarketId(
1051
1059
  return Buffer.from(signature).toString('base64');
1052
1060
  }
1053
1061
 
1062
+ // vaults
1063
+
1064
+ async depositToMegavault(
1065
+ subaccount: SubaccountInfo,
1066
+ amountUsdc: number,
1067
+ broadcastMode?: BroadcastMode,
1068
+ ): Promise<BroadcastTxAsyncResponse | BroadcastTxSyncResponse | IndexedTx> {
1069
+ return this.validatorClient.post.depositToMegavault(
1070
+ subaccount,
1071
+ bigIntToBytes(calculateVaultQuantums(amountUsdc)),
1072
+ broadcastMode,
1073
+ );
1074
+ }
1075
+
1076
+ depositToMegavaultMessage(subaccount: SubaccountInfo, amountUsdc: number): EncodeObject {
1077
+ return this.validatorClient.post.depositToMegavaultMsg(
1078
+ subaccount.address,
1079
+ subaccount.subaccountNumber,
1080
+ bigIntToBytes(calculateVaultQuantums(amountUsdc)),
1081
+ );
1082
+ }
1083
+
1084
+ async withdrawFromMegavault(
1085
+ subaccount: SubaccountInfo,
1086
+ shares: number,
1087
+ minAmount: number,
1088
+ broadcastMode?: BroadcastMode,
1089
+ ): Promise<BroadcastTxAsyncResponse | BroadcastTxSyncResponse | IndexedTx> {
1090
+ return this.validatorClient.post.withdrawFromMegavault(
1091
+ subaccount,
1092
+ bigIntToBytes(BigInt(Math.floor(shares))),
1093
+ bigIntToBytes(calculateVaultQuantums(minAmount)),
1094
+ broadcastMode,
1095
+ );
1096
+ }
1097
+
1098
+ withdrawFromMegavaultMessage(
1099
+ subaccount: SubaccountInfo,
1100
+ shares: number,
1101
+ minAmount: number,
1102
+ ): EncodeObject {
1103
+ return this.validatorClient.post.withdrawFromMegavaultMsg(
1104
+ subaccount.address,
1105
+ subaccount.subaccountNumber,
1106
+ bigIntToBytes(BigInt(Math.floor(shares))),
1107
+ bigIntToBytes(calculateVaultQuantums(minAmount)),
1108
+ );
1109
+ }
1110
+
1054
1111
  /**
1055
1112
  * @description Submit a governance proposal to add a new market.
1056
1113
  *
@@ -94,6 +94,10 @@ export const TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT =
94
94
  '/dydxprotocol.sending.MsgWithdrawFromSubaccount';
95
95
  export const TYPE_URL_MSG_DEPOSIT_TO_SUBACCOUNT = '/dydxprotocol.sending.MsgDepositToSubaccount';
96
96
 
97
+ // x/vault
98
+ export const TYPE_URL_MSG_DEPOSIT_TO_MEGAVAULT = '/dydxprotocol.vault.MsgDepositToMegavault';
99
+ export const TYPE_URL_MSG_WITHDRAW_FROM_MEGAVAULT = '/dydxprotocol.vault.MsgWithdrawFromMegavault';
100
+
97
101
  // x/staking
98
102
  export const TYPE_URL_MSG_DELEGATE = '/cosmos.staking.v1beta1.MsgDelegate';
99
103
  export const TYPE_URL_MSG_UNDELEGATE = '/cosmos.staking.v1beta1.MsgUndelegate';
@@ -106,6 +110,7 @@ export const TYPE_URL_MSG_WITHDRAW_DELEGATOR_REWARD =
106
110
  // The following are same across different networks / deployments.
107
111
  export const GOV_MODULE_ADDRESS = 'dydx10d07y265gmmuvt4z0w9aw880jnsr700jnmapky';
108
112
  export const DELAYMSG_MODULE_ADDRESS = 'dydx1mkkvp26dngu6n8rmalaxyp3gwkjuzztq5zx6tr';
113
+ export const MEGAVAULT_MODULE_ADDRESS = 'dydx18tkxrnrkqc2t0lr3zxr5g6a4hdvqksylxqje4r';
109
114
 
110
115
  // ------------ Market Statistic Day Types ------------
111
116
  export enum MarketStatisticDay {
@@ -177,8 +182,8 @@ export enum TimePeriod {
177
182
  }
178
183
 
179
184
  export enum PnlTickInterval {
180
- HOUR = "hour",
181
- day = "day",
185
+ HOUR = 'hour',
186
+ day = 'day',
182
187
  }
183
188
 
184
189
  // ------------ API Defaults ------------
@@ -6,7 +6,11 @@ import { Order_ConditionType, Order_Side, Order_TimeInForce } from '../modules/p
6
6
  import { OrderFlags } from '../types';
7
7
 
8
8
  export function round(input: number, base: number): number {
9
- return BigNumber(input).div(BigNumber(base)).integerValue(BigNumber.ROUND_FLOOR).times(BigNumber(base)).toNumber();
9
+ return BigNumber(input)
10
+ .div(BigNumber(base))
11
+ .integerValue(BigNumber.ROUND_FLOOR)
12
+ .times(BigNumber(base))
13
+ .toNumber();
10
14
  }
11
15
 
12
16
  export function calculateQuantums(
@@ -14,13 +18,19 @@ export function calculateQuantums(
14
18
  atomicResolution: number,
15
19
  stepBaseQuantums: number,
16
20
  ): Long {
17
- const rawQuantums = BigNumber(size).times(BigNumber(10).pow(BigNumber(atomicResolution).negated()));
21
+ const rawQuantums = BigNumber(size).times(
22
+ BigNumber(10).pow(BigNumber(atomicResolution).negated()),
23
+ );
18
24
  const quantums = round(rawQuantums.toNumber(), stepBaseQuantums);
19
25
  // stepBaseQuantums functions as minimum order size
20
26
  const result = Math.max(quantums, stepBaseQuantums);
21
27
  return Long.fromNumber(result);
22
28
  }
23
29
 
30
+ export function calculateVaultQuantums(size: number): bigint {
31
+ return BigInt(BigNumber(size).times(1_000_000).toFixed(0, BigNumber.ROUND_FLOOR));
32
+ }
33
+
24
34
  export function calculateSubticks(
25
35
  price: number,
26
36
  atomicResolution: number,
@@ -15,6 +15,10 @@ import {
15
15
  MsgDepositToSubaccount,
16
16
  } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/sending/transfer';
17
17
  import { MsgCreateTransfer } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/sending/tx';
18
+ import {
19
+ MsgDepositToMegavault,
20
+ MsgWithdrawFromMegavault,
21
+ } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx';
18
22
 
19
23
  import {
20
24
  TYPE_URL_MSG_PLACE_ORDER,
@@ -28,6 +32,8 @@ import {
28
32
  TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT,
29
33
  TYPE_URL_MSG_DEPOSIT_TO_SUBACCOUNT,
30
34
  TYPE_URL_BATCH_CANCEL,
35
+ TYPE_URL_MSG_DEPOSIT_TO_MEGAVAULT,
36
+ TYPE_URL_MSG_WITHDRAW_FROM_MEGAVAULT,
31
37
  } from '../constants';
32
38
 
33
39
  export const registry: ReadonlyArray<[string, GeneratedType]> = [];
@@ -49,6 +55,9 @@ export function generateRegistry(): Registry {
49
55
  // prices
50
56
  [TYPE_URL_MSG_CREATE_ORACLE_MARKET, MsgCreateOracleMarket as GeneratedType],
51
57
 
58
+ // vaults
59
+ [TYPE_URL_MSG_DEPOSIT_TO_MEGAVAULT, MsgDepositToMegavault as GeneratedType],
60
+ [TYPE_URL_MSG_WITHDRAW_FROM_MEGAVAULT, MsgWithdrawFromMegavault as GeneratedType],
52
61
  // sending
53
62
  [TYPE_URL_MSG_CREATE_TRANSFER, MsgCreateTransfer as GeneratedType],
54
63
  [TYPE_URL_MSG_WITHDRAW_FROM_SUBACCOUNT, MsgWithdrawFromSubaccount as GeneratedType],
@@ -18,6 +18,10 @@ import { MsgDelayMessage } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol
18
18
  import { PerpetualMarketType } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/perpetual';
19
19
  import { MsgCreatePerpetual } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/perpetuals/tx';
20
20
  import { MsgCreateOracleMarket } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/prices/tx';
21
+ import {
22
+ MsgDepositToMegavault,
23
+ MsgWithdrawFromMegavault,
24
+ } from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/tx';
21
25
  import { MsgSend } from 'cosmjs-types/cosmos/bank/v1beta1/tx';
22
26
  import { Coin } from 'cosmjs-types/cosmos/base/v1beta1/coin';
23
27
  import { Any } from 'cosmjs-types/google/protobuf/any';
@@ -43,6 +47,7 @@ import {
43
47
  TYPE_URL_MSG_UNDELEGATE,
44
48
  TYPE_URL_MSG_WITHDRAW_DELEGATOR_REWARD,
45
49
  TYPE_URL_BATCH_CANCEL,
50
+ TYPE_URL_MSG_DEPOSIT_TO_MEGAVAULT,
46
51
  } from '../constants';
47
52
  import { DenomConfig } from '../types';
48
53
  import {
@@ -445,6 +450,51 @@ export class Composer {
445
450
  };
446
451
  }
447
452
 
453
+ // ------------ x/vault ------------
454
+ public composeMsgDepositToMegavault(
455
+ address: string,
456
+ subaccountNumber: number,
457
+ quoteQuantums: Uint8Array,
458
+ ): EncodeObject {
459
+ const subaccountId: SubaccountId = {
460
+ owner: address,
461
+ number: subaccountNumber,
462
+ };
463
+
464
+ const msg: MsgDepositToMegavault = {
465
+ quoteQuantums,
466
+ subaccountId,
467
+ };
468
+
469
+ return {
470
+ typeUrl: TYPE_URL_MSG_DEPOSIT_TO_MEGAVAULT,
471
+ value: msg,
472
+ };
473
+ }
474
+
475
+ public composeMsgWithdrawFromMegavault(
476
+ address: string,
477
+ subaccountNumber: number,
478
+ shares: Uint8Array,
479
+ minQuoteQuantums: Uint8Array,
480
+ ): EncodeObject {
481
+ const subaccountId: SubaccountId = {
482
+ owner: address,
483
+ number: subaccountNumber,
484
+ };
485
+
486
+ const msg: MsgWithdrawFromMegavault = {
487
+ minQuoteQuantums,
488
+ shares: { numShares: shares },
489
+ subaccountId,
490
+ };
491
+
492
+ return {
493
+ typeUrl: TYPE_URL_MSG_DEPOSIT_TO_MEGAVAULT,
494
+ value: msg,
495
+ };
496
+ }
497
+
448
498
  // ------------ x/staking ------------
449
499
  public composeMsgDelegate(delegator: string, validator: string, amount: Coin): EncodeObject {
450
500
  const msg: MsgDelegate = {
@@ -13,6 +13,7 @@ import { Any } from 'cosmjs-types/google/protobuf/any';
13
13
  import Long from 'long';
14
14
  import protobuf from 'protobufjs';
15
15
 
16
+ import { bigIntToBytes } from '../../lib/helpers';
16
17
  import { PAGE_REQUEST } from '../constants';
17
18
  import { UnexpectedClientError } from '../lib/errors';
18
19
  import {
@@ -29,6 +30,7 @@ import {
29
30
  StakingModule,
30
31
  StatsModule,
31
32
  SubaccountsModule,
33
+ VaultModule,
32
34
  } from './proto-includes';
33
35
  import { TendermintClient } from './tendermintClient';
34
36
 
@@ -415,8 +417,7 @@ export class Get {
415
417
  const requestData = Uint8Array.from(
416
418
  DistributionModule.QueryDelegationTotalRewardsRequest.encode({
417
419
  delegatorAddress,
418
- })
419
- .finish(),
420
+ }).finish(),
420
421
  );
421
422
 
422
423
  const data: Uint8Array = await this.sendQuery(
@@ -491,9 +492,13 @@ export class Get {
491
492
  return GovV1Module.QueryProposalsResponse.decode(data);
492
493
  }
493
494
 
494
- async getWithdrawalAndTransferGatingStatus(perpetualId: number): Promise<SubaccountsModule.QueryGetWithdrawalAndTransfersBlockedInfoResponse> {
495
+ async getWithdrawalAndTransferGatingStatus(
496
+ perpetualId: number,
497
+ ): Promise<SubaccountsModule.QueryGetWithdrawalAndTransfersBlockedInfoResponse> {
495
498
  const requestData = Uint8Array.from(
496
- SubaccountsModule.QueryGetWithdrawalAndTransfersBlockedInfoRequest.encode({ perpetualId }).finish(),
499
+ SubaccountsModule.QueryGetWithdrawalAndTransfersBlockedInfoRequest.encode({
500
+ perpetualId,
501
+ }).finish(),
497
502
  );
498
503
 
499
504
  const data = await this.sendQuery(
@@ -518,6 +523,42 @@ export class Get {
518
523
  return RateLimitModule.QueryCapacityByDenomResponse.decode(data);
519
524
  }
520
525
 
526
+ async getMegavaultOwnerShares(
527
+ address: string,
528
+ ): Promise<VaultModule.QueryMegavaultOwnerSharesResponse> {
529
+ const requestData: Uint8Array = Uint8Array.from(
530
+ VaultModule.QueryMegavaultOwnerSharesRequest.encode({
531
+ address,
532
+ }).finish(),
533
+ );
534
+
535
+ const data: Uint8Array = await this.sendQuery(
536
+ '/dydxprotocol.vault.Query/MegavaultOwnerShares',
537
+ requestData,
538
+ );
539
+
540
+ return VaultModule.QueryMegavaultOwnerSharesResponse.decode(data);
541
+ }
542
+
543
+ async getMegavaultWithdrawalInfo(
544
+ sharesToWithdraw: bigint,
545
+ ): Promise<VaultModule.QueryMegavaultWithdrawalInfoResponse> {
546
+ const requestData: Uint8Array = Uint8Array.from(
547
+ VaultModule.QueryMegavaultWithdrawalInfoRequest.encode({
548
+ sharesToWithdraw: {
549
+ numShares: bigIntToBytes(sharesToWithdraw),
550
+ },
551
+ }).finish(),
552
+ );
553
+
554
+ const data: Uint8Array = await this.sendQuery(
555
+ '/dydxprotocol.vault.Query/MegavaultWithdrawalInfo',
556
+ requestData,
557
+ );
558
+
559
+ return VaultModule.QueryMegavaultWithdrawalInfoResponse.decode(data);
560
+ }
561
+
521
562
  private async sendQuery(requestUrl: string, requestData: Uint8Array): Promise<Uint8Array> {
522
563
  // eslint-disable-next-line max-len
523
564
  const resp: QueryAbciResponse = await this.stargateQueryClient.queryAbci(
@@ -76,6 +76,18 @@ export class Post {
76
76
  );
77
77
  }
78
78
 
79
+ /**
80
+ * @description Retrieves the account number for the given wallet address and populates the accountNumberCache.
81
+ * The account number is required for txOptions when signing a transaction.
82
+ * Pre-populating the cache avoids a round-trip request during the first transaction creation in the session, preventing it from being a performance blocker.
83
+ */
84
+ public async populateAccountNumberCache(address: string): Promise<void> {
85
+ if (this.accountNumberCache.has(address)) return;
86
+
87
+ const account = await this.get.getAccount(address);
88
+ this.accountNumberCache.set(address, account);
89
+ }
90
+
79
91
  setSelectedGasDenom(selectedGasDenom: SelectedGasDenom): void {
80
92
  this.selectedGasDenom = selectedGasDenom;
81
93
  }
@@ -800,4 +812,59 @@ export class Post {
800
812
  withdrawDelegatorRewardMsg(delegator: string, validator: string): EncodeObject {
801
813
  return this.composer.composeMsgWithdrawDelegatorReward(delegator, validator);
802
814
  }
815
+
816
+ // vaults
817
+ async depositToMegavault(
818
+ subaccount: SubaccountInfo,
819
+ quoteQuantums: Uint8Array,
820
+ broadcastMode?: BroadcastMode,
821
+ ): Promise<BroadcastTxAsyncResponse | BroadcastTxSyncResponse | IndexedTx> {
822
+ const msg = await this.depositToMegavaultMsg(
823
+ subaccount.address,
824
+ subaccount.subaccountNumber,
825
+ quoteQuantums,
826
+ );
827
+ return this.send(
828
+ subaccount.wallet,
829
+ () => Promise.resolve([msg]),
830
+ false,
831
+ undefined,
832
+ undefined,
833
+ broadcastMode,
834
+ );
835
+ }
836
+
837
+ depositToMegavaultMsg(
838
+ ...args: Parameters<Composer['composeMsgDepositToMegavault']>
839
+ ): EncodeObject {
840
+ return this.composer.composeMsgDepositToMegavault(...args);
841
+ }
842
+
843
+ async withdrawFromMegavault(
844
+ subaccount: SubaccountInfo,
845
+ shares: Uint8Array,
846
+ minQuoteQuantums: Uint8Array,
847
+ broadcastMode?: BroadcastMode,
848
+ ): Promise<BroadcastTxAsyncResponse | BroadcastTxSyncResponse | IndexedTx> {
849
+ const msg = await this.withdrawFromMegavaultMsg(
850
+ subaccount.address,
851
+ subaccount.subaccountNumber,
852
+ shares,
853
+ minQuoteQuantums,
854
+ );
855
+ return this.send(
856
+ subaccount.wallet,
857
+ () => Promise.resolve([msg]),
858
+ false,
859
+ undefined,
860
+ undefined,
861
+ broadcastMode,
862
+ );
863
+ }
864
+
865
+ withdrawFromMegavaultMsg(
866
+ ...args: Parameters<Composer['composeMsgWithdrawFromMegavault']>
867
+ ): EncodeObject {
868
+ return this.composer.composeMsgWithdrawFromMegavault(...args);
869
+ }
803
870
  }
@@ -11,6 +11,7 @@ export * as RewardsModule from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/
11
11
  export * as StakingModule from '@dydxprotocol/v4-proto/src/codegen/cosmos/staking/v1beta1/query';
12
12
  export * as BridgeModule from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/bridge/query';
13
13
  export * as DistributionModule from '@dydxprotocol/v4-proto/src/codegen/cosmos/distribution/v1beta1/query';
14
+ export * as VaultModule from '@dydxprotocol/v4-proto/src/codegen/dydxprotocol/vault/query';
14
15
 
15
16
  export * from '@dydxprotocol/v4-proto/src/codegen/cosmos/base/abci/v1beta1/abci';
16
17
  export * from '@dydxprotocol/v4-proto/src/codegen/cosmos/gov/v1/gov';
@@ -69,6 +69,15 @@ export class ValidatorClient {
69
69
  this._post.setSelectedGasDenom(gasDenom);
70
70
  }
71
71
 
72
+
73
+ /**
74
+ * @description populate account number cache in the Post module for performance.
75
+ */
76
+ async populateAccountNumberCache(address: string): Promise<void> {
77
+ if (!this._post) throw new Error('Post module not initialized');
78
+ await this._post.populateAccountNumberCache(address);
79
+ }
80
+
72
81
  private async initialize(): Promise<void> {
73
82
  const tendermint37Client: Tendermint37Client = await Tendermint37Client.connect(
74
83
  this.config.restEndpoint,
@@ -49,6 +49,16 @@ function toBigInt(u: Uint8Array): BigInt {
49
49
  return negated ? -abs : abs;
50
50
  }
51
51
 
52
+ export function bigIntToBytes(value: bigint): Uint8Array {
53
+ const absoluteValue = value < 0 ? value * BigInt(-1) : value;
54
+ const nonPaddedHexValue = absoluteValue.toString(16);
55
+ const paddedHexValue =
56
+ nonPaddedHexValue.length % 2 === 0 ? nonPaddedHexValue : `0${nonPaddedHexValue}`;
57
+ const numberBytes = Buffer.from(paddedHexValue, 'hex');
58
+ const signedBytes = Uint8Array.of(value < 0 ? 3 : 2, ...numberBytes);
59
+ return signedBytes;
60
+ }
61
+
52
62
  export enum ByteArrayEncoding {
53
63
  HEX = 'hex',
54
64
  BIGINT = 'bigint',