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