@humanode-hyperlane/rebalancer 27.2.2 → 1029.1.0

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,369 @@
1
+ import chai, { expect } from 'chai';
2
+ import chaiAsPromised from 'chai-as-promised';
3
+ import { pino } from 'pino';
4
+ import Sinon from 'sinon';
5
+ import { assert } from '@humanode-hyperlane/utils';
6
+ import { ID_A, ID_B, ID_C, PARAMS, REBALANCE_PARAMS, StubExplorerClient, buildMessage, } from '../../test/pendingTransferMiddlewareMocks.js';
7
+ import { ExplorerRowLimitError, MAX_EXPLORER_QUERY_LIMIT, PENDING_TRANSFER_MIDDLEWARE_FAILED_MESSAGE, PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE, PendingTransferMiddleware, } from './PendingTransferMiddleware.js';
8
+ chai.use(chaiAsPromised);
9
+ /** Returns the first `limit` messages, newest first, like the Explorer. */
10
+ class PagedExplorerClient {
11
+ newestFirst;
12
+ limits = [];
13
+ constructor(newestFirst) {
14
+ this.newestFirst = newestFirst;
15
+ }
16
+ async getInflightUserTransfers(params, _logger) {
17
+ assert(params.limit !== undefined, 'Expected an explicit limit');
18
+ this.limits.push(params.limit);
19
+ return this.newestFirst.slice(0, params.limit);
20
+ }
21
+ async getInflightRebalanceActions(_params, _logger) {
22
+ return [];
23
+ }
24
+ }
25
+ function messageId(index) {
26
+ return `0x${index.toString(16).padStart(64, '0')}`;
27
+ }
28
+ /** Ignores a fixed set of ids and records what it was shown. */
29
+ class StaticMiddleware extends PendingTransferMiddleware {
30
+ ignoredIds;
31
+ seen = [];
32
+ constructor(inner, name, ignoredIds) {
33
+ super(inner, name);
34
+ this.ignoredIds = ignoredIds;
35
+ }
36
+ async findIgnored(messages) {
37
+ this.seen.push(messages.map((msg) => msg.msg_id));
38
+ const ignoredIds = new Set(this.ignoredIds);
39
+ return new Map(messages
40
+ .filter((msg) => ignoredIds.has(msg.msg_id))
41
+ .map((msg) => [msg.msg_id, `${this.name} reason`]));
42
+ }
43
+ }
44
+ class ThrowingMiddleware extends PendingTransferMiddleware {
45
+ constructor(inner) {
46
+ super(inner, 'throwing');
47
+ }
48
+ async findIgnored() {
49
+ throw new Error('boom');
50
+ }
51
+ }
52
+ describe('PendingTransferMiddleware', () => {
53
+ let logger;
54
+ let info;
55
+ let warn;
56
+ let inner;
57
+ beforeEach(() => {
58
+ logger = pino({ level: 'silent' });
59
+ info = Sinon.spy(logger, 'info');
60
+ warn = Sinon.spy(logger, 'warn');
61
+ inner = new StubExplorerClient([
62
+ buildMessage(ID_A),
63
+ buildMessage(ID_B),
64
+ buildMessage(ID_C),
65
+ ]);
66
+ });
67
+ it('chains middlewares so later ones only see what earlier ones kept', async () => {
68
+ const innerLayer = new StaticMiddleware(inner, 'first', [ID_A]);
69
+ const outerLayer = new StaticMiddleware(innerLayer, 'second', [ID_B]);
70
+ const result = await outerLayer.getInflightUserTransfers(PARAMS, logger);
71
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_C]);
72
+ expect(innerLayer.seen).to.deep.equal([[ID_A, ID_B, ID_C]]);
73
+ expect(outerLayer.seen).to.deep.equal([[ID_B, ID_C]]);
74
+ expect(innerLayer.isIgnored(ID_A)).to.be.true;
75
+ expect(innerLayer.isIgnored(ID_B)).to.be.false;
76
+ expect(outerLayer.isIgnored(ID_B.toUpperCase().replace('0X', '0x'))).to.be
77
+ .true;
78
+ expect(outerLayer.isIgnored(ID_A)).to.be.true;
79
+ expect(outerLayer.isIgnored(ID_C)).to.be.false;
80
+ });
81
+ it('reports ids an inner middleware ignored through an outer one that ignores nothing', async () => {
82
+ const innerLayer = new StaticMiddleware(inner, 'first', [ID_A]);
83
+ const outerLayer = new StaticMiddleware(innerLayer, 'second', []);
84
+ const result = await outerLayer.getInflightUserTransfers(PARAMS, logger);
85
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_B, ID_C]);
86
+ expect(outerLayer.isIgnored(ID_A)).to.be.true;
87
+ expect(outerLayer.isIgnored(ID_B)).to.be.false;
88
+ });
89
+ it('passes rebalance action queries through', async () => {
90
+ const client = new StaticMiddleware(inner, 'all', [ID_C]);
91
+ const result = await client.getInflightRebalanceActions({
92
+ bridges: [],
93
+ routersByDomain: PARAMS.routersByDomain,
94
+ rebalancerAddress: '0x995a921d333029512aa166885856c8af760e9381',
95
+ }, logger);
96
+ expect(result).to.equal(inner.rebalanceActions);
97
+ });
98
+ it('keeps every message and warns when the middleware throws', async () => {
99
+ const client = new ThrowingMiddleware(inner);
100
+ const result = await client.getInflightUserTransfers(PARAMS, logger);
101
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_A, ID_B, ID_C]);
102
+ expect(warn.callCount).to.equal(1);
103
+ expect(warn.firstCall.args).to.deep.equal([
104
+ { middleware: 'throwing', error: 'boom' },
105
+ PENDING_TRANSFER_MIDDLEWARE_FAILED_MESSAGE,
106
+ ]);
107
+ });
108
+ it('raises the limit it passes down by what each layer dropped', async () => {
109
+ const innerLayer = new StaticMiddleware(inner, 'first', [ID_A]);
110
+ const outerLayer = new StaticMiddleware(innerLayer, 'second', [ID_B]);
111
+ await outerLayer.getInflightUserTransfers(PARAMS, logger);
112
+ await outerLayer.getInflightUserTransfers({
113
+ routersByDomain: PARAMS.routersByDomain,
114
+ excludeTxSenders: PARAMS.excludeTxSenders,
115
+ limit: 10,
116
+ }, logger);
117
+ expect(inner.userTransferParams.map((params) => params.limit)).to.deep.equal([100, 12]);
118
+ expect(inner.userTransferParams[1].excludeTxSenders).to.deep.equal(PARAMS.excludeTxSenders);
119
+ });
120
+ it('logs each ignored message once until it stops being ignored', async () => {
121
+ const client = new StaticMiddleware(inner, 'first', [ID_A]);
122
+ await client.getInflightUserTransfers(PARAMS, logger);
123
+ await client.getInflightUserTransfers(PARAMS, logger);
124
+ expect(info.callCount).to.equal(1);
125
+ expect(info.firstCall.args).to.deep.equal([
126
+ {
127
+ msgId: ID_A,
128
+ origin: 42161,
129
+ destination: 1,
130
+ amount: '100',
131
+ middleware: 'first',
132
+ reason: 'first reason',
133
+ },
134
+ 'Ignoring pending transfer',
135
+ ]);
136
+ client.ignoredIds = [];
137
+ const result = await client.getInflightUserTransfers(PARAMS, logger);
138
+ expect(result).to.have.lengthOf(3);
139
+ expect(client.isIgnored(ID_A)).to.be.false;
140
+ expect(info.callCount).to.equal(2);
141
+ expect(info.secondCall.args[1]).to.equal('Pending transfer no longer ignored');
142
+ });
143
+ });
144
+ describe('PendingTransferMiddleware Explorer paging', () => {
145
+ let logger;
146
+ let warn;
147
+ beforeEach(() => {
148
+ logger = pino({ level: 'silent' });
149
+ warn = Sinon.spy(logger, 'warn');
150
+ });
151
+ function ignoredIds(count) {
152
+ return Array.from({ length: count }, (_, index) => messageId(index + 1));
153
+ }
154
+ it('re-queries with doubling limits until it keeps a transfer behind many ignored messages', async () => {
155
+ const ignored = ignoredIds(1_000);
156
+ const realTransfer = buildMessage(ID_A);
157
+ const inner = new PagedExplorerClient([
158
+ ...ignored.map(buildMessage),
159
+ realTransfer,
160
+ ]);
161
+ const middleware = new StaticMiddleware(inner, 'paging', ignored);
162
+ const result = await middleware.getInflightUserTransfers(PARAMS, logger);
163
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_A]);
164
+ expect(inner.limits).to.deep.equal([100, 200, 400, 800, 1_600]);
165
+ expect(middleware.isIgnored(messageId(1_000))).to.be.true;
166
+ expect(warn.called).to.be.false;
167
+ });
168
+ it('stops once the Explorer returns fewer rows than asked', async () => {
169
+ const ignored = ignoredIds(5);
170
+ const inner = new PagedExplorerClient([
171
+ ...ignored.map(buildMessage),
172
+ buildMessage(ID_A),
173
+ ]);
174
+ const middleware = new StaticMiddleware(inner, 'paging', ignored);
175
+ const result = await middleware.getInflightUserTransfers({
176
+ routersByDomain: PARAMS.routersByDomain,
177
+ excludeTxSenders: PARAMS.excludeTxSenders,
178
+ limit: 3,
179
+ }, logger);
180
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_A]);
181
+ expect(inner.limits).to.deep.equal([3, 6, 12]);
182
+ });
183
+ it('throws instead of returning a partial page past the row limit', async () => {
184
+ const ignored = ignoredIds(MAX_EXPLORER_QUERY_LIMIT + 100);
185
+ const inner = new PagedExplorerClient([
186
+ ...ignored.map(buildMessage),
187
+ buildMessage(ID_A),
188
+ ]);
189
+ const middleware = new StaticMiddleware(inner, 'paging', ignored);
190
+ const result = middleware.getInflightUserTransfers(PARAMS, logger);
191
+ await expect(result).to.be.rejectedWith(`${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware paging, requested 100, kept 0 of 25600 rows, limit 25600)`);
192
+ expect(inner.limits).to.deep.equal([
193
+ 100, 200, 400, 800, 1_600, 3_200, 6_400, 12_800, 25_600,
194
+ ]);
195
+ });
196
+ describe('after a query that ignored 13,000 transfers', () => {
197
+ let inner;
198
+ let middleware;
199
+ beforeEach(async () => {
200
+ const ignored = ignoredIds(13_000);
201
+ inner = new PagedExplorerClient([
202
+ ...ignored.map(buildMessage),
203
+ buildMessage(ID_A),
204
+ ]);
205
+ middleware = new StaticMiddleware(inner, 'paging', ignored);
206
+ await middleware.getInflightUserTransfers(PARAMS, logger);
207
+ inner.limits.length = 0;
208
+ });
209
+ it('raises the limit to the row cap rather than throwing', async () => {
210
+ const ignored = ignoredIds(13_050);
211
+ const realTransfers = Array.from({ length: 100 }, (_, index) => messageId(1_000_000 + index));
212
+ inner.newestFirst = [
213
+ ...ignored.map(buildMessage),
214
+ ...realTransfers.map(buildMessage),
215
+ ];
216
+ middleware.ignoredIds = ignored;
217
+ const result = await middleware.getInflightUserTransfers(PARAMS, logger);
218
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal(realTransfers);
219
+ expect(inner.limits).to.deep.equal([13_100, 25_600]);
220
+ });
221
+ it('throws only after a full page at the row cap', async () => {
222
+ const ignored = ignoredIds(MAX_EXPLORER_QUERY_LIMIT);
223
+ inner.newestFirst = [...ignored.map(buildMessage), buildMessage(ID_A)];
224
+ middleware.ignoredIds = ignored;
225
+ const result = middleware.getInflightUserTransfers(PARAMS, logger);
226
+ await expect(result).to.be.rejectedWith(`${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware paging, requested 100, kept 0 of 25600 rows, limit 25600)`);
227
+ expect(inner.limits).to.deep.equal([13_100, 25_600]);
228
+ });
229
+ });
230
+ describe('through stacked middlewares', () => {
231
+ function idRange(start, count) {
232
+ return Array.from({ length: count }, (_, index) => messageId(start + index));
233
+ }
234
+ const innerIdsStart = 1;
235
+ const outerIdsStart = 100_001;
236
+ const realIdsStart = 200_001;
237
+ const cases = [
238
+ { outerDrops: 12_750, innerDrops: 100 },
239
+ { outerDrops: 13_000, innerDrops: 500 },
240
+ { outerDrops: 24_000, innerDrops: 1_000 },
241
+ ];
242
+ for (const c of cases) {
243
+ it(`keeps transfers when the outer layer drops ${c.outerDrops} and the inner layer drops ${c.innerDrops}`, async () => {
244
+ const innerIds = idRange(innerIdsStart, c.innerDrops);
245
+ const outerIds = idRange(outerIdsStart, c.outerDrops);
246
+ const realIds = idRange(realIdsStart, 30_000);
247
+ const explorer = new PagedExplorerClient([...innerIds, ...outerIds, ...realIds].map(buildMessage));
248
+ const innerLayer = new StaticMiddleware(explorer, 'inner', innerIds);
249
+ const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
250
+ const result = await outerLayer.getInflightUserTransfers(PARAMS, logger);
251
+ expect(result).to.not.be.empty;
252
+ expect(result[0].msg_id).to.equal(realIds[0]);
253
+ expect(outerLayer.isIgnored(outerIds[0])).to.be.true;
254
+ expect(outerLayer.isIgnored(innerIds[0])).to.be.true;
255
+ expect(outerLayer.isIgnored(realIds[0])).to.be.false;
256
+ });
257
+ }
258
+ it('recovers when a policy refresh leaves the outer layer with a stale hint', async () => {
259
+ const outerIds = idRange(outerIdsStart, 25_000);
260
+ const innerIds = idRange(innerIdsStart, 1_000);
261
+ const realIds = idRange(realIdsStart, 30_000);
262
+ const explorer = new PagedExplorerClient([...outerIds, ...realIds].map(buildMessage));
263
+ const innerLayer = new StaticMiddleware(explorer, 'inner', []);
264
+ const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
265
+ const firstCycle = await outerLayer.getInflightUserTransfers(PARAMS, logger);
266
+ expect(firstCycle[0].msg_id).to.equal(realIds[0]);
267
+ explorer.newestFirst = [...innerIds, ...realIds].map(buildMessage);
268
+ innerLayer.ignoredIds = innerIds;
269
+ outerLayer.ignoredIds = [];
270
+ explorer.limits.length = 0;
271
+ const secondCycle = await outerLayer.getInflightUserTransfers(PARAMS, logger);
272
+ expect(secondCycle[0].msg_id).to.equal(realIds[0]);
273
+ expect(explorer.limits).to.deep.equal([25_100, 25_600]);
274
+ expect(outerLayer.isIgnored(innerIds[0])).to.be.true;
275
+ expect(outerLayer.isIgnored(outerIds[0])).to.be.false;
276
+ explorer.limits.length = 0;
277
+ const thirdCycle = await outerLayer.getInflightUserTransfers(PARAMS, logger);
278
+ expect(thirdCycle[0].msg_id).to.equal(realIds[0]);
279
+ expect(explorer.limits).to.deep.equal([1_100]);
280
+ });
281
+ it('stops reporting an id the inner layer no longer ignores once its capped page is used', async () => {
282
+ const outerIds = idRange(outerIdsStart, 25_000);
283
+ const innerIds = idRange(innerIdsStart, 1_000);
284
+ const realIds = idRange(realIdsStart, 30_000);
285
+ const explorer = new PagedExplorerClient([ID_A, ...outerIds, ...realIds].map(buildMessage));
286
+ const innerLayer = new StaticMiddleware(explorer, 'inner', [ID_A]);
287
+ const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
288
+ await outerLayer.getInflightUserTransfers(PARAMS, logger);
289
+ expect(outerLayer.isIgnored(ID_A)).to.be.true;
290
+ explorer.newestFirst = [...innerIds, ID_A, ...realIds].map(buildMessage);
291
+ innerLayer.ignoredIds = innerIds;
292
+ outerLayer.ignoredIds = [];
293
+ explorer.limits.length = 0;
294
+ const result = await outerLayer.getInflightUserTransfers(PARAMS, logger);
295
+ expect(explorer.limits).to.deep.equal([25_101, 25_600]);
296
+ expect(result[0].msg_id).to.equal(ID_A);
297
+ expect(outerLayer.isIgnored(ID_A)).to.be.false;
298
+ expect(outerLayer.isIgnored(innerIds[0])).to.be.true;
299
+ });
300
+ it('throws with the outer layer name when the inner capped page keeps too few', async () => {
301
+ const innerIds = idRange(innerIdsStart, 1_000);
302
+ const outerIds = idRange(outerIdsStart, 25_000);
303
+ const explorer = new PagedExplorerClient([...innerIds, ...outerIds, ID_A].map(buildMessage));
304
+ const innerLayer = new StaticMiddleware(explorer, 'inner', innerIds);
305
+ const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
306
+ const result = outerLayer.getInflightUserTransfers(PARAMS, logger);
307
+ await expect(result).to.be.rejectedWith(ExplorerRowLimitError, `${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware outer, requested 100, kept 0 of 24600 rows, limit 25600)`);
308
+ });
309
+ it('throws without raising its own limit when a capped inner page arrives below the row cap', async () => {
310
+ const hintIds = idRange(outerIdsStart, 1_000);
311
+ const explorer = new PagedExplorerClient([...hintIds, ...idRange(realIdsStart, 1_000)].map(buildMessage));
312
+ const innerLayer = new StaticMiddleware(explorer, 'inner', []);
313
+ const outerLayer = new StaticMiddleware(innerLayer, 'outer', hintIds);
314
+ await outerLayer.getInflightUserTransfers(PARAMS, logger);
315
+ const innerIds = idRange(innerIdsStart, 25_000);
316
+ const outerIds = idRange(outerIdsStart, 550);
317
+ explorer.newestFirst = [
318
+ ...innerIds,
319
+ ...outerIds,
320
+ ...idRange(realIdsStart, 1_000),
321
+ ].map(buildMessage);
322
+ innerLayer.ignoredIds = innerIds;
323
+ outerLayer.ignoredIds = outerIds;
324
+ explorer.limits.length = 0;
325
+ const result = outerLayer.getInflightUserTransfers(PARAMS, logger);
326
+ await expect(result).to.be.rejectedWith(ExplorerRowLimitError, `${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware outer, requested 100, kept 50 of 600 rows, limit 25600)`);
327
+ expect(explorer.limits).to.deep.equal([
328
+ 1_100, 2_200, 4_400, 8_800, 17_600, 25_600,
329
+ ]);
330
+ });
331
+ });
332
+ });
333
+ /** Also ignores a fixed set of rebalance message ids. */
334
+ class RebalanceIgnoringMiddleware extends StaticMiddleware {
335
+ ignoredRebalanceIds;
336
+ constructor(inner, ignoredRebalanceIds) {
337
+ super(inner, 'rebalance', []);
338
+ this.ignoredRebalanceIds = ignoredRebalanceIds;
339
+ }
340
+ isIgnoredRebalanceAction(messageId) {
341
+ return (this.ignoredRebalanceIds.includes(messageId) ||
342
+ super.isIgnoredRebalanceAction(messageId));
343
+ }
344
+ }
345
+ describe('PendingTransferMiddleware rebalance action queries', () => {
346
+ let logger;
347
+ let inner;
348
+ beforeEach(() => {
349
+ logger = pino({ level: 'silent' });
350
+ inner = new StubExplorerClient([buildMessage(ID_A)]);
351
+ inner.rebalanceActions = [buildMessage(ID_B), buildMessage(ID_C)];
352
+ });
353
+ it('passes rebalance messages through without evaluating them', async () => {
354
+ const client = new StaticMiddleware(inner, 'static', [ID_B]);
355
+ const result = await client.getInflightRebalanceActions(REBALANCE_PARAMS, logger);
356
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_B, ID_C]);
357
+ expect(client.seen).to.deep.equal([]);
358
+ expect(client.isIgnoredRebalanceAction(ID_B)).to.be.false;
359
+ });
360
+ it('reports rebalance messages an inner middleware ignores through an outer one', async () => {
361
+ const innerLayer = new RebalanceIgnoringMiddleware(inner, [ID_B]);
362
+ const outerLayer = new StaticMiddleware(innerLayer, 'other', [ID_C]);
363
+ const result = await outerLayer.getInflightRebalanceActions(REBALANCE_PARAMS, logger);
364
+ expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_B, ID_C]);
365
+ expect(outerLayer.isIgnoredRebalanceAction(ID_B)).to.be.true;
366
+ expect(outerLayer.isIgnoredRebalanceAction(ID_C)).to.be.false;
367
+ });
368
+ });
369
+ //# sourceMappingURL=PendingTransferMiddleware.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PendingTransferMiddleware.test.js","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { Logger } from 'pino';
2
+ import type { ExplorerMessage, IExplorerClient, RebalanceActionQueryParams } from '../../utils/ExplorerClient.js';
3
+ import { PendingTransferMiddleware } from './PendingTransferMiddleware.js';
4
+ export declare const FETCH_TIMEOUT_MS = 10000;
5
+ export declare const INITIAL_LOAD_RETRY_DELAY_MS = 2000;
6
+ /** The relayer's limit on a denylist file, in bytes. */
7
+ export declare const MAX_DENYLIST_FILE_BYTES: number;
8
+ export declare const RELAYER_DENYLIST_REFRESH_FAILED_MESSAGE = "Relayer denylist refresh failed, keeping last good rules";
9
+ export declare const RELAYER_DENYLIST_INITIAL_LOAD_RETRY_MESSAGE = "Failed to fetch relayer denylist at startup, retrying";
10
+ export declare const RELAYER_DENYLIST_CHECK_FAILED_MESSAGE = "Failed to check pending transfer against relayer denylist, keeping it";
11
+ export interface RelayerDenylistMiddlewareOptions {
12
+ url: string;
13
+ refreshIntervalMs: number;
14
+ }
15
+ /** Drops credentials, query and fragment, which may carry a token. */
16
+ export declare function redactUrl(url: string): string;
17
+ export declare function fetchDenylistFile(url: URL): Promise<string>;
18
+ /**
19
+ * Ignores messages the relayer's runtime denylist blocks. `create()` loads the
20
+ * file; it is re-fetched once `refreshIntervalMs` has passed, and a failed
21
+ * refresh keeps the last good rules.
22
+ *
23
+ * `address` rules are checked against the Explorer's `origin_tx_sender`, the
24
+ * origin transaction's fee payer, where the relayer checks every origin
25
+ * transaction signer. A denied depositor whose transaction another account
26
+ * paid for (e.g. a sponsored Sealevel transfer) is therefore not ignored and
27
+ * stays reserved.
28
+ *
29
+ * The relayer also skips its signer check, so it may deliver a message this
30
+ * middleware ignores for its `origin_tx_sender` alone, when no dispatch tx
31
+ * hash is stored (Cosmos block-level events, an old DB backlog, a zero hash),
32
+ * the origin tx is not found (pruned or reorged out), the sender is zero
33
+ * (Radix, Aleo) or the lookup keeps failing for about 8 minutes
34
+ * (rust/main/agents/relayer/src/msg/pending_message.rs and
35
+ * runtime_denylist.rs).
36
+ *
37
+ * Only `match` rules that set nothing but `messageId` apply to the
38
+ * rebalancer's own rebalance messages, which then stop counting as incoming
39
+ * collateral. Deny a rebalance message only once its funds settled another
40
+ * way; otherwise the rebalancer sends a replacement.
41
+ */
42
+ export declare class RelayerDenylistMiddleware extends PendingTransferMiddleware {
43
+ private readonly source;
44
+ private rules;
45
+ private loadedAt;
46
+ private lastAttemptAt;
47
+ private refreshing?;
48
+ private constructor();
49
+ /**
50
+ * Loads the denylist, retrying fetch failures. Throws if it still cannot be
51
+ * fetched or is invalid.
52
+ */
53
+ static create(inner: IExplorerClient, options: RelayerDenylistMiddlewareOptions, logger: Logger): Promise<RelayerDenylistMiddleware>;
54
+ protected findIgnored(messages: ExplorerMessage[], logger: Logger): Promise<Map<string, string>>;
55
+ isIgnoredRebalanceAction(messageId: string): boolean;
56
+ getInflightRebalanceActions(params: RebalanceActionQueryParams, logger: Logger): Promise<ExplorerMessage[]>;
57
+ private refreshIfStale;
58
+ private reload;
59
+ }
60
+ //# sourceMappingURL=RelayerDenylistMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelayerDenylistMiddleware.d.ts","sourceRoot":"","sources":["../../../src/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAKnC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,0BAA0B,EAC3B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAY3E,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAIvC,eAAO,MAAM,2BAA2B,OAAQ,CAAC;AAEjD,wDAAwD;AACxD,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AAEvD,eAAO,MAAM,uCAAuC,6DACQ,CAAC;AAE7D,eAAO,MAAM,2CAA2C,0DACC,CAAC;AAE1D,eAAO,MAAM,qCAAqC,0EACuB,CAAC;AAE1E,MAAM,WAAW,gCAAgC;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAQD,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM7C;AAiID,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAYjE;AAsDD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,yBAA0B,SAAQ,yBAAyB;IAMpE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAPlB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAC,CAAgB;IAEnC,OAAO,eASN;IAED;;;OAGG;IACH,OAAa,MAAM,CACjB,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,gCAAgC,EACzC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC,CAyBpC;IAED,UAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EAAE,EAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuB9B;IAEQ,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAK5D;IAGc,2BAA2B,CACxC,MAAM,EAAE,0BAA0B,EAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,EAAE,CAAC,CAG5B;IAED,OAAO,CAAC,cAAc;YAaR,MAAM;CAgBrB"}