@humanode-hyperlane/rebalancer 27.2.2 → 1029.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/dist/bridges/LiFiBridge.d.ts +3 -3
  2. package/dist/bridges/LiFiBridge.d.ts.map +1 -1
  3. package/dist/bridges/LiFiBridge.js +66 -55
  4. package/dist/bridges/LiFiBridge.js.map +1 -1
  5. package/dist/bridges/LiFiBridge.test.js +213 -0
  6. package/dist/bridges/LiFiBridge.test.js.map +1 -1
  7. package/dist/config/RebalancerConfig.d.ts +4 -3
  8. package/dist/config/RebalancerConfig.d.ts.map +1 -1
  9. package/dist/config/RebalancerConfig.js +7 -5
  10. package/dist/config/RebalancerConfig.js.map +1 -1
  11. package/dist/config/RebalancerConfig.test.js +278 -2
  12. package/dist/config/RebalancerConfig.test.js.map +1 -1
  13. package/dist/config/types.d.ts +707 -2664
  14. package/dist/config/types.d.ts.map +1 -1
  15. package/dist/config/types.js +62 -7
  16. package/dist/config/types.js.map +1 -1
  17. package/dist/core/InventoryRebalancer.d.ts +13 -19
  18. package/dist/core/InventoryRebalancer.d.ts.map +1 -1
  19. package/dist/core/InventoryRebalancer.js +404 -276
  20. package/dist/core/InventoryRebalancer.js.map +1 -1
  21. package/dist/core/InventoryRebalancer.test.js +814 -25
  22. package/dist/core/InventoryRebalancer.test.js.map +1 -1
  23. package/dist/core/Rebalancer.d.ts.map +1 -1
  24. package/dist/core/Rebalancer.js +12 -6
  25. package/dist/core/Rebalancer.js.map +1 -1
  26. package/dist/core/Rebalancer.test.js +51 -0
  27. package/dist/core/Rebalancer.test.js.map +1 -1
  28. package/dist/core/RebalancerOrchestrator.d.ts.map +1 -1
  29. package/dist/core/RebalancerOrchestrator.test.js +0 -1
  30. package/dist/core/RebalancerOrchestrator.test.js.map +1 -1
  31. package/dist/core/RebalancerService.d.ts.map +1 -1
  32. package/dist/core/RebalancerService.js +3 -2
  33. package/dist/core/RebalancerService.js.map +1 -1
  34. package/dist/core/RebalancerService.test.js +24 -0
  35. package/dist/core/RebalancerService.test.js.map +1 -1
  36. package/dist/e2e/fixtures/routes.d.ts +3 -3
  37. package/dist/e2e/fixtures/routes.d.ts.map +1 -1
  38. package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts.map +1 -1
  39. package/dist/e2e/harness/BaseLocalDeploymentManager.js +3 -2
  40. package/dist/e2e/harness/BaseLocalDeploymentManager.js.map +1 -1
  41. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts.map +1 -1
  42. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js.map +1 -1
  43. package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts.map +1 -1
  44. package/dist/e2e/harness/ForkIndexer.d.ts.map +1 -1
  45. package/dist/e2e/harness/ForkIndexer.js.map +1 -1
  46. package/dist/e2e/harness/LocalProvider.d.ts +3 -0
  47. package/dist/e2e/harness/LocalProvider.d.ts.map +1 -0
  48. package/dist/e2e/harness/LocalProvider.js +9 -0
  49. package/dist/e2e/harness/LocalProvider.js.map +1 -0
  50. package/dist/e2e/harness/LocalProvider.test.d.ts +2 -0
  51. package/dist/e2e/harness/LocalProvider.test.d.ts.map +1 -0
  52. package/dist/e2e/harness/LocalProvider.test.js +14 -0
  53. package/dist/e2e/harness/LocalProvider.test.js.map +1 -0
  54. package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts.map +1 -1
  55. package/dist/e2e/harness/MixedLocalDeploymentManager.js.map +1 -1
  56. package/dist/e2e/harness/MockExplorerClient.d.ts.map +1 -1
  57. package/dist/e2e/harness/MockExplorerClient.js.map +1 -1
  58. package/dist/e2e/harness/MockExternalBridge.d.ts.map +1 -1
  59. package/dist/e2e/harness/MockExternalBridge.js.map +1 -1
  60. package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts.map +1 -1
  61. package/dist/e2e/harness/NativeLocalDeploymentManager.js +2 -1
  62. package/dist/e2e/harness/NativeLocalDeploymentManager.js.map +1 -1
  63. package/dist/e2e/harness/SnapshotHelper.d.ts.map +1 -1
  64. package/dist/e2e/harness/SnapshotHelper.js +3 -5
  65. package/dist/e2e/harness/SnapshotHelper.js.map +1 -1
  66. package/dist/e2e/harness/TestHelpers.js +1 -2
  67. package/dist/e2e/harness/TestHelpers.js.map +1 -1
  68. package/dist/e2e/harness/TestRebalancer.d.ts +5 -1
  69. package/dist/e2e/harness/TestRebalancer.d.ts.map +1 -1
  70. package/dist/e2e/harness/TestRebalancer.js +14 -4
  71. package/dist/e2e/harness/TestRebalancer.js.map +1 -1
  72. package/dist/e2e/relayer-denylist.e2e-test.d.ts +2 -0
  73. package/dist/e2e/relayer-denylist.e2e-test.d.ts.map +1 -0
  74. package/dist/e2e/relayer-denylist.e2e-test.js +388 -0
  75. package/dist/e2e/relayer-denylist.e2e-test.js.map +1 -0
  76. package/dist/factories/RebalancerContextFactory.d.ts.map +1 -1
  77. package/dist/factories/RebalancerContextFactory.js +61 -31
  78. package/dist/factories/RebalancerContextFactory.js.map +1 -1
  79. package/dist/factories/RebalancerContextFactory.test.js +336 -5
  80. package/dist/factories/RebalancerContextFactory.test.js.map +1 -1
  81. package/dist/index.d.ts +2 -2
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +1 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/interfaces/IRebalancer.d.ts +4 -2
  86. package/dist/interfaces/IRebalancer.d.ts.map +1 -1
  87. package/dist/metrics/Metrics.d.ts.map +1 -1
  88. package/dist/metrics/Metrics.js +1 -1
  89. package/dist/metrics/Metrics.js.map +1 -1
  90. package/dist/metrics/PriceGetter.d.ts +1 -0
  91. package/dist/metrics/PriceGetter.d.ts.map +1 -1
  92. package/dist/metrics/PriceGetter.js +14 -4
  93. package/dist/metrics/PriceGetter.js.map +1 -1
  94. package/dist/metrics/PriceGetter.test.d.ts +2 -0
  95. package/dist/metrics/PriceGetter.test.d.ts.map +1 -0
  96. package/dist/metrics/PriceGetter.test.js +84 -0
  97. package/dist/metrics/PriceGetter.test.js.map +1 -0
  98. package/dist/metrics/scripts/metrics.d.ts +4 -4
  99. package/dist/monitor/Monitor.d.ts +1 -0
  100. package/dist/monitor/Monitor.d.ts.map +1 -1
  101. package/dist/monitor/Monitor.js +55 -46
  102. package/dist/monitor/Monitor.js.map +1 -1
  103. package/dist/monitor/Monitor.test.d.ts +2 -0
  104. package/dist/monitor/Monitor.test.d.ts.map +1 -0
  105. package/dist/monitor/Monitor.test.js +346 -0
  106. package/dist/monitor/Monitor.test.js.map +1 -0
  107. package/dist/service.d.ts +1 -1
  108. package/dist/service.d.ts.map +1 -1
  109. package/dist/service.js +9 -5
  110. package/dist/service.js.map +1 -1
  111. package/dist/strategy/BaseStrategy.d.ts.map +1 -1
  112. package/dist/strategy/BaseStrategy.js +13 -11
  113. package/dist/strategy/BaseStrategy.js.map +1 -1
  114. package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -1
  115. package/dist/strategy/CollateralDeficitStrategy.js +2 -2
  116. package/dist/strategy/CollateralDeficitStrategy.js.map +1 -1
  117. package/dist/strategy/CompositeStrategy.d.ts.map +1 -1
  118. package/dist/strategy/CompositeStrategy.js.map +1 -1
  119. package/dist/strategy/CompositeStrategy.test.js.map +1 -1
  120. package/dist/strategy/MinAmountStrategy.d.ts +1 -0
  121. package/dist/strategy/MinAmountStrategy.d.ts.map +1 -1
  122. package/dist/strategy/MinAmountStrategy.js +12 -8
  123. package/dist/strategy/MinAmountStrategy.js.map +1 -1
  124. package/dist/strategy/MinAmountStrategy.test.js +189 -2
  125. package/dist/strategy/MinAmountStrategy.test.js.map +1 -1
  126. package/dist/strategy/StrategyFactory.d.ts.map +1 -1
  127. package/dist/strategy/StrategyFactory.js.map +1 -1
  128. package/dist/strategy/WeightedStrategy.d.ts.map +1 -1
  129. package/dist/test/helpers.d.ts +11 -3
  130. package/dist/test/helpers.d.ts.map +1 -1
  131. package/dist/test/helpers.js +9 -11
  132. package/dist/test/helpers.js.map +1 -1
  133. package/dist/test/lifiMocks.d.ts +6 -6
  134. package/dist/test/lifiMocks.d.ts.map +1 -1
  135. package/dist/test/lifiMocks.js +5 -2
  136. package/dist/test/lifiMocks.js.map +1 -1
  137. package/dist/test/pendingTransferMiddlewareMocks.d.ts +17 -0
  138. package/dist/test/pendingTransferMiddlewareMocks.d.ts.map +1 -0
  139. package/dist/test/pendingTransferMiddlewareMocks.js +43 -0
  140. package/dist/test/pendingTransferMiddlewareMocks.js.map +1 -0
  141. package/dist/tracking/ActionTracker.d.ts +4 -0
  142. package/dist/tracking/ActionTracker.d.ts.map +1 -1
  143. package/dist/tracking/ActionTracker.js +76 -9
  144. package/dist/tracking/ActionTracker.js.map +1 -1
  145. package/dist/tracking/ActionTracker.test.js +418 -1
  146. package/dist/tracking/ActionTracker.test.js.map +1 -1
  147. package/dist/tracking/IActionTracker.d.ts +4 -2
  148. package/dist/tracking/IActionTracker.d.ts.map +1 -1
  149. package/dist/tracking/InflightContextAdapter.d.ts.map +1 -1
  150. package/dist/tracking/InflightContextAdapter.js.map +1 -1
  151. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.d.ts +64 -0
  152. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.d.ts.map +1 -0
  153. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.js +474 -0
  154. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.js.map +1 -0
  155. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.d.ts +2 -0
  156. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.d.ts.map +1 -0
  157. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.js +1168 -0
  158. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.js.map +1 -0
  159. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.d.ts +61 -0
  160. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.d.ts.map +1 -0
  161. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.js +160 -0
  162. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.js.map +1 -0
  163. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.d.ts +2 -0
  164. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.d.ts.map +1 -0
  165. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.js +369 -0
  166. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.js.map +1 -0
  167. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.d.ts +60 -0
  168. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.d.ts.map +1 -0
  169. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.js +288 -0
  170. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.js.map +1 -0
  171. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.d.ts +2 -0
  172. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.d.ts.map +1 -0
  173. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.js +606 -0
  174. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.js.map +1 -0
  175. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.d.ts +25 -0
  176. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.d.ts.map +1 -0
  177. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js +41 -0
  178. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js.map +1 -0
  179. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.d.ts +2 -0
  180. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.d.ts.map +1 -0
  181. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.js +141 -0
  182. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.js.map +1 -0
  183. package/dist/tracking/pendingTransferMiddlewares/matchBody.d.ts +12 -0
  184. package/dist/tracking/pendingTransferMiddlewares/matchBody.d.ts.map +1 -0
  185. package/dist/tracking/pendingTransferMiddlewares/matchBody.js +29 -0
  186. package/dist/tracking/pendingTransferMiddlewares/matchBody.js.map +1 -0
  187. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.d.ts +59 -0
  188. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.d.ts.map +1 -0
  189. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.js +661 -0
  190. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.js.map +1 -0
  191. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.d.ts +2 -0
  192. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.d.ts.map +1 -0
  193. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.js +1093 -0
  194. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.js.map +1 -0
  195. package/dist/tracking/pendingTransferMiddlewares/types.d.ts +2 -0
  196. package/dist/tracking/pendingTransferMiddlewares/types.d.ts.map +1 -0
  197. package/dist/tracking/pendingTransferMiddlewares/types.js +4 -0
  198. package/dist/tracking/pendingTransferMiddlewares/types.js.map +1 -0
  199. package/dist/tracking/store/InMemoryStore.d.ts.map +1 -1
  200. package/dist/utils/ExplorerClient.d.ts +1 -0
  201. package/dist/utils/ExplorerClient.d.ts.map +1 -1
  202. package/dist/utils/ExplorerClient.js +8 -3
  203. package/dist/utils/ExplorerClient.js.map +1 -1
  204. package/dist/utils/ExplorerClient.test.js +25 -0
  205. package/dist/utils/ExplorerClient.test.js.map +1 -1
  206. package/dist/utils/balanceUtils.d.ts +7 -1
  207. package/dist/utils/balanceUtils.d.ts.map +1 -1
  208. package/dist/utils/balanceUtils.js +39 -1
  209. package/dist/utils/balanceUtils.js.map +1 -1
  210. package/dist/utils/balanceUtils.test.js +55 -1
  211. package/dist/utils/balanceUtils.test.js.map +1 -1
  212. package/dist/utils/blockTag.d.ts +5 -4
  213. package/dist/utils/blockTag.d.ts.map +1 -1
  214. package/dist/utils/blockTag.js +26 -10
  215. package/dist/utils/blockTag.js.map +1 -1
  216. package/dist/utils/blockTag.test.d.ts +2 -0
  217. package/dist/utils/blockTag.test.d.ts.map +1 -0
  218. package/dist/utils/blockTag.test.js +132 -0
  219. package/dist/utils/blockTag.test.js.map +1 -0
  220. package/dist/utils/bridgeUtils.js.map +1 -1
  221. package/dist/utils/errors.d.ts.map +1 -1
  222. package/dist/utils/gasEstimation.d.ts +2 -1
  223. package/dist/utils/gasEstimation.d.ts.map +1 -1
  224. package/dist/utils/gasEstimation.js +16 -13
  225. package/dist/utils/gasEstimation.js.map +1 -1
  226. package/dist/utils/gasEstimation.test.d.ts +2 -0
  227. package/dist/utils/gasEstimation.test.d.ts.map +1 -0
  228. package/dist/utils/gasEstimation.test.js +104 -0
  229. package/dist/utils/gasEstimation.test.js.map +1 -0
  230. package/dist/utils/tokenUtils.d.ts.map +1 -1
  231. package/dist/utils/tokenUtils.js +5 -2
  232. package/dist/utils/tokenUtils.js.map +1 -1
  233. package/package.json +23 -22
  234. package/src/bridges/LiFiBridge.test.ts +270 -0
  235. package/src/bridges/LiFiBridge.ts +90 -71
  236. package/src/config/RebalancerConfig.test.ts +315 -1
  237. package/src/config/RebalancerConfig.ts +6 -3
  238. package/src/config/types.ts +98 -8
  239. package/src/core/InventoryRebalancer.test.ts +1092 -38
  240. package/src/core/InventoryRebalancer.ts +584 -351
  241. package/src/core/Rebalancer.test.ts +84 -0
  242. package/src/core/Rebalancer.ts +22 -6
  243. package/src/core/RebalancerOrchestrator.test.ts +0 -1
  244. package/src/core/RebalancerService.test.ts +35 -0
  245. package/src/core/RebalancerService.ts +3 -2
  246. package/src/e2e/harness/BaseLocalDeploymentManager.ts +3 -1
  247. package/src/e2e/harness/LocalProvider.test.ts +16 -0
  248. package/src/e2e/harness/LocalProvider.ts +10 -0
  249. package/src/e2e/harness/NativeLocalDeploymentManager.ts +2 -1
  250. package/src/e2e/harness/SnapshotHelper.ts +2 -5
  251. package/src/e2e/harness/TestHelpers.ts +3 -3
  252. package/src/e2e/harness/TestRebalancer.ts +21 -1
  253. package/src/e2e/relayer-denylist.e2e-test.ts +558 -0
  254. package/src/factories/RebalancerContextFactory.test.ts +489 -8
  255. package/src/factories/RebalancerContextFactory.ts +86 -36
  256. package/src/index.ts +2 -0
  257. package/src/interfaces/IRebalancer.ts +4 -1
  258. package/src/metrics/Metrics.ts +1 -0
  259. package/src/metrics/PriceGetter.test.ts +113 -0
  260. package/src/metrics/PriceGetter.ts +18 -3
  261. package/src/monitor/Monitor.test.ts +408 -0
  262. package/src/monitor/Monitor.ts +123 -97
  263. package/src/service.ts +14 -8
  264. package/src/strategy/BaseStrategy.ts +18 -15
  265. package/src/strategy/CollateralDeficitStrategy.ts +4 -3
  266. package/src/strategy/MinAmountStrategy.test.ts +238 -2
  267. package/src/strategy/MinAmountStrategy.ts +29 -17
  268. package/src/test/helpers.ts +13 -12
  269. package/src/test/lifiMocks.ts +5 -2
  270. package/src/test/pendingTransferMiddlewareMocks.ts +65 -0
  271. package/src/tracking/ActionTracker.test.ts +635 -3
  272. package/src/tracking/ActionTracker.ts +92 -12
  273. package/src/tracking/IActionTracker.ts +4 -2
  274. package/src/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.ts +1693 -0
  275. package/src/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.ts +784 -0
  276. package/src/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.ts +554 -0
  277. package/src/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.ts +233 -0
  278. package/src/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.ts +894 -0
  279. package/src/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.ts +404 -0
  280. package/src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.ts +205 -0
  281. package/src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.ts +89 -0
  282. package/src/tracking/pendingTransferMiddlewares/fixtures/mainnet-denylist.json +3556 -0
  283. package/src/tracking/pendingTransferMiddlewares/matchBody.ts +43 -0
  284. package/src/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.ts +1220 -0
  285. package/src/tracking/pendingTransferMiddlewares/relayerDenylistRules.ts +934 -0
  286. package/src/tracking/pendingTransferMiddlewares/types.ts +3 -0
  287. package/src/utils/ExplorerClient.test.ts +42 -0
  288. package/src/utils/ExplorerClient.ts +14 -3
  289. package/src/utils/balanceUtils.test.ts +87 -1
  290. package/src/utils/balanceUtils.ts +73 -2
  291. package/src/utils/blockTag.test.ts +173 -0
  292. package/src/utils/blockTag.ts +35 -15
  293. package/src/utils/gasEstimation.test.ts +192 -0
  294. package/src/utils/gasEstimation.ts +17 -11
  295. package/src/utils/tokenUtils.ts +5 -2
@@ -0,0 +1,25 @@
1
+ import type { Logger } from 'pino';
2
+ import type { MultiProvider } from '@humanode-hyperlane/sdk';
3
+ import { type PendingTransferMiddlewareConfig } from '../../config/types.js';
4
+ import type { IExplorerClient } from '../../utils/ExplorerClient.js';
5
+ export interface PendingTransferMiddlewareDeps {
6
+ routersByDomain: Record<number, string>;
7
+ mailboxByDomain: Record<number, string>;
8
+ multiProvider: MultiProvider;
9
+ logger: Logger;
10
+ }
11
+ export interface PendingTransferMiddlewares {
12
+ client: IExplorerClient;
13
+ /** Set only when at least one middleware is configured. */
14
+ isIgnoredTransfer?: (messageId: string) => boolean;
15
+ /** Set only when at least one middleware is configured. */
16
+ isIgnoredRebalanceAction?: (messageId: string) => boolean;
17
+ }
18
+ /**
19
+ * Wraps `inner` with one middleware per configured item. Item 0 is the
20
+ * innermost middleware, so it sees the raw Explorer result first and each
21
+ * later item sees only what the earlier ones kept. With no items, `inner` is
22
+ * returned unchanged.
23
+ */
24
+ export declare function buildPendingTransferMiddlewares(inner: IExplorerClient, configs: PendingTransferMiddlewareConfig[], deps: PendingTransferMiddlewareDeps): Promise<PendingTransferMiddlewares>;
25
+ //# sourceMappingURL=buildPendingTransferMiddlewares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPendingTransferMiddlewares.d.ts","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EACL,KAAK,+BAA+B,EAErC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,MAAM,WAAW,6BAA6B;IAC5C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,eAAe,CAAC;IACxB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,2DAA2D;IAC3D,wBAAwB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3D;AA+BD;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,+BAA+B,EAAE,EAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,0BAA0B,CAAC,CAoBrC"}
@@ -0,0 +1,41 @@
1
+ import { PendingTransferMiddlewareType, } from '../../config/types.js';
2
+ import { BlacklistIsmMiddleware } from './BlacklistIsmMiddleware.js';
3
+ import { RelayerDenylistMiddleware } from './RelayerDenylistMiddleware.js';
4
+ function createMiddleware(config, inner, deps) {
5
+ switch (config.type) {
6
+ case PendingTransferMiddlewareType.RelayerDenylist:
7
+ return RelayerDenylistMiddleware.create(inner, {
8
+ url: config.url,
9
+ refreshIntervalMs: config.refreshIntervalSecs * 1_000,
10
+ }, deps.logger);
11
+ case PendingTransferMiddlewareType.BlacklistIsm:
12
+ return BlacklistIsmMiddleware.create(inner, {
13
+ refreshIntervalMs: config.refreshIntervalSecs * 1_000,
14
+ routersByDomain: deps.routersByDomain,
15
+ mailboxByDomain: deps.mailboxByDomain,
16
+ multiProvider: deps.multiProvider,
17
+ }, deps.logger);
18
+ }
19
+ }
20
+ /**
21
+ * Wraps `inner` with one middleware per configured item. Item 0 is the
22
+ * innermost middleware, so it sees the raw Explorer result first and each
23
+ * later item sees only what the earlier ones kept. With no items, `inner` is
24
+ * returned unchanged.
25
+ */
26
+ export async function buildPendingTransferMiddlewares(inner, configs, deps) {
27
+ let outermost;
28
+ for (const config of configs) {
29
+ outermost = await createMiddleware(config, outermost ?? inner, deps);
30
+ }
31
+ if (!outermost)
32
+ return { client: inner };
33
+ deps.logger.info({ middlewares: configs.map((config) => config.type) }, 'Pending transfer middlewares enabled');
34
+ const client = outermost;
35
+ return {
36
+ client,
37
+ isIgnoredTransfer: (messageId) => client.isIgnored(messageId),
38
+ isIgnoredRebalanceAction: (messageId) => client.isIgnoredRebalanceAction(messageId),
39
+ };
40
+ }
41
+ //# sourceMappingURL=buildPendingTransferMiddlewares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPendingTransferMiddlewares.js","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAiB3E,SAAS,gBAAgB,CACvB,MAAuC,EACvC,KAAsB,EACtB,IAAmC;IAEnC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,6BAA6B,CAAC,eAAe;YAChD,OAAO,yBAAyB,CAAC,MAAM,CACrC,KAAK,EACL;gBACE,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,GAAG,KAAK;aACtD,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,KAAK,6BAA6B,CAAC,YAAY;YAC7C,OAAO,sBAAsB,CAAC,MAAM,CAClC,KAAK,EACL;gBACE,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,GAAG,KAAK;gBACrD,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;IACN,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,KAAsB,EACtB,OAA0C,EAC1C,IAAmC;IAEnC,IAAI,SAAgD,CAAC;IACrD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,SAAS,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAEzC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EACrD,sCAAsC,CACvC,CAAC;IAEF,MAAM,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO;QACL,MAAM;QACN,iBAAiB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;QAC7D,wBAAwB,EAAE,CAAC,SAAS,EAAE,EAAE,CACtC,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC;KAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=buildPendingTransferMiddlewares.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPendingTransferMiddlewares.test.d.ts","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,141 @@
1
+ import { expect } from 'chai';
2
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { pathToFileURL } from 'node:url';
6
+ import { pino } from 'pino';
7
+ import Sinon from 'sinon';
8
+ import { MultiProvider } from '@humanode-hyperlane/sdk';
9
+ import { ProtocolType, assert } from '@humanode-hyperlane/utils';
10
+ import { PendingTransferMiddlewareType, } from '../../config/types.js';
11
+ import { ID_A, ID_B, ID_C, PARAMS, REBALANCE_PARAMS, StubExplorerClient, buildMessage, } from '../../test/pendingTransferMiddlewareMocks.js';
12
+ import { INITIAL_LOAD_RETRY_DELAY_MS } from './RelayerDenylistMiddleware.js';
13
+ import { buildPendingTransferMiddlewares, } from './buildPendingTransferMiddlewares.js';
14
+ describe('buildPendingTransferMiddlewares', () => {
15
+ const logger = pino({ level: 'silent' });
16
+ let deps;
17
+ beforeEach(() => {
18
+ const multiProvider = Sinon.createStubInstance(MultiProvider);
19
+ multiProvider.getProtocol.returns(ProtocolType.Ethereum);
20
+ multiProvider.getProvider.throws(new Error('No provider in this test'));
21
+ deps = {
22
+ routersByDomain: { 1: '0x67899664446ccfadf75e0d3f5668be262acd1069' },
23
+ mailboxByDomain: { 1: '0xc005dc82818d67af737725bd4bf75435d065d239' },
24
+ multiProvider,
25
+ logger,
26
+ };
27
+ });
28
+ it('returns the inner client unchanged when no middlewares are configured', async () => {
29
+ const inner = new StubExplorerClient([]);
30
+ const result = await buildPendingTransferMiddlewares(inner, [], deps);
31
+ expect(result.client).to.equal(inner);
32
+ expect(result.isIgnoredTransfer).to.equal(undefined);
33
+ expect(result.isIgnoredRebalanceAction).to.equal(undefined);
34
+ });
35
+ it('builds layers in config order and unions their ignored ids', async () => {
36
+ const dir = mkdtempSync(join(tmpdir(), 'pending-transfer-middlewares-'));
37
+ try {
38
+ const writeDenylist = (name, ids) => {
39
+ const path = join(dir, `${name}.json`);
40
+ writeFileSync(path, JSON.stringify({
41
+ rules: ids.map((messageId) => ({
42
+ reason: name,
43
+ addedBy: 'tester',
44
+ match: { messageId },
45
+ })),
46
+ }));
47
+ return pathToFileURL(path).href;
48
+ };
49
+ const configs = [
50
+ {
51
+ type: PendingTransferMiddlewareType.RelayerDenylist,
52
+ url: writeDenylist('first', [ID_A, ID_B]),
53
+ refreshIntervalSecs: 60,
54
+ },
55
+ {
56
+ type: PendingTransferMiddlewareType.RelayerDenylist,
57
+ url: writeDenylist('second', [ID_A]),
58
+ refreshIntervalSecs: 60,
59
+ },
60
+ ];
61
+ const inner = new StubExplorerClient([
62
+ buildMessage(ID_A),
63
+ buildMessage(ID_B),
64
+ buildMessage(ID_C),
65
+ ]);
66
+ const queryLogger = pino({ level: 'silent' });
67
+ const info = Sinon.spy(queryLogger, 'info');
68
+ inner.rebalanceActions = [buildMessage(ID_B), buildMessage(ID_C)];
69
+ const { client, isIgnoredTransfer, isIgnoredRebalanceAction } = await buildPendingTransferMiddlewares(inner, configs, deps);
70
+ const result = await client.getInflightUserTransfers(PARAMS, queryLogger);
71
+ const rebalanceActions = await client.getInflightRebalanceActions(REBALANCE_PARAMS, queryLogger);
72
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_C]);
73
+ // Item 0 is innermost, so it sees ID_A first and records its reason.
74
+ const ignoredLogs = info
75
+ .getCalls()
76
+ .filter((call) => call.args.includes('Ignoring pending transfer'));
77
+ expect(ignoredLogs).to.have.lengthOf(2);
78
+ for (const id of [ID_A, ID_B]) {
79
+ expect(info.calledWith(Sinon.match({ msgId: id, reason: 'first (added by tester)' }), 'Ignoring pending transfer')).to.be.true;
80
+ }
81
+ assert(isIgnoredTransfer, 'Expected an ignored-transfer predicate');
82
+ expect(isIgnoredTransfer(ID_A)).to.be.true;
83
+ expect(isIgnoredTransfer(ID_B)).to.be.true;
84
+ expect(isIgnoredTransfer(ID_C)).to.be.false;
85
+ expect(rebalanceActions.map((msg) => msg.msg_id)).to.deep.equal([
86
+ ID_B,
87
+ ID_C,
88
+ ]);
89
+ assert(isIgnoredRebalanceAction, 'Expected an ignored-rebalance-action predicate');
90
+ expect(isIgnoredRebalanceAction(ID_B)).to.be.true;
91
+ expect(isIgnoredRebalanceAction(ID_C)).to.be.false;
92
+ }
93
+ finally {
94
+ rmSync(dir, { recursive: true, force: true });
95
+ }
96
+ });
97
+ it('fails when the BlacklistIsm trees cannot be resolved at startup', async () => {
98
+ const inner = new StubExplorerClient([]);
99
+ const configs = [
100
+ {
101
+ type: PendingTransferMiddlewareType.BlacklistIsm,
102
+ refreshIntervalSecs: 600,
103
+ },
104
+ ];
105
+ const error = await buildPendingTransferMiddlewares(inner, configs, deps).then(() => expect.fail('Expected buildPendingTransferMiddlewares to throw'), (err) => err);
106
+ expect(error).to.be.instanceOf(Error);
107
+ if (error instanceof Error) {
108
+ expect(error.message).to.equal('Failed to resolve the ISM of router 0x67899664446ccfadf75e0d3f5668be262acd1069 on domain 1: No provider in this test');
109
+ }
110
+ });
111
+ it('fails when a relayer denylist cannot be loaded at startup', async () => {
112
+ const inner = new StubExplorerClient([]);
113
+ const configs = [
114
+ {
115
+ type: PendingTransferMiddlewareType.RelayerDenylist,
116
+ url: 'https://example.com/denylist.json',
117
+ refreshIntervalSecs: 60,
118
+ },
119
+ ];
120
+ // Startup retries a failed fetch after a delay; a stubbed fetch keeps
121
+ // the faked delays off real I/O.
122
+ const clock = Sinon.useFakeTimers({
123
+ toFake: ['setTimeout', 'clearTimeout'],
124
+ });
125
+ const fetchStub = Sinon.stub(globalThis, 'fetch').rejects(new Error('getaddrinfo ENOTFOUND example.com'));
126
+ try {
127
+ const result = buildPendingTransferMiddlewares(inner, configs, deps).then(() => expect.fail('Expected buildPendingTransferMiddlewares to throw'), (err) => err);
128
+ await clock.tickAsync(2 * INITIAL_LOAD_RETRY_DELAY_MS);
129
+ const error = await result;
130
+ expect(error).to.be.instanceOf(Error);
131
+ if (error instanceof Error) {
132
+ expect(error.message).to.equal('Failed to load relayer denylist from https://example.com/denylist.json (fetch_failed): getaddrinfo ENOTFOUND example.com');
133
+ }
134
+ }
135
+ finally {
136
+ fetchStub.restore();
137
+ clock.restore();
138
+ }
139
+ });
140
+ });
141
+ //# sourceMappingURL=buildPendingTransferMiddlewares.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildPendingTransferMiddlewares.test.js","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Returns the lowercase hex (without 0x) of the address a `matchBody: true`
3
+ * rule scans message bodies for. Like the relayer, only 20-byte EVM hex
4
+ * addresses may opt in.
5
+ */
6
+ export declare function parseMatchBodyAddress(address: string, matchBody: boolean | undefined): string | undefined;
7
+ /**
8
+ * Whether the message body contains the address at any byte boundary, like
9
+ * the relayer's `body.windows(20)` scan.
10
+ */
11
+ export declare function bodyContainsAddress(messageBody: string, addressHex: string): boolean;
12
+ //# sourceMappingURL=matchBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchBody.d.ts","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/matchBody.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,OAAO,GAAG,SAAS,GAC7B,MAAM,GAAG,SAAS,CASpB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAYT"}
@@ -0,0 +1,29 @@
1
+ import { ethers } from 'ethers';
2
+ import { strip0x } from '@humanode-hyperlane/utils';
3
+ /**
4
+ * Returns the lowercase hex (without 0x) of the address a `matchBody: true`
5
+ * rule scans message bodies for. Like the relayer, only 20-byte EVM hex
6
+ * addresses may opt in.
7
+ */
8
+ export function parseMatchBodyAddress(address, matchBody) {
9
+ if (matchBody !== true)
10
+ return undefined;
11
+ const trimmed = address.trim();
12
+ if (!ethers.utils.isHexString(trimmed, 20)) {
13
+ throw new Error('`matchBody` requires a 20-byte EVM hex address');
14
+ }
15
+ return strip0x(trimmed).toLowerCase();
16
+ }
17
+ /**
18
+ * Whether the message body contains the address at any byte boundary, like
19
+ * the relayer's `body.windows(20)` scan.
20
+ */
21
+ export function bodyContainsAddress(messageBody, addressHex) {
22
+ const body = strip0x(messageBody).toLowerCase();
23
+ for (let index = body.indexOf(addressHex); index !== -1; index = body.indexOf(addressHex, index + 1)) {
24
+ if (index % 2 === 0)
25
+ return true;
26
+ }
27
+ return false;
28
+ }
29
+ //# sourceMappingURL=matchBody.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchBody.js","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/matchBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAe,EACf,SAA8B;IAE9B,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;IAEhD,KACE,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EACpC,KAAK,KAAK,CAAC,CAAC,EACZ,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,EAC3C,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { RE2JS } from 're2js';
2
+ import type { ExplorerMessage } from '../../utils/ExplorerClient.js';
3
+ export declare const DenylistLoadFailure: {
4
+ readonly FetchFailed: 'fetch_failed';
5
+ readonly InvalidFile: 'invalid_file';
6
+ };
7
+ export type DenylistLoadFailure = (typeof DenylistLoadFailure)[keyof typeof DenylistLoadFailure];
8
+ export declare class DenylistLoadError extends Error {
9
+ readonly failure: DenylistLoadFailure;
10
+ constructor(failure: DenylistLoadFailure, message: string);
11
+ }
12
+ /** Unset fields are wildcards. Addresses and ids are lowercase bytes32 hex. */
13
+ export interface DenylistMatchRule {
14
+ reason: string;
15
+ expiresAt?: number;
16
+ messageIds?: ReadonlySet<string>;
17
+ originDomains?: ReadonlySet<number>;
18
+ senders?: ReadonlySet<string>;
19
+ destinationDomains?: ReadonlySet<number>;
20
+ recipients?: ReadonlySet<string>;
21
+ /** Tested, unanchored, against the lowercase hex body without 0x. */
22
+ bodyRegex?: RE2JS;
23
+ }
24
+ export interface DenylistAddressRule {
25
+ reason: string;
26
+ expiresAt?: number;
27
+ address: string;
28
+ /** Set by `matchBody: true`: lowercase 20-byte hex searched in the body. */
29
+ bodyAddress?: string;
30
+ }
31
+ export interface DenylistRules {
32
+ matchRules: DenylistMatchRule[];
33
+ addressRules: DenylistAddressRule[];
34
+ }
35
+ /** Returns epoch milliseconds, or undefined if not an RFC 3339 timestamp. */
36
+ export declare function parseRfc3339(value: string): number | undefined;
37
+ /**
38
+ * Parses an address the way the relayer's `hex_or_base58_or_bech32_to_h256`
39
+ * does, plus its Tron checksum check, into lowercase bytes32 hex.
40
+ */
41
+ export declare function parseDenylistAddress(value: string): string;
42
+ /**
43
+ * Parses a runtime denylist file. Throws a `DenylistLoadError` if any rule is
44
+ * invalid. Expired rules are kept and skipped at match time.
45
+ */
46
+ export declare function parseDenylistFile(text: string): DenylistRules;
47
+ /**
48
+ * Returns the reason of the first active rule that denies the message, like
49
+ * the relayer: `match` rules first, then `address` rules against the sender,
50
+ * the recipient, the warp transfer recipient (first 32 body bytes), the
51
+ * origin tx sender and, for `matchBody` rules, anywhere in the body.
52
+ */
53
+ export declare function findDenyReason(rules: DenylistRules, msg: ExplorerMessage, nowMs: number): string | undefined;
54
+ /**
55
+ * Returns the reason of the first active `match` rule that sets only
56
+ * `messageId` and lists the message. Other rules are ignored.
57
+ */
58
+ export declare function findMessageIdDenyReason(rules: DenylistRules, messageId: string, nowMs: number): string | undefined;
59
+ //# sourceMappingURL=relayerDenylistRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayerDenylistRules.d.ts","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/relayerDenylistRules.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAgB9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AASrE,eAAO,MAAM,mBAAmB;aAC9B,WAAW,EAAE,cAAc;aAC3B,WAAW,EAAE,cAAc;CACnB,CAAC;AACX,MAAM,MAAM,mBAAmB,GAC7B,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjE,qBAAa,iBAAkB,SAAQ,KAAK;IAExC,QAAQ,CAAC,OAAO,EAAE,mBAAmB;IADvC,YACW,OAAO,EAAE,mBAAmB,EACrC,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,qEAAqE;IACrE,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAyBD,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA4D9D;AAuFD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA8B1D;AA+hBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA+B7D;AAaD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,SAAS,CAiCpB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,SAAS,CAapB"}