@metamask-previews/perps-controller 0.0.0-preview-ce3ee897a → 0.0.0-preview-e4aa1532

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 (498) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/PerpsController.cjs +2224 -66
  3. package/dist/PerpsController.cjs.map +1 -1
  4. package/dist/PerpsController.d.cts +933 -79
  5. package/dist/PerpsController.d.cts.map +1 -1
  6. package/dist/PerpsController.d.mts +933 -79
  7. package/dist/PerpsController.d.mts.map +1 -1
  8. package/dist/PerpsController.mjs +2221 -64
  9. package/dist/PerpsController.mjs.map +1 -1
  10. package/dist/__mocks__/hyperliquidMock.cjs +68 -0
  11. package/dist/__mocks__/hyperliquidMock.cjs.map +1 -0
  12. package/dist/__mocks__/hyperliquidMock.d.cts +15 -0
  13. package/dist/__mocks__/hyperliquidMock.d.cts.map +1 -0
  14. package/dist/__mocks__/hyperliquidMock.d.mts +15 -0
  15. package/dist/__mocks__/hyperliquidMock.d.mts.map +1 -0
  16. package/dist/__mocks__/hyperliquidMock.mjs +65 -0
  17. package/dist/__mocks__/hyperliquidMock.mjs.map +1 -0
  18. package/dist/__mocks__/providerMocks.cjs +144 -0
  19. package/dist/__mocks__/providerMocks.cjs.map +1 -0
  20. package/dist/__mocks__/providerMocks.d.cts +44 -0
  21. package/dist/__mocks__/providerMocks.d.cts.map +1 -0
  22. package/dist/__mocks__/providerMocks.d.mts +44 -0
  23. package/dist/__mocks__/providerMocks.d.mts.map +1 -0
  24. package/dist/__mocks__/providerMocks.mjs +136 -0
  25. package/dist/__mocks__/providerMocks.mjs.map +1 -0
  26. package/dist/__mocks__/serviceMocks.cjs +187 -0
  27. package/dist/__mocks__/serviceMocks.cjs.map +1 -0
  28. package/dist/__mocks__/serviceMocks.d.cts +58 -0
  29. package/dist/__mocks__/serviceMocks.d.cts.map +1 -0
  30. package/dist/__mocks__/serviceMocks.d.mts +58 -0
  31. package/dist/__mocks__/serviceMocks.d.mts.map +1 -0
  32. package/dist/__mocks__/serviceMocks.mjs +180 -0
  33. package/dist/__mocks__/serviceMocks.mjs.map +1 -0
  34. package/dist/aggregation/SubscriptionMultiplexer.cjs +459 -0
  35. package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -0
  36. package/dist/aggregation/SubscriptionMultiplexer.d.cts +222 -0
  37. package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +1 -0
  38. package/dist/aggregation/SubscriptionMultiplexer.d.mts +222 -0
  39. package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +1 -0
  40. package/dist/aggregation/SubscriptionMultiplexer.mjs +455 -0
  41. package/dist/aggregation/SubscriptionMultiplexer.mjs.map +1 -0
  42. package/dist/aggregation/index.cjs +9 -0
  43. package/dist/aggregation/index.cjs.map +1 -0
  44. package/dist/aggregation/index.d.cts +6 -0
  45. package/dist/aggregation/index.d.cts.map +1 -0
  46. package/dist/aggregation/index.d.mts +6 -0
  47. package/dist/aggregation/index.d.mts.map +1 -0
  48. package/dist/aggregation/index.mjs +5 -0
  49. package/dist/aggregation/index.mjs.map +1 -0
  50. package/dist/constants/eventNames.cjs +117 -0
  51. package/dist/constants/eventNames.cjs.map +1 -0
  52. package/dist/constants/eventNames.d.cts +106 -0
  53. package/dist/constants/eventNames.d.cts.map +1 -0
  54. package/dist/constants/eventNames.d.mts +106 -0
  55. package/dist/constants/eventNames.d.mts.map +1 -0
  56. package/dist/constants/eventNames.mjs +114 -0
  57. package/dist/constants/eventNames.mjs.map +1 -0
  58. package/dist/constants/hyperLiquidConfig.cjs +366 -0
  59. package/dist/constants/hyperLiquidConfig.cjs.map +1 -0
  60. package/dist/constants/hyperLiquidConfig.d.cts +276 -0
  61. package/dist/constants/hyperLiquidConfig.d.cts.map +1 -0
  62. package/dist/constants/hyperLiquidConfig.d.mts +276 -0
  63. package/dist/constants/hyperLiquidConfig.d.mts.map +1 -0
  64. package/dist/constants/hyperLiquidConfig.mjs +357 -0
  65. package/dist/constants/hyperLiquidConfig.mjs.map +1 -0
  66. package/dist/constants/index.cjs +23 -0
  67. package/dist/constants/index.cjs.map +1 -0
  68. package/dist/constants/index.d.cts +7 -0
  69. package/dist/constants/index.d.cts.map +1 -0
  70. package/dist/constants/index.d.mts +7 -0
  71. package/dist/constants/index.d.mts.map +1 -0
  72. package/dist/constants/index.mjs +7 -0
  73. package/dist/constants/index.mjs.map +1 -0
  74. package/dist/constants/orderTypes.cjs +31 -0
  75. package/dist/constants/orderTypes.cjs.map +1 -0
  76. package/dist/constants/orderTypes.d.cts +19 -0
  77. package/dist/constants/orderTypes.d.cts.map +1 -0
  78. package/dist/constants/orderTypes.d.mts +19 -0
  79. package/dist/constants/orderTypes.d.mts.map +1 -0
  80. package/dist/constants/orderTypes.mjs +27 -0
  81. package/dist/constants/orderTypes.mjs.map +1 -0
  82. package/dist/constants/performanceMetrics.cjs +61 -0
  83. package/dist/constants/performanceMetrics.cjs.map +1 -0
  84. package/dist/constants/performanceMetrics.d.cts +44 -0
  85. package/dist/constants/performanceMetrics.d.cts.map +1 -0
  86. package/dist/constants/performanceMetrics.d.mts +44 -0
  87. package/dist/constants/performanceMetrics.d.mts.map +1 -0
  88. package/dist/constants/performanceMetrics.mjs +58 -0
  89. package/dist/constants/performanceMetrics.mjs.map +1 -0
  90. package/dist/constants/perpsConfig.cjs +461 -0
  91. package/dist/constants/perpsConfig.cjs.map +1 -0
  92. package/dist/constants/perpsConfig.d.cts +343 -0
  93. package/dist/constants/perpsConfig.d.cts.map +1 -0
  94. package/dist/constants/perpsConfig.d.mts +343 -0
  95. package/dist/constants/perpsConfig.d.mts.map +1 -0
  96. package/dist/constants/perpsConfig.mjs +458 -0
  97. package/dist/constants/perpsConfig.mjs.map +1 -0
  98. package/dist/constants/perpsErrorCodes.cjs +79 -0
  99. package/dist/constants/perpsErrorCodes.cjs.map +1 -0
  100. package/dist/constants/perpsErrorCodes.d.cts +64 -0
  101. package/dist/constants/perpsErrorCodes.d.cts.map +1 -0
  102. package/dist/constants/perpsErrorCodes.d.mts +64 -0
  103. package/dist/constants/perpsErrorCodes.d.mts.map +1 -0
  104. package/dist/constants/perpsErrorCodes.mjs +76 -0
  105. package/dist/constants/perpsErrorCodes.mjs.map +1 -0
  106. package/dist/index.cjs +32 -1
  107. package/dist/index.cjs.map +1 -1
  108. package/dist/index.d.cts +6 -2
  109. package/dist/index.d.cts.map +1 -1
  110. package/dist/index.d.mts +6 -2
  111. package/dist/index.d.mts.map +1 -1
  112. package/dist/index.mjs +9 -1
  113. package/dist/index.mjs.map +1 -1
  114. package/dist/platform-services/HyperLiquidClientService.cjs +857 -0
  115. package/dist/platform-services/HyperLiquidClientService.cjs.map +1 -0
  116. package/dist/platform-services/HyperLiquidClientService.d.cts +263 -0
  117. package/dist/platform-services/HyperLiquidClientService.d.cts.map +1 -0
  118. package/dist/platform-services/HyperLiquidClientService.d.mts +263 -0
  119. package/dist/platform-services/HyperLiquidClientService.d.mts.map +1 -0
  120. package/dist/platform-services/HyperLiquidClientService.mjs +853 -0
  121. package/dist/platform-services/HyperLiquidClientService.mjs.map +1 -0
  122. package/dist/platform-services/HyperLiquidSubscriptionService.cjs +2170 -0
  123. package/dist/platform-services/HyperLiquidSubscriptionService.cjs.map +1 -0
  124. package/dist/platform-services/HyperLiquidSubscriptionService.d.cts +424 -0
  125. package/dist/platform-services/HyperLiquidSubscriptionService.d.cts.map +1 -0
  126. package/dist/platform-services/HyperLiquidSubscriptionService.d.mts +424 -0
  127. package/dist/platform-services/HyperLiquidSubscriptionService.d.mts.map +1 -0
  128. package/dist/platform-services/HyperLiquidSubscriptionService.mjs +2166 -0
  129. package/dist/platform-services/HyperLiquidSubscriptionService.mjs.map +1 -0
  130. package/dist/platform-services/HyperLiquidWalletService.cjs +140 -0
  131. package/dist/platform-services/HyperLiquidWalletService.cjs.map +1 -0
  132. package/dist/platform-services/HyperLiquidWalletService.d.cts +78 -0
  133. package/dist/platform-services/HyperLiquidWalletService.d.cts.map +1 -0
  134. package/dist/platform-services/HyperLiquidWalletService.d.mts +78 -0
  135. package/dist/platform-services/HyperLiquidWalletService.d.mts.map +1 -0
  136. package/dist/platform-services/HyperLiquidWalletService.mjs +136 -0
  137. package/dist/platform-services/HyperLiquidWalletService.mjs.map +1 -0
  138. package/dist/providers/AggregatedPerpsProvider.cjs +777 -0
  139. package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -0
  140. package/dist/providers/AggregatedPerpsProvider.d.cts +466 -0
  141. package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -0
  142. package/dist/providers/AggregatedPerpsProvider.d.mts +466 -0
  143. package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -0
  144. package/dist/providers/AggregatedPerpsProvider.mjs +773 -0
  145. package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -0
  146. package/dist/providers/HyperLiquidProvider.cjs +5172 -0
  147. package/dist/providers/HyperLiquidProvider.cjs.map +1 -0
  148. package/dist/providers/HyperLiquidProvider.d.cts +881 -0
  149. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -0
  150. package/dist/providers/HyperLiquidProvider.d.mts +881 -0
  151. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -0
  152. package/dist/providers/HyperLiquidProvider.mjs +5168 -0
  153. package/dist/providers/HyperLiquidProvider.mjs.map +1 -0
  154. package/dist/providers/index.cjs +11 -0
  155. package/dist/providers/index.cjs.map +1 -0
  156. package/dist/providers/index.d.cts +6 -0
  157. package/dist/providers/index.d.cts.map +1 -0
  158. package/dist/providers/index.d.mts +6 -0
  159. package/dist/providers/index.d.mts.map +1 -0
  160. package/dist/providers/index.mjs +6 -0
  161. package/dist/providers/index.mjs.map +1 -0
  162. package/dist/routing/ProviderRouter.cjs +148 -0
  163. package/dist/routing/ProviderRouter.cjs.map +1 -0
  164. package/dist/routing/ProviderRouter.d.cts +124 -0
  165. package/dist/routing/ProviderRouter.d.cts.map +1 -0
  166. package/dist/routing/ProviderRouter.d.mts +124 -0
  167. package/dist/routing/ProviderRouter.d.mts.map +1 -0
  168. package/dist/routing/ProviderRouter.mjs +144 -0
  169. package/dist/routing/ProviderRouter.mjs.map +1 -0
  170. package/dist/routing/index.cjs +9 -0
  171. package/dist/routing/index.cjs.map +1 -0
  172. package/dist/routing/index.d.cts +6 -0
  173. package/dist/routing/index.d.cts.map +1 -0
  174. package/dist/routing/index.d.mts +6 -0
  175. package/dist/routing/index.d.mts.map +1 -0
  176. package/dist/routing/index.mjs +5 -0
  177. package/dist/routing/index.mjs.map +1 -0
  178. package/dist/selectors.cjs +161 -0
  179. package/dist/selectors.cjs.map +1 -0
  180. package/dist/selectors.d.cts +345 -0
  181. package/dist/selectors.d.cts.map +1 -0
  182. package/dist/selectors.d.mts +345 -0
  183. package/dist/selectors.d.mts.map +1 -0
  184. package/dist/selectors.mjs +153 -0
  185. package/dist/selectors.mjs.map +1 -0
  186. package/dist/services/AccountService.cjs +313 -0
  187. package/dist/services/AccountService.cjs.map +1 -0
  188. package/dist/services/AccountService.d.cts +53 -0
  189. package/dist/services/AccountService.d.cts.map +1 -0
  190. package/dist/services/AccountService.d.mts +53 -0
  191. package/dist/services/AccountService.d.mts.map +1 -0
  192. package/dist/services/AccountService.mjs +309 -0
  193. package/dist/services/AccountService.mjs.map +1 -0
  194. package/dist/services/DataLakeService.cjs +219 -0
  195. package/dist/services/DataLakeService.cjs.map +1 -0
  196. package/dist/services/DataLakeService.d.cts +49 -0
  197. package/dist/services/DataLakeService.d.cts.map +1 -0
  198. package/dist/services/DataLakeService.d.mts +49 -0
  199. package/dist/services/DataLakeService.d.mts.map +1 -0
  200. package/dist/services/DataLakeService.mjs +215 -0
  201. package/dist/services/DataLakeService.mjs.map +1 -0
  202. package/dist/services/DepositService.cjs +96 -0
  203. package/dist/services/DepositService.cjs.map +1 -0
  204. package/dist/services/DepositService.d.cts +37 -0
  205. package/dist/services/DepositService.d.cts.map +1 -0
  206. package/dist/services/DepositService.d.mts +37 -0
  207. package/dist/services/DepositService.d.mts.map +1 -0
  208. package/dist/services/DepositService.mjs +92 -0
  209. package/dist/services/DepositService.mjs.map +1 -0
  210. package/dist/services/EligibilityService.cjs +156 -0
  211. package/dist/services/EligibilityService.cjs.map +1 -0
  212. package/dist/services/EligibilityService.d.cts +48 -0
  213. package/dist/services/EligibilityService.d.cts.map +1 -0
  214. package/dist/services/EligibilityService.d.mts +48 -0
  215. package/dist/services/EligibilityService.d.mts.map +1 -0
  216. package/dist/services/EligibilityService.mjs +152 -0
  217. package/dist/services/EligibilityService.mjs.map +1 -0
  218. package/dist/services/FeatureFlagConfigurationService.cjs +258 -0
  219. package/dist/services/FeatureFlagConfigurationService.cjs.map +1 -0
  220. package/dist/services/FeatureFlagConfigurationService.d.cts +100 -0
  221. package/dist/services/FeatureFlagConfigurationService.d.cts.map +1 -0
  222. package/dist/services/FeatureFlagConfigurationService.d.mts +100 -0
  223. package/dist/services/FeatureFlagConfigurationService.d.mts.map +1 -0
  224. package/dist/services/FeatureFlagConfigurationService.mjs +254 -0
  225. package/dist/services/FeatureFlagConfigurationService.mjs.map +1 -0
  226. package/dist/services/MarketDataService.cjs +875 -0
  227. package/dist/services/MarketDataService.cjs.map +1 -0
  228. package/dist/services/MarketDataService.d.cts +289 -0
  229. package/dist/services/MarketDataService.d.cts.map +1 -0
  230. package/dist/services/MarketDataService.d.mts +289 -0
  231. package/dist/services/MarketDataService.d.mts.map +1 -0
  232. package/dist/services/MarketDataService.mjs +871 -0
  233. package/dist/services/MarketDataService.mjs.map +1 -0
  234. package/dist/services/RewardsIntegrationService.cjs +94 -0
  235. package/dist/services/RewardsIntegrationService.cjs.map +1 -0
  236. package/dist/services/RewardsIntegrationService.d.cts +30 -0
  237. package/dist/services/RewardsIntegrationService.d.cts.map +1 -0
  238. package/dist/services/RewardsIntegrationService.d.mts +30 -0
  239. package/dist/services/RewardsIntegrationService.d.mts.map +1 -0
  240. package/dist/services/RewardsIntegrationService.mjs +90 -0
  241. package/dist/services/RewardsIntegrationService.mjs.map +1 -0
  242. package/dist/services/ServiceContext.cjs +3 -0
  243. package/dist/services/ServiceContext.cjs.map +1 -0
  244. package/dist/services/ServiceContext.d.cts +110 -0
  245. package/dist/services/ServiceContext.d.cts.map +1 -0
  246. package/dist/services/ServiceContext.d.mts +110 -0
  247. package/dist/services/ServiceContext.d.mts.map +1 -0
  248. package/dist/services/ServiceContext.mjs +2 -0
  249. package/dist/services/ServiceContext.mjs.map +1 -0
  250. package/dist/services/TradingService.cjs +1481 -0
  251. package/dist/services/TradingService.cjs.map +1 -0
  252. package/dist/services/TradingService.d.cts +308 -0
  253. package/dist/services/TradingService.d.cts.map +1 -0
  254. package/dist/services/TradingService.d.mts +308 -0
  255. package/dist/services/TradingService.d.mts.map +1 -0
  256. package/dist/services/TradingService.mjs +1477 -0
  257. package/dist/services/TradingService.mjs.map +1 -0
  258. package/dist/services/index.cjs +26 -0
  259. package/dist/services/index.cjs.map +1 -0
  260. package/dist/services/index.d.cts +11 -0
  261. package/dist/services/index.d.cts.map +1 -0
  262. package/dist/services/index.d.mts +11 -0
  263. package/dist/services/index.d.mts.map +1 -0
  264. package/dist/services/index.mjs +10 -0
  265. package/dist/services/index.mjs.map +1 -0
  266. package/dist/services/utils.cjs +16 -0
  267. package/dist/services/utils.cjs.map +1 -0
  268. package/dist/services/utils.d.cts +8 -0
  269. package/dist/services/utils.d.cts.map +1 -0
  270. package/dist/services/utils.d.mts +8 -0
  271. package/dist/services/utils.d.mts.map +1 -0
  272. package/dist/services/utils.mjs +12 -0
  273. package/dist/services/utils.mjs.map +1 -0
  274. package/dist/types/chart.cjs +42 -0
  275. package/dist/types/chart.cjs.map +1 -0
  276. package/dist/types/chart.d.cts +62 -0
  277. package/dist/types/chart.d.cts.map +1 -0
  278. package/dist/types/chart.d.mts +62 -0
  279. package/dist/types/chart.d.mts.map +1 -0
  280. package/dist/types/chart.mjs +39 -0
  281. package/dist/types/chart.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 +52 -0
  285. package/dist/types/hyperliquid-types.d.cts.map +1 -0
  286. package/dist/types/hyperliquid-types.d.mts +52 -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 +96 -0
  291. package/dist/types/index.cjs.map +1 -0
  292. package/dist/types/index.d.cts +1153 -0
  293. package/dist/types/index.d.cts.map +1 -0
  294. package/dist/types/index.d.mts +1153 -0
  295. package/dist/types/index.d.mts.map +1 -0
  296. package/dist/types/index.mjs +79 -0
  297. package/dist/types/index.mjs.map +1 -0
  298. package/dist/types/transactionTypes.cjs +28 -0
  299. package/dist/types/transactionTypes.cjs.map +1 -0
  300. package/dist/types/transactionTypes.d.cts +64 -0
  301. package/dist/types/transactionTypes.d.cts.map +1 -0
  302. package/dist/types/transactionTypes.d.mts +64 -0
  303. package/dist/types/transactionTypes.d.mts.map +1 -0
  304. package/dist/types/transactionTypes.mjs +23 -0
  305. package/dist/types/transactionTypes.mjs.map +1 -0
  306. package/dist/utils/accountUtils.cjs +65 -0
  307. package/dist/utils/accountUtils.cjs.map +1 -0
  308. package/dist/utils/accountUtils.d.cts +26 -0
  309. package/dist/utils/accountUtils.d.cts.map +1 -0
  310. package/dist/utils/accountUtils.d.mts +26 -0
  311. package/dist/utils/accountUtils.d.mts.map +1 -0
  312. package/dist/utils/accountUtils.mjs +61 -0
  313. package/dist/utils/accountUtils.mjs.map +1 -0
  314. package/dist/utils/amountConversion.cjs +61 -0
  315. package/dist/utils/amountConversion.cjs.map +1 -0
  316. package/dist/utils/amountConversion.d.cts +16 -0
  317. package/dist/utils/amountConversion.d.cts.map +1 -0
  318. package/dist/utils/amountConversion.d.mts +16 -0
  319. package/dist/utils/amountConversion.d.mts.map +1 -0
  320. package/dist/utils/amountConversion.mjs +54 -0
  321. package/dist/utils/amountConversion.mjs.map +1 -0
  322. package/dist/utils/chartUtils.cjs +98 -0
  323. package/dist/utils/chartUtils.cjs.map +1 -0
  324. package/dist/utils/chartUtils.d.cts +14 -0
  325. package/dist/utils/chartUtils.d.cts.map +1 -0
  326. package/dist/utils/chartUtils.d.mts +14 -0
  327. package/dist/utils/chartUtils.d.mts.map +1 -0
  328. package/dist/utils/chartUtils.mjs +94 -0
  329. package/dist/utils/chartUtils.mjs.map +1 -0
  330. package/dist/utils/errorUtils.cjs +22 -0
  331. package/dist/utils/errorUtils.cjs.map +1 -0
  332. package/dist/utils/errorUtils.d.cts +13 -0
  333. package/dist/utils/errorUtils.d.cts.map +1 -0
  334. package/dist/utils/errorUtils.d.mts +13 -0
  335. package/dist/utils/errorUtils.d.mts.map +1 -0
  336. package/dist/utils/errorUtils.mjs +18 -0
  337. package/dist/utils/errorUtils.mjs.map +1 -0
  338. package/dist/utils/formatUtils.cjs +987 -0
  339. package/dist/utils/formatUtils.cjs.map +1 -0
  340. package/dist/utils/formatUtils.d.cts +387 -0
  341. package/dist/utils/formatUtils.d.cts.map +1 -0
  342. package/dist/utils/formatUtils.d.mts +387 -0
  343. package/dist/utils/formatUtils.d.mts.map +1 -0
  344. package/dist/utils/formatUtils.mjs +966 -0
  345. package/dist/utils/formatUtils.mjs.map +1 -0
  346. package/dist/utils/hyperLiquidAdapter.cjs +454 -0
  347. package/dist/utils/hyperLiquidAdapter.cjs.map +1 -0
  348. package/dist/utils/hyperLiquidAdapter.d.cts +158 -0
  349. package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -0
  350. package/dist/utils/hyperLiquidAdapter.d.mts +158 -0
  351. package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -0
  352. package/dist/utils/hyperLiquidAdapter.mjs +439 -0
  353. package/dist/utils/hyperLiquidAdapter.mjs.map +1 -0
  354. package/dist/utils/hyperLiquidOrderBookProcessor.cjs +89 -0
  355. package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +1 -0
  356. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +58 -0
  357. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +1 -0
  358. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +58 -0
  359. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +1 -0
  360. package/dist/utils/hyperLiquidOrderBookProcessor.mjs +84 -0
  361. package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +1 -0
  362. package/dist/utils/hyperLiquidValidation.cjs +426 -0
  363. package/dist/utils/hyperLiquidValidation.cjs.map +1 -0
  364. package/dist/utils/hyperLiquidValidation.d.cts +143 -0
  365. package/dist/utils/hyperLiquidValidation.d.cts.map +1 -0
  366. package/dist/utils/hyperLiquidValidation.d.mts +143 -0
  367. package/dist/utils/hyperLiquidValidation.d.mts.map +1 -0
  368. package/dist/utils/hyperLiquidValidation.mjs +413 -0
  369. package/dist/utils/hyperLiquidValidation.mjs.map +1 -0
  370. package/dist/utils/idUtils.cjs +50 -0
  371. package/dist/utils/idUtils.cjs.map +1 -0
  372. package/dist/utils/idUtils.d.cts +38 -0
  373. package/dist/utils/idUtils.d.cts.map +1 -0
  374. package/dist/utils/idUtils.d.mts +38 -0
  375. package/dist/utils/idUtils.d.mts.map +1 -0
  376. package/dist/utils/idUtils.mjs +42 -0
  377. package/dist/utils/idUtils.mjs.map +1 -0
  378. package/dist/utils/marginUtils.cjs +137 -0
  379. package/dist/utils/marginUtils.cjs.map +1 -0
  380. package/dist/utils/marginUtils.d.cts +64 -0
  381. package/dist/utils/marginUtils.d.cts.map +1 -0
  382. package/dist/utils/marginUtils.d.mts +64 -0
  383. package/dist/utils/marginUtils.d.mts.map +1 -0
  384. package/dist/utils/marginUtils.mjs +131 -0
  385. package/dist/utils/marginUtils.mjs.map +1 -0
  386. package/dist/utils/marketDataTransform.cjs +227 -0
  387. package/dist/utils/marketDataTransform.cjs.map +1 -0
  388. package/dist/utils/marketDataTransform.d.cts +45 -0
  389. package/dist/utils/marketDataTransform.d.cts.map +1 -0
  390. package/dist/utils/marketDataTransform.d.mts +45 -0
  391. package/dist/utils/marketDataTransform.d.mts.map +1 -0
  392. package/dist/utils/marketDataTransform.mjs +220 -0
  393. package/dist/utils/marketDataTransform.mjs.map +1 -0
  394. package/dist/utils/marketUtils.cjs +420 -0
  395. package/dist/utils/marketUtils.cjs.map +1 -0
  396. package/dist/utils/marketUtils.d.cts +227 -0
  397. package/dist/utils/marketUtils.d.cts.map +1 -0
  398. package/dist/utils/marketUtils.d.mts +227 -0
  399. package/dist/utils/marketUtils.d.mts.map +1 -0
  400. package/dist/utils/marketUtils.mjs +404 -0
  401. package/dist/utils/marketUtils.mjs.map +1 -0
  402. package/dist/utils/orderBookGrouping.cjs +151 -0
  403. package/dist/utils/orderBookGrouping.cjs.map +1 -0
  404. package/dist/utils/orderBookGrouping.d.cts +76 -0
  405. package/dist/utils/orderBookGrouping.d.cts.map +1 -0
  406. package/dist/utils/orderBookGrouping.d.mts +76 -0
  407. package/dist/utils/orderBookGrouping.d.mts.map +1 -0
  408. package/dist/utils/orderBookGrouping.mjs +143 -0
  409. package/dist/utils/orderBookGrouping.mjs.map +1 -0
  410. package/dist/utils/orderCalculations.cjs +283 -0
  411. package/dist/utils/orderCalculations.cjs.map +1 -0
  412. package/dist/utils/orderCalculations.d.cts +107 -0
  413. package/dist/utils/orderCalculations.d.cts.map +1 -0
  414. package/dist/utils/orderCalculations.d.mts +107 -0
  415. package/dist/utils/orderCalculations.d.mts.map +1 -0
  416. package/dist/utils/orderCalculations.mjs +274 -0
  417. package/dist/utils/orderCalculations.mjs.map +1 -0
  418. package/dist/utils/orderUtils.cjs +159 -0
  419. package/dist/utils/orderUtils.cjs.map +1 -0
  420. package/dist/utils/orderUtils.d.cts +66 -0
  421. package/dist/utils/orderUtils.d.cts.map +1 -0
  422. package/dist/utils/orderUtils.d.mts +66 -0
  423. package/dist/utils/orderUtils.d.mts.map +1 -0
  424. package/dist/utils/orderUtils.mjs +151 -0
  425. package/dist/utils/orderUtils.mjs.map +1 -0
  426. package/dist/utils/pnlCalculations.cjs +107 -0
  427. package/dist/utils/pnlCalculations.cjs.map +1 -0
  428. package/dist/utils/pnlCalculations.d.cts +79 -0
  429. package/dist/utils/pnlCalculations.d.cts.map +1 -0
  430. package/dist/utils/pnlCalculations.d.mts +79 -0
  431. package/dist/utils/pnlCalculations.d.mts.map +1 -0
  432. package/dist/utils/pnlCalculations.mjs +97 -0
  433. package/dist/utils/pnlCalculations.mjs.map +1 -0
  434. package/dist/utils/positionCalculations.cjs +176 -0
  435. package/dist/utils/positionCalculations.cjs.map +1 -0
  436. package/dist/utils/positionCalculations.d.cts +85 -0
  437. package/dist/utils/positionCalculations.d.cts.map +1 -0
  438. package/dist/utils/positionCalculations.d.mts +85 -0
  439. package/dist/utils/positionCalculations.d.mts.map +1 -0
  440. package/dist/utils/positionCalculations.mjs +165 -0
  441. package/dist/utils/positionCalculations.mjs.map +1 -0
  442. package/dist/utils/sortMarkets.cjs +88 -0
  443. package/dist/utils/sortMarkets.cjs.map +1 -0
  444. package/dist/utils/sortMarkets.d.cts +21 -0
  445. package/dist/utils/sortMarkets.d.cts.map +1 -0
  446. package/dist/utils/sortMarkets.d.mts +21 -0
  447. package/dist/utils/sortMarkets.d.mts.map +1 -0
  448. package/dist/utils/sortMarkets.mjs +84 -0
  449. package/dist/utils/sortMarkets.mjs.map +1 -0
  450. package/dist/utils/standaloneInfoClient.cjs +34 -0
  451. package/dist/utils/standaloneInfoClient.cjs.map +1 -0
  452. package/dist/utils/standaloneInfoClient.d.cts +31 -0
  453. package/dist/utils/standaloneInfoClient.d.cts.map +1 -0
  454. package/dist/utils/standaloneInfoClient.d.mts +31 -0
  455. package/dist/utils/standaloneInfoClient.d.mts.map +1 -0
  456. package/dist/utils/standaloneInfoClient.mjs +30 -0
  457. package/dist/utils/standaloneInfoClient.mjs.map +1 -0
  458. package/dist/utils/stringParseUtils.cjs +49 -0
  459. package/dist/utils/stringParseUtils.cjs.map +1 -0
  460. package/dist/utils/stringParseUtils.d.cts +35 -0
  461. package/dist/utils/stringParseUtils.d.cts.map +1 -0
  462. package/dist/utils/stringParseUtils.d.mts +35 -0
  463. package/dist/utils/stringParseUtils.d.mts.map +1 -0
  464. package/dist/utils/stringParseUtils.mjs +44 -0
  465. package/dist/utils/stringParseUtils.mjs.map +1 -0
  466. package/dist/utils/time.cjs +37 -0
  467. package/dist/utils/time.cjs.map +1 -0
  468. package/dist/utils/time.d.cts +17 -0
  469. package/dist/utils/time.d.cts.map +1 -0
  470. package/dist/utils/time.d.mts +17 -0
  471. package/dist/utils/time.d.mts.map +1 -0
  472. package/dist/utils/time.mjs +33 -0
  473. package/dist/utils/time.mjs.map +1 -0
  474. package/dist/utils/tpslValidation.cjs +505 -0
  475. package/dist/utils/tpslValidation.cjs.map +1 -0
  476. package/dist/utils/tpslValidation.d.cts +182 -0
  477. package/dist/utils/tpslValidation.d.cts.map +1 -0
  478. package/dist/utils/tpslValidation.d.mts +182 -0
  479. package/dist/utils/tpslValidation.d.mts.map +1 -0
  480. package/dist/utils/tpslValidation.mjs +482 -0
  481. package/dist/utils/tpslValidation.mjs.map +1 -0
  482. package/dist/utils/transactionUtils.cjs +36 -0
  483. package/dist/utils/transactionUtils.cjs.map +1 -0
  484. package/dist/utils/transactionUtils.d.cts +17 -0
  485. package/dist/utils/transactionUtils.d.cts.map +1 -0
  486. package/dist/utils/transactionUtils.d.mts +17 -0
  487. package/dist/utils/transactionUtils.d.mts.map +1 -0
  488. package/dist/utils/transactionUtils.mjs +32 -0
  489. package/dist/utils/transactionUtils.mjs.map +1 -0
  490. package/dist/utils/wait.cjs +12 -0
  491. package/dist/utils/wait.cjs.map +1 -0
  492. package/dist/utils/wait.d.cts +8 -0
  493. package/dist/utils/wait.d.cts.map +1 -0
  494. package/dist/utils/wait.d.mts +8 -0
  495. package/dist/utils/wait.d.mts.map +1 -0
  496. package/dist/utils/wait.mjs +8 -0
  497. package/dist/utils/wait.mjs.map +1 -0
  498. package/package.json +19 -4
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EligibilityService = void 0;
4
+ /* eslint-disable id-denylist, no-restricted-syntax, @typescript-eslint/naming-convention */
5
+ // TODO: Fix ESLint errors in this file - tracked for Phase 5 cleanup
6
+ const controller_utils_1 = require("@metamask/controller-utils");
7
+ const utils_1 = require("./utils.cjs");
8
+ // Geo-blocking API URLs
9
+ const ON_RAMP_GEO_BLOCKING_URLS = {
10
+ DEV: 'https://on-ramp.uat-api.cx.metamask.io/geolocation',
11
+ PROD: 'https://on-ramp.api.cx.metamask.io/geolocation',
12
+ };
13
+ /**
14
+ * EligibilityService
15
+ *
16
+ * Handles geo-location fetching and eligibility checking.
17
+ * Manages caching to minimize API calls.
18
+ *
19
+ * Instance-based service with constructor injection of platform dependencies.
20
+ * Cache is instance-scoped to support multiple service instances (e.g., testing).
21
+ */
22
+ class EligibilityService {
23
+ /**
24
+ * Create a new EligibilityService instance.
25
+ *
26
+ * @param deps - Platform dependencies for logging, metrics, etc.
27
+ */
28
+ constructor(deps) {
29
+ this.GEO_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
30
+ this.geoLocationCache = null;
31
+ this.geoLocationFetchPromise = null;
32
+ this.deps = deps;
33
+ }
34
+ /**
35
+ * Fetch geo location with caching and deduplication.
36
+ *
37
+ * @returns The geo location string (e.g., 'US', 'GB') or 'UNKNOWN' if fetch fails
38
+ */
39
+ async fetchGeoLocation() {
40
+ // Check cache first
41
+ if (this.geoLocationCache) {
42
+ const cacheAge = Date.now() - this.geoLocationCache.timestamp;
43
+ if (cacheAge < this.GEO_CACHE_TTL_MS) {
44
+ this.deps.debugLogger.log('EligibilityService: Using cached geo location', {
45
+ location: this.geoLocationCache.location,
46
+ cacheAge: `${(cacheAge / 1000).toFixed(1)}s`,
47
+ });
48
+ return this.geoLocationCache.location;
49
+ }
50
+ }
51
+ // If already fetching, return the existing promise
52
+ if (this.geoLocationFetchPromise) {
53
+ this.deps.debugLogger.log('EligibilityService: Geo location fetch already in progress, waiting...');
54
+ return this.geoLocationFetchPromise;
55
+ }
56
+ // Start new fetch
57
+ this.geoLocationFetchPromise = this.performGeoLocationFetch();
58
+ try {
59
+ const location = await this.geoLocationFetchPromise;
60
+ return location;
61
+ }
62
+ finally {
63
+ // Clear the promise after completion (success or failure)
64
+ this.geoLocationFetchPromise = null;
65
+ }
66
+ }
67
+ /**
68
+ * Perform the actual geo location fetch.
69
+ * Separated to allow proper promise management.
70
+ *
71
+ * @returns The geo location string or 'UNKNOWN' on failure
72
+ */
73
+ async performGeoLocationFetch() {
74
+ let location = 'UNKNOWN';
75
+ try {
76
+ const environment = (0, utils_1.getEnvironment)();
77
+ this.deps.debugLogger.log('EligibilityService: Fetching geo location from API', {
78
+ environment,
79
+ });
80
+ const response = await (0, controller_utils_1.successfulFetch)(ON_RAMP_GEO_BLOCKING_URLS[environment]);
81
+ const textResult = await response?.text();
82
+ location = textResult || 'UNKNOWN';
83
+ // Cache the successful result
84
+ this.geoLocationCache = {
85
+ location,
86
+ timestamp: Date.now(),
87
+ };
88
+ this.deps.debugLogger.log('EligibilityService: Geo location fetched successfully', {
89
+ location,
90
+ });
91
+ return location;
92
+ }
93
+ catch (err) {
94
+ const error = err instanceof Error ? err : new Error(String(err));
95
+ this.deps.logger.error(error, {
96
+ context: {
97
+ name: 'EligibilityService.performGeoLocationFetch',
98
+ data: {},
99
+ },
100
+ });
101
+ // Don't cache failures
102
+ return location;
103
+ }
104
+ }
105
+ /**
106
+ * Check if user is eligible based on geo-blocked regions.
107
+ *
108
+ * @param blockedRegions - List of blocked region codes (e.g., ['US', 'CN'])
109
+ * @returns true if eligible (not in blocked region), false otherwise
110
+ */
111
+ async checkEligibility(blockedRegions) {
112
+ try {
113
+ this.deps.debugLogger.log('EligibilityService: Checking eligibility', {
114
+ blockedRegionsCount: blockedRegions.length,
115
+ });
116
+ // Returns UNKNOWN if we can't fetch the geo location
117
+ const geoLocation = await this.fetchGeoLocation();
118
+ // Only set to eligible if we have valid geolocation and it's not blocked
119
+ if (geoLocation !== 'UNKNOWN') {
120
+ const isEligible = blockedRegions.every((geoBlockedRegion) => !geoLocation
121
+ .toUpperCase()
122
+ .startsWith(geoBlockedRegion.toUpperCase()));
123
+ this.deps.debugLogger.log('EligibilityService: Eligibility check completed', {
124
+ geoLocation,
125
+ isEligible,
126
+ blockedRegions,
127
+ });
128
+ return isEligible;
129
+ }
130
+ // Default to eligible if location is unknown
131
+ return true;
132
+ }
133
+ catch (err) {
134
+ const error = err instanceof Error ? err : new Error(String(err));
135
+ this.deps.logger.error(error, {
136
+ context: {
137
+ name: 'EligibilityService.checkEligibility',
138
+ data: {},
139
+ },
140
+ });
141
+ // Default to eligible on error
142
+ return true;
143
+ }
144
+ }
145
+ /**
146
+ * Clear the geo-location cache.
147
+ * Useful for testing or forcing a fresh fetch.
148
+ */
149
+ clearCache() {
150
+ this.geoLocationCache = null;
151
+ this.geoLocationFetchPromise = null;
152
+ this.deps.debugLogger.log('EligibilityService: Cache cleared');
153
+ }
154
+ }
155
+ exports.EligibilityService = EligibilityService;
156
+ //# sourceMappingURL=EligibilityService.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EligibilityService.cjs","sourceRoot":"","sources":["../../src/services/EligibilityService.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable id-denylist, no-restricted-syntax, @typescript-eslint/naming-convention */\n// TODO: Fix ESLint errors in this file - tracked for Phase 5 cleanup\nimport { successfulFetch } from '@metamask/controller-utils';\n\nimport { getEnvironment } from './utils';\nimport type { PerpsPlatformDependencies } from '../types';\n\n// Geo-blocking API URLs\nconst ON_RAMP_GEO_BLOCKING_URLS = {\n DEV: 'https://on-ramp.uat-api.cx.metamask.io/geolocation',\n PROD: 'https://on-ramp.api.cx.metamask.io/geolocation',\n} as const;\n\n/**\n * Geo-location cache entry\n */\ntype GeoLocationCache = {\n location: string;\n timestamp: number;\n};\n\n/**\n * EligibilityService\n *\n * Handles geo-location fetching and eligibility checking.\n * Manages caching to minimize API calls.\n *\n * Instance-based service with constructor injection of platform dependencies.\n * Cache is instance-scoped to support multiple service instances (e.g., testing).\n */\nexport class EligibilityService {\n private readonly GEO_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n private readonly deps: PerpsPlatformDependencies;\n\n private geoLocationCache: GeoLocationCache | null = null;\n\n private geoLocationFetchPromise: Promise<string> | null = null;\n\n /**\n * Create a new EligibilityService instance.\n *\n * @param deps - Platform dependencies for logging, metrics, etc.\n */\n constructor(deps: PerpsPlatformDependencies) {\n this.deps = deps;\n }\n\n /**\n * Fetch geo location with caching and deduplication.\n *\n * @returns The geo location string (e.g., 'US', 'GB') or 'UNKNOWN' if fetch fails\n */\n async fetchGeoLocation(): Promise<string> {\n // Check cache first\n if (this.geoLocationCache) {\n const cacheAge = Date.now() - this.geoLocationCache.timestamp;\n if (cacheAge < this.GEO_CACHE_TTL_MS) {\n this.deps.debugLogger.log(\n 'EligibilityService: Using cached geo location',\n {\n location: this.geoLocationCache.location,\n cacheAge: `${(cacheAge / 1000).toFixed(1)}s`,\n },\n );\n return this.geoLocationCache.location;\n }\n }\n\n // If already fetching, return the existing promise\n if (this.geoLocationFetchPromise) {\n this.deps.debugLogger.log(\n 'EligibilityService: Geo location fetch already in progress, waiting...',\n );\n return this.geoLocationFetchPromise;\n }\n\n // Start new fetch\n this.geoLocationFetchPromise = this.performGeoLocationFetch();\n\n try {\n const location = await this.geoLocationFetchPromise;\n return location;\n } finally {\n // Clear the promise after completion (success or failure)\n this.geoLocationFetchPromise = null;\n }\n }\n\n /**\n * Perform the actual geo location fetch.\n * Separated to allow proper promise management.\n *\n * @returns The geo location string or 'UNKNOWN' on failure\n */\n private async performGeoLocationFetch(): Promise<string> {\n let location = 'UNKNOWN';\n\n try {\n const environment = getEnvironment();\n\n this.deps.debugLogger.log(\n 'EligibilityService: Fetching geo location from API',\n {\n environment,\n },\n );\n\n const response = await successfulFetch(\n ON_RAMP_GEO_BLOCKING_URLS[environment],\n );\n\n const textResult = await response?.text();\n location = textResult || 'UNKNOWN';\n\n // Cache the successful result\n this.geoLocationCache = {\n location,\n timestamp: Date.now(),\n };\n\n this.deps.debugLogger.log(\n 'EligibilityService: Geo location fetched successfully',\n {\n location,\n },\n );\n\n return location;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.deps.logger.error(error, {\n context: {\n name: 'EligibilityService.performGeoLocationFetch',\n data: {},\n },\n });\n // Don't cache failures\n return location;\n }\n }\n\n /**\n * Check if user is eligible based on geo-blocked regions.\n *\n * @param blockedRegions - List of blocked region codes (e.g., ['US', 'CN'])\n * @returns true if eligible (not in blocked region), false otherwise\n */\n async checkEligibility(blockedRegions: string[]): Promise<boolean> {\n try {\n this.deps.debugLogger.log('EligibilityService: Checking eligibility', {\n blockedRegionsCount: blockedRegions.length,\n });\n\n // Returns UNKNOWN if we can't fetch the geo location\n const geoLocation = await this.fetchGeoLocation();\n\n // Only set to eligible if we have valid geolocation and it's not blocked\n if (geoLocation !== 'UNKNOWN') {\n const isEligible = blockedRegions.every(\n (geoBlockedRegion) =>\n !geoLocation\n .toUpperCase()\n .startsWith(geoBlockedRegion.toUpperCase()),\n );\n\n this.deps.debugLogger.log(\n 'EligibilityService: Eligibility check completed',\n {\n geoLocation,\n isEligible,\n blockedRegions,\n },\n );\n\n return isEligible;\n }\n\n // Default to eligible if location is unknown\n return true;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.deps.logger.error(error, {\n context: {\n name: 'EligibilityService.checkEligibility',\n data: {},\n },\n });\n // Default to eligible on error\n return true;\n }\n }\n\n /**\n * Clear the geo-location cache.\n * Useful for testing or forcing a fresh fetch.\n */\n clearCache(): void {\n this.geoLocationCache = null;\n this.geoLocationFetchPromise = null;\n this.deps.debugLogger.log('EligibilityService: Cache cleared');\n }\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import type { PerpsPlatformDependencies } from "../types/index.cjs";
2
+ /**
3
+ * EligibilityService
4
+ *
5
+ * Handles geo-location fetching and eligibility checking.
6
+ * Manages caching to minimize API calls.
7
+ *
8
+ * Instance-based service with constructor injection of platform dependencies.
9
+ * Cache is instance-scoped to support multiple service instances (e.g., testing).
10
+ */
11
+ export declare class EligibilityService {
12
+ private readonly GEO_CACHE_TTL_MS;
13
+ private readonly deps;
14
+ private geoLocationCache;
15
+ private geoLocationFetchPromise;
16
+ /**
17
+ * Create a new EligibilityService instance.
18
+ *
19
+ * @param deps - Platform dependencies for logging, metrics, etc.
20
+ */
21
+ constructor(deps: PerpsPlatformDependencies);
22
+ /**
23
+ * Fetch geo location with caching and deduplication.
24
+ *
25
+ * @returns The geo location string (e.g., 'US', 'GB') or 'UNKNOWN' if fetch fails
26
+ */
27
+ fetchGeoLocation(): Promise<string>;
28
+ /**
29
+ * Perform the actual geo location fetch.
30
+ * Separated to allow proper promise management.
31
+ *
32
+ * @returns The geo location string or 'UNKNOWN' on failure
33
+ */
34
+ private performGeoLocationFetch;
35
+ /**
36
+ * Check if user is eligible based on geo-blocked regions.
37
+ *
38
+ * @param blockedRegions - List of blocked region codes (e.g., ['US', 'CN'])
39
+ * @returns true if eligible (not in blocked region), false otherwise
40
+ */
41
+ checkEligibility(blockedRegions: string[]): Promise<boolean>;
42
+ /**
43
+ * Clear the geo-location cache.
44
+ * Useful for testing or forcing a fresh fetch.
45
+ */
46
+ clearCache(): void;
47
+ }
48
+ //# sourceMappingURL=EligibilityService.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EligibilityService.d.cts","sourceRoot":"","sources":["../../src/services/EligibilityService.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,yBAAyB,EAAE,2BAAiB;AAgB1D;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IAEjD,OAAO,CAAC,gBAAgB,CAAiC;IAEzD,OAAO,CAAC,uBAAuB,CAAgC;IAE/D;;;;OAIG;gBACS,IAAI,EAAE,yBAAyB;IAI3C;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAoCzC;;;;;OAKG;YACW,uBAAuB;IA+CrC;;;;;OAKG;IACG,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA6ClE;;;OAGG;IACH,UAAU,IAAI,IAAI;CAKnB"}
@@ -0,0 +1,48 @@
1
+ import type { PerpsPlatformDependencies } from "../types/index.mjs";
2
+ /**
3
+ * EligibilityService
4
+ *
5
+ * Handles geo-location fetching and eligibility checking.
6
+ * Manages caching to minimize API calls.
7
+ *
8
+ * Instance-based service with constructor injection of platform dependencies.
9
+ * Cache is instance-scoped to support multiple service instances (e.g., testing).
10
+ */
11
+ export declare class EligibilityService {
12
+ private readonly GEO_CACHE_TTL_MS;
13
+ private readonly deps;
14
+ private geoLocationCache;
15
+ private geoLocationFetchPromise;
16
+ /**
17
+ * Create a new EligibilityService instance.
18
+ *
19
+ * @param deps - Platform dependencies for logging, metrics, etc.
20
+ */
21
+ constructor(deps: PerpsPlatformDependencies);
22
+ /**
23
+ * Fetch geo location with caching and deduplication.
24
+ *
25
+ * @returns The geo location string (e.g., 'US', 'GB') or 'UNKNOWN' if fetch fails
26
+ */
27
+ fetchGeoLocation(): Promise<string>;
28
+ /**
29
+ * Perform the actual geo location fetch.
30
+ * Separated to allow proper promise management.
31
+ *
32
+ * @returns The geo location string or 'UNKNOWN' on failure
33
+ */
34
+ private performGeoLocationFetch;
35
+ /**
36
+ * Check if user is eligible based on geo-blocked regions.
37
+ *
38
+ * @param blockedRegions - List of blocked region codes (e.g., ['US', 'CN'])
39
+ * @returns true if eligible (not in blocked region), false otherwise
40
+ */
41
+ checkEligibility(blockedRegions: string[]): Promise<boolean>;
42
+ /**
43
+ * Clear the geo-location cache.
44
+ * Useful for testing or forcing a fresh fetch.
45
+ */
46
+ clearCache(): void;
47
+ }
48
+ //# sourceMappingURL=EligibilityService.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EligibilityService.d.mts","sourceRoot":"","sources":["../../src/services/EligibilityService.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,yBAAyB,EAAE,2BAAiB;AAgB1D;;;;;;;;GAQG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAiB;IAElD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IAEjD,OAAO,CAAC,gBAAgB,CAAiC;IAEzD,OAAO,CAAC,uBAAuB,CAAgC;IAE/D;;;;OAIG;gBACS,IAAI,EAAE,yBAAyB;IAI3C;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAoCzC;;;;;OAKG;YACW,uBAAuB;IA+CrC;;;;;OAKG;IACG,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA6ClE;;;OAGG;IACH,UAAU,IAAI,IAAI;CAKnB"}
@@ -0,0 +1,152 @@
1
+ /* eslint-disable id-denylist, no-restricted-syntax, @typescript-eslint/naming-convention */
2
+ // TODO: Fix ESLint errors in this file - tracked for Phase 5 cleanup
3
+ import { successfulFetch } from "@metamask/controller-utils";
4
+ import { getEnvironment } from "./utils.mjs";
5
+ // Geo-blocking API URLs
6
+ const ON_RAMP_GEO_BLOCKING_URLS = {
7
+ DEV: 'https://on-ramp.uat-api.cx.metamask.io/geolocation',
8
+ PROD: 'https://on-ramp.api.cx.metamask.io/geolocation',
9
+ };
10
+ /**
11
+ * EligibilityService
12
+ *
13
+ * Handles geo-location fetching and eligibility checking.
14
+ * Manages caching to minimize API calls.
15
+ *
16
+ * Instance-based service with constructor injection of platform dependencies.
17
+ * Cache is instance-scoped to support multiple service instances (e.g., testing).
18
+ */
19
+ export class EligibilityService {
20
+ /**
21
+ * Create a new EligibilityService instance.
22
+ *
23
+ * @param deps - Platform dependencies for logging, metrics, etc.
24
+ */
25
+ constructor(deps) {
26
+ this.GEO_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
27
+ this.geoLocationCache = null;
28
+ this.geoLocationFetchPromise = null;
29
+ this.deps = deps;
30
+ }
31
+ /**
32
+ * Fetch geo location with caching and deduplication.
33
+ *
34
+ * @returns The geo location string (e.g., 'US', 'GB') or 'UNKNOWN' if fetch fails
35
+ */
36
+ async fetchGeoLocation() {
37
+ // Check cache first
38
+ if (this.geoLocationCache) {
39
+ const cacheAge = Date.now() - this.geoLocationCache.timestamp;
40
+ if (cacheAge < this.GEO_CACHE_TTL_MS) {
41
+ this.deps.debugLogger.log('EligibilityService: Using cached geo location', {
42
+ location: this.geoLocationCache.location,
43
+ cacheAge: `${(cacheAge / 1000).toFixed(1)}s`,
44
+ });
45
+ return this.geoLocationCache.location;
46
+ }
47
+ }
48
+ // If already fetching, return the existing promise
49
+ if (this.geoLocationFetchPromise) {
50
+ this.deps.debugLogger.log('EligibilityService: Geo location fetch already in progress, waiting...');
51
+ return this.geoLocationFetchPromise;
52
+ }
53
+ // Start new fetch
54
+ this.geoLocationFetchPromise = this.performGeoLocationFetch();
55
+ try {
56
+ const location = await this.geoLocationFetchPromise;
57
+ return location;
58
+ }
59
+ finally {
60
+ // Clear the promise after completion (success or failure)
61
+ this.geoLocationFetchPromise = null;
62
+ }
63
+ }
64
+ /**
65
+ * Perform the actual geo location fetch.
66
+ * Separated to allow proper promise management.
67
+ *
68
+ * @returns The geo location string or 'UNKNOWN' on failure
69
+ */
70
+ async performGeoLocationFetch() {
71
+ let location = 'UNKNOWN';
72
+ try {
73
+ const environment = getEnvironment();
74
+ this.deps.debugLogger.log('EligibilityService: Fetching geo location from API', {
75
+ environment,
76
+ });
77
+ const response = await successfulFetch(ON_RAMP_GEO_BLOCKING_URLS[environment]);
78
+ const textResult = await response?.text();
79
+ location = textResult || 'UNKNOWN';
80
+ // Cache the successful result
81
+ this.geoLocationCache = {
82
+ location,
83
+ timestamp: Date.now(),
84
+ };
85
+ this.deps.debugLogger.log('EligibilityService: Geo location fetched successfully', {
86
+ location,
87
+ });
88
+ return location;
89
+ }
90
+ catch (err) {
91
+ const error = err instanceof Error ? err : new Error(String(err));
92
+ this.deps.logger.error(error, {
93
+ context: {
94
+ name: 'EligibilityService.performGeoLocationFetch',
95
+ data: {},
96
+ },
97
+ });
98
+ // Don't cache failures
99
+ return location;
100
+ }
101
+ }
102
+ /**
103
+ * Check if user is eligible based on geo-blocked regions.
104
+ *
105
+ * @param blockedRegions - List of blocked region codes (e.g., ['US', 'CN'])
106
+ * @returns true if eligible (not in blocked region), false otherwise
107
+ */
108
+ async checkEligibility(blockedRegions) {
109
+ try {
110
+ this.deps.debugLogger.log('EligibilityService: Checking eligibility', {
111
+ blockedRegionsCount: blockedRegions.length,
112
+ });
113
+ // Returns UNKNOWN if we can't fetch the geo location
114
+ const geoLocation = await this.fetchGeoLocation();
115
+ // Only set to eligible if we have valid geolocation and it's not blocked
116
+ if (geoLocation !== 'UNKNOWN') {
117
+ const isEligible = blockedRegions.every((geoBlockedRegion) => !geoLocation
118
+ .toUpperCase()
119
+ .startsWith(geoBlockedRegion.toUpperCase()));
120
+ this.deps.debugLogger.log('EligibilityService: Eligibility check completed', {
121
+ geoLocation,
122
+ isEligible,
123
+ blockedRegions,
124
+ });
125
+ return isEligible;
126
+ }
127
+ // Default to eligible if location is unknown
128
+ return true;
129
+ }
130
+ catch (err) {
131
+ const error = err instanceof Error ? err : new Error(String(err));
132
+ this.deps.logger.error(error, {
133
+ context: {
134
+ name: 'EligibilityService.checkEligibility',
135
+ data: {},
136
+ },
137
+ });
138
+ // Default to eligible on error
139
+ return true;
140
+ }
141
+ }
142
+ /**
143
+ * Clear the geo-location cache.
144
+ * Useful for testing or forcing a fresh fetch.
145
+ */
146
+ clearCache() {
147
+ this.geoLocationCache = null;
148
+ this.geoLocationFetchPromise = null;
149
+ this.deps.debugLogger.log('EligibilityService: Cache cleared');
150
+ }
151
+ }
152
+ //# sourceMappingURL=EligibilityService.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EligibilityService.mjs","sourceRoot":"","sources":["../../src/services/EligibilityService.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable id-denylist, no-restricted-syntax, @typescript-eslint/naming-convention */\n// TODO: Fix ESLint errors in this file - tracked for Phase 5 cleanup\nimport { successfulFetch } from '@metamask/controller-utils';\n\nimport { getEnvironment } from './utils';\nimport type { PerpsPlatformDependencies } from '../types';\n\n// Geo-blocking API URLs\nconst ON_RAMP_GEO_BLOCKING_URLS = {\n DEV: 'https://on-ramp.uat-api.cx.metamask.io/geolocation',\n PROD: 'https://on-ramp.api.cx.metamask.io/geolocation',\n} as const;\n\n/**\n * Geo-location cache entry\n */\ntype GeoLocationCache = {\n location: string;\n timestamp: number;\n};\n\n/**\n * EligibilityService\n *\n * Handles geo-location fetching and eligibility checking.\n * Manages caching to minimize API calls.\n *\n * Instance-based service with constructor injection of platform dependencies.\n * Cache is instance-scoped to support multiple service instances (e.g., testing).\n */\nexport class EligibilityService {\n private readonly GEO_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n private readonly deps: PerpsPlatformDependencies;\n\n private geoLocationCache: GeoLocationCache | null = null;\n\n private geoLocationFetchPromise: Promise<string> | null = null;\n\n /**\n * Create a new EligibilityService instance.\n *\n * @param deps - Platform dependencies for logging, metrics, etc.\n */\n constructor(deps: PerpsPlatformDependencies) {\n this.deps = deps;\n }\n\n /**\n * Fetch geo location with caching and deduplication.\n *\n * @returns The geo location string (e.g., 'US', 'GB') or 'UNKNOWN' if fetch fails\n */\n async fetchGeoLocation(): Promise<string> {\n // Check cache first\n if (this.geoLocationCache) {\n const cacheAge = Date.now() - this.geoLocationCache.timestamp;\n if (cacheAge < this.GEO_CACHE_TTL_MS) {\n this.deps.debugLogger.log(\n 'EligibilityService: Using cached geo location',\n {\n location: this.geoLocationCache.location,\n cacheAge: `${(cacheAge / 1000).toFixed(1)}s`,\n },\n );\n return this.geoLocationCache.location;\n }\n }\n\n // If already fetching, return the existing promise\n if (this.geoLocationFetchPromise) {\n this.deps.debugLogger.log(\n 'EligibilityService: Geo location fetch already in progress, waiting...',\n );\n return this.geoLocationFetchPromise;\n }\n\n // Start new fetch\n this.geoLocationFetchPromise = this.performGeoLocationFetch();\n\n try {\n const location = await this.geoLocationFetchPromise;\n return location;\n } finally {\n // Clear the promise after completion (success or failure)\n this.geoLocationFetchPromise = null;\n }\n }\n\n /**\n * Perform the actual geo location fetch.\n * Separated to allow proper promise management.\n *\n * @returns The geo location string or 'UNKNOWN' on failure\n */\n private async performGeoLocationFetch(): Promise<string> {\n let location = 'UNKNOWN';\n\n try {\n const environment = getEnvironment();\n\n this.deps.debugLogger.log(\n 'EligibilityService: Fetching geo location from API',\n {\n environment,\n },\n );\n\n const response = await successfulFetch(\n ON_RAMP_GEO_BLOCKING_URLS[environment],\n );\n\n const textResult = await response?.text();\n location = textResult || 'UNKNOWN';\n\n // Cache the successful result\n this.geoLocationCache = {\n location,\n timestamp: Date.now(),\n };\n\n this.deps.debugLogger.log(\n 'EligibilityService: Geo location fetched successfully',\n {\n location,\n },\n );\n\n return location;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.deps.logger.error(error, {\n context: {\n name: 'EligibilityService.performGeoLocationFetch',\n data: {},\n },\n });\n // Don't cache failures\n return location;\n }\n }\n\n /**\n * Check if user is eligible based on geo-blocked regions.\n *\n * @param blockedRegions - List of blocked region codes (e.g., ['US', 'CN'])\n * @returns true if eligible (not in blocked region), false otherwise\n */\n async checkEligibility(blockedRegions: string[]): Promise<boolean> {\n try {\n this.deps.debugLogger.log('EligibilityService: Checking eligibility', {\n blockedRegionsCount: blockedRegions.length,\n });\n\n // Returns UNKNOWN if we can't fetch the geo location\n const geoLocation = await this.fetchGeoLocation();\n\n // Only set to eligible if we have valid geolocation and it's not blocked\n if (geoLocation !== 'UNKNOWN') {\n const isEligible = blockedRegions.every(\n (geoBlockedRegion) =>\n !geoLocation\n .toUpperCase()\n .startsWith(geoBlockedRegion.toUpperCase()),\n );\n\n this.deps.debugLogger.log(\n 'EligibilityService: Eligibility check completed',\n {\n geoLocation,\n isEligible,\n blockedRegions,\n },\n );\n\n return isEligible;\n }\n\n // Default to eligible if location is unknown\n return true;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.deps.logger.error(error, {\n context: {\n name: 'EligibilityService.checkEligibility',\n data: {},\n },\n });\n // Default to eligible on error\n return true;\n }\n }\n\n /**\n * Clear the geo-location cache.\n * Useful for testing or forcing a fresh fetch.\n */\n clearCache(): void {\n this.geoLocationCache = null;\n this.geoLocationFetchPromise = null;\n this.deps.debugLogger.log('EligibilityService: Cache cleared');\n }\n}\n"]}