@metamask-previews/perps-controller 0.0.0-preview-685dbf46b → 1.0.0-preview-bc00f2c

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 (482) hide show
  1. package/CHANGELOG.md +30 -2
  2. package/dist/PerpsController.cjs +3077 -65
  3. package/dist/PerpsController.cjs.map +1 -1
  4. package/dist/PerpsController.d.cts +969 -82
  5. package/dist/PerpsController.d.cts.map +1 -1
  6. package/dist/PerpsController.d.mts +969 -82
  7. package/dist/PerpsController.d.mts.map +1 -1
  8. package/dist/PerpsController.mjs +3073 -62
  9. package/dist/PerpsController.mjs.map +1 -1
  10. package/dist/aggregation/SubscriptionMultiplexer.cjs +441 -0
  11. package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -0
  12. package/dist/aggregation/SubscriptionMultiplexer.d.cts +171 -0
  13. package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +1 -0
  14. package/dist/aggregation/SubscriptionMultiplexer.d.mts +171 -0
  15. package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +1 -0
  16. package/dist/aggregation/SubscriptionMultiplexer.mjs +437 -0
  17. package/dist/aggregation/SubscriptionMultiplexer.mjs.map +1 -0
  18. package/dist/aggregation/index.cjs +9 -0
  19. package/dist/aggregation/index.cjs.map +1 -0
  20. package/dist/aggregation/index.d.cts +6 -0
  21. package/dist/aggregation/index.d.cts.map +1 -0
  22. package/dist/aggregation/index.d.mts +6 -0
  23. package/dist/aggregation/index.d.mts.map +1 -0
  24. package/dist/aggregation/index.mjs +5 -0
  25. package/dist/aggregation/index.mjs.map +1 -0
  26. package/dist/constants/chartConfig.cjs +227 -0
  27. package/dist/constants/chartConfig.cjs.map +1 -0
  28. package/dist/constants/chartConfig.d.cts +216 -0
  29. package/dist/constants/chartConfig.d.cts.map +1 -0
  30. package/dist/constants/chartConfig.d.mts +216 -0
  31. package/dist/constants/chartConfig.d.mts.map +1 -0
  32. package/dist/constants/chartConfig.mjs +221 -0
  33. package/dist/constants/chartConfig.mjs.map +1 -0
  34. package/dist/constants/eventNames.cjs +436 -0
  35. package/dist/constants/eventNames.cjs.map +1 -0
  36. package/dist/constants/eventNames.d.cts +387 -0
  37. package/dist/constants/eventNames.d.cts.map +1 -0
  38. package/dist/constants/eventNames.d.mts +387 -0
  39. package/dist/constants/eventNames.d.mts.map +1 -0
  40. package/dist/constants/eventNames.mjs +433 -0
  41. package/dist/constants/eventNames.mjs.map +1 -0
  42. package/dist/constants/hyperLiquidConfig.cjs +380 -0
  43. package/dist/constants/hyperLiquidConfig.cjs.map +1 -0
  44. package/dist/constants/hyperLiquidConfig.d.cts +236 -0
  45. package/dist/constants/hyperLiquidConfig.d.cts.map +1 -0
  46. package/dist/constants/hyperLiquidConfig.d.mts +236 -0
  47. package/dist/constants/hyperLiquidConfig.d.mts.map +1 -0
  48. package/dist/constants/hyperLiquidConfig.mjs +371 -0
  49. package/dist/constants/hyperLiquidConfig.mjs.map +1 -0
  50. package/dist/constants/index.cjs +28 -0
  51. package/dist/constants/index.cjs.map +1 -0
  52. package/dist/constants/index.d.cts +12 -0
  53. package/dist/constants/index.d.cts.map +1 -0
  54. package/dist/constants/index.d.mts +12 -0
  55. package/dist/constants/index.d.mts.map +1 -0
  56. package/dist/constants/index.mjs +12 -0
  57. package/dist/constants/index.mjs.map +1 -0
  58. package/dist/constants/myxConfig.cjs +229 -0
  59. package/dist/constants/myxConfig.cjs.map +1 -0
  60. package/dist/constants/myxConfig.d.cts +106 -0
  61. package/dist/constants/myxConfig.d.cts.map +1 -0
  62. package/dist/constants/myxConfig.d.mts +106 -0
  63. package/dist/constants/myxConfig.d.mts.map +1 -0
  64. package/dist/constants/myxConfig.mjs +219 -0
  65. package/dist/constants/myxConfig.mjs.map +1 -0
  66. package/dist/constants/orderTypes.cjs +31 -0
  67. package/dist/constants/orderTypes.cjs.map +1 -0
  68. package/dist/constants/orderTypes.d.cts +19 -0
  69. package/dist/constants/orderTypes.d.cts.map +1 -0
  70. package/dist/constants/orderTypes.d.mts +19 -0
  71. package/dist/constants/orderTypes.d.mts.map +1 -0
  72. package/dist/constants/orderTypes.mjs +27 -0
  73. package/dist/constants/orderTypes.mjs.map +1 -0
  74. package/dist/constants/performanceMetrics.cjs +63 -0
  75. package/dist/constants/performanceMetrics.cjs.map +1 -0
  76. package/dist/constants/performanceMetrics.d.cts +46 -0
  77. package/dist/constants/performanceMetrics.d.cts.map +1 -0
  78. package/dist/constants/performanceMetrics.d.mts +46 -0
  79. package/dist/constants/performanceMetrics.d.mts.map +1 -0
  80. package/dist/constants/performanceMetrics.mjs +60 -0
  81. package/dist/constants/performanceMetrics.mjs.map +1 -0
  82. package/dist/constants/perpsConfig.cjs +295 -0
  83. package/dist/constants/perpsConfig.cjs.map +1 -0
  84. package/dist/constants/perpsConfig.d.cts +221 -0
  85. package/dist/constants/perpsConfig.d.cts.map +1 -0
  86. package/dist/constants/perpsConfig.d.mts +221 -0
  87. package/dist/constants/perpsConfig.d.mts.map +1 -0
  88. package/dist/constants/perpsConfig.mjs +292 -0
  89. package/dist/constants/perpsConfig.mjs.map +1 -0
  90. package/dist/constants/transactionsHistoryConfig.cjs +19 -0
  91. package/dist/constants/transactionsHistoryConfig.cjs.map +1 -0
  92. package/dist/constants/transactionsHistoryConfig.d.cts +16 -0
  93. package/dist/constants/transactionsHistoryConfig.d.cts.map +1 -0
  94. package/dist/constants/transactionsHistoryConfig.d.mts +16 -0
  95. package/dist/constants/transactionsHistoryConfig.d.mts.map +1 -0
  96. package/dist/constants/transactionsHistoryConfig.mjs +16 -0
  97. package/dist/constants/transactionsHistoryConfig.mjs.map +1 -0
  98. package/dist/index.cjs +63 -1
  99. package/dist/index.cjs.map +1 -1
  100. package/dist/index.d.cts +38 -2
  101. package/dist/index.d.cts.map +1 -1
  102. package/dist/index.d.mts +38 -2
  103. package/dist/index.d.mts.map +1 -1
  104. package/dist/index.mjs +46 -1
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/perpsErrorCodes.cjs +80 -0
  107. package/dist/perpsErrorCodes.cjs.map +1 -0
  108. package/dist/perpsErrorCodes.d.cts +65 -0
  109. package/dist/perpsErrorCodes.d.cts.map +1 -0
  110. package/dist/perpsErrorCodes.d.mts +65 -0
  111. package/dist/perpsErrorCodes.d.mts.map +1 -0
  112. package/dist/perpsErrorCodes.mjs +77 -0
  113. package/dist/perpsErrorCodes.mjs.map +1 -0
  114. package/dist/providers/AggregatedPerpsProvider.cjs +508 -0
  115. package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -0
  116. package/dist/providers/AggregatedPerpsProvider.d.cts +171 -0
  117. package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -0
  118. package/dist/providers/AggregatedPerpsProvider.d.mts +171 -0
  119. package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -0
  120. package/dist/providers/AggregatedPerpsProvider.mjs +504 -0
  121. package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -0
  122. package/dist/providers/HyperLiquidProvider.cjs +5679 -0
  123. package/dist/providers/HyperLiquidProvider.cjs.map +1 -0
  124. package/dist/providers/HyperLiquidProvider.d.cts +516 -0
  125. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -0
  126. package/dist/providers/HyperLiquidProvider.d.mts +516 -0
  127. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -0
  128. package/dist/providers/HyperLiquidProvider.mjs +5675 -0
  129. package/dist/providers/HyperLiquidProvider.mjs.map +1 -0
  130. package/dist/providers/MYXProvider.cjs +514 -0
  131. package/dist/providers/MYXProvider.cjs.map +1 -0
  132. package/dist/providers/MYXProvider.d.cts +105 -0
  133. package/dist/providers/MYXProvider.d.cts.map +1 -0
  134. package/dist/providers/MYXProvider.d.mts +105 -0
  135. package/dist/providers/MYXProvider.d.mts.map +1 -0
  136. package/dist/providers/MYXProvider.mjs +510 -0
  137. package/dist/providers/MYXProvider.mjs.map +1 -0
  138. package/dist/routing/ProviderRouter.cjs +154 -0
  139. package/dist/routing/ProviderRouter.cjs.map +1 -0
  140. package/dist/routing/ProviderRouter.d.cts +112 -0
  141. package/dist/routing/ProviderRouter.d.cts.map +1 -0
  142. package/dist/routing/ProviderRouter.d.mts +112 -0
  143. package/dist/routing/ProviderRouter.d.mts.map +1 -0
  144. package/dist/routing/ProviderRouter.mjs +150 -0
  145. package/dist/routing/ProviderRouter.mjs.map +1 -0
  146. package/dist/routing/index.cjs +9 -0
  147. package/dist/routing/index.cjs.map +1 -0
  148. package/dist/routing/index.d.cts +6 -0
  149. package/dist/routing/index.d.cts.map +1 -0
  150. package/dist/routing/index.d.mts +6 -0
  151. package/dist/routing/index.d.mts.map +1 -0
  152. package/dist/routing/index.mjs +5 -0
  153. package/dist/routing/index.mjs.map +1 -0
  154. package/dist/selectors.cjs +166 -0
  155. package/dist/selectors.cjs.map +1 -0
  156. package/dist/selectors.d.cts +362 -0
  157. package/dist/selectors.d.cts.map +1 -0
  158. package/dist/selectors.d.mts +362 -0
  159. package/dist/selectors.d.mts.map +1 -0
  160. package/dist/selectors.mjs +158 -0
  161. package/dist/selectors.mjs.map +1 -0
  162. package/dist/services/AccountService.cjs +324 -0
  163. package/dist/services/AccountService.cjs.map +1 -0
  164. package/dist/services/AccountService.d.cts +56 -0
  165. package/dist/services/AccountService.d.cts.map +1 -0
  166. package/dist/services/AccountService.d.mts +56 -0
  167. package/dist/services/AccountService.d.mts.map +1 -0
  168. package/dist/services/AccountService.mjs +320 -0
  169. package/dist/services/AccountService.mjs.map +1 -0
  170. package/dist/services/DataLakeService.cjs +233 -0
  171. package/dist/services/DataLakeService.cjs.map +1 -0
  172. package/dist/services/DataLakeService.d.cts +51 -0
  173. package/dist/services/DataLakeService.d.cts.map +1 -0
  174. package/dist/services/DataLakeService.d.mts +51 -0
  175. package/dist/services/DataLakeService.d.mts.map +1 -0
  176. package/dist/services/DataLakeService.mjs +229 -0
  177. package/dist/services/DataLakeService.mjs.map +1 -0
  178. package/dist/services/DepositService.cjs +98 -0
  179. package/dist/services/DepositService.cjs.map +1 -0
  180. package/dist/services/DepositService.d.cts +39 -0
  181. package/dist/services/DepositService.d.cts.map +1 -0
  182. package/dist/services/DepositService.d.mts +39 -0
  183. package/dist/services/DepositService.d.mts.map +1 -0
  184. package/dist/services/DepositService.mjs +94 -0
  185. package/dist/services/DepositService.mjs.map +1 -0
  186. package/dist/services/EligibilityService.cjs +173 -0
  187. package/dist/services/EligibilityService.cjs.map +1 -0
  188. package/dist/services/EligibilityService.d.cts +39 -0
  189. package/dist/services/EligibilityService.d.cts.map +1 -0
  190. package/dist/services/EligibilityService.d.mts +39 -0
  191. package/dist/services/EligibilityService.d.mts.map +1 -0
  192. package/dist/services/EligibilityService.mjs +169 -0
  193. package/dist/services/EligibilityService.mjs.map +1 -0
  194. package/dist/services/FeatureFlagConfigurationService.cjs +257 -0
  195. package/dist/services/FeatureFlagConfigurationService.cjs.map +1 -0
  196. package/dist/services/FeatureFlagConfigurationService.d.cts +73 -0
  197. package/dist/services/FeatureFlagConfigurationService.d.cts.map +1 -0
  198. package/dist/services/FeatureFlagConfigurationService.d.mts +73 -0
  199. package/dist/services/FeatureFlagConfigurationService.d.mts.map +1 -0
  200. package/dist/services/FeatureFlagConfigurationService.mjs +253 -0
  201. package/dist/services/FeatureFlagConfigurationService.mjs.map +1 -0
  202. package/dist/services/HyperLiquidClientService.cjs +867 -0
  203. package/dist/services/HyperLiquidClientService.cjs.map +1 -0
  204. package/dist/services/HyperLiquidClientService.d.cts +214 -0
  205. package/dist/services/HyperLiquidClientService.d.cts.map +1 -0
  206. package/dist/services/HyperLiquidClientService.d.mts +214 -0
  207. package/dist/services/HyperLiquidClientService.d.mts.map +1 -0
  208. package/dist/services/HyperLiquidClientService.mjs +862 -0
  209. package/dist/services/HyperLiquidClientService.mjs.map +1 -0
  210. package/dist/services/HyperLiquidSubscriptionService.cjs +2199 -0
  211. package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -0
  212. package/dist/services/HyperLiquidSubscriptionService.d.cts +187 -0
  213. package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -0
  214. package/dist/services/HyperLiquidSubscriptionService.d.mts +187 -0
  215. package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -0
  216. package/dist/services/HyperLiquidSubscriptionService.mjs +2195 -0
  217. package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -0
  218. package/dist/services/HyperLiquidWalletService.cjs +163 -0
  219. package/dist/services/HyperLiquidWalletService.cjs.map +1 -0
  220. package/dist/services/HyperLiquidWalletService.d.cts +78 -0
  221. package/dist/services/HyperLiquidWalletService.d.cts.map +1 -0
  222. package/dist/services/HyperLiquidWalletService.d.mts +78 -0
  223. package/dist/services/HyperLiquidWalletService.d.mts.map +1 -0
  224. package/dist/services/HyperLiquidWalletService.mjs +159 -0
  225. package/dist/services/HyperLiquidWalletService.mjs.map +1 -0
  226. package/dist/services/MYXClientService.cjs +304 -0
  227. package/dist/services/MYXClientService.cjs.map +1 -0
  228. package/dist/services/MYXClientService.d.cts +81 -0
  229. package/dist/services/MYXClientService.d.cts.map +1 -0
  230. package/dist/services/MYXClientService.d.mts +81 -0
  231. package/dist/services/MYXClientService.d.mts.map +1 -0
  232. package/dist/services/MYXClientService.mjs +300 -0
  233. package/dist/services/MYXClientService.mjs.map +1 -0
  234. package/dist/services/MarketDataService.cjs +848 -0
  235. package/dist/services/MarketDataService.cjs.map +1 -0
  236. package/dist/services/MarketDataService.d.cts +291 -0
  237. package/dist/services/MarketDataService.d.cts.map +1 -0
  238. package/dist/services/MarketDataService.d.mts +291 -0
  239. package/dist/services/MarketDataService.d.mts.map +1 -0
  240. package/dist/services/MarketDataService.mjs +844 -0
  241. package/dist/services/MarketDataService.mjs.map +1 -0
  242. package/dist/services/RewardsIntegrationService.cjs +120 -0
  243. package/dist/services/RewardsIntegrationService.cjs.map +1 -0
  244. package/dist/services/RewardsIntegrationService.d.cts +28 -0
  245. package/dist/services/RewardsIntegrationService.d.cts.map +1 -0
  246. package/dist/services/RewardsIntegrationService.d.mts +28 -0
  247. package/dist/services/RewardsIntegrationService.d.mts.map +1 -0
  248. package/dist/services/RewardsIntegrationService.mjs +116 -0
  249. package/dist/services/RewardsIntegrationService.mjs.map +1 -0
  250. package/dist/services/ServiceContext.cjs +3 -0
  251. package/dist/services/ServiceContext.cjs.map +1 -0
  252. package/dist/services/ServiceContext.d.cts +86 -0
  253. package/dist/services/ServiceContext.d.cts.map +1 -0
  254. package/dist/services/ServiceContext.d.mts +86 -0
  255. package/dist/services/ServiceContext.d.mts.map +1 -0
  256. package/dist/services/ServiceContext.mjs +2 -0
  257. package/dist/services/ServiceContext.mjs.map +1 -0
  258. package/dist/services/TradingReadinessCache.cjs +288 -0
  259. package/dist/services/TradingReadinessCache.cjs.map +1 -0
  260. package/dist/services/TradingReadinessCache.d.cts +174 -0
  261. package/dist/services/TradingReadinessCache.d.cts.map +1 -0
  262. package/dist/services/TradingReadinessCache.d.mts +174 -0
  263. package/dist/services/TradingReadinessCache.d.mts.map +1 -0
  264. package/dist/services/TradingReadinessCache.mjs +285 -0
  265. package/dist/services/TradingReadinessCache.mjs.map +1 -0
  266. package/dist/services/TradingService.cjs +1457 -0
  267. package/dist/services/TradingService.cjs.map +1 -0
  268. package/dist/services/TradingService.d.cts +195 -0
  269. package/dist/services/TradingService.d.cts.map +1 -0
  270. package/dist/services/TradingService.d.mts +195 -0
  271. package/dist/services/TradingService.d.mts.map +1 -0
  272. package/dist/services/TradingService.mjs +1453 -0
  273. package/dist/services/TradingService.mjs.map +1 -0
  274. package/dist/types/config.cjs +3 -0
  275. package/dist/types/config.cjs.map +1 -0
  276. package/dist/types/config.d.cts +49 -0
  277. package/dist/types/config.d.cts.map +1 -0
  278. package/dist/types/config.d.mts +49 -0
  279. package/dist/types/config.d.mts.map +1 -0
  280. package/dist/types/config.mjs +2 -0
  281. package/dist/types/config.mjs.map +1 -0
  282. package/dist/types/hyperliquid-types.cjs +3 -0
  283. package/dist/types/hyperliquid-types.cjs.map +1 -0
  284. package/dist/types/hyperliquid-types.d.cts +20 -0
  285. package/dist/types/hyperliquid-types.d.cts.map +1 -0
  286. package/dist/types/hyperliquid-types.d.mts +20 -0
  287. package/dist/types/hyperliquid-types.d.mts.map +1 -0
  288. package/dist/types/hyperliquid-types.mjs +2 -0
  289. package/dist/types/hyperliquid-types.mjs.map +1 -0
  290. package/dist/types/index.cjs +115 -0
  291. package/dist/types/index.cjs.map +1 -0
  292. package/dist/types/index.d.cts +1262 -0
  293. package/dist/types/index.d.cts.map +1 -0
  294. package/dist/types/index.d.mts +1262 -0
  295. package/dist/types/index.d.mts.map +1 -0
  296. package/dist/types/index.mjs +97 -0
  297. package/dist/types/index.mjs.map +1 -0
  298. package/dist/types/messenger.cjs +3 -0
  299. package/dist/types/messenger.cjs.map +1 -0
  300. package/dist/types/messenger.d.cts +27 -0
  301. package/dist/types/messenger.d.cts.map +1 -0
  302. package/dist/types/messenger.d.mts +27 -0
  303. package/dist/types/messenger.d.mts.map +1 -0
  304. package/dist/types/messenger.mjs +2 -0
  305. package/dist/types/messenger.mjs.map +1 -0
  306. package/dist/types/myx-types.cjs +25 -0
  307. package/dist/types/myx-types.cjs.map +1 -0
  308. package/dist/types/myx-types.d.cts +63 -0
  309. package/dist/types/myx-types.d.cts.map +1 -0
  310. package/dist/types/myx-types.d.mts +63 -0
  311. package/dist/types/myx-types.d.mts.map +1 -0
  312. package/dist/types/myx-types.mjs +22 -0
  313. package/dist/types/myx-types.mjs.map +1 -0
  314. package/dist/types/perps-types.cjs +4 -0
  315. package/dist/types/perps-types.cjs.map +1 -0
  316. package/dist/types/perps-types.d.cts +105 -0
  317. package/dist/types/perps-types.d.cts.map +1 -0
  318. package/dist/types/perps-types.d.mts +105 -0
  319. package/dist/types/perps-types.d.mts.map +1 -0
  320. package/dist/types/perps-types.mjs +2 -0
  321. package/dist/types/perps-types.mjs.map +1 -0
  322. package/dist/types/token.cjs +3 -0
  323. package/dist/types/token.cjs.map +1 -0
  324. package/dist/types/token.d.cts +25 -0
  325. package/dist/types/token.d.cts.map +1 -0
  326. package/dist/types/token.d.mts +25 -0
  327. package/dist/types/token.d.mts.map +1 -0
  328. package/dist/types/token.mjs +2 -0
  329. package/dist/types/token.mjs.map +1 -0
  330. package/dist/types/transactionTypes.cjs +28 -0
  331. package/dist/types/transactionTypes.cjs.map +1 -0
  332. package/dist/types/transactionTypes.d.cts +64 -0
  333. package/dist/types/transactionTypes.d.cts.map +1 -0
  334. package/dist/types/transactionTypes.d.mts +64 -0
  335. package/dist/types/transactionTypes.d.mts.map +1 -0
  336. package/dist/types/transactionTypes.mjs +23 -0
  337. package/dist/types/transactionTypes.mjs.map +1 -0
  338. package/dist/utils/accountUtils.cjs +100 -0
  339. package/dist/utils/accountUtils.cjs.map +1 -0
  340. package/dist/utils/accountUtils.d.cts +30 -0
  341. package/dist/utils/accountUtils.d.cts.map +1 -0
  342. package/dist/utils/accountUtils.d.mts +30 -0
  343. package/dist/utils/accountUtils.d.mts.map +1 -0
  344. package/dist/utils/accountUtils.mjs +92 -0
  345. package/dist/utils/accountUtils.mjs.map +1 -0
  346. package/dist/utils/errorUtils.cjs +35 -0
  347. package/dist/utils/errorUtils.cjs.map +1 -0
  348. package/dist/utils/errorUtils.d.cts +15 -0
  349. package/dist/utils/errorUtils.d.cts.map +1 -0
  350. package/dist/utils/errorUtils.d.mts +15 -0
  351. package/dist/utils/errorUtils.d.mts.map +1 -0
  352. package/dist/utils/errorUtils.mjs +31 -0
  353. package/dist/utils/errorUtils.mjs.map +1 -0
  354. package/dist/utils/hyperLiquidAdapter.cjs +331 -0
  355. package/dist/utils/hyperLiquidAdapter.cjs.map +1 -0
  356. package/dist/utils/hyperLiquidAdapter.d.cts +42 -0
  357. package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -0
  358. package/dist/utils/hyperLiquidAdapter.d.mts +42 -0
  359. package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -0
  360. package/dist/utils/hyperLiquidAdapter.mjs +316 -0
  361. package/dist/utils/hyperLiquidAdapter.mjs.map +1 -0
  362. package/dist/utils/hyperLiquidOrderBookProcessor.cjs +83 -0
  363. package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +1 -0
  364. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +55 -0
  365. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +1 -0
  366. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +55 -0
  367. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +1 -0
  368. package/dist/utils/hyperLiquidOrderBookProcessor.mjs +78 -0
  369. package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +1 -0
  370. package/dist/utils/hyperLiquidValidation.cjs +426 -0
  371. package/dist/utils/hyperLiquidValidation.cjs.map +1 -0
  372. package/dist/utils/hyperLiquidValidation.d.cts +143 -0
  373. package/dist/utils/hyperLiquidValidation.d.cts.map +1 -0
  374. package/dist/utils/hyperLiquidValidation.d.mts +143 -0
  375. package/dist/utils/hyperLiquidValidation.d.mts.map +1 -0
  376. package/dist/utils/hyperLiquidValidation.mjs +413 -0
  377. package/dist/utils/hyperLiquidValidation.mjs.map +1 -0
  378. package/dist/utils/idUtils.cjs +18 -0
  379. package/dist/utils/idUtils.cjs.map +1 -0
  380. package/dist/utils/idUtils.d.cts +6 -0
  381. package/dist/utils/idUtils.d.cts.map +1 -0
  382. package/dist/utils/idUtils.d.mts +6 -0
  383. package/dist/utils/idUtils.d.mts.map +1 -0
  384. package/dist/utils/idUtils.mjs +10 -0
  385. package/dist/utils/idUtils.mjs.map +1 -0
  386. package/dist/utils/index.cjs +59 -0
  387. package/dist/utils/index.cjs.map +1 -0
  388. package/dist/utils/index.d.cts +25 -0
  389. package/dist/utils/index.d.cts.map +1 -0
  390. package/dist/utils/index.d.mts +25 -0
  391. package/dist/utils/index.d.mts.map +1 -0
  392. package/dist/utils/index.mjs +30 -0
  393. package/dist/utils/index.mjs.map +1 -0
  394. package/dist/utils/marketDataTransform.cjs +211 -0
  395. package/dist/utils/marketDataTransform.cjs.map +1 -0
  396. package/dist/utils/marketDataTransform.d.cts +40 -0
  397. package/dist/utils/marketDataTransform.d.cts.map +1 -0
  398. package/dist/utils/marketDataTransform.d.mts +40 -0
  399. package/dist/utils/marketDataTransform.d.mts.map +1 -0
  400. package/dist/utils/marketDataTransform.mjs +205 -0
  401. package/dist/utils/marketDataTransform.mjs.map +1 -0
  402. package/dist/utils/marketUtils.cjs +151 -0
  403. package/dist/utils/marketUtils.cjs.map +1 -0
  404. package/dist/utils/marketUtils.d.cts +30 -0
  405. package/dist/utils/marketUtils.d.cts.map +1 -0
  406. package/dist/utils/marketUtils.d.mts +30 -0
  407. package/dist/utils/marketUtils.d.mts.map +1 -0
  408. package/dist/utils/marketUtils.mjs +138 -0
  409. package/dist/utils/marketUtils.mjs.map +1 -0
  410. package/dist/utils/myxAdapter.cjs +224 -0
  411. package/dist/utils/myxAdapter.cjs.map +1 -0
  412. package/dist/utils/myxAdapter.d.cts +81 -0
  413. package/dist/utils/myxAdapter.d.cts.map +1 -0
  414. package/dist/utils/myxAdapter.d.mts +81 -0
  415. package/dist/utils/myxAdapter.d.mts.map +1 -0
  416. package/dist/utils/myxAdapter.mjs +213 -0
  417. package/dist/utils/myxAdapter.mjs.map +1 -0
  418. package/dist/utils/orderCalculations.cjs +283 -0
  419. package/dist/utils/orderCalculations.cjs.map +1 -0
  420. package/dist/utils/orderCalculations.d.cts +107 -0
  421. package/dist/utils/orderCalculations.d.cts.map +1 -0
  422. package/dist/utils/orderCalculations.d.mts +107 -0
  423. package/dist/utils/orderCalculations.d.mts.map +1 -0
  424. package/dist/utils/orderCalculations.mjs +274 -0
  425. package/dist/utils/orderCalculations.mjs.map +1 -0
  426. package/dist/utils/rewardsUtils.cjs +98 -0
  427. package/dist/utils/rewardsUtils.cjs.map +1 -0
  428. package/dist/utils/rewardsUtils.d.cts +33 -0
  429. package/dist/utils/rewardsUtils.d.cts.map +1 -0
  430. package/dist/utils/rewardsUtils.d.mts +33 -0
  431. package/dist/utils/rewardsUtils.d.mts.map +1 -0
  432. package/dist/utils/rewardsUtils.mjs +92 -0
  433. package/dist/utils/rewardsUtils.mjs.map +1 -0
  434. package/dist/utils/significantFigures.cjs +88 -0
  435. package/dist/utils/significantFigures.cjs.map +1 -0
  436. package/dist/utils/significantFigures.d.cts +25 -0
  437. package/dist/utils/significantFigures.d.cts.map +1 -0
  438. package/dist/utils/significantFigures.d.mts +25 -0
  439. package/dist/utils/significantFigures.d.mts.map +1 -0
  440. package/dist/utils/significantFigures.mjs +82 -0
  441. package/dist/utils/significantFigures.mjs.map +1 -0
  442. package/dist/utils/sortMarkets.cjs +93 -0
  443. package/dist/utils/sortMarkets.cjs.map +1 -0
  444. package/dist/utils/sortMarkets.d.cts +27 -0
  445. package/dist/utils/sortMarkets.d.cts.map +1 -0
  446. package/dist/utils/sortMarkets.d.mts +27 -0
  447. package/dist/utils/sortMarkets.d.mts.map +1 -0
  448. package/dist/utils/sortMarkets.mjs +88 -0
  449. package/dist/utils/sortMarkets.mjs.map +1 -0
  450. package/dist/utils/standaloneInfoClient.cjs +70 -0
  451. package/dist/utils/standaloneInfoClient.cjs.map +1 -0
  452. package/dist/utils/standaloneInfoClient.d.cts +37 -0
  453. package/dist/utils/standaloneInfoClient.d.cts.map +1 -0
  454. package/dist/utils/standaloneInfoClient.d.mts +37 -0
  455. package/dist/utils/standaloneInfoClient.d.mts.map +1 -0
  456. package/dist/utils/standaloneInfoClient.mjs +64 -0
  457. package/dist/utils/standaloneInfoClient.mjs.map +1 -0
  458. package/dist/utils/stringParseUtils.cjs +18 -0
  459. package/dist/utils/stringParseUtils.cjs.map +1 -0
  460. package/dist/utils/stringParseUtils.d.cts +3 -0
  461. package/dist/utils/stringParseUtils.d.cts.map +1 -0
  462. package/dist/utils/stringParseUtils.d.mts +3 -0
  463. package/dist/utils/stringParseUtils.d.mts.map +1 -0
  464. package/dist/utils/stringParseUtils.mjs +13 -0
  465. package/dist/utils/stringParseUtils.mjs.map +1 -0
  466. package/dist/utils/transferData.cjs +33 -0
  467. package/dist/utils/transferData.cjs.map +1 -0
  468. package/dist/utils/transferData.d.cts +9 -0
  469. package/dist/utils/transferData.d.cts.map +1 -0
  470. package/dist/utils/transferData.d.mts +9 -0
  471. package/dist/utils/transferData.d.mts.map +1 -0
  472. package/dist/utils/transferData.mjs +29 -0
  473. package/dist/utils/transferData.mjs.map +1 -0
  474. package/dist/utils/wait.cjs +6 -0
  475. package/dist/utils/wait.cjs.map +1 -0
  476. package/dist/utils/wait.d.cts +2 -0
  477. package/dist/utils/wait.d.cts.map +1 -0
  478. package/dist/utils/wait.d.mts +2 -0
  479. package/dist/utils/wait.d.mts.map +1 -0
  480. package/dist/utils/wait.mjs +2 -0
  481. package/dist/utils/wait.mjs.map +1 -0
  482. package/package.json +16 -2
@@ -0,0 +1,1457 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _TradingService_instances, _TradingService_deps, _TradingService_controllerDeps, _TradingService_getErrorContext, _TradingService_trackOrderResult, _TradingService_handleOrderSuccess, _TradingService_withFeeDiscount, _TradingService_loadPositionData, _TradingService_calculateCloseMetrics, _TradingService_buildCloseEventProperties, _TradingService_trackPositionCloseResult, _TradingService_handleDataLakeReporting, _TradingService_calculateFeeDiscountWithMeasurement;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TradingService = void 0;
16
+ const uuid_1 = require("uuid");
17
+ const eventNames_1 = require("../constants/eventNames.cjs");
18
+ const orderTypes_1 = require("../constants/orderTypes.cjs");
19
+ const performanceMetrics_1 = require("../constants/performanceMetrics.cjs");
20
+ const perpsConfig_1 = require("../constants/perpsConfig.cjs");
21
+ const types_1 = require("../types/index.cjs");
22
+ const errorUtils_1 = require("../utils/errorUtils.cjs");
23
+ /**
24
+ * TradingService
25
+ *
26
+ * Handles trading operations with fee discount management.
27
+ * Controller is responsible for analytics, state management, and tracing.
28
+ *
29
+ * Instance-based service with constructor injection of platform dependencies.
30
+ * Controller-level dependencies (RewardsController, NetworkController, etc.)
31
+ * are injected via setControllerDependencies() after construction.
32
+ */
33
+ class TradingService {
34
+ /**
35
+ * Create a new TradingService instance
36
+ *
37
+ * @param deps - Platform dependencies for logging, metrics, etc.
38
+ */
39
+ constructor(deps) {
40
+ _TradingService_instances.add(this);
41
+ /**
42
+ * Platform dependencies for logging, metrics, etc.
43
+ */
44
+ _TradingService_deps.set(this, void 0);
45
+ /**
46
+ * Controller-level dependencies for fee discount calculation.
47
+ * Set via setControllerDependencies() after construction.
48
+ */
49
+ _TradingService_controllerDeps.set(this, null);
50
+ __classPrivateFieldSet(this, _TradingService_deps, deps, "f");
51
+ }
52
+ /**
53
+ * Set controller-level dependencies for fee discount calculation.
54
+ * Called by PerpsController after construction to inject singleton dependencies.
55
+ *
56
+ * @param controllerDeps - Controller-level dependencies (RewardsController, etc.)
57
+ */
58
+ setControllerDependencies(controllerDeps) {
59
+ __classPrivateFieldSet(this, _TradingService_controllerDeps, controllerDeps, "f");
60
+ }
61
+ /**
62
+ * Place a new order with full orchestration
63
+ * Handles tracing, fee discounts, state management, analytics, and data lake reporting
64
+ *
65
+ * @param options - The configuration options.
66
+ * @param options.provider - The perps provider instance.
67
+ * @param options.params - The operation parameters.
68
+ * @param options.context - The service context for dependencies.
69
+ * @param options.reportOrderToDataLake - The report order to data lake value.
70
+ * @returns The result of the operation.
71
+ */
72
+ async placeOrder(options) {
73
+ const { provider, params, context, reportOrderToDataLake } = options;
74
+ const traceId = (0, uuid_1.v4)();
75
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
76
+ let traceData;
77
+ try {
78
+ // Start trace for the entire operation
79
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
80
+ name: types_1.PerpsTraceNames.PlaceOrder,
81
+ id: traceId,
82
+ op: types_1.PerpsTraceOperations.OrderSubmission,
83
+ tags: {
84
+ provider: context.tracingContext.provider,
85
+ orderType: params.orderType,
86
+ market: params.symbol,
87
+ leverage: String(params.leverage ?? 1),
88
+ isTestnet: String(context.tracingContext.isTestnet),
89
+ },
90
+ data: {
91
+ isBuy: params.isBuy,
92
+ orderPrice: params.price ?? '',
93
+ },
94
+ });
95
+ // Calculate fee discount at execution time (fresh, secure)
96
+ const feeDiscountBips = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_calculateFeeDiscountWithMeasurement).call(this);
97
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Fee discount calculated', {
98
+ feeDiscountBips,
99
+ hasDiscount: feeDiscountBips !== undefined,
100
+ });
101
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Submitting order to provider', {
102
+ symbol: params.symbol,
103
+ orderType: params.orderType,
104
+ isBuy: params.isBuy,
105
+ size: params.size,
106
+ leverage: params.leverage,
107
+ hasTP: Boolean(params.takeProfitPrice),
108
+ hasSL: Boolean(params.stopLossPrice),
109
+ });
110
+ // Execute order with fee discount management
111
+ const result = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_withFeeDiscount).call(this, {
112
+ provider,
113
+ feeDiscountBips,
114
+ operation: () => provider.placeOrder(params),
115
+ });
116
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Provider response received', {
117
+ success: result.success,
118
+ orderId: result.orderId,
119
+ error: result.error,
120
+ });
121
+ // Update state and handle success/failure
122
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
123
+ if (result.success) {
124
+ // Handle success: state updates, data lake reporting
125
+ await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_handleOrderSuccess).call(this, {
126
+ params,
127
+ context,
128
+ reportOrderToDataLake,
129
+ });
130
+ traceData = { success: true, orderId: result.orderId ?? '' };
131
+ // Invalidate standalone caches so external hooks (e.g., usePerpsPositionForAsset) refresh
132
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'positions' });
133
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'accountState' });
134
+ }
135
+ else {
136
+ traceData = { success: false, error: result.error ?? 'Unknown error' };
137
+ }
138
+ // Track analytics (success or failure)
139
+ __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_trackOrderResult).call(this, {
140
+ result,
141
+ params,
142
+ context,
143
+ duration: completionDuration,
144
+ });
145
+ return result;
146
+ }
147
+ catch (error) {
148
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
149
+ // Track analytics for exception
150
+ __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_trackOrderResult).call(this, {
151
+ result: null,
152
+ error: error instanceof Error ? error : undefined,
153
+ params,
154
+ context,
155
+ duration: completionDuration,
156
+ });
157
+ // withFeeDiscount handles fee discount cleanup automatically
158
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.placeOrder'), {
159
+ tags: {
160
+ feature: perpsConfig_1.PERPS_CONSTANTS.FeatureName,
161
+ provider: context.tracingContext.provider,
162
+ network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',
163
+ },
164
+ context: {
165
+ name: context.errorContext.controller,
166
+ data: {
167
+ method: context.errorContext.method,
168
+ symbol: params.symbol,
169
+ orderType: params.orderType,
170
+ },
171
+ },
172
+ });
173
+ traceData = {
174
+ success: false,
175
+ error: error instanceof Error ? error.message : 'Unknown error',
176
+ };
177
+ throw error;
178
+ }
179
+ finally {
180
+ // Always end trace on exit (success or failure)
181
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
182
+ name: types_1.PerpsTraceNames.PlaceOrder,
183
+ id: traceId,
184
+ data: traceData,
185
+ });
186
+ }
187
+ }
188
+ /**
189
+ * Edit an existing order with full orchestration
190
+ * Handles tracing, fee discounts, state management, and analytics
191
+ *
192
+ * @param options - The configuration options.
193
+ * @param options.provider - The perps provider instance.
194
+ * @param options.params - The operation parameters.
195
+ * @param options.context - The service context for dependencies.
196
+ * @returns The result of the operation.
197
+ */
198
+ async editOrder(options) {
199
+ const { provider, params, context } = options;
200
+ const traceId = (0, uuid_1.v4)();
201
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
202
+ let traceData;
203
+ try {
204
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
205
+ name: types_1.PerpsTraceNames.EditOrder,
206
+ id: traceId,
207
+ op: types_1.PerpsTraceOperations.OrderSubmission,
208
+ tags: {
209
+ provider: context.tracingContext.provider,
210
+ orderType: params.newOrder.orderType,
211
+ market: params.newOrder.symbol,
212
+ leverage: String(params.newOrder.leverage ?? 1),
213
+ isTestnet: String(context.tracingContext.isTestnet),
214
+ },
215
+ data: {
216
+ isBuy: params.newOrder.isBuy,
217
+ orderPrice: params.newOrder.price ?? '',
218
+ },
219
+ });
220
+ // Calculate fee discount only if required dependencies are available
221
+ const feeDiscountBips = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_calculateFeeDiscountWithMeasurement).call(this);
222
+ // Execute order edit with fee discount management
223
+ const result = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_withFeeDiscount).call(this, {
224
+ provider,
225
+ feeDiscountBips,
226
+ operation: () => provider.editOrder(params),
227
+ });
228
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
229
+ if (result.success) {
230
+ // Update state on success
231
+ if (context.stateManager) {
232
+ context.stateManager.update((state) => {
233
+ state.lastUpdateTimestamp = Date.now();
234
+ });
235
+ }
236
+ // Track order edit executed
237
+ const editExecutedProps = {
238
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED,
239
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,
240
+ [eventNames_1.PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy
241
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
242
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT,
243
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,
244
+ [eventNames_1.PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,
245
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,
246
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
247
+ };
248
+ if (params.newOrder.price) {
249
+ editExecutedProps[eventNames_1.PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(params.newOrder.price);
250
+ }
251
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.TradeTransaction, editExecutedProps);
252
+ traceData = { success: true, orderId: result.orderId ?? '' };
253
+ }
254
+ else {
255
+ // Track order edit failed
256
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.TradeTransaction, {
257
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
258
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,
259
+ [eventNames_1.PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy
260
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
261
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT,
262
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,
263
+ [eventNames_1.PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,
264
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,
265
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
266
+ [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: result.error ?? 'Unknown error',
267
+ });
268
+ traceData = { success: false, error: result.error ?? 'Unknown error' };
269
+ }
270
+ return result;
271
+ }
272
+ catch (error) {
273
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
274
+ // Track order edit exception
275
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.TradeTransaction, {
276
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
277
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.newOrder.symbol,
278
+ [eventNames_1.PERPS_EVENT_PROPERTY.DIRECTION]: params.newOrder.isBuy
279
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
280
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT,
281
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.newOrder.orderType,
282
+ [eventNames_1.PERPS_EVENT_PROPERTY.LEVERAGE]: params.newOrder.leverage ?? 1,
283
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_SIZE]: params.newOrder.size,
284
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
285
+ [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: error instanceof Error ? error.message : 'Unknown error',
286
+ });
287
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.editOrder'), {
288
+ tags: {
289
+ feature: perpsConfig_1.PERPS_CONSTANTS.FeatureName,
290
+ provider: context.tracingContext.provider,
291
+ network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',
292
+ },
293
+ context: {
294
+ name: context.errorContext.controller,
295
+ data: {
296
+ method: context.errorContext.method,
297
+ orderId: params.orderId,
298
+ },
299
+ },
300
+ });
301
+ traceData = {
302
+ success: false,
303
+ error: error instanceof Error ? error.message : 'Unknown error',
304
+ };
305
+ throw error;
306
+ }
307
+ finally {
308
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
309
+ name: types_1.PerpsTraceNames.EditOrder,
310
+ id: traceId,
311
+ data: traceData,
312
+ });
313
+ }
314
+ }
315
+ /**
316
+ * Cancel a single order with full orchestration
317
+ * Handles tracing, state management, and analytics
318
+ *
319
+ * @param options - The configuration options.
320
+ * @param options.provider - The perps provider instance.
321
+ * @param options.params - The operation parameters.
322
+ * @param options.context - The service context for dependencies.
323
+ * @returns The result of the operation.
324
+ */
325
+ async cancelOrder(options) {
326
+ const { provider, params, context } = options;
327
+ const traceId = (0, uuid_1.v4)();
328
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
329
+ let traceData;
330
+ try {
331
+ // Start trace for the entire operation
332
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
333
+ name: types_1.PerpsTraceNames.CancelOrder,
334
+ id: traceId,
335
+ op: types_1.PerpsTraceOperations.OrderSubmission,
336
+ tags: {
337
+ provider: context.tracingContext.provider,
338
+ market: params.symbol,
339
+ isTestnet: String(context.tracingContext.isTestnet),
340
+ },
341
+ data: {
342
+ orderId: params.orderId,
343
+ },
344
+ });
345
+ // Execute order cancellation
346
+ const result = await provider.cancelOrder(params);
347
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
348
+ if (result.success) {
349
+ // Update state on success
350
+ if (context.stateManager) {
351
+ context.stateManager.update((state) => {
352
+ state.lastUpdateTimestamp = Date.now();
353
+ });
354
+ }
355
+ // Track order cancel executed
356
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.OrderCancelTransaction, {
357
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED,
358
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.symbol,
359
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
360
+ });
361
+ traceData = { success: true, orderId: params.orderId };
362
+ }
363
+ else {
364
+ // Track order cancel failed
365
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.OrderCancelTransaction, {
366
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
367
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.symbol,
368
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
369
+ [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: result.error ?? 'Unknown error',
370
+ });
371
+ traceData = { success: false, error: result.error ?? 'Unknown error' };
372
+ }
373
+ return result;
374
+ }
375
+ catch (error) {
376
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
377
+ // Track order cancel exception
378
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.OrderCancelTransaction, {
379
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
380
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.symbol,
381
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
382
+ [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: error instanceof Error ? error.message : 'Unknown error',
383
+ });
384
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.cancelOrder'), __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_getErrorContext).call(this, 'cancelOrder', { symbol: params.symbol }));
385
+ traceData = {
386
+ success: false,
387
+ error: error instanceof Error ? error.message : 'Unknown error',
388
+ };
389
+ throw error;
390
+ }
391
+ finally {
392
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
393
+ name: types_1.PerpsTraceNames.CancelOrder,
394
+ id: traceId,
395
+ data: traceData,
396
+ });
397
+ }
398
+ }
399
+ /**
400
+ * Cancel multiple orders with full orchestration
401
+ * Handles tracing, stream pausing, filtering, batch operations, and analytics
402
+ *
403
+ * @param options - The configuration options.
404
+ * @param options.provider - The perps provider instance.
405
+ * @param options.params - The operation parameters.
406
+ * @param options.context - The service context for dependencies.
407
+ * @param options.withStreamPause - The with stream pause value.
408
+ * @returns The result of the operation.
409
+ */
410
+ async cancelOrders(options) {
411
+ const { provider, params, context, withStreamPause } = options;
412
+ const traceId = (0, uuid_1.v4)();
413
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
414
+ let operationResult = null;
415
+ let operationError = null;
416
+ try {
417
+ // Start trace for batch operation
418
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
419
+ name: types_1.PerpsTraceNames.CancelOrder,
420
+ id: traceId,
421
+ op: types_1.PerpsTraceOperations.OrderSubmission,
422
+ tags: {
423
+ provider: context.tracingContext.provider,
424
+ isBatch: 'true',
425
+ isTestnet: String(context.tracingContext.isTestnet),
426
+ },
427
+ data: {
428
+ cancelAll: params.cancelAll ? 'true' : 'false',
429
+ symbolCount: params.symbols?.length ?? 0,
430
+ orderIdCount: params.orderIds?.length ?? 0,
431
+ },
432
+ });
433
+ // Pause orders stream to prevent WebSocket updates during cancellation
434
+ operationResult = await withStreamPause(async () => {
435
+ // Get all open orders
436
+ if (!context.getOpenOrders) {
437
+ throw new Error('getOpenOrders callback not provided in context');
438
+ }
439
+ const orders = await context.getOpenOrders();
440
+ // Filter orders based on params
441
+ let ordersToCancel = orders;
442
+ if (params.cancelAll === true ||
443
+ (!params.symbols && !params.orderIds)) {
444
+ // Cancel all orders (excluding TP/SL orders for positions)
445
+ ordersToCancel = orders.filter((order) => !(0, orderTypes_1.isTPSLOrder)(order.detailedOrderType));
446
+ }
447
+ else if (params.orderIds && params.orderIds.length > 0) {
448
+ // Cancel specific order IDs
449
+ ordersToCancel = orders.filter((order) => params.orderIds?.includes(order.orderId));
450
+ }
451
+ else if (params.symbols && params.symbols.length > 0) {
452
+ // Cancel orders for specific symbols
453
+ ordersToCancel = orders.filter((order) => params.symbols?.includes(order.symbol));
454
+ }
455
+ if (ordersToCancel.length === 0) {
456
+ return {
457
+ success: false,
458
+ successCount: 0,
459
+ failureCount: 0,
460
+ results: [],
461
+ };
462
+ }
463
+ // Use batch cancel if provider supports it
464
+ if (provider.cancelOrders) {
465
+ return await provider.cancelOrders(ordersToCancel.map((order) => ({
466
+ symbol: order.symbol,
467
+ orderId: order.orderId,
468
+ })));
469
+ }
470
+ // Fallback: Cancel orders in parallel (for providers without batch support)
471
+ const results = await Promise.allSettled(ordersToCancel.map((order) => this.cancelOrder({
472
+ provider,
473
+ params: { symbol: order.symbol, orderId: order.orderId },
474
+ context,
475
+ })));
476
+ // Aggregate results
477
+ const successCount = results.filter((res) => res.status === 'fulfilled' && res.value.success).length;
478
+ const failureCount = results.length - successCount;
479
+ return {
480
+ success: successCount > 0,
481
+ successCount,
482
+ failureCount,
483
+ results: results.map((result, index) => {
484
+ let error;
485
+ if (result.status === 'rejected') {
486
+ error =
487
+ result.reason instanceof Error
488
+ ? result.reason.message
489
+ : 'Unknown error';
490
+ }
491
+ else if (result.status === 'fulfilled' && !result.value.success) {
492
+ error = result.value.error;
493
+ }
494
+ return {
495
+ orderId: ordersToCancel[index].orderId,
496
+ symbol: ordersToCancel[index].symbol,
497
+ success: Boolean(result.status === 'fulfilled' && result.value.success),
498
+ error,
499
+ };
500
+ }),
501
+ };
502
+ }, ['orders']); // Disconnect orders stream during operation
503
+ return operationResult;
504
+ }
505
+ catch (error) {
506
+ operationError =
507
+ error instanceof Error ? error : new Error(String(error));
508
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.cancelOrders'), __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_getErrorContext).call(this, 'cancelOrders'));
509
+ throw error;
510
+ }
511
+ finally {
512
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
513
+ // Track batch cancel event (success or failure)
514
+ const batchCancelProps = {
515
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: operationResult?.success && operationResult.successCount > 0
516
+ ? eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED
517
+ : eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
518
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
519
+ };
520
+ if (operationError) {
521
+ batchCancelProps[eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =
522
+ operationError.message;
523
+ }
524
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.OrderCancelTransaction, batchCancelProps);
525
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
526
+ name: types_1.PerpsTraceNames.CancelOrder,
527
+ id: traceId,
528
+ });
529
+ }
530
+ }
531
+ /**
532
+ * Close a single position with full orchestration
533
+ * Handles tracing, fee discounts, state management, analytics, and data lake reporting
534
+ *
535
+ * @param options - The configuration options.
536
+ * @param options.provider - The perps provider instance.
537
+ * @param options.params - The operation parameters.
538
+ * @param options.context - The service context for dependencies.
539
+ * @param options.reportOrderToDataLake - The report order to data lake value.
540
+ * @returns The result of the operation.
541
+ */
542
+ async closePosition(options) {
543
+ const { provider, params, context, reportOrderToDataLake } = options;
544
+ const traceId = (0, uuid_1.v4)();
545
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
546
+ let position;
547
+ let result;
548
+ let traceData;
549
+ try {
550
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
551
+ name: types_1.PerpsTraceNames.ClosePosition,
552
+ id: traceId,
553
+ op: types_1.PerpsTraceOperations.PositionManagement,
554
+ tags: {
555
+ provider: context.tracingContext.provider,
556
+ symbol: params.symbol,
557
+ closeSize: params.size ?? 'full',
558
+ isTestnet: String(context.tracingContext.isTestnet),
559
+ },
560
+ });
561
+ // Load position data with measurement
562
+ position = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_loadPositionData).call(this, {
563
+ symbol: params.symbol,
564
+ context,
565
+ });
566
+ // Calculate fee discount with measurement
567
+ const feeDiscountBips = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_calculateFeeDiscountWithMeasurement).call(this);
568
+ // Execute position close with fee discount management
569
+ result = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_withFeeDiscount).call(this, {
570
+ provider,
571
+ feeDiscountBips,
572
+ operation: () => provider.closePosition(params),
573
+ });
574
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
575
+ if (result.success) {
576
+ // Update state on success
577
+ if (context.stateManager) {
578
+ context.stateManager.update((state) => {
579
+ state.lastUpdateTimestamp = Date.now();
580
+ });
581
+ }
582
+ // Report to data lake (fire-and-forget)
583
+ __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_handleDataLakeReporting).call(this, reportOrderToDataLake, params.symbol, context);
584
+ traceData = { success: true, filledSize: result.filledSize ?? '' };
585
+ // Invalidate standalone caches so external hooks (e.g., usePerpsPositionForAsset) refresh
586
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'positions' });
587
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'accountState' });
588
+ }
589
+ else {
590
+ traceData = { success: false, error: result.error ?? 'Unknown error' };
591
+ }
592
+ // Track analytics (success or failure, includes partial fills)
593
+ __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_trackPositionCloseResult).call(this, {
594
+ position,
595
+ result,
596
+ params,
597
+ context,
598
+ duration: completionDuration,
599
+ });
600
+ return result;
601
+ }
602
+ catch (error) {
603
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
604
+ traceData = {
605
+ success: false,
606
+ error: error instanceof Error ? error.message : 'Unknown error',
607
+ };
608
+ // Track analytics for exception
609
+ __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_trackPositionCloseResult).call(this, {
610
+ position,
611
+ result: null,
612
+ error: error instanceof Error ? error : undefined,
613
+ params,
614
+ context,
615
+ duration: completionDuration,
616
+ });
617
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.closePosition'), {
618
+ tags: {
619
+ feature: perpsConfig_1.PERPS_CONSTANTS.FeatureName,
620
+ provider: context.tracingContext.provider,
621
+ network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',
622
+ },
623
+ context: {
624
+ name: context.errorContext.controller,
625
+ data: {
626
+ method: context.errorContext.method,
627
+ symbol: params.symbol,
628
+ },
629
+ },
630
+ });
631
+ throw error;
632
+ }
633
+ finally {
634
+ // Always end trace on exit (success or failure)
635
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
636
+ name: types_1.PerpsTraceNames.ClosePosition,
637
+ id: traceId,
638
+ data: traceData,
639
+ });
640
+ }
641
+ }
642
+ /**
643
+ * Close multiple positions with full orchestration
644
+ * Handles tracing, fee discounts, batch operations, and analytics
645
+ *
646
+ * @param options - The configuration options.
647
+ * @param options.provider - The perps provider instance.
648
+ * @param options.params - The operation parameters.
649
+ * @param options.context - The service context for dependencies.
650
+ * @returns The result of the operation.
651
+ */
652
+ async closePositions(options) {
653
+ const { provider, params, context } = options;
654
+ const traceId = (0, uuid_1.v4)();
655
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
656
+ let operationResult = null;
657
+ let operationError = null;
658
+ try {
659
+ // Start trace for batch operation
660
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
661
+ name: types_1.PerpsTraceNames.ClosePosition,
662
+ id: traceId,
663
+ op: types_1.PerpsTraceOperations.PositionManagement,
664
+ tags: {
665
+ provider: context.tracingContext.provider,
666
+ isBatch: 'true',
667
+ isTestnet: String(context.tracingContext.isTestnet),
668
+ },
669
+ data: {
670
+ closeAll: params.closeAll ? 'true' : 'false',
671
+ symbolCount: params.symbols?.length ?? 0,
672
+ },
673
+ });
674
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('[closePositions] Batch method check', {
675
+ providerType: provider.protocolId,
676
+ hasBatchMethod: 'closePositions' in provider,
677
+ providerKeys: Object.keys(provider).filter((key) => key.includes('close')),
678
+ });
679
+ // Use batch close if provider supports it (provider handles filtering)
680
+ if (provider.closePositions) {
681
+ const feeDiscountBips = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_calculateFeeDiscountWithMeasurement).call(this);
682
+ operationResult = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_withFeeDiscount).call(this, {
683
+ provider,
684
+ feeDiscountBips,
685
+ operation: async () => {
686
+ if (!provider.closePositions) {
687
+ throw new Error('closePositions method not available');
688
+ }
689
+ return provider.closePositions(params);
690
+ },
691
+ });
692
+ }
693
+ else {
694
+ // Fallback: Get positions, filter, and close in parallel
695
+ if (!context.getPositions) {
696
+ throw new Error('getPositions callback not provided in context');
697
+ }
698
+ const positions = await context.getPositions();
699
+ const positionsToClose = params.closeAll === true ||
700
+ !params.symbols ||
701
+ params.symbols.length === 0
702
+ ? positions
703
+ : positions.filter((pos) => params.symbols?.includes(pos.symbol));
704
+ if (positionsToClose.length === 0) {
705
+ operationResult = {
706
+ success: false,
707
+ successCount: 0,
708
+ failureCount: 0,
709
+ results: [],
710
+ };
711
+ return operationResult;
712
+ }
713
+ const results = await Promise.allSettled(positionsToClose.map((position) => this.closePosition({
714
+ provider,
715
+ params: { symbol: position.symbol },
716
+ context,
717
+ reportOrderToDataLake: () => Promise.resolve({ success: true }), // No-op for batch fallback
718
+ })));
719
+ // Aggregate results
720
+ const successCount = results.filter((res) => res.status === 'fulfilled' && res.value.success).length;
721
+ const failureCount = results.length - successCount;
722
+ operationResult = {
723
+ success: successCount > 0,
724
+ successCount,
725
+ failureCount,
726
+ results: results.map((result, index) => {
727
+ let error;
728
+ if (result.status === 'rejected') {
729
+ error =
730
+ result.reason instanceof Error
731
+ ? result.reason.message
732
+ : 'Unknown error';
733
+ }
734
+ else if (result.status === 'fulfilled' && !result.value.success) {
735
+ error = result.value.error;
736
+ }
737
+ return {
738
+ symbol: positionsToClose[index].symbol,
739
+ success: Boolean(result.status === 'fulfilled' && result.value.success),
740
+ error,
741
+ };
742
+ }),
743
+ };
744
+ }
745
+ return operationResult;
746
+ }
747
+ catch (error) {
748
+ operationError =
749
+ error instanceof Error ? error : new Error(String(error));
750
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.closePositions'), __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_getErrorContext).call(this, 'closePositions', {
751
+ symbols: params.symbols?.length ?? 0,
752
+ closeAll: params.closeAll,
753
+ }));
754
+ throw error;
755
+ }
756
+ finally {
757
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
758
+ // Track batch close event (success or failure)
759
+ const batchCloseProps = {
760
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: operationResult?.success && operationResult.successCount > 0
761
+ ? eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED
762
+ : eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
763
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
764
+ };
765
+ if (operationError) {
766
+ batchCloseProps[eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =
767
+ operationError.message;
768
+ }
769
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.PositionCloseTransaction, batchCloseProps);
770
+ // Invalidate standalone caches on successful batch close
771
+ if (operationResult?.success && operationResult.successCount > 0) {
772
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'positions' });
773
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'accountState' });
774
+ }
775
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
776
+ name: types_1.PerpsTraceNames.ClosePosition,
777
+ id: traceId,
778
+ });
779
+ }
780
+ }
781
+ /**
782
+ * Update TP/SL for an existing position with full orchestration
783
+ * Handles tracing, fee discounts, state management, and analytics
784
+ *
785
+ * @param options - The configuration options.
786
+ * @param options.provider - The perps provider instance.
787
+ * @param options.params - The operation parameters.
788
+ * @param options.context - The service context for dependencies.
789
+ * @returns The result of the operation.
790
+ */
791
+ async updatePositionTPSL(options) {
792
+ const { provider, params, context } = options;
793
+ const traceId = (0, uuid_1.v4)();
794
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
795
+ let traceData;
796
+ let result;
797
+ let errorMessage;
798
+ // Extract tracking data with defaults
799
+ const direction = params.trackingData?.direction;
800
+ const positionSize = params.trackingData?.positionSize;
801
+ const source = params.trackingData?.source ?? eventNames_1.PERPS_EVENT_VALUE.SOURCE.TP_SL_VIEW;
802
+ const takeProfitPercentage = params.trackingData?.takeProfitPercentage;
803
+ const stopLossPercentage = params.trackingData?.stopLossPercentage;
804
+ const isEditingExistingPosition = params.trackingData?.isEditingExistingPosition ?? false;
805
+ try {
806
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
807
+ name: types_1.PerpsTraceNames.UpdateTpsl,
808
+ id: traceId,
809
+ op: types_1.PerpsTraceOperations.PositionManagement,
810
+ tags: {
811
+ provider: context.tracingContext.provider,
812
+ market: params.symbol,
813
+ isTestnet: String(context.tracingContext.isTestnet),
814
+ },
815
+ data: {
816
+ takeProfitPrice: params.takeProfitPrice ?? '',
817
+ stopLossPrice: params.stopLossPrice ?? '',
818
+ },
819
+ });
820
+ // Get fee discount from rewards
821
+ const feeDiscountBips = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_calculateFeeDiscountWithMeasurement).call(this);
822
+ // Execute with fee discount management
823
+ result = await __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_withFeeDiscount).call(this, {
824
+ provider,
825
+ feeDiscountBips,
826
+ operation: () => provider.updatePositionTPSL(params),
827
+ });
828
+ if (result.success) {
829
+ // Update state on success
830
+ if (context.stateManager) {
831
+ context.stateManager.update((state) => {
832
+ state.lastUpdateTimestamp = Date.now();
833
+ });
834
+ }
835
+ traceData = { success: true };
836
+ }
837
+ else {
838
+ errorMessage = result.error ?? 'Unknown error';
839
+ traceData = { success: false, error: errorMessage };
840
+ }
841
+ return result;
842
+ }
843
+ catch (error) {
844
+ errorMessage = error instanceof Error ? error.message : 'Unknown error';
845
+ traceData = { success: false, error: errorMessage };
846
+ throw error;
847
+ }
848
+ finally {
849
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
850
+ // Determine screen type based on whether editing existing position
851
+ const screenType = isEditingExistingPosition
852
+ ? eventNames_1.PERPS_EVENT_VALUE.SCREEN_TYPE.EDIT_TPSL
853
+ : eventNames_1.PERPS_EVENT_VALUE.SCREEN_TYPE.CREATE_TPSL;
854
+ // Determine if TP/SL are set
855
+ const hasTakeProfit = Boolean(params.takeProfitPrice);
856
+ const hasStopLoss = Boolean(params.stopLossPrice);
857
+ // Build comprehensive event properties
858
+ const eventProperties = {
859
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: result?.success
860
+ ? eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED
861
+ : eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
862
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.symbol,
863
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
864
+ [eventNames_1.PERPS_EVENT_PROPERTY.SOURCE]: source,
865
+ [eventNames_1.PERPS_EVENT_PROPERTY.SCREEN_TYPE]: screenType,
866
+ [eventNames_1.PERPS_EVENT_PROPERTY.HAS_TAKE_PROFIT]: hasTakeProfit,
867
+ [eventNames_1.PERPS_EVENT_PROPERTY.HAS_STOP_LOSS]: hasStopLoss,
868
+ ...(direction && {
869
+ [eventNames_1.PERPS_EVENT_PROPERTY.DIRECTION]: direction === 'long'
870
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
871
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT,
872
+ }),
873
+ ...(positionSize !== undefined && {
874
+ [eventNames_1.PERPS_EVENT_PROPERTY.POSITION_SIZE]: positionSize,
875
+ }),
876
+ ...(params.takeProfitPrice && {
877
+ [eventNames_1.PERPS_EVENT_PROPERTY.TAKE_PROFIT_PRICE]: parseFloat(params.takeProfitPrice),
878
+ }),
879
+ ...(params.stopLossPrice && {
880
+ [eventNames_1.PERPS_EVENT_PROPERTY.STOP_LOSS_PRICE]: parseFloat(params.stopLossPrice),
881
+ }),
882
+ ...(takeProfitPercentage !== undefined && {
883
+ [eventNames_1.PERPS_EVENT_PROPERTY.TAKE_PROFIT_PERCENTAGE]: takeProfitPercentage,
884
+ }),
885
+ ...(stopLossPercentage !== undefined && {
886
+ [eventNames_1.PERPS_EVENT_PROPERTY.STOP_LOSS_PERCENTAGE]: stopLossPercentage,
887
+ }),
888
+ ...(errorMessage && {
889
+ [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,
890
+ }),
891
+ };
892
+ // Track event once with all properties
893
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.RiskManagement, eventProperties);
894
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
895
+ name: types_1.PerpsTraceNames.UpdateTpsl,
896
+ id: traceId,
897
+ data: traceData,
898
+ });
899
+ }
900
+ }
901
+ /**
902
+ * Update margin for an existing position (add or remove)
903
+ *
904
+ * @param options - The configuration options.
905
+ * @param options.provider - The perps provider instance.
906
+ * @param options.symbol - The trading pair symbol.
907
+ * @param options.amount - The amount value.
908
+ * @param options.context - The service context for dependencies.
909
+ * @returns The result of the operation.
910
+ */
911
+ async updateMargin(options) {
912
+ const { provider, symbol, amount, context } = options;
913
+ const traceId = (0, uuid_1.v4)();
914
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
915
+ try {
916
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
917
+ name: types_1.PerpsTraceNames.UpdateMargin,
918
+ id: traceId,
919
+ op: types_1.PerpsTraceOperations.PositionManagement,
920
+ tags: {
921
+ provider: context.tracingContext.provider,
922
+ symbol,
923
+ isAdd: String(parseFloat(amount) > 0),
924
+ isTestnet: String(context.tracingContext.isTestnet),
925
+ },
926
+ });
927
+ // Call provider method
928
+ const result = await provider.updateMargin?.({ symbol, amount });
929
+ if (!result) {
930
+ throw new Error('Provider does not support margin adjustment');
931
+ }
932
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
933
+ if (result.success) {
934
+ // Update state on success
935
+ if (context.stateManager) {
936
+ context.stateManager.update((state) => {
937
+ state.lastUpdateTimestamp = Date.now();
938
+ });
939
+ }
940
+ // Track success analytics
941
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.RiskManagement, {
942
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED,
943
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: symbol,
944
+ [eventNames_1.PERPS_EVENT_PROPERTY.ACTION]: parseFloat(amount) > 0 ? 'add_margin' : 'remove_margin',
945
+ [eventNames_1.PERPS_EVENT_PROPERTY.MARGIN_USED]: Math.abs(parseFloat(amount)),
946
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
947
+ });
948
+ // Invalidate standalone caches so external hooks refresh
949
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'positions' });
950
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'accountState' });
951
+ }
952
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
953
+ name: types_1.PerpsTraceNames.UpdateMargin,
954
+ id: traceId,
955
+ data: { success: result.success, error: result.error ?? '' },
956
+ });
957
+ return result;
958
+ }
959
+ catch (error) {
960
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
961
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
962
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.updateMargin'), __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_getErrorContext).call(this, 'updateMargin', { symbol, amount }));
963
+ // Track failure analytics
964
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.RiskManagement, {
965
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
966
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: symbol,
967
+ [eventNames_1.PERPS_EVENT_PROPERTY.ACTION]: parseFloat(amount) > 0 ? 'add_margin' : 'remove_margin',
968
+ [eventNames_1.PERPS_EVENT_PROPERTY.MARGIN_USED]: Math.abs(parseFloat(amount)),
969
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
970
+ [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,
971
+ });
972
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
973
+ name: types_1.PerpsTraceNames.UpdateMargin,
974
+ id: traceId,
975
+ data: { success: false, error: errorMessage },
976
+ });
977
+ throw error;
978
+ }
979
+ }
980
+ /**
981
+ * Flip position (reverse direction while keeping size and leverage)
982
+ *
983
+ * @param options - The configuration options.
984
+ * @param options.provider - The perps provider instance.
985
+ * @param options.position - The position data.
986
+ * @param options.context - The service context for dependencies.
987
+ * @returns The result of the operation.
988
+ */
989
+ async flipPosition(options) {
990
+ const { provider, position, context } = options;
991
+ const traceId = (0, uuid_1.v4)();
992
+ const startTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
993
+ try {
994
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.trace({
995
+ name: types_1.PerpsTraceNames.FlipPosition,
996
+ id: traceId,
997
+ op: types_1.PerpsTraceOperations.PositionManagement,
998
+ tags: {
999
+ provider: context.tracingContext.provider,
1000
+ symbol: position.symbol,
1001
+ isTestnet: String(context.tracingContext.isTestnet),
1002
+ },
1003
+ });
1004
+ // Calculate flip parameters
1005
+ const positionSize = Math.abs(parseFloat(position.size));
1006
+ const isCurrentlyLong = parseFloat(position.size) > 0;
1007
+ const oppositeDirection = !isCurrentlyLong;
1008
+ // Validate available balance for fees
1009
+ const accountState = await provider.getAccountState?.();
1010
+ if (!accountState) {
1011
+ throw new Error('Failed to get account state');
1012
+ }
1013
+ const availableBalance = parseFloat(accountState.availableBalance);
1014
+ // Estimate fees (close + open, approximately 0.09% of notional)
1015
+ // Flip requires 2x position size (1x to close, 1x to open opposite)
1016
+ const entryPrice = parseFloat(position.entryPrice);
1017
+ const flipSize = positionSize * 2;
1018
+ const notionalValue = flipSize * entryPrice;
1019
+ const estimatedFees = notionalValue * 0.0009;
1020
+ if (estimatedFees > availableBalance) {
1021
+ throw new Error(`Insufficient balance for flip fees. Need $${estimatedFees.toFixed(2)}, have $${availableBalance.toFixed(2)}`);
1022
+ }
1023
+ // Create order params for flip
1024
+ // Use 2x position size: 1x to close current position + 1x to open opposite position
1025
+ const orderParams = {
1026
+ symbol: position.symbol,
1027
+ isBuy: oppositeDirection,
1028
+ size: flipSize.toString(),
1029
+ orderType: 'market',
1030
+ leverage: position.leverage?.value,
1031
+ currentPrice: entryPrice,
1032
+ };
1033
+ // Place flip order (HyperLiquid handles margin transfer automatically)
1034
+ const result = await provider.placeOrder(orderParams);
1035
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
1036
+ if (result.success) {
1037
+ // Update state on success
1038
+ if (context.stateManager) {
1039
+ context.stateManager.update((state) => {
1040
+ state.lastUpdateTimestamp = Date.now();
1041
+ });
1042
+ }
1043
+ // Track success analytics
1044
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.TradeTransaction, {
1045
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED,
1046
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: position.symbol,
1047
+ [eventNames_1.PERPS_EVENT_PROPERTY.DIRECTION]: oppositeDirection
1048
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
1049
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT,
1050
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_TYPE]: 'market',
1051
+ [eventNames_1.PERPS_EVENT_PROPERTY.LEVERAGE]: position.leverage?.value || 1,
1052
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_SIZE]: positionSize,
1053
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
1054
+ [eventNames_1.PERPS_EVENT_PROPERTY.ACTION]: 'flip_position',
1055
+ });
1056
+ // Invalidate standalone caches so external hooks refresh
1057
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'positions' });
1058
+ __classPrivateFieldGet(this, _TradingService_deps, "f").cacheInvalidator.invalidate({ cacheType: 'accountState' });
1059
+ }
1060
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
1061
+ name: types_1.PerpsTraceNames.FlipPosition,
1062
+ id: traceId,
1063
+ data: { success: result.success ?? false, error: result.error ?? '' },
1064
+ });
1065
+ return result;
1066
+ }
1067
+ catch (error) {
1068
+ const completionDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - startTime;
1069
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
1070
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.flipPosition'), __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_getErrorContext).call(this, 'flipPosition', { symbol: position.symbol }));
1071
+ // Track failure analytics
1072
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.TradeTransaction, {
1073
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED,
1074
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: position.symbol,
1075
+ [eventNames_1.PERPS_EVENT_PROPERTY.ACTION]: 'flip_position',
1076
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: completionDuration,
1077
+ [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: errorMessage,
1078
+ });
1079
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.endTrace({
1080
+ name: types_1.PerpsTraceNames.FlipPosition,
1081
+ id: traceId,
1082
+ data: { success: false, error: errorMessage },
1083
+ });
1084
+ throw error;
1085
+ }
1086
+ }
1087
+ }
1088
+ exports.TradingService = TradingService;
1089
+ _TradingService_deps = new WeakMap(), _TradingService_controllerDeps = new WeakMap(), _TradingService_instances = new WeakSet(), _TradingService_getErrorContext = function _TradingService_getErrorContext(method, additionalContext) {
1090
+ return {
1091
+ controller: 'TradingService',
1092
+ method,
1093
+ ...additionalContext,
1094
+ };
1095
+ }, _TradingService_trackOrderResult = function _TradingService_trackOrderResult(options) {
1096
+ const { result, error, params, duration } = options;
1097
+ const status = result?.success === true
1098
+ ? eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED
1099
+ : eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED;
1100
+ // Build base properties
1101
+ const properties = {
1102
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: status,
1103
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: params.symbol,
1104
+ [eventNames_1.PERPS_EVENT_PROPERTY.DIRECTION]: params.isBuy
1105
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
1106
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT,
1107
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_TYPE]: params.orderType,
1108
+ [eventNames_1.PERPS_EVENT_PROPERTY.LEVERAGE]: parseFloat(String(params.leverage ?? 1)),
1109
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_SIZE]: parseFloat(result?.filledSize ?? params.size),
1110
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,
1111
+ };
1112
+ // Add optional properties
1113
+ if (params.trackingData?.marginUsed !== undefined) {
1114
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.MARGIN_USED] =
1115
+ params.trackingData.marginUsed;
1116
+ }
1117
+ if (params.trackingData?.totalFee !== undefined) {
1118
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.FEES] = params.trackingData.totalFee;
1119
+ }
1120
+ if (result?.averagePrice ?? params.trackingData?.marketPrice) {
1121
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.ASSET_PRICE] = result?.averagePrice
1122
+ ? parseFloat(result.averagePrice)
1123
+ : params.trackingData?.marketPrice;
1124
+ }
1125
+ if (params.orderType === 'limit' && params.price) {
1126
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.LIMIT_PRICE] = parseFloat(params.price);
1127
+ }
1128
+ if (params.trackingData?.source) {
1129
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.SOURCE] = params.trackingData.source;
1130
+ }
1131
+ if (params.trackingData?.tradeAction) {
1132
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.ACTION] = params.trackingData.tradeAction;
1133
+ }
1134
+ // Pay with any token: trade_with_token (boolean); when true, include mm_pay_token_selected and mm_pay_network_selected
1135
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.TRADE_WITH_TOKEN] =
1136
+ params.trackingData?.tradeWithToken === true;
1137
+ if (params.trackingData?.tradeWithToken === true) {
1138
+ if (params.trackingData.mmPayTokenSelected !== undefined) {
1139
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.MM_PAY_TOKEN_SELECTED] =
1140
+ params.trackingData.mmPayTokenSelected;
1141
+ }
1142
+ if (params.trackingData.mmPayNetworkSelected !== undefined) {
1143
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.MM_PAY_NETWORK_SELECTED] =
1144
+ params.trackingData.mmPayNetworkSelected;
1145
+ }
1146
+ }
1147
+ // Add success-specific properties
1148
+ if (status === eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED) {
1149
+ if (params.trackingData?.metamaskFee !== undefined) {
1150
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.METAMASK_FEE] =
1151
+ params.trackingData.metamaskFee;
1152
+ }
1153
+ if (params.trackingData?.metamaskFeeRate !== undefined) {
1154
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.METAMASK_FEE_RATE] =
1155
+ params.trackingData.metamaskFeeRate;
1156
+ }
1157
+ if (params.trackingData?.feeDiscountPercentage !== undefined) {
1158
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.DISCOUNT_PERCENTAGE] =
1159
+ params.trackingData.feeDiscountPercentage;
1160
+ }
1161
+ if (params.trackingData?.estimatedPoints !== undefined) {
1162
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.ESTIMATED_REWARDS] =
1163
+ params.trackingData.estimatedPoints;
1164
+ }
1165
+ if (params.takeProfitPrice) {
1166
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.TAKE_PROFIT_PRICE] = parseFloat(params.takeProfitPrice);
1167
+ }
1168
+ if (params.stopLossPrice) {
1169
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.STOP_LOSS_PRICE] = parseFloat(params.stopLossPrice);
1170
+ }
1171
+ }
1172
+ else {
1173
+ // Add failure-specific properties
1174
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE] =
1175
+ error?.message ?? result?.error ?? 'Unknown error';
1176
+ }
1177
+ if (params.trackingData?.abTests &&
1178
+ Object.keys(params.trackingData.abTests).length > 0) {
1179
+ properties[eventNames_1.PERPS_EVENT_PROPERTY.AB_TESTS] = params.trackingData.abTests;
1180
+ }
1181
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.TradeTransaction, properties);
1182
+ }, _TradingService_handleOrderSuccess =
1183
+ /**
1184
+ * Handle successful order placement (state updates, analytics, data lake reporting)
1185
+ *
1186
+ * @param options - The configuration options.
1187
+ * @param options.params - The operation parameters.
1188
+ * @param options.context - The service context for dependencies.
1189
+ * @param options.reportOrderToDataLake - The report order to data lake value.
1190
+ */
1191
+ async function _TradingService_handleOrderSuccess(options) {
1192
+ const { params, context, reportOrderToDataLake } = options;
1193
+ // Update state on success
1194
+ if (context.stateManager) {
1195
+ context.stateManager.update((state) => {
1196
+ state.lastUpdateTimestamp = Date.now();
1197
+ });
1198
+ }
1199
+ // Save executed trade configuration for this market
1200
+ if (params.leverage && context.saveTradeConfiguration) {
1201
+ context.saveTradeConfiguration(params.symbol, params.leverage);
1202
+ }
1203
+ // Report to data lake (fire-and-forget with retry)
1204
+ reportOrderToDataLake({
1205
+ action: 'open',
1206
+ symbol: params.symbol,
1207
+ slPrice: params.stopLossPrice
1208
+ ? parseFloat(params.stopLossPrice)
1209
+ : undefined,
1210
+ tpPrice: params.takeProfitPrice
1211
+ ? parseFloat(params.takeProfitPrice)
1212
+ : undefined,
1213
+ }).catch((error) => {
1214
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.handleOrderSuccess'), {
1215
+ tags: {
1216
+ feature: perpsConfig_1.PERPS_CONSTANTS.FeatureName,
1217
+ provider: context.tracingContext.provider,
1218
+ network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',
1219
+ },
1220
+ context: {
1221
+ name: context.errorContext.controller,
1222
+ data: {
1223
+ method: context.errorContext.method,
1224
+ operation: 'reportOrderToDataLake',
1225
+ symbol: params.symbol,
1226
+ },
1227
+ },
1228
+ });
1229
+ });
1230
+ }, _TradingService_withFeeDiscount =
1231
+ /**
1232
+ * Execute a trading operation with fee discount context
1233
+ * Ensures fee discount is always cleared after operation (success or failure)
1234
+ *
1235
+ * @param options - The configuration options.
1236
+ * @param options.provider - The perps provider instance.
1237
+ * @param options.feeDiscountBips - The fee discount bips value.
1238
+ * @param options.operation - The operation value.
1239
+ * @returns The result of the operation.
1240
+ */
1241
+ async function _TradingService_withFeeDiscount(options) {
1242
+ const { provider, feeDiscountBips, operation } = options;
1243
+ try {
1244
+ // Set discount context in provider for this operation
1245
+ if (feeDiscountBips !== undefined && provider.setUserFeeDiscount) {
1246
+ provider.setUserFeeDiscount(feeDiscountBips);
1247
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Fee discount set in provider', {
1248
+ feeDiscountBips,
1249
+ });
1250
+ }
1251
+ // Execute the operation
1252
+ return await operation();
1253
+ }
1254
+ finally {
1255
+ // Always clear discount context, even on exception
1256
+ if (provider.setUserFeeDiscount) {
1257
+ provider.setUserFeeDiscount(undefined);
1258
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Fee discount cleared from provider');
1259
+ }
1260
+ }
1261
+ }, _TradingService_loadPositionData =
1262
+ /**
1263
+ * Load position data with performance measurement
1264
+ *
1265
+ * @param options - The configuration options.
1266
+ * @param options.symbol - The trading pair symbol.
1267
+ * @param options.context - The service context for dependencies.
1268
+ * @returns The result of the operation.
1269
+ */
1270
+ async function _TradingService_loadPositionData(options) {
1271
+ const { symbol, context } = options;
1272
+ const positionLoadStart = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
1273
+ try {
1274
+ const positions = context.getPositions
1275
+ ? await context.getPositions()
1276
+ : [];
1277
+ const position = positions.find((pos) => pos.symbol === symbol);
1278
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.setMeasurement(performanceMetrics_1.PerpsMeasurementName.PerpsGetPositionsOperation, __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - positionLoadStart, 'millisecond');
1279
+ return position;
1280
+ }
1281
+ catch (error) {
1282
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Could not get position data for tracking', error instanceof Error ? error.message : String(error));
1283
+ return undefined;
1284
+ }
1285
+ }, _TradingService_calculateCloseMetrics = function _TradingService_calculateCloseMetrics(position, params, result) {
1286
+ const direction = parseFloat(position.size) > 0
1287
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
1288
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT;
1289
+ const filledSize = result.filledSize ? parseFloat(result.filledSize) : 0;
1290
+ const requestedSize = params.size
1291
+ ? parseFloat(params.size)
1292
+ : Math.abs(parseFloat(position.size));
1293
+ const isPartiallyFilled = filledSize > 0 && filledSize < requestedSize;
1294
+ const orderType = params.orderType ?? eventNames_1.PERPS_EVENT_VALUE.ORDER_TYPE.MARKET;
1295
+ const closePercentage = params.size
1296
+ ? (parseFloat(params.size) / Math.abs(parseFloat(position.size))) * 100
1297
+ : 100;
1298
+ const closeType = closePercentage === 100
1299
+ ? eventNames_1.PERPS_EVENT_VALUE.CLOSE_TYPE.FULL
1300
+ : eventNames_1.PERPS_EVENT_VALUE.CLOSE_TYPE.PARTIAL;
1301
+ return {
1302
+ direction,
1303
+ closePercentage,
1304
+ closeType,
1305
+ orderType,
1306
+ filledSize,
1307
+ requestedSize,
1308
+ isPartiallyFilled,
1309
+ };
1310
+ }, _TradingService_buildCloseEventProperties = function _TradingService_buildCloseEventProperties(position, params, metrics, result, status, error) {
1311
+ const baseProperties = {
1312
+ [eventNames_1.PERPS_EVENT_PROPERTY.STATUS]: status,
1313
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET]: position.symbol,
1314
+ [eventNames_1.PERPS_EVENT_PROPERTY.DIRECTION]: metrics.direction,
1315
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_TYPE]: metrics.orderType,
1316
+ [eventNames_1.PERPS_EVENT_PROPERTY.ORDER_SIZE]: metrics.requestedSize,
1317
+ [eventNames_1.PERPS_EVENT_PROPERTY.OPEN_POSITION_SIZE]: Math.abs(parseFloat(position.size)),
1318
+ [eventNames_1.PERPS_EVENT_PROPERTY.PERCENTAGE_CLOSED]: metrics.closePercentage,
1319
+ ...(position.unrealizedPnl && {
1320
+ [eventNames_1.PERPS_EVENT_PROPERTY.PNL_DOLLAR]: parseFloat(position.unrealizedPnl),
1321
+ }),
1322
+ ...(position.returnOnEquity && {
1323
+ [eventNames_1.PERPS_EVENT_PROPERTY.PNL_PERCENT]: parseFloat(position.returnOnEquity) * 100,
1324
+ }),
1325
+ ...(params.trackingData?.totalFee !== undefined && {
1326
+ [eventNames_1.PERPS_EVENT_PROPERTY.FEE]: params.trackingData.totalFee,
1327
+ }),
1328
+ ...(params.trackingData?.metamaskFee !== undefined && {
1329
+ [eventNames_1.PERPS_EVENT_PROPERTY.METAMASK_FEE]: params.trackingData.metamaskFee,
1330
+ }),
1331
+ ...(params.trackingData?.metamaskFeeRate !== undefined && {
1332
+ [eventNames_1.PERPS_EVENT_PROPERTY.METAMASK_FEE_RATE]: params.trackingData.metamaskFeeRate,
1333
+ }),
1334
+ ...(params.trackingData?.feeDiscountPercentage !== undefined && {
1335
+ [eventNames_1.PERPS_EVENT_PROPERTY.DISCOUNT_PERCENTAGE]: params.trackingData.feeDiscountPercentage,
1336
+ }),
1337
+ ...(params.trackingData?.estimatedPoints !== undefined && {
1338
+ [eventNames_1.PERPS_EVENT_PROPERTY.ESTIMATED_REWARDS]: params.trackingData.estimatedPoints,
1339
+ }),
1340
+ ...((params.trackingData?.marketPrice ?? result?.averagePrice) && {
1341
+ [eventNames_1.PERPS_EVENT_PROPERTY.ASSET_PRICE]: result?.averagePrice
1342
+ ? parseFloat(result.averagePrice)
1343
+ : params.trackingData?.marketPrice,
1344
+ }),
1345
+ ...(params.orderType === 'limit' &&
1346
+ params.price && {
1347
+ [eventNames_1.PERPS_EVENT_PROPERTY.LIMIT_PRICE]: parseFloat(params.price),
1348
+ }),
1349
+ ...(params.trackingData?.receivedAmount !== undefined && {
1350
+ [eventNames_1.PERPS_EVENT_PROPERTY.RECEIVED_AMOUNT]: params.trackingData.receivedAmount,
1351
+ }),
1352
+ };
1353
+ // Add success-specific properties
1354
+ if (status === eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED) {
1355
+ return {
1356
+ ...baseProperties,
1357
+ [eventNames_1.PERPS_EVENT_PROPERTY.CLOSE_TYPE]: metrics.closeType,
1358
+ };
1359
+ }
1360
+ // Add error for failures
1361
+ return {
1362
+ ...baseProperties,
1363
+ ...(error && { [eventNames_1.PERPS_EVENT_PROPERTY.ERROR_MESSAGE]: error }),
1364
+ };
1365
+ }, _TradingService_trackPositionCloseResult = function _TradingService_trackPositionCloseResult(options) {
1366
+ const { position, result, error, params, duration } = options;
1367
+ if (!position) {
1368
+ return;
1369
+ }
1370
+ const metrics = result
1371
+ ? __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_calculateCloseMetrics).call(this, position, params, result)
1372
+ : {
1373
+ direction: parseFloat(position.size) > 0
1374
+ ? eventNames_1.PERPS_EVENT_VALUE.DIRECTION.LONG
1375
+ : eventNames_1.PERPS_EVENT_VALUE.DIRECTION.SHORT,
1376
+ closePercentage: params.size
1377
+ ? (parseFloat(params.size) / Math.abs(parseFloat(position.size))) *
1378
+ 100
1379
+ : 100,
1380
+ closeType: eventNames_1.PERPS_EVENT_VALUE.CLOSE_TYPE.FULL,
1381
+ orderType: params.orderType ?? eventNames_1.PERPS_EVENT_VALUE.ORDER_TYPE.MARKET,
1382
+ requestedSize: params.size
1383
+ ? parseFloat(params.size)
1384
+ : Math.abs(parseFloat(position.size)),
1385
+ filledSize: 0,
1386
+ isPartiallyFilled: false,
1387
+ };
1388
+ // Track partially filled event if applicable
1389
+ if (result?.success && metrics.isPartiallyFilled) {
1390
+ const partialProperties = __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_buildCloseEventProperties).call(this, position, params, metrics, result, eventNames_1.PERPS_EVENT_VALUE.STATUS.PARTIALLY_FILLED);
1391
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.PositionCloseTransaction, {
1392
+ ...partialProperties,
1393
+ [eventNames_1.PERPS_EVENT_PROPERTY.AMOUNT_FILLED]: metrics.filledSize,
1394
+ [eventNames_1.PERPS_EVENT_PROPERTY.REMAINING_AMOUNT]: metrics.requestedSize - metrics.filledSize,
1395
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,
1396
+ });
1397
+ }
1398
+ // Determine status
1399
+ const status = result?.success === true
1400
+ ? eventNames_1.PERPS_EVENT_VALUE.STATUS.EXECUTED
1401
+ : eventNames_1.PERPS_EVENT_VALUE.STATUS.FAILED;
1402
+ const errorMessage = error?.message ?? result?.error;
1403
+ // Track main close event
1404
+ const eventProperties = __classPrivateFieldGet(this, _TradingService_instances, "m", _TradingService_buildCloseEventProperties).call(this, position, params, metrics, result, status, errorMessage);
1405
+ __classPrivateFieldGet(this, _TradingService_deps, "f").metrics.trackPerpsEvent(types_1.PerpsAnalyticsEvent.PositionCloseTransaction, {
1406
+ ...eventProperties,
1407
+ [eventNames_1.PERPS_EVENT_PROPERTY.COMPLETION_DURATION]: duration,
1408
+ });
1409
+ }, _TradingService_handleDataLakeReporting = function _TradingService_handleDataLakeReporting(reportOrderToDataLake, symbol, context) {
1410
+ reportOrderToDataLake({
1411
+ action: 'close',
1412
+ symbol,
1413
+ }).catch((error) => {
1414
+ __classPrivateFieldGet(this, _TradingService_deps, "f").logger.error((0, errorUtils_1.ensureError)(error, 'TradingService.handleDataLakeReporting'), {
1415
+ tags: {
1416
+ feature: perpsConfig_1.PERPS_CONSTANTS.FeatureName,
1417
+ provider: context.tracingContext.provider,
1418
+ network: context.tracingContext.isTestnet ? 'testnet' : 'mainnet',
1419
+ },
1420
+ context: {
1421
+ name: context.errorContext.controller,
1422
+ data: {
1423
+ method: context.errorContext.method,
1424
+ operation: 'reportOrderToDataLake',
1425
+ symbol,
1426
+ },
1427
+ },
1428
+ });
1429
+ });
1430
+ }, _TradingService_calculateFeeDiscountWithMeasurement =
1431
+ /**
1432
+ * Calculate fee discount with performance measurement
1433
+ * Uses controller dependencies injected via setControllerDependencies()
1434
+ * Helper method for placeOrder orchestration
1435
+ *
1436
+ * @returns The result of the operation.
1437
+ */
1438
+ async function _TradingService_calculateFeeDiscountWithMeasurement() {
1439
+ // Check if controller dependencies are available
1440
+ if (!__classPrivateFieldGet(this, _TradingService_controllerDeps, "f")) {
1441
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Controller dependencies not set, skipping fee discount');
1442
+ return undefined;
1443
+ }
1444
+ const { rewardsIntegrationService } = __classPrivateFieldGet(this, _TradingService_controllerDeps, "f");
1445
+ const orderExecutionFeeDiscountStartTime = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now();
1446
+ // Calculate fee discount using messenger pattern (service handles controller access internally)
1447
+ const discountBips = await rewardsIntegrationService.calculateUserFeeDiscount();
1448
+ const orderExecutionFeeDiscountDuration = __classPrivateFieldGet(this, _TradingService_deps, "f").performance.now() - orderExecutionFeeDiscountStartTime;
1449
+ // Record measurement
1450
+ __classPrivateFieldGet(this, _TradingService_deps, "f").tracer.setMeasurement(performanceMetrics_1.PerpsMeasurementName.PerpsRewardsOrderExecutionFeeDiscountApiCall, orderExecutionFeeDiscountDuration, 'millisecond');
1451
+ __classPrivateFieldGet(this, _TradingService_deps, "f").debugLogger.log('TradingService: Fee discount API call completed', {
1452
+ discountBips,
1453
+ duration: `${orderExecutionFeeDiscountDuration.toFixed(0)}ms`,
1454
+ });
1455
+ return discountBips;
1456
+ };
1457
+ //# sourceMappingURL=TradingService.cjs.map