@levrbet/shared 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +92 -0
  3. package/bin/setup-prisma.js +44 -0
  4. package/dist/core/config/dotenv.d.ts +16 -0
  5. package/dist/core/config/dotenv.js +77 -0
  6. package/dist/core/config/dotenv.js.map +1 -0
  7. package/dist/core/config/index.d.ts +2 -0
  8. package/dist/core/config/index.js +19 -0
  9. package/dist/core/config/index.js.map +1 -0
  10. package/dist/core/config/urls.d.ts +55 -0
  11. package/dist/core/config/urls.js +61 -0
  12. package/dist/core/config/urls.js.map +1 -0
  13. package/dist/core/contracts/abis/LevrBaseMarket.d.ts +1009 -0
  14. package/dist/core/contracts/abis/LevrBaseMarket.js +976 -0
  15. package/dist/core/contracts/abis/LevrBaseMarket.js.map +1 -0
  16. package/dist/core/contracts/abis/LevrConfigProvider.d.ts +2671 -0
  17. package/dist/core/contracts/abis/LevrConfigProvider.js +2551 -0
  18. package/dist/core/contracts/abis/LevrConfigProvider.js.map +1 -0
  19. package/dist/core/contracts/abis/LevrFeeCollector.d.ts +259 -0
  20. package/dist/core/contracts/abis/LevrFeeCollector.js +143 -0
  21. package/dist/core/contracts/abis/LevrFeeCollector.js.map +1 -0
  22. package/dist/core/contracts/abis/LevrFulltimeMarket.d.ts +1050 -0
  23. package/dist/core/contracts/abis/LevrFulltimeMarket.js +462 -0
  24. package/dist/core/contracts/abis/LevrFulltimeMarket.js.map +1 -0
  25. package/dist/core/contracts/abis/LevrFundManager.d.ts +51 -0
  26. package/dist/core/contracts/abis/LevrFundManager.js +4 -0
  27. package/dist/core/contracts/abis/LevrFundManager.js.map +1 -0
  28. package/dist/core/contracts/abis/LevrLiquidationEngine.d.ts +244 -0
  29. package/dist/core/contracts/abis/LevrLiquidationEngine.js +231 -0
  30. package/dist/core/contracts/abis/LevrLiquidationEngine.js.map +1 -0
  31. package/dist/core/contracts/abis/LevrManager.d.ts +1281 -0
  32. package/dist/core/contracts/abis/LevrManager.js +1090 -0
  33. package/dist/core/contracts/abis/LevrManager.js.map +1 -0
  34. package/dist/core/contracts/abis/LevrMarketFeed.d.ts +902 -0
  35. package/dist/core/contracts/abis/LevrMarketFeed.js +775 -0
  36. package/dist/core/contracts/abis/LevrMarketFeed.js.map +1 -0
  37. package/dist/core/contracts/abis/LevrMarketMaker.d.ts +175 -0
  38. package/dist/core/contracts/abis/LevrMarketMaker.js +108 -0
  39. package/dist/core/contracts/abis/LevrMarketMaker.js.map +1 -0
  40. package/dist/core/contracts/abis/LevrMarketRiskSentinel.d.ts +682 -0
  41. package/dist/core/contracts/abis/LevrMarketRiskSentinel.js +323 -0
  42. package/dist/core/contracts/abis/LevrMarketRiskSentinel.js.map +1 -0
  43. package/dist/core/contracts/abis/LevrMarketRouter.d.ts +281 -0
  44. package/dist/core/contracts/abis/LevrMarketRouter.js +262 -0
  45. package/dist/core/contracts/abis/LevrMarketRouter.js.map +1 -0
  46. package/dist/core/contracts/abis/LevrMvpDepository.d.ts +766 -0
  47. package/dist/core/contracts/abis/LevrMvpDepository.js +396 -0
  48. package/dist/core/contracts/abis/LevrMvpDepository.js.map +1 -0
  49. package/dist/core/contracts/abis/LevrMvpRouter.d.ts +305 -0
  50. package/dist/core/contracts/abis/LevrMvpRouter.js +291 -0
  51. package/dist/core/contracts/abis/LevrMvpRouter.js.map +1 -0
  52. package/dist/core/contracts/abis/LevrMvpStaker.d.ts +746 -0
  53. package/dist/core/contracts/abis/LevrMvpStaker.js +386 -0
  54. package/dist/core/contracts/abis/LevrMvpStaker.js.map +1 -0
  55. package/dist/core/contracts/abis/LevrMvpToken.d.ts +341 -0
  56. package/dist/core/contracts/abis/LevrMvpToken.js +183 -0
  57. package/dist/core/contracts/abis/LevrMvpToken.js.map +1 -0
  58. package/dist/core/contracts/abis/LevrOrderbook.d.ts +471 -0
  59. package/dist/core/contracts/abis/LevrOrderbook.js +486 -0
  60. package/dist/core/contracts/abis/LevrOrderbook.js.map +1 -0
  61. package/dist/core/contracts/abis/LevrOrderbookLens.d.ts +167 -0
  62. package/dist/core/contracts/abis/LevrOrderbookLens.js +103 -0
  63. package/dist/core/contracts/abis/LevrOrderbookLens.js.map +1 -0
  64. package/dist/core/contracts/abis/LevrOverUnderMarket.d.ts +1054 -0
  65. package/dist/core/contracts/abis/LevrOverUnderMarket.js +463 -0
  66. package/dist/core/contracts/abis/LevrOverUnderMarket.js.map +1 -0
  67. package/dist/core/contracts/abis/LevrPythFeed.d.ts +225 -0
  68. package/dist/core/contracts/abis/LevrPythFeed.js +131 -0
  69. package/dist/core/contracts/abis/LevrPythFeed.js.map +1 -0
  70. package/dist/core/contracts/abis/LevrUtil.d.ts +485 -0
  71. package/dist/core/contracts/abis/LevrUtil.js +226 -0
  72. package/dist/core/contracts/abis/LevrUtil.js.map +1 -0
  73. package/dist/core/contracts/abis/Storage.d.ts +34 -0
  74. package/dist/core/contracts/abis/Storage.js +47 -0
  75. package/dist/core/contracts/abis/Storage.js.map +1 -0
  76. package/dist/core/contracts/abis/index.d.ts +12174 -0
  77. package/dist/core/contracts/abis/index.js +51 -0
  78. package/dist/core/contracts/abis/index.js.map +1 -0
  79. package/dist/core/contracts/addresses.d.ts +154 -0
  80. package/dist/core/contracts/addresses.js +160 -0
  81. package/dist/core/contracts/addresses.js.map +1 -0
  82. package/dist/core/contracts/chains.d.ts +4 -0
  83. package/dist/core/contracts/chains.js +14 -0
  84. package/dist/core/contracts/chains.js.map +1 -0
  85. package/dist/core/contracts/clients/index.d.ts +1 -0
  86. package/dist/core/contracts/clients/index.js +18 -0
  87. package/dist/core/contracts/clients/index.js.map +1 -0
  88. package/dist/core/contracts/clients/publicClients.d.ts +24 -0
  89. package/dist/core/contracts/clients/publicClients.js +123 -0
  90. package/dist/core/contracts/clients/publicClients.js.map +1 -0
  91. package/dist/core/contracts/constants.d.ts +15 -0
  92. package/dist/core/contracts/constants.js +30 -0
  93. package/dist/core/contracts/constants.js.map +1 -0
  94. package/dist/core/contracts/index.d.ts +6 -0
  95. package/dist/core/contracts/index.js +23 -0
  96. package/dist/core/contracts/index.js.map +1 -0
  97. package/dist/core/contracts/instances.d.ts +48 -0
  98. package/dist/core/contracts/instances.js +101 -0
  99. package/dist/core/contracts/instances.js.map +1 -0
  100. package/dist/core/index.d.ts +9 -0
  101. package/dist/core/index.js +26 -0
  102. package/dist/core/index.js.map +1 -0
  103. package/dist/core/indexers/envio.test.query.d.ts +5 -0
  104. package/dist/core/indexers/envio.test.query.js +32 -0
  105. package/dist/core/indexers/envio.test.query.js.map +1 -0
  106. package/dist/core/indexers/index.d.ts +1 -0
  107. package/dist/core/indexers/index.js +18 -0
  108. package/dist/core/indexers/index.js.map +1 -0
  109. package/dist/core/indexers/indexers.service.d.ts +19 -0
  110. package/dist/core/indexers/indexers.service.js +104 -0
  111. package/dist/core/indexers/indexers.service.js.map +1 -0
  112. package/dist/core/indexers/subsquid.test.query.d.ts +4 -0
  113. package/dist/core/indexers/subsquid.test.query.js +42 -0
  114. package/dist/core/indexers/subsquid.test.query.js.map +1 -0
  115. package/dist/core/prisma/index.d.ts +1 -0
  116. package/dist/core/prisma/index.js +21 -0
  117. package/dist/core/prisma/index.js.map +1 -0
  118. package/dist/core/prisma/schema.prisma +360 -0
  119. package/dist/core/privy/constants.d.ts +19 -0
  120. package/dist/core/privy/constants.js +28 -0
  121. package/dist/core/privy/constants.js.map +1 -0
  122. package/dist/core/privy/index.d.ts +1 -0
  123. package/dist/core/privy/index.js +18 -0
  124. package/dist/core/privy/index.js.map +1 -0
  125. package/dist/core/socket.io/events.d.ts +20 -0
  126. package/dist/core/socket.io/events.js +20 -0
  127. package/dist/core/socket.io/events.js.map +1 -0
  128. package/dist/core/socket.io/index.d.ts +2 -0
  129. package/dist/core/socket.io/index.js +19 -0
  130. package/dist/core/socket.io/index.js.map +1 -0
  131. package/dist/core/socket.io/rooms.d.ts +6 -0
  132. package/dist/core/socket.io/rooms.js +10 -0
  133. package/dist/core/socket.io/rooms.js.map +1 -0
  134. package/dist/core/types/auth/auth.types.d.ts +31 -0
  135. package/dist/core/types/auth/auth.types.js +15 -0
  136. package/dist/core/types/auth/auth.types.js.map +1 -0
  137. package/dist/core/types/auth/index.d.ts +2 -0
  138. package/dist/core/types/auth/index.js +19 -0
  139. package/dist/core/types/auth/index.js.map +1 -0
  140. package/dist/core/types/auth/request.types.d.ts +19 -0
  141. package/dist/core/types/auth/request.types.js +15 -0
  142. package/dist/core/types/auth/request.types.js.map +1 -0
  143. package/dist/core/types/blockchain/chains.types.d.ts +3 -0
  144. package/dist/core/types/blockchain/chains.types.js +8 -0
  145. package/dist/core/types/blockchain/chains.types.js.map +1 -0
  146. package/dist/core/types/blockchain/contract.types.d.ts +8 -0
  147. package/dist/core/types/blockchain/contract.types.js +13 -0
  148. package/dist/core/types/blockchain/contract.types.js.map +1 -0
  149. package/dist/core/types/blockchain/index.d.ts +3 -0
  150. package/dist/core/types/blockchain/index.js +20 -0
  151. package/dist/core/types/blockchain/index.js.map +1 -0
  152. package/dist/core/types/blockchain/oz.relayer.types.d.ts +7 -0
  153. package/dist/core/types/blockchain/oz.relayer.types.js +13 -0
  154. package/dist/core/types/blockchain/oz.relayer.types.js.map +1 -0
  155. package/dist/core/types/index.d.ts +6 -0
  156. package/dist/core/types/index.js +23 -0
  157. package/dist/core/types/index.js.map +1 -0
  158. package/dist/core/types/indexers.types.d.ts +4 -0
  159. package/dist/core/types/indexers.types.js +9 -0
  160. package/dist/core/types/indexers.types.js.map +1 -0
  161. package/dist/core/types/misc.types.d.ts +6 -0
  162. package/dist/core/types/misc.types.js +11 -0
  163. package/dist/core/types/misc.types.js.map +1 -0
  164. package/dist/core/types/oracle/fixture.types.d.ts +75 -0
  165. package/dist/core/types/oracle/fixture.types.js +4 -0
  166. package/dist/core/types/oracle/fixture.types.js.map +1 -0
  167. package/dist/core/types/oracle/game/game.types.d.ts +108 -0
  168. package/dist/core/types/oracle/game/game.types.js +64 -0
  169. package/dist/core/types/oracle/game/game.types.js.map +1 -0
  170. package/dist/core/types/oracle/game/index.d.ts +2 -0
  171. package/dist/core/types/oracle/game/index.js +19 -0
  172. package/dist/core/types/oracle/game/index.js.map +1 -0
  173. package/dist/core/types/oracle/game/zod.game.types.d.ts +31 -0
  174. package/dist/core/types/oracle/game/zod.game.types.js +22 -0
  175. package/dist/core/types/oracle/game/zod.game.types.js.map +1 -0
  176. package/dist/core/types/oracle/index.d.ts +4 -0
  177. package/dist/core/types/oracle/index.js +21 -0
  178. package/dist/core/types/oracle/index.js.map +1 -0
  179. package/dist/core/types/oracle/market/index.d.ts +3 -0
  180. package/dist/core/types/oracle/market/index.js +20 -0
  181. package/dist/core/types/oracle/market/index.js.map +1 -0
  182. package/dist/core/types/oracle/market/markets.types.d.ts +95 -0
  183. package/dist/core/types/oracle/market/markets.types.js +35 -0
  184. package/dist/core/types/oracle/market/markets.types.js.map +1 -0
  185. package/dist/core/types/oracle/market/odds.types.d.ts +14 -0
  186. package/dist/core/types/oracle/market/odds.types.js +3 -0
  187. package/dist/core/types/oracle/market/odds.types.js.map +1 -0
  188. package/dist/core/types/oracle/market/positions.types.d.ts +57 -0
  189. package/dist/core/types/oracle/market/positions.types.js +3 -0
  190. package/dist/core/types/oracle/market/positions.types.js.map +1 -0
  191. package/dist/core/types/oracle/requests/game.request.types.d.ts +170 -0
  192. package/dist/core/types/oracle/requests/game.request.types.js +126 -0
  193. package/dist/core/types/oracle/requests/game.request.types.js.map +1 -0
  194. package/dist/core/types/oracle/requests/game.response.types.d.ts +8 -0
  195. package/dist/core/types/oracle/requests/game.response.types.js +3 -0
  196. package/dist/core/types/oracle/requests/game.response.types.js.map +1 -0
  197. package/dist/core/types/oracle/requests/index.d.ts +5 -0
  198. package/dist/core/types/oracle/requests/index.js +22 -0
  199. package/dist/core/types/oracle/requests/index.js.map +1 -0
  200. package/dist/core/types/oracle/requests/market.request.types.d.ts +63 -0
  201. package/dist/core/types/oracle/requests/market.request.types.js +41 -0
  202. package/dist/core/types/oracle/requests/market.request.types.js.map +1 -0
  203. package/dist/core/types/oracle/requests/odds.response.types.d.ts +2 -0
  204. package/dist/core/types/oracle/requests/odds.response.types.js +3 -0
  205. package/dist/core/types/oracle/requests/odds.response.types.js.map +1 -0
  206. package/dist/core/types/oracle/requests/user.request.type.d.ts +4 -0
  207. package/dist/core/types/oracle/requests/user.request.type.js +3 -0
  208. package/dist/core/types/oracle/requests/user.request.type.js.map +1 -0
  209. package/dist/core/types/privy.types.d.ts +4 -0
  210. package/dist/core/types/privy.types.js +9 -0
  211. package/dist/core/types/privy.types.js.map +1 -0
  212. package/dist/core/utils/converters.utils.d.ts +29 -0
  213. package/dist/core/utils/converters.utils.js +97 -0
  214. package/dist/core/utils/converters.utils.js.map +1 -0
  215. package/dist/core/utils/game.utils.d.ts +4 -0
  216. package/dist/core/utils/game.utils.js +79 -0
  217. package/dist/core/utils/game.utils.js.map +1 -0
  218. package/dist/core/utils/index.d.ts +4 -0
  219. package/dist/core/utils/index.js +21 -0
  220. package/dist/core/utils/index.js.map +1 -0
  221. package/dist/core/utils/misc.utils.d.ts +14 -0
  222. package/dist/core/utils/misc.utils.js +33 -0
  223. package/dist/core/utils/misc.utils.js.map +1 -0
  224. package/dist/core/utils/position.utils.d.ts +18 -0
  225. package/dist/core/utils/position.utils.js +68 -0
  226. package/dist/core/utils/position.utils.js.map +1 -0
  227. package/dist/core/validators/bytes.validators.d.ts +32 -0
  228. package/dist/core/validators/bytes.validators.js +47 -0
  229. package/dist/core/validators/bytes.validators.js.map +1 -0
  230. package/dist/core/validators/index.d.ts +2 -0
  231. package/dist/core/validators/index.js +19 -0
  232. package/dist/core/validators/index.js.map +1 -0
  233. package/dist/core/validators/mongo.validators.d.ts +2 -0
  234. package/dist/core/validators/mongo.validators.js +10 -0
  235. package/dist/core/validators/mongo.validators.js.map +1 -0
  236. package/dist/index.d.ts +1 -0
  237. package/dist/index.js +23 -0
  238. package/dist/index.js.map +1 -0
  239. package/dist/react/hooks/auth/index.d.ts +1 -0
  240. package/dist/react/hooks/auth/index.js +18 -0
  241. package/dist/react/hooks/auth/index.js.map +1 -0
  242. package/dist/react/hooks/auth/useAuthHeaders.d.ts +45 -0
  243. package/dist/react/hooks/auth/useAuthHeaders.js +58 -0
  244. package/dist/react/hooks/auth/useAuthHeaders.js.map +1 -0
  245. package/dist/react/hooks/contracts/erc20/index.d.ts +6 -0
  246. package/dist/react/hooks/contracts/erc20/index.js +23 -0
  247. package/dist/react/hooks/contracts/erc20/index.js.map +1 -0
  248. package/dist/react/hooks/contracts/erc20/useApproveErc20.d.ts +13 -0
  249. package/dist/react/hooks/contracts/erc20/useApproveErc20.js +28 -0
  250. package/dist/react/hooks/contracts/erc20/useApproveErc20.js.map +1 -0
  251. package/dist/react/hooks/contracts/erc20/useErc20Allowance.d.ts +10 -0
  252. package/dist/react/hooks/contracts/erc20/useErc20Allowance.js +34 -0
  253. package/dist/react/hooks/contracts/erc20/useErc20Allowance.js.map +1 -0
  254. package/dist/react/hooks/contracts/erc20/useErc20Balance.d.ts +22 -0
  255. package/dist/react/hooks/contracts/erc20/useErc20Balance.js +95 -0
  256. package/dist/react/hooks/contracts/erc20/useErc20Balance.js.map +1 -0
  257. package/dist/react/hooks/contracts/erc20/useErc20Decimals.d.ts +8 -0
  258. package/dist/react/hooks/contracts/erc20/useErc20Decimals.js +28 -0
  259. package/dist/react/hooks/contracts/erc20/useErc20Decimals.js.map +1 -0
  260. package/dist/react/hooks/contracts/erc20/useErc20Symbol.d.ts +8 -0
  261. package/dist/react/hooks/contracts/erc20/useErc20Symbol.js +28 -0
  262. package/dist/react/hooks/contracts/erc20/useErc20Symbol.js.map +1 -0
  263. package/dist/react/hooks/contracts/erc20/useTransferErc20.d.ts +13 -0
  264. package/dist/react/hooks/contracts/erc20/useTransferErc20.js +31 -0
  265. package/dist/react/hooks/contracts/erc20/useTransferErc20.js.map +1 -0
  266. package/dist/react/hooks/contracts/index.d.ts +3 -0
  267. package/dist/react/hooks/contracts/index.js +20 -0
  268. package/dist/react/hooks/contracts/index.js.map +1 -0
  269. package/dist/react/hooks/contracts/useContracts.d.ts +120 -0
  270. package/dist/react/hooks/contracts/useContracts.js +81 -0
  271. package/dist/react/hooks/contracts/useContracts.js.map +1 -0
  272. package/dist/react/hooks/contracts/useLevrMarketContractAddresses.d.ts +3 -0
  273. package/dist/react/hooks/contracts/useLevrMarketContractAddresses.js +27 -0
  274. package/dist/react/hooks/contracts/useLevrMarketContractAddresses.js.map +1 -0
  275. package/dist/react/hooks/index.d.ts +2 -0
  276. package/dist/react/hooks/index.js +19 -0
  277. package/dist/react/hooks/index.js.map +1 -0
  278. package/dist/react/index.d.ts +6 -0
  279. package/dist/react/index.js +23 -0
  280. package/dist/react/index.js.map +1 -0
  281. package/dist/react/injectedDependencies.d.ts +78 -0
  282. package/dist/react/injectedDependencies.js +94 -0
  283. package/dist/react/injectedDependencies.js.map +1 -0
  284. package/dist/react/queryClient.d.ts +9 -0
  285. package/dist/react/queryClient.js +13 -0
  286. package/dist/react/queryClient.js.map +1 -0
  287. package/dist/react/queryKeys.d.ts +17 -0
  288. package/dist/react/queryKeys.js +23 -0
  289. package/dist/react/queryKeys.js.map +1 -0
  290. package/dist/react/types/contracts.types.d.ts +4 -0
  291. package/dist/react/types/contracts.types.js +3 -0
  292. package/dist/react/types/contracts.types.js.map +1 -0
  293. package/dist/react/types/index.d.ts +1 -0
  294. package/dist/react/types/index.js +18 -0
  295. package/dist/react/types/index.js.map +1 -0
  296. package/dist/server/config/cloudflare.d.ts +30 -0
  297. package/dist/server/config/cloudflare.js +45 -0
  298. package/dist/server/config/cloudflare.js.map +1 -0
  299. package/dist/server/config/constants.d.ts +1 -0
  300. package/dist/server/config/constants.js +7 -0
  301. package/dist/server/config/constants.js.map +1 -0
  302. package/dist/server/config/dotenv.d.ts +35 -0
  303. package/dist/server/config/dotenv.js +42 -0
  304. package/dist/server/config/dotenv.js.map +1 -0
  305. package/dist/server/config/index.d.ts +9 -0
  306. package/dist/server/config/index.js +31 -0
  307. package/dist/server/config/index.js.map +1 -0
  308. package/dist/server/config/kms.d.ts +22 -0
  309. package/dist/server/config/kms.js +54 -0
  310. package/dist/server/config/kms.js.map +1 -0
  311. package/dist/server/config/prisma.d.ts +20 -0
  312. package/dist/server/config/prisma.js +40 -0
  313. package/dist/server/config/prisma.js.map +1 -0
  314. package/dist/server/config/redis.d.ts +57 -0
  315. package/dist/server/config/redis.js +121 -0
  316. package/dist/server/config/redis.js.map +1 -0
  317. package/dist/server/config/urls.d.ts +49 -0
  318. package/dist/server/config/urls.js +7 -0
  319. package/dist/server/config/urls.js.map +1 -0
  320. package/dist/server/config/winston.d.ts +3 -0
  321. package/dist/server/config/winston.js +14 -0
  322. package/dist/server/config/winston.js.map +1 -0
  323. package/dist/server/contracts/clients/index.d.ts +1 -0
  324. package/dist/server/contracts/clients/index.js +18 -0
  325. package/dist/server/contracts/clients/index.js.map +1 -0
  326. package/dist/server/contracts/clients/ozRelayerService.d.ts +18 -0
  327. package/dist/server/contracts/clients/ozRelayerService.js +167 -0
  328. package/dist/server/contracts/clients/ozRelayerService.js.map +1 -0
  329. package/dist/server/contracts/index.d.ts +2 -0
  330. package/dist/server/contracts/index.js +19 -0
  331. package/dist/server/contracts/index.js.map +1 -0
  332. package/dist/server/contracts/instances.d.ts +20 -0
  333. package/dist/server/contracts/instances.js +28 -0
  334. package/dist/server/contracts/instances.js.map +1 -0
  335. package/dist/server/index.d.ts +11 -0
  336. package/dist/server/index.js +36 -0
  337. package/dist/server/index.js.map +1 -0
  338. package/dist/server/instrumentation.d.ts +9 -0
  339. package/dist/server/instrumentation.js +37 -0
  340. package/dist/server/instrumentation.js.map +1 -0
  341. package/dist/server/liquidation-engine/index.d.ts +3 -0
  342. package/dist/server/liquidation-engine/index.js +20 -0
  343. package/dist/server/liquidation-engine/index.js.map +1 -0
  344. package/dist/server/liquidation-engine/redis.cache.manager/cache.keys.util.d.ts +10 -0
  345. package/dist/server/liquidation-engine/redis.cache.manager/cache.keys.util.js +15 -0
  346. package/dist/server/liquidation-engine/redis.cache.manager/cache.keys.util.js.map +1 -0
  347. package/dist/server/liquidation-engine/redis.cache.manager/prices.set.manager.d.ts +124 -0
  348. package/dist/server/liquidation-engine/redis.cache.manager/prices.set.manager.js +242 -0
  349. package/dist/server/liquidation-engine/redis.cache.manager/prices.set.manager.js.map +1 -0
  350. package/dist/server/liquidation-engine/redis.cache.manager/prices.set.manager.test.d.ts +1 -0
  351. package/dist/server/liquidation-engine/redis.cache.manager/prices.set.manager.test.js +115 -0
  352. package/dist/server/liquidation-engine/redis.cache.manager/prices.set.manager.test.js.map +1 -0
  353. package/dist/server/liquidation-engine/types/index.d.ts +1 -0
  354. package/dist/server/liquidation-engine/types/index.js +3 -0
  355. package/dist/server/liquidation-engine/types/index.js.map +1 -0
  356. package/dist/server/middleware/auth/cloudflare.handler.d.ts +6 -0
  357. package/dist/server/middleware/auth/cloudflare.handler.js +37 -0
  358. package/dist/server/middleware/auth/cloudflare.handler.js.map +1 -0
  359. package/dist/server/middleware/auth/hmac.handler.d.ts +11 -0
  360. package/dist/server/middleware/auth/hmac.handler.js +157 -0
  361. package/dist/server/middleware/auth/hmac.handler.js.map +1 -0
  362. package/dist/server/middleware/auth/index.d.ts +3 -0
  363. package/dist/server/middleware/auth/index.js +20 -0
  364. package/dist/server/middleware/auth/index.js.map +1 -0
  365. package/dist/server/middleware/auth/privy.handler.d.ts +7 -0
  366. package/dist/server/middleware/auth/privy.handler.js +31 -0
  367. package/dist/server/middleware/auth/privy.handler.js.map +1 -0
  368. package/dist/server/middleware/index.d.ts +2 -0
  369. package/dist/server/middleware/index.js +19 -0
  370. package/dist/server/middleware/index.js.map +1 -0
  371. package/dist/server/middleware/multiAuth.examples.d.ts +46 -0
  372. package/dist/server/middleware/multiAuth.examples.js +123 -0
  373. package/dist/server/middleware/multiAuth.examples.js.map +1 -0
  374. package/dist/server/middleware/multiAuth.middleware.d.ts +30 -0
  375. package/dist/server/middleware/multiAuth.middleware.js +90 -0
  376. package/dist/server/middleware/multiAuth.middleware.js.map +1 -0
  377. package/dist/server/middleware/rateLimit.middleware.d.ts +1 -0
  378. package/dist/server/middleware/rateLimit.middleware.js +19 -0
  379. package/dist/server/middleware/rateLimit.middleware.js.map +1 -0
  380. package/dist/server/oracle/index.d.ts +3 -0
  381. package/dist/server/oracle/index.js +20 -0
  382. package/dist/server/oracle/index.js.map +1 -0
  383. package/dist/server/oracle/redis-cache-manager/cache.keys.utils.d.ts +90 -0
  384. package/dist/server/oracle/redis-cache-manager/cache.keys.utils.js +147 -0
  385. package/dist/server/oracle/redis-cache-manager/cache.keys.utils.js.map +1 -0
  386. package/dist/server/oracle/redis-cache-manager/channels.d.ts +2 -0
  387. package/dist/server/oracle/redis-cache-manager/channels.js +11 -0
  388. package/dist/server/oracle/redis-cache-manager/channels.js.map +1 -0
  389. package/dist/server/oracle/redis-cache-manager/game.cache.service.d.ts +184 -0
  390. package/dist/server/oracle/redis-cache-manager/game.cache.service.js +698 -0
  391. package/dist/server/oracle/redis-cache-manager/game.cache.service.js.map +1 -0
  392. package/dist/server/oracle/redis-cache-manager/index.d.ts +4 -0
  393. package/dist/server/oracle/redis-cache-manager/index.js +21 -0
  394. package/dist/server/oracle/redis-cache-manager/index.js.map +1 -0
  395. package/dist/server/oracle/redis-cache-manager/market.cache.service.d.ts +115 -0
  396. package/dist/server/oracle/redis-cache-manager/market.cache.service.js +279 -0
  397. package/dist/server/oracle/redis-cache-manager/market.cache.service.js.map +1 -0
  398. package/dist/server/oracle/rmq-manager/base.queue.manager.d.ts +21 -0
  399. package/dist/server/oracle/rmq-manager/base.queue.manager.js +128 -0
  400. package/dist/server/oracle/rmq-manager/base.queue.manager.js.map +1 -0
  401. package/dist/server/oracle/rmq-manager/index.d.ts +2 -0
  402. package/dist/server/oracle/rmq-manager/index.js +19 -0
  403. package/dist/server/oracle/rmq-manager/index.js.map +1 -0
  404. package/dist/server/oracle/rmq-manager/queue.configs.d.ts +5 -0
  405. package/dist/server/oracle/rmq-manager/queue.configs.js +38 -0
  406. package/dist/server/oracle/rmq-manager/queue.configs.js.map +1 -0
  407. package/dist/server/oracle/types/index.d.ts +2 -0
  408. package/dist/server/oracle/types/index.js +19 -0
  409. package/dist/server/oracle/types/index.js.map +1 -0
  410. package/dist/server/oracle/types/providers/index.d.ts +4 -0
  411. package/dist/server/oracle/types/providers/index.js +21 -0
  412. package/dist/server/oracle/types/providers/index.js.map +1 -0
  413. package/dist/server/oracle/types/providers/lsports.types.d.ts +148 -0
  414. package/dist/server/oracle/types/providers/lsports.types.js +13 -0
  415. package/dist/server/oracle/types/providers/lsports.types.js.map +1 -0
  416. package/dist/server/oracle/types/providers/optic.odds.types.d.ts +293 -0
  417. package/dist/server/oracle/types/providers/optic.odds.types.js +140 -0
  418. package/dist/server/oracle/types/providers/optic.odds.types.js.map +1 -0
  419. package/dist/server/oracle/types/providers/providers.types.d.ts +5 -0
  420. package/dist/server/oracle/types/providers/providers.types.js +10 -0
  421. package/dist/server/oracle/types/providers/providers.types.js.map +1 -0
  422. package/dist/server/oracle/types/providers/rundown.types.d.ts +194 -0
  423. package/dist/server/oracle/types/providers/rundown.types.js +22 -0
  424. package/dist/server/oracle/types/providers/rundown.types.js.map +1 -0
  425. package/dist/server/oracle/types/queue/index.d.ts +2 -0
  426. package/dist/server/oracle/types/queue/index.js +19 -0
  427. package/dist/server/oracle/types/queue/index.js.map +1 -0
  428. package/dist/server/oracle/types/queue/queue.constant.d.ts +10 -0
  429. package/dist/server/oracle/types/queue/queue.constant.js +14 -0
  430. package/dist/server/oracle/types/queue/queue.constant.js.map +1 -0
  431. package/dist/server/oracle/types/queue/queue.types.d.ts +5 -0
  432. package/dist/server/oracle/types/queue/queue.types.js +3 -0
  433. package/dist/server/oracle/types/queue/queue.types.js.map +1 -0
  434. package/dist/server/prisma/index.d.ts +2 -0
  435. package/dist/server/prisma/index.js +24 -0
  436. package/dist/server/prisma/index.js.map +1 -0
  437. package/dist/server/repositories/apiKey.repository.d.ts +7 -0
  438. package/dist/server/repositories/apiKey.repository.js +19 -0
  439. package/dist/server/repositories/apiKey.repository.js.map +1 -0
  440. package/dist/server/repositories/index.d.ts +1 -0
  441. package/dist/server/repositories/index.js +18 -0
  442. package/dist/server/repositories/index.js.map +1 -0
  443. package/dist/server/services/cloudflare.service.d.ts +12 -0
  444. package/dist/server/services/cloudflare.service.js +24 -0
  445. package/dist/server/services/cloudflare.service.js.map +1 -0
  446. package/dist/server/services/crypto.service.d.ts +17 -0
  447. package/dist/server/services/crypto.service.js +50 -0
  448. package/dist/server/services/crypto.service.js.map +1 -0
  449. package/dist/server/services/hmac.service.d.ts +52 -0
  450. package/dist/server/services/hmac.service.js +115 -0
  451. package/dist/server/services/hmac.service.js.map +1 -0
  452. package/dist/server/services/index.d.ts +5 -0
  453. package/dist/server/services/index.js +22 -0
  454. package/dist/server/services/index.js.map +1 -0
  455. package/dist/server/services/presigned.urls.d.ts +11 -0
  456. package/dist/server/services/presigned.urls.js +41 -0
  457. package/dist/server/services/presigned.urls.js.map +1 -0
  458. package/dist/server/services/privy.service.d.ts +30 -0
  459. package/dist/server/services/privy.service.js +122 -0
  460. package/dist/server/services/privy.service.js.map +1 -0
  461. package/dist/server/test-relayers.d.ts +1 -0
  462. package/dist/server/test-relayers.js +17 -0
  463. package/dist/server/test-relayers.js.map +1 -0
  464. package/dist/server/types/auth.types.d.ts +8 -0
  465. package/dist/server/types/auth.types.js +3 -0
  466. package/dist/server/types/auth.types.js.map +1 -0
  467. package/dist/server/types/global.types.d.ts +35 -0
  468. package/dist/server/types/global.types.js +4 -0
  469. package/dist/server/types/global.types.js.map +1 -0
  470. package/dist/server/types/index.d.ts +2 -0
  471. package/dist/server/types/index.js +19 -0
  472. package/dist/server/types/index.js.map +1 -0
  473. package/dist/server/utils/express.utils.d.ts +24 -0
  474. package/dist/server/utils/express.utils.js +36 -0
  475. package/dist/server/utils/express.utils.js.map +1 -0
  476. package/dist/server/utils/index.d.ts +2 -0
  477. package/dist/server/utils/index.js +19 -0
  478. package/dist/server/utils/index.js.map +1 -0
  479. package/dist/server/utils/tracing/index.d.ts +2 -0
  480. package/dist/server/utils/tracing/index.js +19 -0
  481. package/dist/server/utils/tracing/index.js.map +1 -0
  482. package/dist/server/utils/tracing/trace.d.ts +12 -0
  483. package/dist/server/utils/tracing/trace.js +50 -0
  484. package/dist/server/utils/tracing/trace.js.map +1 -0
  485. package/dist/server/utils/tracing/wrap.module.with.tracing.d.ts +126 -0
  486. package/dist/server/utils/tracing/wrap.module.with.tracing.js +202 -0
  487. package/dist/server/utils/tracing/wrap.module.with.tracing.js.map +1 -0
  488. package/package.json +126 -0
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkChangeOverActive = exports.setChangeOverActive = exports.getStreamData = exports.deleteStream = exports.addPrices = exports.streamsOfMarketsBeingWatched = exports.removeStreamFromSet = exports.updateStreamSetsRoundRobin = void 0;
4
+ const core_1 = require("../../../core");
5
+ const config_1 = require("../../config");
6
+ const cache_keys_util_1 = require("./cache.keys.util");
7
+ /**
8
+ * Updates the round-robin assignment of a market's price stream to a Redis set.
9
+ *
10
+ * This function manages the distribution of market price streams across a fixed number of Redis sets,
11
+ * using a round-robin strategy to balance load and ensure even distribution. It performs the following steps atomically:
12
+ * 1. Retrieves the current round-robin index from Redis.
13
+ * 2. Calculates the next index, wrapping around based on `LE_STREAMS_SETS_MAX_COUNT`.
14
+ * 3. Adds the given `marketId` to the corresponding Redis set for the next round.
15
+ * 4. Updates the round-robin index in Redis.
16
+ * 5. Maps the `marketId` to its assigned set index in a Redis hash for quick lookup.
17
+ *
18
+ * All Redis operations are executed in a single pipeline to ensure atomicity and performance.
19
+ *
20
+ * @param redis - The Redis client instance used for executing commands.
21
+ * @param marketId - The unique identifier for the market, represented as a 16-byte value.
22
+ * @returns A promise that resolves when the operation is complete.
23
+ *
24
+ * @remarks
25
+ * - Assumes that `LE_STREAMS_SETS_MAX_COUNT`, `lastUpdatedStreamSetCountKey`, `marketsBeingWatched`, `PRICE_STREAM_KEY`,
26
+ * and `MARKET_TO_SET_ID` are defined and accessible in the module scope.
27
+ * - Ensures that each market is always assigned to a set, and the mapping is kept up-to-date for efficient retrieval.
28
+ * - Designed for high-throughput environments where market assignments need to be balanced dynamically.
29
+ */
30
+ const updateStreamSetsRoundRobin = async (redis, marketId) => {
31
+ // Get the current Id for round robin
32
+ let Id = await redis.get(cache_keys_util_1.lastUpdatedStreamSetCountKey);
33
+ Id ?? (Id = "0");
34
+ const nextId = (parseInt(Id, 10) + 1) % cache_keys_util_1.LE_STREAMS_SETS_MAX_COUNT;
35
+ const pipeline = redis.pipeline();
36
+ // Add marketId to the watched set
37
+ pipeline.sadd((0, cache_keys_util_1.marketsBeingWatched)(nextId), (0, cache_keys_util_1.PRICE_STREAM_KEY)(marketId));
38
+ // Update the last updated Id
39
+ pipeline.set(cache_keys_util_1.lastUpdatedStreamSetCountKey, nextId.toString());
40
+ // Key = MARKET_TO_SET_ID
41
+ // Value = nextId
42
+ // FIELD = marketId
43
+ pipeline.hset(cache_keys_util_1.MARKET_TO_SET_ID, marketId, nextId.toString());
44
+ await pipeline.exec();
45
+ };
46
+ exports.updateStreamSetsRoundRobin = updateStreamSetsRoundRobin;
47
+ // use this at market completed/settlement to remove it from being watched
48
+ /**
49
+ * Removes a market's price stream from its associated Redis set and deletes its mapping.
50
+ *
51
+ * This function performs the following steps atomically using a Redis pipeline:
52
+ * 1. Retrieves the set ID associated with the given `marketId` from the `MARKET_TO_SET_ID` hash.
53
+ * 2. If the mapping does not exist, logs a warning and exits.
54
+ * 3. Removes the market's price stream key from the corresponding watched set.
55
+ * 4. Deletes the mapping of `marketId` from the `MARKET_TO_SET_ID` hash.
56
+ * 5. Executes the pipeline and checks for errors, logging and rethrowing if any occur.
57
+ * 6. Logs successful removal of the market from the set.
58
+ *
59
+ * @param redis - The Redis client instance used for executing commands.
60
+ * @param marketId - The unique identifier for the market whose stream should be removed.
61
+ * @returns A promise that resolves when the operation is complete.
62
+ * @throws If any Redis operation in the pipeline fails, the error is logged and rethrown.
63
+ *
64
+ * @remarks
65
+ * - Ensures atomicity and consistency by using Redis pipelines.
66
+ * - Designed for use in environments where market-to-set mappings are dynamically managed.
67
+ * - Logging is performed at both warning and error levels for observability.
68
+ */
69
+ const removeStreamFromSet = async (redis, marketId) => {
70
+ const setIdStr = await redis.hget(cache_keys_util_1.MARKET_TO_SET_ID, marketId);
71
+ if (!setIdStr) {
72
+ config_1.logger.warn(`Market ${marketId} mapping not found`);
73
+ return;
74
+ }
75
+ // Remove marketId from the watched set
76
+ const setId = parseInt(setIdStr, 10);
77
+ const pipeline = redis.pipeline();
78
+ pipeline.srem((0, cache_keys_util_1.marketsBeingWatched)(setId), (0, cache_keys_util_1.PRICE_STREAM_KEY)(marketId));
79
+ pipeline.hdel(cache_keys_util_1.MARKET_TO_SET_ID, marketId);
80
+ const results = await pipeline.exec();
81
+ if (results) {
82
+ for (const [err] of results) {
83
+ if (err) {
84
+ config_1.logger.error(`Error removing market ${marketId} from set ${setId}: ${err.message}`);
85
+ throw err;
86
+ }
87
+ }
88
+ }
89
+ config_1.logger.info(`Market ${marketId} removed from set ${setId}`);
90
+ };
91
+ exports.removeStreamFromSet = removeStreamFromSet;
92
+ // gets the stream to add to xread for a worker
93
+ const streamsOfMarketsBeingWatched = async (redis, Id) => {
94
+ return await redis.smembers((0, cache_keys_util_1.marketsBeingWatched)(Id));
95
+ };
96
+ exports.streamsOfMarketsBeingWatched = streamsOfMarketsBeingWatched;
97
+ /**
98
+ * Adds an array of price objects to a Redis stream for a specific market.
99
+ *
100
+ * This function ensures the Redis consumer group for the price stream exists,
101
+ * creating it if necessary. It then adds each price to the stream using a pipeline
102
+ * for efficiency, enforcing a maximum stream length. The first entry in the stream
103
+ * is guaranteed to create the stream if it does not exist. If no prices are provided,
104
+ * the function logs and exits early.
105
+ *
106
+ * @param redis - The Redis client instance used for stream operations.
107
+ * @param prices - An array of Odds objects to be added to the stream.
108
+ * @param marketId - The unique identifier for the market, used to derive the stream key.
109
+ *
110
+ * @remarks
111
+ * - The function is idempotent with respect to consumer group creation; it will not throw
112
+ * if the group already exists.
113
+ * - Each price is validated against the OddsSchema before being added.
114
+ * - Uses Redis pipelining for batch efficiency.
115
+ * - Logs the number of prices added for observability.
116
+ *
117
+ * @throws
118
+ * Throws any unexpected errors encountered during consumer group creation or pipeline execution.
119
+ */
120
+ const addPrices = async (redis, prices, marketId) => {
121
+ const streamKey = (0, cache_keys_util_1.PRICE_STREAM_KEY)(marketId);
122
+ // Ensure the consumer group exists once
123
+ try {
124
+ await redis.xgroup("CREATE", streamKey, cache_keys_util_1.LE_CONSUMER_GROUP, "$", "MKSTREAM");
125
+ await (0, exports.updateStreamSetsRoundRobin)(redis, marketId); // will work once
126
+ }
127
+ catch (err) {
128
+ if (err instanceof Error && err.message.includes("BUSYGROUP")) {
129
+ // Group already exists
130
+ }
131
+ else {
132
+ throw err;
133
+ }
134
+ }
135
+ if (prices.length === 0) {
136
+ config_1.logger.info("No prices to add for market:", marketId);
137
+ return;
138
+ }
139
+ const pipeline = redis.pipeline();
140
+ let isFirst = true;
141
+ for (const price of prices) {
142
+ const oddsData = core_1.OddsSchema.parse(price);
143
+ pipeline.xadd(streamKey, "MAXLEN", "~", cache_keys_util_1.STREAM_MAX_LENGTH, "*", "odds", JSON.stringify(oddsData), ...(isFirst ? ["MKSTREAM"] : []));
144
+ isFirst = false;
145
+ }
146
+ await pipeline.exec();
147
+ config_1.logger.info(`Added ${prices.length} prices to stream ${streamKey}`);
148
+ };
149
+ exports.addPrices = addPrices;
150
+ /**
151
+ * Deletes the price stream associated with a specific market from Redis.
152
+ *
153
+ * This function performs two main operations:
154
+ * 1. Removes the stream reference from the set of active streams for the given market.
155
+ * 2. Deletes the actual Redis key that stores the price stream data for the market.
156
+ *
157
+ * @param redis - An instance of the Redis client used to perform cache operations.
158
+ * @param marketId - The unique identifier (Bytes16) of the market whose price stream should be deleted.
159
+ * @returns A promise that resolves when the stream and its references have been fully removed.
160
+ *
161
+ * @remarks
162
+ * - Use this function when a market is being decommissioned or its price stream is no longer required.
163
+ * - Ensure that no other process is concurrently writing to the same stream to avoid race conditions.
164
+ */
165
+ const deleteStream = async (redis, marketId) => {
166
+ await (0, exports.removeStreamFromSet)(redis, marketId);
167
+ const streamKey = (0, cache_keys_util_1.PRICE_STREAM_KEY)(marketId);
168
+ await redis.del(streamKey);
169
+ };
170
+ exports.deleteStream = deleteStream;
171
+ /**
172
+ * Retrieves and aggregates all odds data from a Redis stream for a given market.
173
+ *
174
+ * This function iteratively reads batches of messages from the specified Redis stream,
175
+ * deserializes each message into an `Odds` object, and accumulates the results. It continues
176
+ * fetching until the stream is exhausted or an error occurs. The function also tracks the
177
+ * snapshot state, marking it as `"INCOMPLETE"` if any error is encountered during the read process.
178
+ *
179
+ * @param redis - An instance of the Redis client used to interact with the stream.
180
+ * @param marketId - The unique identifier for the market whose price stream is being read.
181
+ * @returns An object containing:
182
+ * - `odds`: An array of all `Odds` objects retrieved from the stream.
183
+ * - `snapshotState`: The final state of the snapshot read operation, either `"COMPLETE"` or `"INCOMPLETE"`.
184
+ *
185
+ * @remarks
186
+ * - The function reads the stream in batches to optimize memory usage and performance.
187
+ * - If the stream contains no messages, an empty array is returned with a `"COMPLETE"` state.
188
+ * - Errors during stream processing are logged and result in an `"INCOMPLETE"` snapshot state.
189
+ * - The function assumes that the second field in each stream entry contains a JSON-encoded `Odds` object.
190
+ *
191
+ * @throws Never throws; errors are caught internally and reflected in the `snapshotState`.
192
+ */
193
+ const getStreamData = async (redis, marketId) => {
194
+ let start = "-";
195
+ const batchSize = 100;
196
+ const streamKey = (0, cache_keys_util_1.PRICE_STREAM_KEY)(marketId);
197
+ const results = [];
198
+ let snapshotState = "COMPLETE";
199
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
200
+ while (true) {
201
+ try {
202
+ const batch = await redis.xrange(streamKey, start, "+", "COUNT", batchSize);
203
+ if (batch.length === 0)
204
+ break;
205
+ for (const [, fields] of batch) {
206
+ // process message
207
+ const oddsData = JSON.parse(fields[1]);
208
+ results.push(oddsData);
209
+ }
210
+ // update start to last id + 1
211
+ start = batch[batch.length - 1][0];
212
+ }
213
+ catch (error) {
214
+ config_1.logger.error("Error reading stream:", error);
215
+ snapshotState = "INCOMPLETE";
216
+ break;
217
+ }
218
+ }
219
+ return {
220
+ odds: results,
221
+ snapshotState,
222
+ };
223
+ };
224
+ exports.getStreamData = getStreamData;
225
+ /**
226
+ * Sets the change-over active marker in Redis.
227
+ */
228
+ const setChangeOverActive = async (redis, status) => {
229
+ await redis.set(cache_keys_util_1.switchOnPriceMarkerLiquidationKey, status.toString(), "EX", cache_keys_util_1.MAKER_DURATION_EXPIRY);
230
+ };
231
+ exports.setChangeOverActive = setChangeOverActive;
232
+ /**
233
+ * Checks whether the changeover for active liquidation is enabled in Redis.
234
+ */
235
+ const checkChangeOverActive = async (redis) => {
236
+ const result = await redis.get(cache_keys_util_1.switchOnPriceMarkerLiquidationKey);
237
+ return result === "true";
238
+ };
239
+ exports.checkChangeOverActive = checkChangeOverActive;
240
+ //produce stream
241
+ // read stream and ack
242
+ //# sourceMappingURL=prices.set.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prices.set.manager.js","sourceRoot":"","sources":["../../../../src/server/liquidation-engine/redis.cache.manager/prices.set.manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ // import { Redis } from "ioredis"
3
+ // import { Bytes16, Odds } from "../../oracle"
4
+ // import { addPrices, getFirstRandomUnProcessedPrices, isSetEmpty, removeRandomUnProcessedPrice } from "./prices.set.manager"
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // jest.mock("ioredis")
7
+ // const mockRedis = () => {
8
+ // const data: Record<string, Set<string>> = {}
9
+ // const list: string[] = []
10
+ // return {
11
+ // pipeline: jest.fn(() => {
12
+ // const ops: any[] = []
13
+ // return {
14
+ // sadd: jest.fn((key: string, value: string) => {
15
+ // ops.push(() => {
16
+ // data[key] = new Set()
17
+ // data[key].add(value)
18
+ // return 1
19
+ // })
20
+ // }),
21
+ // lpush: jest.fn((key: string, value: string) => {
22
+ // ops.push(() => {
23
+ // list.unshift(value)
24
+ // return 1
25
+ // })
26
+ // }),
27
+ // srandmember: jest.fn((key: string, count: number) => {
28
+ // ops.push(() => {
29
+ // const arr = Array.from(data[key])
30
+ // return arr.slice(0, count)
31
+ // })
32
+ // }),
33
+ // srem: jest.fn((key: string, value: string) => {
34
+ // ops.push(() => {
35
+ // if (data[key].has(value)) {
36
+ // data[key].delete(value)
37
+ // return 1
38
+ // }
39
+ // return 0
40
+ // })
41
+ // }),
42
+ // lrem: jest.fn((key: string, _count: number, value: string) => {
43
+ // ops.push(() => {
44
+ // let removed = 0
45
+ // for (let i = list.length - 1; i >= 0; i--) {
46
+ // if (list[i] === value) {
47
+ // list.splice(i, 1)
48
+ // removed++
49
+ // }
50
+ // }
51
+ // return removed
52
+ // })
53
+ // }),
54
+ // exec: jest.fn(() => ops.map((fn) => [null, fn()])),
55
+ // }
56
+ // }),
57
+ // lrange: jest.fn(async (key: string, _start: number, _end: number) => {
58
+ // if (key === "liquidation:prices:set:keys") return [...list]
59
+ // return []
60
+ // }),
61
+ // scard: jest.fn(async (key: string) => {
62
+ // return data[key] ? data[key].size : 0
63
+ // }),
64
+ // } as unknown as Redis
65
+ // }
66
+ // describe("prices.set.manager", () => {
67
+ // let redis: Redis
68
+ // const marketId: Bytes16 = "0x1234567890abcdef"
69
+ // const odds: Odds = { id: "odds-1", value: 2.5 }
70
+ // const odds2: Odds = { id: "odds-2", value: 3.1 }
71
+ // beforeEach(() => {
72
+ // redis = mockRedis()
73
+ // })
74
+ // it("addPrices adds prices to the set and updates keys list", async () => {
75
+ // await addPrices(redis, [odds, odds2], marketId)
76
+ // // Check that lrange returns the key
77
+ // const keys = await redis.lrange("liquidation:prices:set:keys", 0, -1)
78
+ // expect(keys).toContain(`liquidation:prices:set:${marketId}`)
79
+ // // Check that scard returns 2
80
+ // const count = await redis.scard(`liquidation:prices:set:${marketId}`)
81
+ // expect(count).toBe(2)
82
+ // })
83
+ // it("getFirstRandomUnProcessedPrices returns a random price", async () => {
84
+ // await addPrices(redis, [odds], marketId)
85
+ // const result = await getFirstRandomUnProcessedPrices(redis, 1)
86
+ // expect(result).toBeTruthy()
87
+ // expect(Array.isArray(result)).toBe(true)
88
+ // expect(result![0]).toMatchObject(odds)
89
+ // })
90
+ // it("getFirstRandomUnProcessedPrices returns null if no prices", async () => {
91
+ // const result = await getFirstRandomUnProcessedPrices(redis, 1)
92
+ // expect(result).toBeNull()
93
+ // })
94
+ // it("removeRandomUnProcessedPrice removes a price from the set and keys list", async () => {
95
+ // await addPrices(redis, [odds], marketId)
96
+ // await removeRandomUnProcessedPrice(redis, marketId, odds)
97
+ // const count = await redis.scard(`liquidation:prices:set:${marketId}`)
98
+ // expect(count).toBe(0)
99
+ // const keys = await redis.lrange("liquidation:prices:set:keys", 0, -1)
100
+ // expect(keys).not.toContain(`liquidation:prices:set:${marketId}`)
101
+ // })
102
+ // it("removeRandomUnProcessedPrice throws if price not found", async () => {
103
+ // await expect(removeRandomUnProcessedPrice(redis, marketId, odds)).rejects.toThrow()
104
+ // })
105
+ // it("isSetEmpty returns true if set is empty", async () => {
106
+ // const empty = await isSetEmpty(redis, marketId)
107
+ // expect(empty).toBe(true)
108
+ // })
109
+ // it("isSetEmpty returns false if set is not empty", async () => {
110
+ // await addPrices(redis, [odds], marketId)
111
+ // const empty = await isSetEmpty(redis, marketId)
112
+ // expect(empty).toBe(false)
113
+ // })
114
+ // })
115
+ //# sourceMappingURL=prices.set.manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prices.set.manager.test.js","sourceRoot":"","sources":["../../../../src/server/liquidation-engine/redis.cache.manager/prices.set.manager.test.ts"],"names":[],"mappings":";AAAA,kCAAkC;AAClC,+CAA+C;AAC/C,8HAA8H;;AAE9H,uBAAuB;AAEvB,4BAA4B;AAC5B,mDAAmD;AACnD,gCAAgC;AAEhC,eAAe;AACf,oCAAoC;AACpC,oCAAoC;AACpC,uBAAuB;AACvB,kEAAkE;AAClE,uCAAuC;AACvC,gDAAgD;AAChD,+CAA+C;AAC/C,mCAAmC;AACnC,yBAAyB;AACzB,sBAAsB;AACtB,mEAAmE;AACnE,uCAAuC;AACvC,8CAA8C;AAC9C,mCAAmC;AACnC,yBAAyB;AACzB,sBAAsB;AACtB,yEAAyE;AACzE,uCAAuC;AACvC,4DAA4D;AAC5D,qDAAqD;AACrD,yBAAyB;AACzB,sBAAsB;AACtB,kEAAkE;AAClE,uCAAuC;AACvC,sDAAsD;AACtD,sDAAsD;AACtD,uCAAuC;AACvC,4BAA4B;AAC5B,mCAAmC;AACnC,yBAAyB;AACzB,sBAAsB;AACtB,kFAAkF;AAClF,uCAAuC;AACvC,0CAA0C;AAC1C,uEAAuE;AACvE,uDAAuD;AACvD,oDAAoD;AACpD,4CAA4C;AAC5C,gCAAgC;AAChC,4BAA4B;AAC5B,yCAAyC;AACzC,yBAAyB;AACzB,sBAAsB;AACtB,sEAAsE;AACtE,gBAAgB;AAChB,cAAc;AACd,iFAAiF;AACjF,0EAA0E;AAC1E,wBAAwB;AACxB,cAAc;AACd,kDAAkD;AAClD,oDAAoD;AACpD,cAAc;AACd,4BAA4B;AAC5B,IAAI;AAEJ,yCAAyC;AACzC,uBAAuB;AACvB,qDAAqD;AACrD,sDAAsD;AACtD,uDAAuD;AAEvD,yBAAyB;AACzB,8BAA8B;AAC9B,SAAS;AAET,iFAAiF;AACjF,0DAA0D;AAC1D,+CAA+C;AAC/C,gFAAgF;AAChF,uEAAuE;AACvE,wCAAwC;AACxC,gFAAgF;AAChF,gCAAgC;AAChC,SAAS;AAET,iFAAiF;AACjF,mDAAmD;AACnD,yEAAyE;AACzE,sCAAsC;AACtC,mDAAmD;AACnD,iDAAiD;AACjD,SAAS;AAET,oFAAoF;AACpF,yEAAyE;AACzE,oCAAoC;AACpC,SAAS;AAET,kGAAkG;AAClG,mDAAmD;AACnD,oEAAoE;AACpE,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAChF,2EAA2E;AAC3E,SAAS;AAET,iFAAiF;AACjF,8FAA8F;AAC9F,SAAS;AAET,kEAAkE;AAClE,0DAA0D;AAC1D,mCAAmC;AACnC,SAAS;AAET,uEAAuE;AACvE,mDAAmD;AACnD,0DAA0D;AAC1D,oCAAoC;AACpC,SAAS;AACT,KAAK"}
@@ -0,0 +1 @@
1
+ export type SnapShotReadState = "COMPLETE" | "INCOMPLETE";
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/liquidation-engine/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { Request } from "express";
2
+ import type { AuthResult } from "../../types/auth.types";
3
+ /**
4
+ * Handles Cloudflare Access authentication
5
+ */
6
+ export declare function handleCloudflareAuth(req: Request): Promise<AuthResult>;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleCloudflareAuth = handleCloudflareAuth;
7
+ const core_1 = require("../../../core");
8
+ const services_1 = require("../../services");
9
+ const winston_1 = __importDefault(require("../../config/winston"));
10
+ /**
11
+ * Handles Cloudflare Access authentication
12
+ */
13
+ async function handleCloudflareAuth(req) {
14
+ const jwt = req.headers["cf-access-jwt-assertion"]?.toString();
15
+ if (!jwt) {
16
+ return {
17
+ success: false,
18
+ error: "Missing CF-Access-JWT-Assertion header",
19
+ statusCode: 401,
20
+ };
21
+ }
22
+ try {
23
+ await services_1.cloudflareAuthService.verifyJwt(jwt);
24
+ req.authMethod = core_1.LevrAuth.CLOUDFLARE;
25
+ return { success: true };
26
+ }
27
+ catch (err) {
28
+ const errorMsg = err instanceof Error ? err.message : String(err);
29
+ winston_1.default.error("Cloudflare JWT verification error:", errorMsg);
30
+ return {
31
+ success: false,
32
+ error: `Invalid Cloudflare JWT: ${errorMsg}`,
33
+ statusCode: 401,
34
+ };
35
+ }
36
+ }
37
+ //# sourceMappingURL=cloudflare.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/cloudflare.handler.ts"],"names":[],"mappings":";;;;;AASA,oDAwBC;AAhCD,wCAAwC;AACxC,6CAAsD;AAEtD,mEAAyC;AAEzC;;GAEG;AACI,KAAK,UAAU,oBAAoB,CAAC,GAAY;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,EAAE,QAAQ,EAAE,CAAA;IAE9D,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wCAAwC;YAC/C,UAAU,EAAE,GAAG;SAClB,CAAA;IACL,CAAC;IAED,IAAI,CAAC;QACD,MAAM,gCAAqB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAC1C,GAAG,CAAC,UAAU,GAAG,eAAQ,CAAC,UAAU,CAAA;QACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACjE,iBAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,QAAQ,CAAC,CAAA;QAC5D,OAAO;YACH,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,QAAQ,EAAE;YAC5C,UAAU,EAAE,GAAG;SAClB,CAAA;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Request } from "express";
2
+ import { MultiAuthOptions } from "../../../core";
3
+ import type { AuthResult } from "../../types/auth.types";
4
+ /**
5
+ * Handles HMAC authentication (user API keys)
6
+ */
7
+ export declare function handleHmacAuth(req: Request, options: MultiAuthOptions): Promise<AuthResult>;
8
+ /**
9
+ * Handles SERVICE_HMAC authentication (service-to-service API keys)
10
+ */
11
+ export declare function handleServiceHmacAuth(req: Request, options: MultiAuthOptions): Promise<AuthResult>;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleHmacAuth = handleHmacAuth;
7
+ exports.handleServiceHmacAuth = handleServiceHmacAuth;
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const ms_1 = __importDefault(require("ms"));
10
+ const core_1 = require("../../../core");
11
+ const config_1 = require("../../config");
12
+ const repositories_1 = require("../../repositories");
13
+ const services_1 = require("../../services");
14
+ /**
15
+ * Validates that the API key has all the required scopes
16
+ */
17
+ function validateScopes(apiKeyScopes, requiredScopes) {
18
+ if (!requiredScopes || requiredScopes.length === 0)
19
+ return true;
20
+ return requiredScopes.every((scope) => apiKeyScopes.includes(scope));
21
+ }
22
+ /**
23
+ * Determines required scopes based on HTTP method and options
24
+ */
25
+ function getRequiredScopes(method, options) {
26
+ const scopes = options.requiredScopes || [];
27
+ const autoEnforce = options.autoEnforceWriteScope !== false; // default true
28
+ if (autoEnforce && ["POST", "PUT", "PATCH", "DELETE"].includes(method.toUpperCase())) {
29
+ if (!scopes.includes(core_1.ApiKeyScope.Write)) {
30
+ return [...scopes, core_1.ApiKeyScope.Write];
31
+ }
32
+ }
33
+ return scopes;
34
+ }
35
+ /**
36
+ * Prevents nonce replay attacks by ensuring each nonce is only used once per API key
37
+ */
38
+ async function validateNonce(apiKeyId, nonce) {
39
+ const key = `hmac_nonce:${apiKeyId}:${nonce}`;
40
+ try {
41
+ // Set nonce with 2 minute expiry, NX ensures it's only set if it doesn't exist
42
+ const result = await config_1.redisClientManager.primaryClient.set(key, "1", "EX", 120, "NX");
43
+ return result === "OK"; // Returns OK only if key was set (nonce not used before)
44
+ }
45
+ catch (err) {
46
+ config_1.logger.error("Nonce validation error:", err);
47
+ // Fail open on Redis errors to avoid blocking legitimate requests
48
+ return true;
49
+ }
50
+ }
51
+ /**
52
+ * Shared HMAC authentication logic for both user and service API keys
53
+ */
54
+ async function handleHmacAuthBase(req, options, isServiceAuth) {
55
+ // Parse Authorization header
56
+ const auth = req.header("Authorization");
57
+ if (!auth)
58
+ return { success: false, error: "Missing Authorization header", statusCode: 401 };
59
+ const m = auth.match(/^HMAC\s+([A-Za-z0-9-]+):(.+)$/);
60
+ if (!m)
61
+ return { success: false, error: "Invalid Authorization header format", statusCode: 401 };
62
+ const [, apiKeyId, sigB64] = m;
63
+ if (!apiKeyId || !sigB64)
64
+ return { success: false, error: "Invalid Authorization header format", statusCode: 401 };
65
+ const apiKey = await repositories_1.apiKeyRepository.getApiKey({ apiKeyId });
66
+ if (!apiKey)
67
+ return { success: false, error: "Unknown API key", statusCode: 401 };
68
+ if (isServiceAuth && !apiKey.service) {
69
+ return { success: false, error: "This endpoint requires a service API key", statusCode: 403 };
70
+ }
71
+ if (!isServiceAuth && apiKey.service) {
72
+ return { success: false, error: "Service API keys cannot be used with HMAC auth", statusCode: 403 };
73
+ }
74
+ // Check expiration
75
+ if (apiKey.expiresAt && apiKey.expiresAt < new Date()) {
76
+ return { success: false, error: "API key has expired", statusCode: 401 };
77
+ }
78
+ // Validate service restriction (SERVICE_HMAC only)
79
+ if (isServiceAuth) {
80
+ // If no allowed services specified, reject all service auth requests
81
+ if (!options.allowedServices || options.allowedServices.length === 0) {
82
+ return {
83
+ success: false,
84
+ error: "Service authentication requires allowedServices configuration",
85
+ statusCode: 403,
86
+ };
87
+ }
88
+ if (!apiKey.service || !options.allowedServices.includes(apiKey.service)) {
89
+ return {
90
+ success: false,
91
+ error: `Service not allowed. Allowed: [${options.allowedServices.join(", ")}], Got: ${apiKey.service}`,
92
+ statusCode: 403,
93
+ };
94
+ }
95
+ }
96
+ // Validate scopes
97
+ const requiredScopes = getRequiredScopes(req.method, options);
98
+ if (!validateScopes(apiKey.scopes, requiredScopes)) {
99
+ return {
100
+ success: false,
101
+ error: `Insufficient scopes. Required: ${requiredScopes.join(", ")}`,
102
+ statusCode: 403,
103
+ };
104
+ }
105
+ // Verify HMAC signature
106
+ try {
107
+ const secretKey = await services_1.cryptoService.getSecretKey(apiKeyId, apiKey.ciphertext);
108
+ const method = req.method.toUpperCase();
109
+ const path = req.originalUrl.split("?")[0];
110
+ const timestamp = req.header("x-request-timestamp");
111
+ const nonce = req.header("x-request-nonce");
112
+ if (!timestamp) {
113
+ return { success: false, error: "Missing x-request-timestamp header", statusCode: 400 };
114
+ }
115
+ if (!nonce || nonce.length === 0) {
116
+ return { success: false, error: "Missing x-request-nonce header", statusCode: 400 };
117
+ }
118
+ const ts = parseInt(timestamp, 10);
119
+ if (Number.isNaN(ts))
120
+ return { success: false, error: "Invalid timestamp format", statusCode: 400 };
121
+ if (Math.abs(Date.now() - ts) > (0, ms_1.default)("2m")) {
122
+ return { success: false, error: "Request timestamp expired", statusCode: 401 };
123
+ }
124
+ const expectedSig = services_1.cryptoService.signRequest({ method, path, ts, body: req.body, nonce, secretKey });
125
+ const providedSig = sigB64;
126
+ const ok = crypto_1.default.timingSafeEqual(Buffer.from(expectedSig, "base64"), Buffer.from(providedSig, "base64"));
127
+ if (!ok)
128
+ return { success: false, error: "Invalid signature", statusCode: 401 };
129
+ // Prevent nonce replay attacks
130
+ const nonceValid = await validateNonce(apiKeyId, nonce);
131
+ if (!nonceValid)
132
+ return { success: false, error: "Nonce has already been used", statusCode: 401 };
133
+ req.apiUser = { id: apiKey.userId, service: apiKey.service };
134
+ req.ethAddress = apiKey.ethAddress;
135
+ req.authMethod = isServiceAuth ? core_1.LevrAuth.SERVICE_HMAC : core_1.LevrAuth.HMAC;
136
+ req.privyUser = await services_1.privyService.getUserById(apiKey.userId);
137
+ await repositories_1.apiKeyRepository.updateApiKey({ apiKeyId }, { lastUsedAt: new Date(), usageCount: { increment: 1 } });
138
+ return { success: true };
139
+ }
140
+ catch (err) {
141
+ config_1.logger.error(`HMAC verification error:`, err);
142
+ return { success: false, error: "Signature verification failed", statusCode: 401 };
143
+ }
144
+ }
145
+ /**
146
+ * Handles HMAC authentication (user API keys)
147
+ */
148
+ async function handleHmacAuth(req, options) {
149
+ return handleHmacAuthBase(req, options, false);
150
+ }
151
+ /**
152
+ * Handles SERVICE_HMAC authentication (service-to-service API keys)
153
+ */
154
+ async function handleServiceHmacAuth(req, options) {
155
+ return handleHmacAuthBase(req, options, true);
156
+ }
157
+ //# sourceMappingURL=hmac.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmac.handler.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/hmac.handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./cloudflare.handler";
2
+ export * from "./hmac.handler";
3
+ export * from "./privy.handler";
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cloudflare.handler"), exports);
18
+ __exportStar(require("./hmac.handler"), exports);
19
+ __exportStar(require("./privy.handler"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/middleware/auth/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAoC;AACpC,iDAA8B;AAC9B,kDAA+B"}