@decibeltrade/sdk 0.1.1

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 (294) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint$colon$check.log +5 -0
  3. package/.turbo/turbo-lint.log +5 -0
  4. package/decibel_transactions.md +1049 -0
  5. package/dist/abi/abi-manager.d.ts +13 -0
  6. package/dist/abi/abi-manager.d.ts.map +1 -0
  7. package/dist/abi/abi-manager.js +21 -0
  8. package/dist/abi/abis.json +1322 -0
  9. package/dist/abi/bytecode-manager.d.ts +57 -0
  10. package/dist/abi/bytecode-manager.d.ts.map +1 -0
  11. package/dist/abi/bytecode-manager.js +62 -0
  12. package/dist/abi/bytecode.json +24 -0
  13. package/dist/abi/fetch-abis.d.ts +7 -0
  14. package/dist/abi/fetch-abis.d.ts.map +1 -0
  15. package/dist/abi/fetch-abis.js +132 -0
  16. package/dist/abi/fetch-bytecode.d.ts +24 -0
  17. package/dist/abi/fetch-bytecode.d.ts.map +1 -0
  18. package/dist/abi/fetch-bytecode.js +123 -0
  19. package/dist/abi/generate-abis.d.ts +6 -0
  20. package/dist/abi/generate-abis.d.ts.map +1 -0
  21. package/dist/abi/generate-abis.js +170 -0
  22. package/dist/abi/json/netna.json +1323 -0
  23. package/dist/abi/json/testnet.json +1315 -0
  24. package/dist/abi/types.d.ts +22 -0
  25. package/dist/abi/types.d.ts.map +1 -0
  26. package/dist/abi/types.js +2 -0
  27. package/dist/admin.d.ts +29 -0
  28. package/dist/admin.d.ts.map +1 -0
  29. package/dist/admin.js +203 -0
  30. package/dist/base.d.ts +42 -0
  31. package/dist/base.d.ts.map +1 -0
  32. package/dist/base.js +176 -0
  33. package/dist/constants.d.ts +41 -0
  34. package/dist/constants.d.ts.map +1 -0
  35. package/dist/constants.js +78 -0
  36. package/dist/fee-pay.d.ts +11 -0
  37. package/dist/fee-pay.d.ts.map +1 -0
  38. package/dist/fee-pay.js +30 -0
  39. package/dist/gas/gas-price-manager.d.ts +35 -0
  40. package/dist/gas/gas-price-manager.d.ts.map +1 -0
  41. package/dist/gas/gas-price-manager.js +93 -0
  42. package/dist/gas-price-manager.d.ts +31 -0
  43. package/dist/gas-price-manager.d.ts.map +1 -0
  44. package/dist/gas-price-manager.js +84 -0
  45. package/dist/index.d.ts +11 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +26 -0
  48. package/dist/order-event.types.d.ts +55 -0
  49. package/dist/order-event.types.d.ts.map +1 -0
  50. package/dist/order-event.types.js +3 -0
  51. package/dist/order-status.d.ts +43 -0
  52. package/dist/order-status.d.ts.map +1 -0
  53. package/dist/order-status.js +86 -0
  54. package/dist/read/account-overview/account-overview.reader.d.ts +37 -0
  55. package/dist/read/account-overview/account-overview.reader.d.ts.map +1 -0
  56. package/dist/read/account-overview/account-overview.reader.js +35 -0
  57. package/dist/read/account-overview/account-overview.types.d.ts +52 -0
  58. package/dist/read/account-overview/account-overview.types.d.ts.map +1 -0
  59. package/dist/read/account-overview/account-overview.types.js +36 -0
  60. package/dist/read/api-wallets/api-wallets.reader.d.ts +17 -0
  61. package/dist/read/api-wallets/api-wallets.reader.d.ts.map +1 -0
  62. package/dist/read/api-wallets/api-wallets.reader.js +27 -0
  63. package/dist/read/api-wallets/api-wallets.types.d.ts +17 -0
  64. package/dist/read/api-wallets/api-wallets.types.d.ts.map +1 -0
  65. package/dist/read/api-wallets/api-wallets.types.js +13 -0
  66. package/dist/read/base-reader.d.ts +22 -0
  67. package/dist/read/base-reader.d.ts.map +1 -0
  68. package/dist/read/base-reader.js +29 -0
  69. package/dist/read/candlesticks/candlesticks.reader.d.ts +31 -0
  70. package/dist/read/candlesticks/candlesticks.reader.d.ts.map +1 -0
  71. package/dist/read/candlesticks/candlesticks.reader.js +43 -0
  72. package/dist/read/candlesticks/candlesticks.types.d.ts +45 -0
  73. package/dist/read/candlesticks/candlesticks.types.d.ts.map +1 -0
  74. package/dist/read/candlesticks/candlesticks.types.js +36 -0
  75. package/dist/read/delegations/delegations.reader.d.ts +15 -0
  76. package/dist/read/delegations/delegations.reader.d.ts.map +1 -0
  77. package/dist/read/delegations/delegations.reader.js +23 -0
  78. package/dist/read/delegations/delegations.types.d.ts +17 -0
  79. package/dist/read/delegations/delegations.types.d.ts.map +1 -0
  80. package/dist/read/delegations/delegations.types.js +13 -0
  81. package/dist/read/index.d.ts +105 -0
  82. package/dist/read/index.d.ts.map +1 -0
  83. package/dist/read/index.js +244 -0
  84. package/dist/read/leaderboard/leaderboard.reader.d.ts +21 -0
  85. package/dist/read/leaderboard/leaderboard.reader.d.ts.map +1 -0
  86. package/dist/read/leaderboard/leaderboard.reader.js +22 -0
  87. package/dist/read/leaderboard/leaderboard.types.d.ts +27 -0
  88. package/dist/read/leaderboard/leaderboard.types.d.ts.map +1 -0
  89. package/dist/read/leaderboard/leaderboard.types.js +14 -0
  90. package/dist/read/market-contexts/market-contexts.reader.d.ts +22 -0
  91. package/dist/read/market-contexts/market-contexts.reader.d.ts.map +1 -0
  92. package/dist/read/market-contexts/market-contexts.reader.js +27 -0
  93. package/dist/read/market-contexts/market-contexts.types.d.ts +26 -0
  94. package/dist/read/market-contexts/market-contexts.types.d.ts.map +1 -0
  95. package/dist/read/market-contexts/market-contexts.types.js +19 -0
  96. package/dist/read/market-depth/market-depth.reader.d.ts +30 -0
  97. package/dist/read/market-depth/market-depth.reader.d.ts.map +1 -0
  98. package/dist/read/market-depth/market-depth.reader.js +46 -0
  99. package/dist/read/market-depth/market-depth.types.d.ts +20 -0
  100. package/dist/read/market-depth/market-depth.types.d.ts.map +1 -0
  101. package/dist/read/market-depth/market-depth.types.js +16 -0
  102. package/dist/read/market-prices/market-prices.reader.d.ts +44 -0
  103. package/dist/read/market-prices/market-prices.reader.d.ts.map +1 -0
  104. package/dist/read/market-prices/market-prices.reader.js +51 -0
  105. package/dist/read/market-prices/market-prices.types.d.ts +48 -0
  106. package/dist/read/market-prices/market-prices.types.d.ts.map +1 -0
  107. package/dist/read/market-prices/market-prices.types.js +26 -0
  108. package/dist/read/market-trades/market-trades.reader.d.ts +33 -0
  109. package/dist/read/market-trades/market-trades.reader.d.ts.map +1 -0
  110. package/dist/read/market-trades/market-trades.reader.js +39 -0
  111. package/dist/read/market-trades/market-trades.types.d.ts +52 -0
  112. package/dist/read/market-trades/market-trades.types.d.ts.map +1 -0
  113. package/dist/read/market-trades/market-trades.types.js +23 -0
  114. package/dist/read/markets/markets.reader.d.ts +38 -0
  115. package/dist/read/markets/markets.reader.d.ts.map +1 -0
  116. package/dist/read/markets/markets.reader.js +80 -0
  117. package/dist/read/markets/markets.types.d.ts +82 -0
  118. package/dist/read/markets/markets.types.d.ts.map +1 -0
  119. package/dist/read/markets/markets.types.js +46 -0
  120. package/dist/read/pagination.types.d.ts +14 -0
  121. package/dist/read/pagination.types.d.ts.map +1 -0
  122. package/dist/read/pagination.types.js +12 -0
  123. package/dist/read/portfolio-chart/portfolio-chart.reader.d.ts +14 -0
  124. package/dist/read/portfolio-chart/portfolio-chart.reader.d.ts.map +1 -0
  125. package/dist/read/portfolio-chart/portfolio-chart.reader.js +21 -0
  126. package/dist/read/portfolio-chart/portfolio-chart.types.d.ts +14 -0
  127. package/dist/read/portfolio-chart/portfolio-chart.types.d.ts.map +1 -0
  128. package/dist/read/portfolio-chart/portfolio-chart.types.js +12 -0
  129. package/dist/read/public-vaults/public-vaults.reader.d.ts +38 -0
  130. package/dist/read/public-vaults/public-vaults.reader.d.ts.map +1 -0
  131. package/dist/read/public-vaults/public-vaults.reader.js +31 -0
  132. package/dist/read/public-vaults/public-vaults.types.d.ts +62 -0
  133. package/dist/read/public-vaults/public-vaults.types.d.ts.map +1 -0
  134. package/dist/read/public-vaults/public-vaults.types.js +33 -0
  135. package/dist/read/types.d.ts +178 -0
  136. package/dist/read/types.d.ts.map +1 -0
  137. package/dist/read/types.js +87 -0
  138. package/dist/read/user-active-twaps/user-active-twaps.reader.d.ts +31 -0
  139. package/dist/read/user-active-twaps/user-active-twaps.reader.d.ts.map +1 -0
  140. package/dist/read/user-active-twaps/user-active-twaps.reader.js +31 -0
  141. package/dist/read/user-active-twaps/user-active-twaps.types.d.ts +49 -0
  142. package/dist/read/user-active-twaps/user-active-twaps.types.d.ts.map +1 -0
  143. package/dist/read/user-active-twaps/user-active-twaps.types.js +25 -0
  144. package/dist/read/user-bulk-orders/user-bulk-orders.reader.d.ts +31 -0
  145. package/dist/read/user-bulk-orders/user-bulk-orders.reader.d.ts.map +1 -0
  146. package/dist/read/user-bulk-orders/user-bulk-orders.reader.js +32 -0
  147. package/dist/read/user-bulk-orders/user-bulk-orders.types.d.ts +46 -0
  148. package/dist/read/user-bulk-orders/user-bulk-orders.types.d.ts.map +1 -0
  149. package/dist/read/user-bulk-orders/user-bulk-orders.types.js +24 -0
  150. package/dist/read/user-funding-history/user-funding-history.reader.d.ts +28 -0
  151. package/dist/read/user-funding-history/user-funding-history.reader.d.ts.map +1 -0
  152. package/dist/read/user-funding-history/user-funding-history.reader.js +32 -0
  153. package/dist/read/user-funding-history/user-funding-history.types.d.ts +37 -0
  154. package/dist/read/user-funding-history/user-funding-history.types.d.ts.map +1 -0
  155. package/dist/read/user-funding-history/user-funding-history.types.js +21 -0
  156. package/dist/read/user-notifications/user-notifications.reader.d.ts +13 -0
  157. package/dist/read/user-notifications/user-notifications.reader.d.ts.map +1 -0
  158. package/dist/read/user-notifications/user-notifications.reader.js +19 -0
  159. package/dist/read/user-notifications/user-notifications.types.d.ts +49 -0
  160. package/dist/read/user-notifications/user-notifications.types.d.ts.map +1 -0
  161. package/dist/read/user-notifications/user-notifications.types.js +18 -0
  162. package/dist/read/user-open-orders/user-open-orders.reader.d.ts +40 -0
  163. package/dist/read/user-open-orders/user-open-orders.reader.d.ts.map +1 -0
  164. package/dist/read/user-open-orders/user-open-orders.reader.js +31 -0
  165. package/dist/read/user-open-orders/user-open-orders.types.d.ts +76 -0
  166. package/dist/read/user-open-orders/user-open-orders.types.d.ts.map +1 -0
  167. package/dist/read/user-open-orders/user-open-orders.types.js +34 -0
  168. package/dist/read/user-order-history/user-order-history.reader.d.ts +40 -0
  169. package/dist/read/user-order-history/user-order-history.reader.d.ts.map +1 -0
  170. package/dist/read/user-order-history/user-order-history.reader.js +28 -0
  171. package/dist/read/user-order-history/user-order-history.types.d.ts +85 -0
  172. package/dist/read/user-order-history/user-order-history.types.d.ts.map +1 -0
  173. package/dist/read/user-order-history/user-order-history.types.js +37 -0
  174. package/dist/read/user-positions/user-positions.reader.d.ts +37 -0
  175. package/dist/read/user-positions/user-positions.reader.d.ts.map +1 -0
  176. package/dist/read/user-positions/user-positions.reader.js +41 -0
  177. package/dist/read/user-positions/user-positions.types.d.ts +2590 -0
  178. package/dist/read/user-positions/user-positions.types.d.ts.map +1 -0
  179. package/dist/read/user-positions/user-positions.types.js +31 -0
  180. package/dist/read/user-subaccounts/user-subaccounts.reader.d.ts +18 -0
  181. package/dist/read/user-subaccounts/user-subaccounts.reader.d.ts.map +1 -0
  182. package/dist/read/user-subaccounts/user-subaccounts.reader.js +28 -0
  183. package/dist/read/user-subaccounts/user-subaccounts.types.d.ts +21 -0
  184. package/dist/read/user-subaccounts/user-subaccounts.types.d.ts.map +1 -0
  185. package/dist/read/user-subaccounts/user-subaccounts.types.js +15 -0
  186. package/dist/read/user-trade-history/user-trade-history.reader.d.ts +33 -0
  187. package/dist/read/user-trade-history/user-trade-history.reader.d.ts.map +1 -0
  188. package/dist/read/user-trade-history/user-trade-history.reader.js +32 -0
  189. package/dist/read/user-trade-history/user-trade-history.types.d.ts +52 -0
  190. package/dist/read/user-trade-history/user-trade-history.types.d.ts.map +1 -0
  191. package/dist/read/user-trade-history/user-trade-history.types.js +26 -0
  192. package/dist/read/user-vaults/user-vaults.reader.d.ts +26 -0
  193. package/dist/read/user-vaults/user-vaults.reader.d.ts.map +1 -0
  194. package/dist/read/user-vaults/user-vaults.reader.js +32 -0
  195. package/dist/read/user-vaults/user-vaults.types.d.ts +39 -0
  196. package/dist/read/user-vaults/user-vaults.types.d.ts.map +1 -0
  197. package/dist/read/user-vaults/user-vaults.types.js +21 -0
  198. package/dist/read/vault/vault.reader.d.ts +95 -0
  199. package/dist/read/vault/vault.reader.d.ts.map +1 -0
  200. package/dist/read/vault/vault.reader.js +168 -0
  201. package/dist/read/vault/vault.types.d.ts +49 -0
  202. package/dist/read/vault/vault.types.d.ts.map +1 -0
  203. package/dist/read/vault/vault.types.js +45 -0
  204. package/dist/read/vaults/vaults.reader.d.ts +72 -0
  205. package/dist/read/vaults/vaults.reader.d.ts.map +1 -0
  206. package/dist/read/vaults/vaults.reader.js +63 -0
  207. package/dist/read/vaults/vaults.types.d.ts +140 -0
  208. package/dist/read/vaults/vaults.types.d.ts.map +1 -0
  209. package/dist/read/vaults/vaults.types.js +71 -0
  210. package/dist/read/ws-subscription.d.ts +21 -0
  211. package/dist/read/ws-subscription.d.ts.map +1 -0
  212. package/dist/read/ws-subscription.js +170 -0
  213. package/dist/subaccount-types.d.ts +24 -0
  214. package/dist/subaccount-types.d.ts.map +1 -0
  215. package/dist/subaccount-types.js +11 -0
  216. package/dist/transaction-builder.d.ts +14 -0
  217. package/dist/transaction-builder.d.ts.map +1 -0
  218. package/dist/transaction-builder.js +40 -0
  219. package/dist/tsconfig.tsbuildinfo +1 -0
  220. package/dist/utils.d.ts +56 -0
  221. package/dist/utils.d.ts.map +1 -0
  222. package/dist/utils.js +164 -0
  223. package/dist/vault-types.d.ts +43 -0
  224. package/dist/vault-types.d.ts.map +1 -0
  225. package/dist/vault-types.js +11 -0
  226. package/dist/write.d.ts +271 -0
  227. package/dist/write.d.ts.map +1 -0
  228. package/dist/write.js +485 -0
  229. package/eslint.config.mjs +25 -0
  230. package/package.json +39 -0
  231. package/readme.md +257 -0
  232. package/sdk_reference.md +876 -0
  233. package/src/abi/generate-abis.ts +164 -0
  234. package/src/abi/json/netna.json +1323 -0
  235. package/src/abi/json/testnet.json +1315 -0
  236. package/src/abi/types.ts +23 -0
  237. package/src/admin.ts +284 -0
  238. package/src/base.ts +218 -0
  239. package/src/constants.ts +118 -0
  240. package/src/fee-pay.ts +39 -0
  241. package/src/gas/gas-price-manager.ts +115 -0
  242. package/src/index.ts +10 -0
  243. package/src/order-event.types.ts +65 -0
  244. package/src/order-status.ts +89 -0
  245. package/src/read/account-overview/account-overview.reader.ts +43 -0
  246. package/src/read/account-overview/account-overview.types.ts +45 -0
  247. package/src/read/base-reader.ts +41 -0
  248. package/src/read/candlesticks/candlesticks.reader.ts +61 -0
  249. package/src/read/candlesticks/candlesticks.types.ts +46 -0
  250. package/src/read/delegations/delegations.reader.ts +22 -0
  251. package/src/read/delegations/delegations.types.ts +19 -0
  252. package/src/read/index.ts +271 -0
  253. package/src/read/leaderboard/leaderboard.reader.ts +21 -0
  254. package/src/read/leaderboard/leaderboard.types.ts +26 -0
  255. package/src/read/market-contexts/market-contexts.reader.ts +26 -0
  256. package/src/read/market-contexts/market-contexts.types.ts +18 -0
  257. package/src/read/market-depth/market-depth.reader.ts +60 -0
  258. package/src/read/market-depth/market-depth.types.ts +24 -0
  259. package/src/read/market-prices/market-prices.reader.ts +61 -0
  260. package/src/read/market-prices/market-prices.types.ts +38 -0
  261. package/src/read/market-trades/market-trades.reader.ts +46 -0
  262. package/src/read/market-trades/market-trades.types.ts +34 -0
  263. package/src/read/markets/markets.reader.ts +82 -0
  264. package/src/read/markets/markets.types.ts +54 -0
  265. package/src/read/pagination.types.ts +18 -0
  266. package/src/read/portfolio-chart/portfolio-chart.reader.ts +20 -0
  267. package/src/read/portfolio-chart/portfolio-chart.types.ts +21 -0
  268. package/src/read/types.ts +129 -0
  269. package/src/read/user-active-twaps/user-active-twaps.reader.ts +36 -0
  270. package/src/read/user-active-twaps/user-active-twaps.types.ts +33 -0
  271. package/src/read/user-bulk-orders/user-bulk-orders.reader.ts +37 -0
  272. package/src/read/user-bulk-orders/user-bulk-orders.types.ts +32 -0
  273. package/src/read/user-funding-history/user-funding-history.reader.ts +38 -0
  274. package/src/read/user-funding-history/user-funding-history.types.ts +29 -0
  275. package/src/read/user-notifications/user-notifications.reader.ts +17 -0
  276. package/src/read/user-notifications/user-notifications.types.ts +61 -0
  277. package/src/read/user-open-orders/user-open-orders.reader.ts +36 -0
  278. package/src/read/user-open-orders/user-open-orders.types.ts +42 -0
  279. package/src/read/user-order-history/user-order-history.reader.ts +34 -0
  280. package/src/read/user-order-history/user-order-history.types.ts +44 -0
  281. package/src/read/user-positions/user-positions.reader.ts +55 -0
  282. package/src/read/user-positions/user-positions.types.ts +43 -0
  283. package/src/read/user-subaccounts/user-subaccounts.reader.ts +30 -0
  284. package/src/read/user-subaccounts/user-subaccounts.types.ts +21 -0
  285. package/src/read/user-trade-history/user-trade-history.reader.ts +38 -0
  286. package/src/read/user-trade-history/user-trade-history.types.ts +33 -0
  287. package/src/read/vaults/vaults.reader.ts +79 -0
  288. package/src/read/vaults/vaults.types.ts +106 -0
  289. package/src/read/ws-subscription.ts +200 -0
  290. package/src/subaccount-types.ts +31 -0
  291. package/src/transaction-builder.ts +75 -0
  292. package/src/utils.ts +255 -0
  293. package/src/write.ts +965 -0
  294. package/tsconfig.json +8 -0
package/src/write.ts ADDED
@@ -0,0 +1,965 @@
1
+ import { Account, AccountAddress, CommittedTransactionResponse } from "@aptos-labs/ts-sdk";
2
+
3
+ import { BaseSDK, Options } from "./base";
4
+ import { DecibelConfig } from "./constants";
5
+ import { OrderEvent, PlaceOrderResult, TwapEvent } from "./order-event.types";
6
+ import { OrderStatusClient } from "./order-status";
7
+ import {
8
+ ActivateVaultArgs,
9
+ CreateVaultArgs,
10
+ DepositToVaultArgs,
11
+ WithdrawFromVaultArgs,
12
+ } from "./read";
13
+ import { RenameSubaccountArgs, RenameSubaccountSchema } from "./subaccount-types";
14
+ import { getMarketAddr, getPrimarySubaccountAddr, postRequest } from "./utils";
15
+
16
+ export const TimeInForce = {
17
+ GoodTillCanceled: 0,
18
+ PostOnly: 1,
19
+ ImmediateOrCancel: 2,
20
+ } as const;
21
+ export type TimeInForce = (typeof TimeInForce)[keyof typeof TimeInForce];
22
+
23
+ interface Cache {
24
+ usdcDecimals?: number;
25
+ }
26
+
27
+ type WithSignerAddress<T> = T & {
28
+ signerAddress: AccountAddress;
29
+ };
30
+
31
+ /**
32
+ * Rounds price to the nearest tick size multiple
33
+ * @param price The price to round
34
+ * @param tickSize The market's tick size
35
+ * @returns Price rounded to nearest tick size multiple
36
+ */
37
+ function roundToTickSize(price: number, tickSize: number): number {
38
+ if (price === 0 || tickSize === 0) return 0;
39
+ return Math.round(price / tickSize) * tickSize;
40
+ }
41
+
42
+ export class DecibelWriteDex extends BaseSDK {
43
+ readonly cache: Cache;
44
+ readonly orderStatusClient: OrderStatusClient;
45
+
46
+ constructor(config: DecibelConfig, account: Account, opts?: Options) {
47
+ super(config, account, opts);
48
+ this.cache = {};
49
+ this.orderStatusClient = new OrderStatusClient(config);
50
+ }
51
+
52
+ /**
53
+ * Extract order_id from OrderEvent in transaction response
54
+ */
55
+ private extractOrderIdFromTransaction(
56
+ txResponse: CommittedTransactionResponse,
57
+ subaccountAddr?: string,
58
+ ): string | null {
59
+ const orderEvents = ["market_types::OrderEvent", "async_matching_engine::TwapEvent"];
60
+ try {
61
+ // Check if the response is a UserTransactionResponse with events
62
+ if ("events" in txResponse && Array.isArray(txResponse.events)) {
63
+ for (const event of txResponse.events) {
64
+ // Check if this is an OrderEvent from the market module
65
+ for (const orderEvent of orderEvents) {
66
+ if (event.type.includes(orderEvent)) {
67
+ const orderEvent = event.data as OrderEvent | TwapEvent;
68
+ // Verify the event's user field matches the subaccount placing the order
69
+ const userAddress = subaccountAddr ?? this.account.accountAddress;
70
+ const orderUserAddress = (orderEvent as OrderEvent).user;
71
+ const twapUserAddress = (orderEvent as TwapEvent).account;
72
+ if (orderUserAddress === userAddress || twapUserAddress === userAddress) {
73
+ return typeof orderEvent.order_id === "string"
74
+ ? orderEvent.order_id
75
+ : orderEvent.order_id.order_id;
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ return null;
82
+ } catch (error) {
83
+ console.error("Error extracting order_id from transaction:", error);
84
+ return null;
85
+ }
86
+ }
87
+
88
+ async renameSubaccount({ subaccountAddress, newName }: RenameSubaccountArgs) {
89
+ return await postRequest({
90
+ schema: RenameSubaccountSchema,
91
+ url: `${this.config.tradingHttpUrl}/api/v1/subaccounts/${subaccountAddress}`,
92
+ body: { name: newName },
93
+ });
94
+ }
95
+
96
+ async createSubaccount() {
97
+ return await this.sendTx({
98
+ function: `${this.config.deployment.package}::dex_accounts::create_new_subaccount`,
99
+ typeArguments: [],
100
+ functionArguments: [],
101
+ });
102
+ }
103
+
104
+ async sendSubaccountTx(
105
+ sendTx: (subaccountAddr: string) => Promise<CommittedTransactionResponse>,
106
+ subaccountAddr?: string,
107
+ ) {
108
+ if (!subaccountAddr) {
109
+ subaccountAddr = getPrimarySubaccountAddr(this.account.accountAddress);
110
+ }
111
+ return await sendTx(subaccountAddr);
112
+ }
113
+
114
+ async withSubaccount<T>(fn: (subaccountAddr: string) => Promise<T>, subaccountAddr?: string) {
115
+ if (!subaccountAddr) {
116
+ subaccountAddr = getPrimarySubaccountAddr(this.account.accountAddress);
117
+ }
118
+ return await fn(subaccountAddr);
119
+ }
120
+ /**
121
+ * @param amount u64 amount of collateral to deposit
122
+ */
123
+ async deposit(amount: number, subaccountAddr?: string) {
124
+ if (!subaccountAddr) {
125
+ return await this.sendTx({
126
+ function: `${this.config.deployment.package}::dex_accounts::deposit_to_subaccount`,
127
+ typeArguments: [],
128
+ functionArguments: [this.config.deployment.usdc, amount],
129
+ });
130
+ } else {
131
+ return await this.sendSubaccountTx(
132
+ (subaccountAddr) =>
133
+ this.sendTx({
134
+ function: `${this.config.deployment.package}::dex_accounts::deposit_to_subaccount_at`,
135
+ typeArguments: [],
136
+ functionArguments: [subaccountAddr, this.config.deployment.usdc, amount],
137
+ }),
138
+ subaccountAddr,
139
+ );
140
+ }
141
+ }
142
+
143
+ /**
144
+ * @param amount u64 amount of collateral to withdraw
145
+ */
146
+ async withdraw(amount: number, subaccountAddr?: string) {
147
+ return await this.sendSubaccountTx(
148
+ (subaccountAddr) =>
149
+ this.sendTx({
150
+ function: `${this.config.deployment.package}::dex_accounts::withdraw_from_subaccount`,
151
+ typeArguments: [],
152
+ functionArguments: [subaccountAddr, this.config.deployment.usdc, amount],
153
+ }),
154
+ subaccountAddr,
155
+ );
156
+ }
157
+
158
+ async configureUserSettingsForMarket({
159
+ marketAddr,
160
+ subaccountAddr,
161
+ isCross,
162
+ userLeverage,
163
+ }: {
164
+ marketAddr: string;
165
+ subaccountAddr: string;
166
+ isCross: boolean;
167
+ userLeverage: number;
168
+ }) {
169
+ return await this.sendSubaccountTx(
170
+ (subaccountAddr) =>
171
+ this.sendTx({
172
+ function: `${this.config.deployment.package}::dex_accounts::configure_user_settings_for_market`,
173
+ typeArguments: [],
174
+ functionArguments: [subaccountAddr, marketAddr, isCross, userLeverage],
175
+ }),
176
+ subaccountAddr,
177
+ );
178
+ }
179
+
180
+ async placeOrder({
181
+ marketName,
182
+ price,
183
+ size,
184
+ isBuy,
185
+ timeInForce,
186
+ isReduceOnly,
187
+ clientOrderId,
188
+ stopPrice,
189
+ tpTriggerPrice,
190
+ tpLimitPrice,
191
+ slTriggerPrice,
192
+ slLimitPrice,
193
+ builderAddr,
194
+ builderFee,
195
+ subaccountAddr,
196
+ accountOverride,
197
+ tickSize,
198
+ }: {
199
+ marketName: string;
200
+ price: number;
201
+ size: number;
202
+ isBuy: boolean;
203
+ timeInForce: TimeInForce;
204
+ isReduceOnly: boolean;
205
+ clientOrderId?: string;
206
+ stopPrice?: number;
207
+ tpTriggerPrice?: number;
208
+ tpLimitPrice?: number;
209
+ slTriggerPrice?: number;
210
+ slLimitPrice?: number;
211
+ builderAddr?: string;
212
+ builderFee?: number;
213
+ subaccountAddr?: string;
214
+ /**
215
+ * Optional account to use for the transaction. Primarily set as the session
216
+ * account. If not provided, the default constructor account will be used
217
+ */
218
+ accountOverride?: Account;
219
+ /**
220
+ * Market tick size for price rounding. If not provided, no rounding is applied.
221
+ */
222
+ tickSize?: number;
223
+ }): Promise<PlaceOrderResult> {
224
+ try {
225
+ const marketAddr = getMarketAddr(marketName, this.config.deployment.perpEngineGlobal);
226
+
227
+ // Apply tick size rounding if tickSize is provided
228
+ const roundedPrice = tickSize ? roundToTickSize(price, tickSize) : price;
229
+ const roundedStopPrice =
230
+ stopPrice !== undefined && tickSize ? roundToTickSize(stopPrice, tickSize) : stopPrice;
231
+ const roundedTpTriggerPrice =
232
+ tpTriggerPrice !== undefined && tickSize
233
+ ? roundToTickSize(tpTriggerPrice, tickSize)
234
+ : tpTriggerPrice;
235
+ const roundedTpLimitPrice =
236
+ tpLimitPrice !== undefined && tickSize
237
+ ? roundToTickSize(tpLimitPrice, tickSize)
238
+ : tpLimitPrice;
239
+ const roundedSlTriggerPrice =
240
+ slTriggerPrice !== undefined && tickSize
241
+ ? roundToTickSize(slTriggerPrice, tickSize)
242
+ : slTriggerPrice;
243
+ const roundedSlLimitPrice =
244
+ slLimitPrice !== undefined && tickSize
245
+ ? roundToTickSize(slLimitPrice, tickSize)
246
+ : slLimitPrice;
247
+
248
+ const txResponse = await this.sendSubaccountTx(
249
+ (subaccountAddr) =>
250
+ this.sendTx(
251
+ {
252
+ function: `${this.config.deployment.package}::dex_accounts::place_order_to_subaccount`,
253
+ typeArguments: [],
254
+ functionArguments: [
255
+ subaccountAddr,
256
+ marketAddr.toString(),
257
+ roundedPrice,
258
+ size,
259
+ isBuy,
260
+ timeInForce,
261
+ isReduceOnly,
262
+ clientOrderId,
263
+ roundedStopPrice,
264
+ roundedTpTriggerPrice,
265
+ roundedTpLimitPrice,
266
+ roundedSlTriggerPrice,
267
+ roundedSlLimitPrice,
268
+ builderAddr,
269
+ builderFee,
270
+ ],
271
+ },
272
+ accountOverride,
273
+ ),
274
+ subaccountAddr,
275
+ );
276
+
277
+ // Extract order_id from the transaction events
278
+ const orderId = this.extractOrderIdFromTransaction(txResponse, subaccountAddr);
279
+
280
+ return {
281
+ success: true,
282
+ orderId: orderId || undefined,
283
+ transactionHash: txResponse.hash,
284
+ };
285
+ } catch (error) {
286
+ console.error("Error placing order:", error);
287
+ return {
288
+ success: false,
289
+ error: error instanceof Error ? error.message : "Unknown error",
290
+ };
291
+ }
292
+ }
293
+
294
+ async triggerMatching({ marketAddr, maxWorkUnit }: { marketAddr: string; maxWorkUnit: number }) {
295
+ const txResponse = await this.sendTx({
296
+ function: `${this.config.deployment.package}::public_apis::trigger_matching`,
297
+ typeArguments: [],
298
+ functionArguments: [marketAddr, maxWorkUnit],
299
+ });
300
+ return {
301
+ success: true,
302
+ transactionHash: txResponse.hash,
303
+ };
304
+ }
305
+
306
+ async placeTwapOrder({
307
+ marketName,
308
+ size,
309
+ isBuy,
310
+ isReduceOnly,
311
+ // clientOrderId,
312
+ twapFrequencySeconds,
313
+ twapDurationSeconds,
314
+ builderAddress,
315
+ builderFees,
316
+ subaccountAddr,
317
+ accountOverride,
318
+ }: {
319
+ marketName: string;
320
+ size: number;
321
+ isBuy: boolean;
322
+ isReduceOnly: boolean;
323
+ // clientOrderId?: string;
324
+ twapFrequencySeconds: number;
325
+ twapDurationSeconds: number;
326
+ builderAddress?: string;
327
+ builderFees?: number;
328
+ subaccountAddr?: string;
329
+ /**
330
+ * Optional account to use for the transaction. Primarily set as the session
331
+ * account. If not provided, the default constructor account will be used
332
+ */
333
+ accountOverride?: Account;
334
+ }) {
335
+ const marketAddr = getMarketAddr(marketName, this.config.deployment.perpEngineGlobal);
336
+ const txResponse = await this.sendSubaccountTx(
337
+ (subaccountAddr) =>
338
+ this.sendTx(
339
+ {
340
+ // TODO: update to place_twap_order_to_subaccount_v2 once available
341
+ function: `${this.config.deployment.package}::dex_accounts::place_twap_order_to_subaccount`,
342
+ typeArguments: [],
343
+ functionArguments: [
344
+ subaccountAddr,
345
+ marketAddr.toString(),
346
+ size,
347
+ isBuy,
348
+ isReduceOnly,
349
+ // clientOrderId, // TODO: include once v2 is available
350
+ twapFrequencySeconds,
351
+ twapDurationSeconds,
352
+ builderAddress,
353
+ builderFees,
354
+ ],
355
+ },
356
+ accountOverride,
357
+ ),
358
+ subaccountAddr,
359
+ );
360
+
361
+ const orderId = this.extractOrderIdFromTransaction(txResponse, subaccountAddr);
362
+
363
+ return {
364
+ success: true,
365
+ orderId: orderId || undefined,
366
+ transactionHash: txResponse.hash,
367
+ };
368
+ }
369
+
370
+ /**
371
+ * Cancel an order on the exchange
372
+ * @param orderId The id of the order to cancel
373
+ * @param marketId The id of the market the order is in
374
+ * @param subaccountAddr Optional subaccount address, will use primary if not provided
375
+ * @returns Transaction response
376
+ */
377
+ async cancelOrder({
378
+ orderId,
379
+ subaccountAddr,
380
+ accountOverride,
381
+ ...args
382
+ }: {
383
+ orderId: number | string;
384
+
385
+ subaccountAddr?: string;
386
+ /**
387
+ * Optional account to use for the transaction. Primarily set as the session
388
+ * account. If not provided, the default constructor account will be used
389
+ */
390
+ accountOverride?: Account;
391
+ } & ({ marketName: string } | { marketAddr: string })) {
392
+ // Either marketName or marketAddr must be provided
393
+ const marketAddr =
394
+ "marketName" in args
395
+ ? getMarketAddr(args.marketName, this.config.deployment.perpEngineGlobal)
396
+ : args.marketAddr;
397
+
398
+ return await this.sendSubaccountTx(
399
+ (subaccountAddr) =>
400
+ this.sendTx(
401
+ {
402
+ function: `${this.config.deployment.package}::dex_accounts::cancel_order_to_subaccount`,
403
+ typeArguments: [],
404
+ functionArguments: [subaccountAddr, BigInt(orderId.toString()), marketAddr.toString()],
405
+ },
406
+ accountOverride,
407
+ ),
408
+ subaccountAddr,
409
+ );
410
+ }
411
+
412
+ async cancelClientOrder({
413
+ clientOrderId,
414
+ marketName,
415
+ subaccountAddr,
416
+ accountOverride,
417
+ }: {
418
+ clientOrderId: string;
419
+ marketName: string;
420
+ subaccountAddr?: string;
421
+ /**
422
+ * Optional account to use for the transaction. Primarily set as the session
423
+ * account. If not provided, the default constructor account will be used
424
+ */
425
+ accountOverride?: Account;
426
+ }) {
427
+ const marketAddr = getMarketAddr(marketName, this.config.deployment.perpEngineGlobal);
428
+ return await this.sendSubaccountTx(
429
+ (subaccountAddr) =>
430
+ this.sendTx(
431
+ {
432
+ function: `${this.config.deployment.package}::dex_accounts::cancel_client_order_to_subaccount`,
433
+ typeArguments: [],
434
+ functionArguments: [subaccountAddr, clientOrderId, marketAddr.toString()],
435
+ },
436
+ accountOverride,
437
+ ),
438
+ subaccountAddr,
439
+ );
440
+ }
441
+
442
+ async delegateTradingTo({
443
+ subaccountAddr,
444
+ accountToDelegateTo,
445
+ }: {
446
+ subaccountAddr?: string;
447
+ accountToDelegateTo: string;
448
+ }) {
449
+ return await this.sendSubaccountTx(
450
+ (subaccountAddr) =>
451
+ this.sendTx({
452
+ function: `${this.config.deployment.package}::dex_accounts::delegate_trading_to`,
453
+ typeArguments: [],
454
+ functionArguments: [subaccountAddr, accountToDelegateTo],
455
+ }),
456
+ subaccountAddr,
457
+ );
458
+ }
459
+
460
+ async revokeDelegation({
461
+ subaccountAddr,
462
+ accountToRevoke,
463
+ }: {
464
+ subaccountAddr?: string;
465
+ accountToRevoke: string;
466
+ }) {
467
+ return await this.sendSubaccountTx(
468
+ (subaccountAddr) =>
469
+ this.sendTx({
470
+ function: `${this.config.deployment.package}::dex_accounts::revoke_delegation`,
471
+ typeArguments: [],
472
+ functionArguments: [subaccountAddr, accountToRevoke],
473
+ }),
474
+ subaccountAddr,
475
+ );
476
+ }
477
+
478
+ /**
479
+ * Place a TP/SL order for a position
480
+ */
481
+ async placeTpSlOrderForPosition({
482
+ marketAddr,
483
+ tpTriggerPrice,
484
+ tpLimitPrice,
485
+ tpSize,
486
+ slTriggerPrice,
487
+ slLimitPrice,
488
+ slSize,
489
+ subaccountAddr,
490
+ accountOverride,
491
+ tickSize,
492
+ }: {
493
+ marketAddr: string;
494
+ tpTriggerPrice?: number;
495
+ tpLimitPrice?: number;
496
+ tpSize?: number;
497
+ slTriggerPrice?: number;
498
+ slLimitPrice?: number;
499
+ slSize?: number;
500
+ subaccountAddr?: string;
501
+ accountOverride?: Account;
502
+ tickSize?: number;
503
+ }) {
504
+ const roundedTpTriggerPrice =
505
+ tpTriggerPrice !== undefined && tickSize
506
+ ? roundToTickSize(tpTriggerPrice, tickSize)
507
+ : tpTriggerPrice;
508
+ const roundedTpLimitPrice =
509
+ tpLimitPrice !== undefined && tickSize
510
+ ? roundToTickSize(tpLimitPrice, tickSize)
511
+ : tpLimitPrice;
512
+ const roundedSlTriggerPrice =
513
+ slTriggerPrice !== undefined && tickSize
514
+ ? roundToTickSize(slTriggerPrice, tickSize)
515
+ : slTriggerPrice;
516
+ const roundedSlLimitPrice =
517
+ slLimitPrice !== undefined && tickSize
518
+ ? roundToTickSize(slLimitPrice, tickSize)
519
+ : slLimitPrice;
520
+
521
+ return await this.sendSubaccountTx(
522
+ (subaccountAddr) =>
523
+ this.sendTx(
524
+ {
525
+ function: `${this.config.deployment.package}::dex_accounts::place_tp_sl_order_for_position`,
526
+ typeArguments: [],
527
+ functionArguments: [
528
+ subaccountAddr,
529
+ marketAddr,
530
+ roundedTpTriggerPrice,
531
+ roundedTpLimitPrice,
532
+ tpSize,
533
+ roundedSlTriggerPrice,
534
+ roundedSlLimitPrice,
535
+ slSize,
536
+ undefined, // builderAddr
537
+ undefined, // builderFees
538
+ ],
539
+ },
540
+ accountOverride,
541
+ ),
542
+ subaccountAddr,
543
+ );
544
+ }
545
+
546
+ /**
547
+ * Update TP for a position
548
+ */
549
+ async updateTpOrderForPosition({
550
+ marketAddr,
551
+ prevOrderId,
552
+ tpTriggerPrice,
553
+ tpLimitPrice,
554
+ tpSize,
555
+ subaccountAddr,
556
+ accountOverride,
557
+ }: {
558
+ marketAddr: string;
559
+ prevOrderId: number | string;
560
+ tpTriggerPrice?: number;
561
+ tpLimitPrice?: number;
562
+ tpSize?: number;
563
+ subaccountAddr?: string;
564
+ accountOverride?: Account;
565
+ }) {
566
+ return await this.sendSubaccountTx(
567
+ (subaccountAddr) =>
568
+ this.sendTx(
569
+ {
570
+ function: `${this.config.deployment.package}::dex_accounts::update_tp_order_for_position`,
571
+ typeArguments: [],
572
+ functionArguments: [
573
+ subaccountAddr,
574
+ BigInt(prevOrderId.toString()),
575
+ marketAddr,
576
+ tpTriggerPrice,
577
+ tpLimitPrice,
578
+ tpSize,
579
+ ],
580
+ },
581
+ accountOverride,
582
+ ),
583
+ subaccountAddr,
584
+ );
585
+ }
586
+
587
+ /**
588
+ * Update SL for a position
589
+ */
590
+ async updateSlOrderForPosition({
591
+ marketAddr,
592
+ prevOrderId,
593
+ slTriggerPrice,
594
+ slLimitPrice,
595
+ slSize,
596
+ subaccountAddr,
597
+ accountOverride,
598
+ }: {
599
+ marketAddr: string;
600
+ prevOrderId: number | string;
601
+ slTriggerPrice?: number;
602
+ slLimitPrice?: number;
603
+ slSize?: number;
604
+ subaccountAddr?: string;
605
+ accountOverride?: Account;
606
+ }) {
607
+ return await this.sendSubaccountTx(
608
+ (subaccountAddr) =>
609
+ this.sendTx(
610
+ {
611
+ function: `${this.config.deployment.package}::dex_accounts::update_sl_order_for_position`,
612
+ typeArguments: [],
613
+ functionArguments: [
614
+ subaccountAddr,
615
+ BigInt(prevOrderId.toString()),
616
+ marketAddr,
617
+ slTriggerPrice,
618
+ slLimitPrice,
619
+ slSize,
620
+ ],
621
+ },
622
+ accountOverride,
623
+ ),
624
+ subaccountAddr,
625
+ );
626
+ }
627
+
628
+ /**
629
+ * Cancel a TP/SL order for a position
630
+ */
631
+ async cancelTpSlOrderForPosition({
632
+ marketAddr,
633
+ orderId,
634
+ subaccountAddr,
635
+ accountOverride,
636
+ }: {
637
+ marketAddr: string;
638
+ orderId: number | string;
639
+ subaccountAddr?: string;
640
+ accountOverride?: Account;
641
+ }) {
642
+ return await this.sendSubaccountTx(
643
+ (subaccountAddr) =>
644
+ this.sendTx(
645
+ {
646
+ function: `${this.config.deployment.package}::dex_accounts::cancel_tp_sl_order_for_position`,
647
+ typeArguments: [],
648
+ functionArguments: [subaccountAddr, marketAddr, BigInt(orderId.toString())],
649
+ },
650
+ accountOverride,
651
+ ),
652
+ subaccountAddr,
653
+ );
654
+ }
655
+
656
+ async cancelTwapOrder({
657
+ orderId,
658
+ marketAddr,
659
+ subaccountAddr,
660
+ accountOverride,
661
+ }: {
662
+ orderId: string;
663
+ marketAddr: string;
664
+ subaccountAddr?: string;
665
+ /**
666
+ * Optional account to use for the transaction. Primarily set as the session
667
+ * account. If not provided, the default constructor account will be used
668
+ */
669
+ accountOverride?: Account;
670
+ }) {
671
+ return await this.sendSubaccountTx(
672
+ (subaccountAddr) =>
673
+ this.sendTx(
674
+ {
675
+ function: `${this.config.deployment.package}::dex_accounts::cancel_twap_orders_to_subaccount`,
676
+ typeArguments: [],
677
+ functionArguments: [subaccountAddr, marketAddr, orderId],
678
+ },
679
+ accountOverride,
680
+ ),
681
+ subaccountAddr,
682
+ );
683
+ }
684
+
685
+ async buildDeactiveSubaccountTx({
686
+ subaccountAddr,
687
+ revokeAllDelegations = true,
688
+ signerAddress,
689
+ }: WithSignerAddress<{
690
+ subaccountAddr: string;
691
+ revokeAllDelegations: boolean;
692
+ }>) {
693
+ const transaction = await this.buildTx(
694
+ {
695
+ function: `${this.config.deployment.package}::dex_accounts::deactivate_subaccount`,
696
+ typeArguments: [],
697
+ functionArguments: [subaccountAddr, revokeAllDelegations],
698
+ },
699
+ signerAddress,
700
+ );
701
+ return transaction;
702
+ }
703
+
704
+ // ======= VAULT FUNCTIONS =======
705
+
706
+ // @Todo: We can move this to another Class and this doesnt requires subaccount so dont belong in here
707
+ /**
708
+ * Create a new vault with optional initial funding
709
+ */
710
+ async buildCreateVaultTx({
711
+ contributionAssetType,
712
+ vaultName,
713
+ vaultShareSymbol,
714
+ vaultShareIconUri = "",
715
+ vaultShareProjectUri = "",
716
+ feeBps,
717
+ feeIntervalS,
718
+ contributionLockupDurationS,
719
+ initialFunding = 0,
720
+ acceptsContributions = false,
721
+ delegateToCreator = false,
722
+ signerAddress,
723
+ vaultDescription,
724
+ vaultSocialLinks,
725
+ }: WithSignerAddress<CreateVaultArgs>) {
726
+ const transaction = await this.buildTx(
727
+ {
728
+ function: `${this.config.deployment.package}::vault::create_and_fund_vault`,
729
+ typeArguments: [],
730
+ functionArguments: [
731
+ contributionAssetType,
732
+ vaultName,
733
+ vaultDescription,
734
+ vaultSocialLinks,
735
+ vaultShareSymbol,
736
+ vaultShareIconUri,
737
+ vaultShareProjectUri,
738
+ feeBps,
739
+ feeIntervalS,
740
+ contributionLockupDurationS,
741
+ initialFunding,
742
+ acceptsContributions,
743
+ delegateToCreator,
744
+ ],
745
+ },
746
+ signerAddress,
747
+ );
748
+
749
+ return transaction;
750
+ }
751
+
752
+ async createVault(
753
+ args: CreateVaultArgs & {
754
+ /**
755
+ * Optional account to use for the transaction. Primarily set as the session
756
+ * account. If not provided, the default constructor account will be used
757
+ */
758
+ accountOverride?: Account;
759
+ subaccountAddr?: string;
760
+ },
761
+ ) {
762
+ const txResponse = await this.sendSubaccountTx(
763
+ () =>
764
+ this.sendTx(
765
+ {
766
+ function: `${this.config.deployment.package}::vault::create_and_fund_vault`,
767
+ typeArguments: [],
768
+ functionArguments: [
769
+ args.contributionAssetType,
770
+ args.vaultName,
771
+ args.vaultDescription,
772
+ args.vaultSocialLinks,
773
+ args.vaultShareSymbol,
774
+ args.vaultShareIconUri,
775
+ args.vaultShareProjectUri,
776
+ args.feeBps,
777
+ args.feeIntervalS,
778
+ args.contributionLockupDurationS,
779
+ args.initialFunding,
780
+ args.acceptsContributions,
781
+ args.delegateToCreator,
782
+ ],
783
+ },
784
+ args.accountOverride,
785
+ ),
786
+ args.subaccountAddr,
787
+ );
788
+
789
+ return txResponse;
790
+ }
791
+
792
+ /**
793
+ * Activate a vault to accept contributions
794
+ */
795
+ async buildActivateVaultTx({
796
+ vaultAddress,
797
+ additionalFunding = 0,
798
+ signerAddress,
799
+ }: WithSignerAddress<ActivateVaultArgs>) {
800
+ return await this.buildTx(
801
+ {
802
+ function: `${this.config.deployment.package}::vault::activate_vault`,
803
+ typeArguments: [],
804
+ functionArguments: [vaultAddress, additionalFunding],
805
+ },
806
+ signerAddress,
807
+ );
808
+ }
809
+
810
+ /**
811
+ * Contribute funds to a vault in exchange for shares
812
+ */
813
+ async buildDepositToVaultTx({
814
+ vaultAddress,
815
+ amount,
816
+ signerAddress,
817
+ }: WithSignerAddress<DepositToVaultArgs>) {
818
+ return await this.buildTx(
819
+ {
820
+ function: `${this.config.deployment.package}::vault::contribute`,
821
+ typeArguments: [],
822
+ functionArguments: [vaultAddress, amount],
823
+ },
824
+ signerAddress,
825
+ );
826
+ }
827
+
828
+ async depositToVault(
829
+ args: DepositToVaultArgs & {
830
+ subaccountAddr: string;
831
+ },
832
+ ) {
833
+ const txResponse = await this.sendSubaccountTx(
834
+ (subaccountAddr) =>
835
+ this.sendTx({
836
+ function: `${this.config.deployment.package}::dex_accounts_vault_extension::contribute_to_vault`,
837
+ typeArguments: [],
838
+ functionArguments: [
839
+ subaccountAddr,
840
+ args.vaultAddress,
841
+ this.config.deployment.usdc,
842
+ args.amount,
843
+ ],
844
+ }),
845
+ args.subaccountAddr,
846
+ );
847
+
848
+ return txResponse;
849
+ }
850
+
851
+ /**
852
+ * Redeem shares from a vault for underlying assets
853
+ */
854
+ async buildWithdrawFromVaultTx({
855
+ vaultAddress,
856
+ shares,
857
+ signerAddress,
858
+ }: WithSignerAddress<WithdrawFromVaultArgs>) {
859
+ return await this.buildTx(
860
+ {
861
+ function: `${this.config.deployment.package}::vault::redeem`,
862
+ typeArguments: [],
863
+ functionArguments: [vaultAddress, shares],
864
+ },
865
+ signerAddress,
866
+ );
867
+ }
868
+
869
+ async withdrawFromVault(
870
+ args: WithdrawFromVaultArgs & {
871
+ /**
872
+ * Optional account to use for the transaction. Primarily set as the session
873
+ * account. If not provided, the default constructor account will be used
874
+ */
875
+ accountOverride?: Account;
876
+ subaccountAddr?: string;
877
+ },
878
+ ) {
879
+ const txResponse = await this.sendSubaccountTx(
880
+ (subaccountAddr) =>
881
+ this.sendTx(
882
+ {
883
+ function: `${this.config.deployment.package}::dex_accounts_vault_extension::redeem_from_vault`,
884
+ typeArguments: [],
885
+ functionArguments: [subaccountAddr, args.vaultAddress, args.shares],
886
+ },
887
+ args.accountOverride,
888
+ ),
889
+ args.subaccountAddr,
890
+ );
891
+
892
+ return txResponse;
893
+ }
894
+ /**
895
+ * Delegate trading to another account for a vault
896
+ */
897
+ async buildDelegateDexActionsToTx({
898
+ vaultAddress,
899
+ accountToDelegateTo,
900
+ signerAddress,
901
+ expirationTimestampSecs,
902
+ }: WithSignerAddress<{
903
+ vaultAddress: string;
904
+ accountToDelegateTo: string;
905
+ expirationTimestampSecs?: number;
906
+ }>) {
907
+ return await this.buildTx(
908
+ {
909
+ function: `${this.config.deployment.package}::vault::delegate_dex_actions_to`,
910
+ typeArguments: [],
911
+ functionArguments: [vaultAddress, accountToDelegateTo, expirationTimestampSecs],
912
+ },
913
+ signerAddress,
914
+ );
915
+ }
916
+
917
+ /**
918
+ * Approve max builder fee for a subaccount
919
+ * @param builderAddr The address of the builder
920
+ * @param maxFee The maximum fee in basis points (e.g., 100 = 0.01%)
921
+ * @param subaccountAddr Optional subaccount address, will use primary if not provided
922
+ */
923
+ async approveMaxBuilderFee({
924
+ builderAddr,
925
+ maxFee,
926
+ subaccountAddr,
927
+ }: {
928
+ builderAddr: string;
929
+ maxFee: number;
930
+ subaccountAddr?: string;
931
+ }) {
932
+ return await this.sendSubaccountTx(
933
+ (subaccountAddr) =>
934
+ this.sendTx({
935
+ function: `${this.config.deployment.package}::dex_accounts::approve_max_builder_fee_for_subaccount`,
936
+ typeArguments: [],
937
+ functionArguments: [subaccountAddr, builderAddr, maxFee],
938
+ }),
939
+ subaccountAddr,
940
+ );
941
+ }
942
+
943
+ /**
944
+ * Revoke max builder fee for a subaccount
945
+ * @param builderAddr The address of the builder
946
+ * @param subaccountAddr Optional subaccount address, will use primary if not provided
947
+ */
948
+ async revokeMaxBuilderFee({
949
+ builderAddr,
950
+ subaccountAddr,
951
+ }: {
952
+ builderAddr: string;
953
+ subaccountAddr?: string;
954
+ }) {
955
+ return await this.sendSubaccountTx(
956
+ (subaccountAddr) =>
957
+ this.sendTx({
958
+ function: `${this.config.deployment.package}::dex_accounts::revoke_max_builder_fee_for_subaccount`,
959
+ typeArguments: [],
960
+ functionArguments: [subaccountAddr, builderAddr],
961
+ }),
962
+ subaccountAddr,
963
+ );
964
+ }
965
+ }