@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,388 @@
1
+ import { expect } from 'chai';
2
+ import { BigNumber, ethers } from 'ethers';
3
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { pathToFileURL } from 'node:url';
7
+ import { ERC20__factory } from '@humanode-hyperlane/core';
8
+ import { HyperlaneCore, snapshot, } from '@humanode-hyperlane/sdk';
9
+ import { assert, sleep } from '@humanode-hyperlane/utils';
10
+ import { PendingTransferMiddlewareType, RebalancerStrategyOptions, } from '../config/types.js';
11
+ import { ANVIL_TEST_PRIVATE_KEY, DOMAIN_IDS, TEST_CHAINS, } from './fixtures/routes.js';
12
+ import { getAllCollateralBalances } from './harness/BridgeSetup.js';
13
+ import { Erc20LocalDeploymentManager } from './harness/Erc20LocalDeploymentManager.js';
14
+ import { resetSnapshotsAndRefreshProviders } from './harness/SnapshotHelper.js';
15
+ import { getFirstMonitorEvent } from './harness/TestHelpers.js';
16
+ import { TestRebalancer, } from './harness/TestRebalancer.js';
17
+ import { tryRelayMessage } from './harness/TransferHelper.js';
18
+ const USDC = 1000000n;
19
+ const REBALANCE_MESSAGE = 'rebalance_message';
20
+ // Re-reads the denylist on every Explorer query, so a rule written between
21
+ // cycles applies to the next one. Config files cannot set 0: the schema
22
+ // requires a positive interval.
23
+ const DENYLIST_REFRESH_INTERVAL_SECS = 0;
24
+ const POSITIVE_REFRESH_INTERVAL_SECS = 20;
25
+ const REFRESH_WAIT_MARGIN_MS = 1_000;
26
+ describe('RelayerDenylist middleware rebalance messages E2E', function () {
27
+ this.timeout(300_000);
28
+ let deploymentManager;
29
+ let multiProvider;
30
+ let localProviders;
31
+ let snapshotIds;
32
+ let hyperlaneCore;
33
+ let deployedAddresses;
34
+ let weightedStrategyConfig;
35
+ let denylistDir;
36
+ let denylistPath;
37
+ before(async function () {
38
+ deploymentManager = new Erc20LocalDeploymentManager();
39
+ const ctx = await deploymentManager.start();
40
+ multiProvider = ctx.multiProvider;
41
+ localProviders = ctx.providers;
42
+ deployedAddresses = ctx.deployedAddresses;
43
+ const coreAddresses = {};
44
+ for (const chain of TEST_CHAINS) {
45
+ coreAddresses[chain] = {
46
+ mailbox: deployedAddresses.chains[chain].mailbox,
47
+ interchainSecurityModule: deployedAddresses.chains[chain].ism,
48
+ };
49
+ }
50
+ hyperlaneCore = HyperlaneCore.fromAddressesMap(coreAddresses, multiProvider);
51
+ weightedStrategyConfig = [
52
+ {
53
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
54
+ chains: {
55
+ anvil1: {
56
+ weighted: { weight: 60n, tolerance: 5n },
57
+ bridge: deployedAddresses.bridgeRoute1.anvil1,
58
+ },
59
+ anvil2: {
60
+ weighted: { weight: 20n, tolerance: 5n },
61
+ bridge: deployedAddresses.bridgeRoute1.anvil2,
62
+ },
63
+ anvil3: {
64
+ weighted: { weight: 20n, tolerance: 5n },
65
+ bridge: deployedAddresses.bridgeRoute1.anvil3,
66
+ },
67
+ },
68
+ },
69
+ ];
70
+ snapshotIds = new Map();
71
+ for (const [chain, provider] of localProviders) {
72
+ snapshotIds.set(chain, await snapshot(provider));
73
+ }
74
+ });
75
+ beforeEach(function () {
76
+ denylistDir = mkdtempSync(join(tmpdir(), 'rebalancer-denylist-e2e-'));
77
+ denylistPath = join(denylistDir, 'denylist.json');
78
+ writeDenylist([]);
79
+ });
80
+ afterEach(async function () {
81
+ rmSync(denylistDir, { recursive: true, force: true });
82
+ await resetSnapshotsAndRefreshProviders({
83
+ localProviders,
84
+ multiProvider,
85
+ snapshotIds,
86
+ });
87
+ });
88
+ after(async function () {
89
+ if (deploymentManager) {
90
+ await deploymentManager.stop();
91
+ }
92
+ });
93
+ function writeDenylist(messageIds, matches = []) {
94
+ writeFileSync(denylistPath, JSON.stringify({
95
+ rules: [
96
+ ...messageIds.map((messageId) => ({ messageId })),
97
+ ...matches,
98
+ ].map((match) => ({
99
+ reason: 'CCTP delivered the funds out of band',
100
+ addedBy: 'e2e',
101
+ match,
102
+ })),
103
+ }));
104
+ }
105
+ function buildContext(balances, mockRebalanceActions = [], refreshIntervalSecs = DENYLIST_REFRESH_INTERVAL_SECS) {
106
+ const builder = TestRebalancer.builder(deploymentManager, multiProvider)
107
+ .withStrategy(weightedStrategyConfig)
108
+ .withBalances(balances)
109
+ .withPendingTransferMiddlewares([
110
+ {
111
+ type: PendingTransferMiddlewareType.RelayerDenylist,
112
+ url: pathToFileURL(denylistPath).href,
113
+ refreshIntervalSecs,
114
+ },
115
+ ])
116
+ .withExecutionMode('execute');
117
+ for (const message of mockRebalanceActions) {
118
+ builder.withMockRebalanceAction(message);
119
+ }
120
+ return builder.build();
121
+ }
122
+ async function runCycle(context) {
123
+ const event = await getFirstMonitorEvent(context.createMonitor(0));
124
+ await context.orchestrator.executeCycle(event);
125
+ }
126
+ function getBalances() {
127
+ return getAllCollateralBalances(localProviders, TEST_CHAINS, deployedAddresses.monitoredRoute, deployedAddresses.tokens);
128
+ }
129
+ function expectBalances(balances, expected) {
130
+ for (const chain of TEST_CHAINS) {
131
+ expect(balances[chain].toBigInt(), `${chain} collateral`).to.equal(expected[chain]);
132
+ }
133
+ }
134
+ // Simulates CCTP minting the bridged funds to the destination router while
135
+ // the companion Hyperlane message stays undeliverable.
136
+ async function deliverOutOfBand(chain, amount) {
137
+ const provider = localProviders.get(chain);
138
+ assert(provider, `Missing provider for chain ${chain}`);
139
+ const token = ERC20__factory.connect(deployedAddresses.tokens[chain], new ethers.Wallet(ANVIL_TEST_PRIVATE_KEY, provider));
140
+ const tx = await token.transfer(deployedAddresses.monitoredRoute[chain], amount);
141
+ await tx.wait();
142
+ }
143
+ function findAction(actions, destination) {
144
+ const action = actions.find((a) => a.destination === DOMAIN_IDS[destination]);
145
+ assert(action, `Missing rebalance action to ${destination}`);
146
+ return action;
147
+ }
148
+ function getMessageId(action) {
149
+ assert(action.messageId, `Missing message id on action ${action.id}`);
150
+ return action.messageId;
151
+ }
152
+ // Cycle 1 moves 1000 USDC anvil1 -> anvil3; CCTP then delivers it out of
153
+ // band, leaving the routers balanced at 6000/2000/2000.
154
+ async function rebalanceAndDeliverOutOfBand(context) {
155
+ await runCycle(context);
156
+ const intents = await context.tracker.getActiveRebalanceIntents();
157
+ expect(intents.length).to.equal(1);
158
+ const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
159
+ expect(actions.length).to.equal(1);
160
+ const [action] = actions;
161
+ expect(action.intentId).to.equal(intents[0].id);
162
+ expect(action.origin).to.equal(DOMAIN_IDS.anvil1);
163
+ expect(action.destination).to.equal(DOMAIN_IDS.anvil3);
164
+ expect(action.amount).to.equal(1000n * USDC);
165
+ expect(action.status).to.equal('in_progress');
166
+ expectBalances(await getBalances(), {
167
+ anvil1: 6000n * USDC,
168
+ anvil2: 2000n * USDC,
169
+ anvil3: 1000n * USDC,
170
+ });
171
+ await deliverOutOfBand('anvil3', action.amount);
172
+ expectBalances(await getBalances(), {
173
+ anvil1: 6000n * USDC,
174
+ anvil2: 2000n * USDC,
175
+ anvil3: 2000n * USDC,
176
+ });
177
+ return action;
178
+ }
179
+ // Seen as still in flight, the out-of-band 1000 USDC inflates the total to
180
+ // 11000, so anvil3 looks 800 over its 2200 target.
181
+ async function expectDoubleCounted(context, action) {
182
+ const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
183
+ expect(actions.length).to.equal(3);
184
+ const toAnvil1 = findAction(actions, 'anvil1');
185
+ expect(toAnvil1.origin).to.equal(DOMAIN_IDS.anvil3);
186
+ expect(toAnvil1.amount).to.equal(600n * USDC);
187
+ const toAnvil2 = findAction(actions, 'anvil2');
188
+ expect(toAnvil2.origin).to.equal(DOMAIN_IDS.anvil3);
189
+ expect(toAnvil2.amount).to.equal(200n * USDC);
190
+ const intents = await context.tracker.getActiveRebalanceIntents();
191
+ expect(intents.map((i) => i.id)).to.have.members([
192
+ action.intentId,
193
+ toAnvil1.intentId,
194
+ toAnvil2.intentId,
195
+ ]);
196
+ }
197
+ async function getIndexedMessage(context, messageId) {
198
+ await context.forkIndexer.sync(await context.getConfirmedBlockTags());
199
+ const message = context.forkIndexer
200
+ .getRebalanceActions()
201
+ .find((m) => m.msg_id === messageId);
202
+ assert(message, `Fork indexer did not index message ${messageId}`);
203
+ return message;
204
+ }
205
+ async function expectStillInProgress(context, action) {
206
+ const storedAction = await context.tracker.getRebalanceAction(action.id);
207
+ expect(storedAction?.status).to.equal('in_progress');
208
+ const storedIntent = await context.tracker.getRebalanceIntent(action.intentId);
209
+ expect(storedIntent?.status).to.equal('in_progress');
210
+ }
211
+ it('double counts an out-of-band delivered rebalance that is not denylisted', async function () {
212
+ const context = await buildContext('WEIGHTED_IMBALANCED');
213
+ const action = await rebalanceAndDeliverOutOfBand(context);
214
+ await runCycle(context);
215
+ await expectDoubleCounted(context, action);
216
+ await expectStillInProgress(context, action);
217
+ });
218
+ it('stops counting a rebalance once its message is denylisted', async function () {
219
+ const context = await buildContext('WEIGHTED_IMBALANCED');
220
+ const action = await rebalanceAndDeliverOutOfBand(context);
221
+ writeDenylist([getMessageId(action)]);
222
+ await runCycle(context);
223
+ expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
224
+ const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
225
+ expect(actions.length).to.equal(1);
226
+ expect(actions[0].id).to.equal(action.id);
227
+ await expectStillInProgress(context, action);
228
+ });
229
+ it('stops counting a denylisted rebalance once the refresh interval passes', async function () {
230
+ const context = await buildContext('WEIGHTED_IMBALANCED', [], POSITIVE_REFRESH_INTERVAL_SECS);
231
+ const action = await rebalanceAndDeliverOutOfBand(context);
232
+ writeDenylist([getMessageId(action)]);
233
+ const ruleWrittenAt = Date.now();
234
+ await context.tracker.syncRebalanceActions(await context.getConfirmedBlockTags());
235
+ expect((await context.tracker.getActiveRebalanceIntents()).map((i) => i.id)).to.deep.equal([action.intentId]);
236
+ // The rule was not loaded above, so the last load predates it.
237
+ await sleep(ruleWrittenAt +
238
+ POSITIVE_REFRESH_INTERVAL_SECS * 1_000 +
239
+ REFRESH_WAIT_MARGIN_MS -
240
+ Date.now());
241
+ await runCycle(context);
242
+ expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
243
+ const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
244
+ expect(actions.length).to.equal(1);
245
+ expect(actions[0].id).to.equal(action.id);
246
+ await expectStillInProgress(context, action);
247
+ });
248
+ it('counts the rebalance again once its deny rule is removed', async function () {
249
+ const context = await buildContext('WEIGHTED_IMBALANCED');
250
+ const action = await rebalanceAndDeliverOutOfBand(context);
251
+ writeDenylist([getMessageId(action)]);
252
+ await runCycle(context);
253
+ expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
254
+ expect((await context.tracker.getActionsByType(REBALANCE_MESSAGE)).length).to.equal(1);
255
+ writeDenylist([]);
256
+ await runCycle(context);
257
+ await expectDoubleCounted(context, action);
258
+ await expectStillInProgress(context, action);
259
+ });
260
+ it('recovers and counts a non-denylisted rebalance after a restart', async function () {
261
+ const context = await buildContext('WEIGHTED_IMBALANCED');
262
+ const action = await rebalanceAndDeliverOutOfBand(context);
263
+ const messageId = getMessageId(action);
264
+ const message = await getIndexedMessage(context, messageId);
265
+ const restarted = await buildContext(await getBalances(), [message]);
266
+ const recovered = await restarted.tracker.getActionsByType(REBALANCE_MESSAGE);
267
+ expect(recovered.length).to.equal(1);
268
+ expect(recovered[0].id).to.equal(messageId);
269
+ expect(recovered[0].status).to.equal('in_progress');
270
+ expect((await restarted.tracker.getActiveRebalanceIntents()).map((i) => i.id)).to.deep.equal([recovered[0].intentId]);
271
+ await runCycle(restarted);
272
+ await expectDoubleCounted(restarted, recovered[0]);
273
+ });
274
+ it('does not recover a denylisted rebalance after a restart', async function () {
275
+ const context = await buildContext('WEIGHTED_IMBALANCED');
276
+ const action = await rebalanceAndDeliverOutOfBand(context);
277
+ const messageId = getMessageId(action);
278
+ const message = await getIndexedMessage(context, messageId);
279
+ writeDenylist([messageId]);
280
+ const restarted = await buildContext(await getBalances(), [message]);
281
+ expect(await restarted.tracker.getActionsByType(REBALANCE_MESSAGE)).to.be
282
+ .empty;
283
+ expect(await restarted.tracker.getActiveRebalanceIntents()).to.be.empty;
284
+ await runCycle(restarted);
285
+ expect(await restarted.tracker.getActionsByType(REBALANCE_MESSAGE)).to.be
286
+ .empty;
287
+ expect(await restarted.tracker.getActiveRebalanceIntents()).to.be.empty;
288
+ });
289
+ it('completes a denylisted rebalance whose message is delivered', async function () {
290
+ const context = await buildContext('WEIGHTED_IMBALANCED');
291
+ await runCycle(context);
292
+ const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
293
+ expect(actions.length).to.equal(1);
294
+ const [action] = actions;
295
+ const messageId = getMessageId(action);
296
+ writeDenylist([messageId]);
297
+ await context.tracker.syncRebalanceActions(await context.getConfirmedBlockTags());
298
+ expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
299
+ const originProvider = localProviders.get('anvil1');
300
+ assert(originProvider, 'Missing provider for chain anvil1');
301
+ assert(action.txHash, `Missing tx hash on action ${action.id}`);
302
+ const relayResult = await tryRelayMessage(multiProvider, hyperlaneCore, {
303
+ dispatchTx: await originProvider.getTransactionReceipt(action.txHash),
304
+ messageId,
305
+ origin: 'anvil1',
306
+ destination: 'anvil3',
307
+ });
308
+ expect(relayResult.success, `Relay failed: ${relayResult.error}`).to.be
309
+ .true;
310
+ await context.tracker.syncRebalanceActions(await context.getConfirmedBlockTags());
311
+ const storedAction = await context.tracker.getRebalanceAction(action.id);
312
+ expect(storedAction?.status).to.equal('complete');
313
+ const storedIntent = await context.tracker.getRebalanceIntent(action.intentId);
314
+ expect(storedIntent?.status).to.equal('complete');
315
+ expect(await context.tracker.getInProgressActions()).to.be.empty;
316
+ expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
317
+ expectBalances(await getBalances(), {
318
+ anvil1: 6000n * USDC,
319
+ anvil2: 2000n * USDC,
320
+ anvil3: 2000n * USDC,
321
+ });
322
+ });
323
+ const broadRuleCases = [
324
+ {
325
+ name: 'destination',
326
+ match: () => ({ destinationDomain: DOMAIN_IDS.anvil3 }),
327
+ },
328
+ {
329
+ name: 'route',
330
+ match: (message) => ({
331
+ originDomain: message.origin_domain_id,
332
+ senderAddress: message.sender,
333
+ destinationDomain: message.destination_domain_id,
334
+ recipientAddress: message.recipient,
335
+ }),
336
+ },
337
+ ];
338
+ for (const c of broadRuleCases) {
339
+ it(`keeps counting an undelivered rebalance a ${c.name} rule denies`, async function () {
340
+ const context = await buildContext('WEIGHTED_IMBALANCED');
341
+ await runCycle(context);
342
+ const [action] = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
343
+ assert(action, 'Missing rebalance action from cycle 1');
344
+ const message = await getIndexedMessage(context, getMessageId(action));
345
+ writeDenylist([], [c.match(message)]);
346
+ await runCycle(context);
347
+ await runCycle(context);
348
+ const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
349
+ expect(actions.map((a) => a.id)).to.deep.equal([action.id]);
350
+ expect((await context.tracker.getActiveRebalanceIntents()).map((i) => i.id)).to.deep.equal([action.intentId]);
351
+ await expectStillInProgress(context, action);
352
+ expectBalances(await getBalances(), {
353
+ anvil1: 6000n * USDC,
354
+ anvil2: 2000n * USDC,
355
+ anvil3: 1000n * USDC,
356
+ });
357
+ });
358
+ }
359
+ it('keeps counting the rebalance that is not denylisted', async function () {
360
+ const context = await buildContext({
361
+ anvil1: BigNumber.from(8000n * USDC),
362
+ anvil2: BigNumber.from(1000n * USDC),
363
+ anvil3: BigNumber.from(1000n * USDC),
364
+ });
365
+ await runCycle(context);
366
+ const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
367
+ expect(actions.length).to.equal(2);
368
+ const toAnvil2 = findAction(actions, 'anvil2');
369
+ const toAnvil3 = findAction(actions, 'anvil3');
370
+ expect(toAnvil2.amount).to.equal(1000n * USDC);
371
+ expect(toAnvil3.amount).to.equal(1000n * USDC);
372
+ expect((await context.tracker.getActiveRebalanceIntents()).length).to.equal(2);
373
+ await deliverOutOfBand('anvil3', toAnvil3.amount);
374
+ writeDenylist([getMessageId(toAnvil3)]);
375
+ expectBalances(await getBalances(), {
376
+ anvil1: 6000n * USDC,
377
+ anvil2: 1000n * USDC,
378
+ anvil3: 2000n * USDC,
379
+ });
380
+ await runCycle(context);
381
+ const intents = await context.tracker.getActiveRebalanceIntents();
382
+ expect(intents.map((i) => i.id)).to.deep.equal([toAnvil2.intentId]);
383
+ expect((await context.tracker.getActionsByType(REBALANCE_MESSAGE)).length).to.equal(2);
384
+ await expectStillInProgress(context, toAnvil2);
385
+ await expectStillInProgress(context, toAnvil3);
386
+ });
387
+ });
388
+ //# sourceMappingURL=relayer-denylist.e2e-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayer-denylist.e2e-test.js","sourceRoot":"","sources":["../../src/e2e/relayer-denylist.e2e-test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RebalancerContextFactory.d.ts","sourceRoot":"","sources":["../../src/factories/RebalancerContextFactory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RebalancerContextFactory.d.ts","sourceRoot":"","sources":["../../src/factories/RebalancerContextFactory.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { MultiProtocolCore, MultiProtocolProvider, WarpCore, } from '@humanode-hyperlane/sdk';
2
- import { assert, ProtocolType, objMap, toWei, } from '@humanode-hyperlane/utils';
3
- import { LiFiBridge } from '../bridges/LiFiBridge.js';
2
+ import { assert, isEVMLike, ProtocolType, objMap, } from '@humanode-hyperlane/utils';
4
3
  import { ExecutionType, ExternalBridgeType, getAllBridges, getInventoryChainNames, getInventoryOriginChainNames, getOverrideExecutionType, getStrategyChainConfig, getStrategyChainNames, } from '../config/types.js';
5
4
  import { InventoryRebalancer, } from '../core/InventoryRebalancer.js';
6
5
  import { Rebalancer } from '../core/Rebalancer.js';
@@ -11,8 +10,10 @@ import { Monitor } from '../monitor/Monitor.js';
11
10
  import { StrategyFactory } from '../strategy/StrategyFactory.js';
12
11
  import { ActionTracker, } from '../tracking/ActionTracker.js';
13
12
  import { InflightContextAdapter } from '../tracking/InflightContextAdapter.js';
13
+ import { buildPendingTransferMiddlewares } from '../tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js';
14
14
  import { InMemoryStore } from '../tracking/store/index.js';
15
15
  import { ExplorerClient, } from '../utils/ExplorerClient.js';
16
+ import { normalizeConfiguredAmount, normalizeToCanonical, } from '../utils/balanceUtils.js';
16
17
  import { isCollateralizedTokenEligibleForRebalancing } from '../utils/tokenUtils.js';
17
18
  const DEFAULT_EXPLORER_URL = process.env.EXPLORER_API_URL || 'https://explorer4.hasura.app/v1/graphql';
18
19
  export class RebalancerContextFactory {
@@ -73,7 +74,7 @@ export class RebalancerContextFactory {
73
74
  ...new Set(warpCoreConfig.tokens.map((t) => t.chainName)),
74
75
  ];
75
76
  for (const chain of warpChains) {
76
- if (multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) {
77
+ if (!isEVMLike(multiProvider.getProtocol(chain))) {
77
78
  logger.debug({ chain }, 'Skipping provider init for non-EVM chain');
78
79
  continue;
79
80
  }
@@ -123,8 +124,8 @@ export class RebalancerContextFactory {
123
124
  const chainConfig = getStrategyChainConfig(this.config.strategyConfig, chainName);
124
125
  if (chainConfig?.bridgeMinAcceptedAmount) {
125
126
  const token = this.tokensByChainName[chainName];
126
- const decimals = token?.decimals ?? 18;
127
- minAmountsByChain[chainName] = BigInt(toWei(chainConfig.bridgeMinAcceptedAmount, decimals));
127
+ assert(token, `No token found for configured strategy chain ${chainName} in warp route ${this.config.warpRouteId}`);
128
+ minAmountsByChain[chainName] = normalizeConfiguredAmount(chainConfig.bridgeMinAcceptedAmount, token);
128
129
  }
129
130
  }
130
131
  this.logger.debug({
@@ -142,7 +143,7 @@ export class RebalancerContextFactory {
142
143
  const transferStore = new InMemoryStore();
143
144
  const intentStore = new InMemoryStore();
144
145
  const actionStore = new InMemoryStore();
145
- const explorerClient = typeof explorerUrlOrClient === 'string'
146
+ const baseExplorerClient = typeof explorerUrlOrClient === 'string'
146
147
  ? new ExplorerClient(explorerUrlOrClient, (domain) => this.multiProvider.getProtocol(domain))
147
148
  : explorerUrlOrClient;
148
149
  // 3. Get MultiProtocolCore from registry (supports all VM types)
@@ -172,16 +173,28 @@ export class RebalancerContextFactory {
172
173
  const domain = this.multiProvider.getDomainId(token.chainName);
173
174
  routersByDomain[domain] = token.addressOrDenom;
174
175
  }
176
+ const mailboxByDomain = {};
177
+ for (const [chain, addresses] of Object.entries(coreAddresses)) {
178
+ mailboxByDomain[this.multiProvider.getDomainId(chain)] =
179
+ addresses.mailbox;
180
+ }
181
+ const { client: explorerClient, isIgnoredTransfer, isIgnoredRebalanceAction, } = await buildPendingTransferMiddlewares(baseExplorerClient, this.config.pendingTransferMiddlewares ?? [], {
182
+ routersByDomain,
183
+ mailboxByDomain,
184
+ multiProvider: this.multiProvider,
185
+ logger: this.logger,
186
+ });
175
187
  const trackerConfig = {
176
188
  routersByDomain,
189
+ isIgnoredTransfer,
190
+ isIgnoredRebalanceAction,
177
191
  bridges,
178
192
  rebalancerAddress,
179
193
  inventorySignerAddresses: this.config.inventorySigners
180
- ? Object.entries(this.config.inventorySigners)
181
- .filter(([protocol]) => protocol === ProtocolType.Ethereum)
182
- .map(([, signerConfig]) => signerConfig)
183
- .map((s) => s.address)
184
- .filter(Boolean)
194
+ ? Object.values(ProtocolType)
195
+ .filter((protocol) => isEVMLike(protocol))
196
+ .map((protocol) => this.config.inventorySigners?.[protocol]?.address)
197
+ .filter((address) => Boolean(address))
185
198
  : undefined,
186
199
  intentTTL: this.config.intentTTL,
187
200
  };
@@ -225,6 +238,9 @@ export class RebalancerContextFactory {
225
238
  this.logger.debug('No inventory chains configured');
226
239
  return null;
227
240
  }
241
+ for (const chain of allRelevantChains) {
242
+ assert(this.tokensByChainName[chain], `No token found for inventory-relevant chain ${chain} in warp route ${this.config.warpRouteId}`);
243
+ }
228
244
  const requiredProtocols = new Set(allRelevantChains.map((chain) => {
229
245
  const metadata = this.warpCore.multiProvider.getChainMetadata(chain);
230
246
  assert(metadata?.protocol, `No protocol in chain metadata for ${chain}`);
@@ -233,11 +249,12 @@ export class RebalancerContextFactory {
233
249
  const SUPPORTED_INVENTORY_PROTOCOLS = new Set([
234
250
  ProtocolType.Ethereum,
235
251
  ProtocolType.Sealevel,
252
+ ProtocolType.Tron,
236
253
  ]);
237
254
  for (const protocol of requiredProtocols) {
238
255
  const chainsForProtocol = allRelevantChains.filter((chain) => this.warpCore.multiProvider.getChainMetadata(chain).protocol ===
239
256
  protocol);
240
- assert(SUPPORTED_INVENTORY_PROTOCOLS.has(protocol), `Inventory rebalancing does not support protocol '${protocol}' (chains: ${chainsForProtocol.join(', ')}). Supported: ethereum, sealevel`);
257
+ assert(SUPPORTED_INVENTORY_PROTOCOLS.has(protocol), `Inventory rebalancing does not support protocol '${protocol}' (chains: ${chainsForProtocol.join(', ')}). Supported: ethereum, sealevel, tron`);
241
258
  }
242
259
  for (const protocol of requiredProtocols) {
243
260
  const chainsForProtocol = allRelevantChains.filter((chain) => this.warpCore.multiProvider.getChainMetadata(chain).protocol ===
@@ -251,7 +268,8 @@ export class RebalancerContextFactory {
251
268
  protocol);
252
269
  assert(inventorySigners[protocol]?.address, `Missing inventory address for protocol ${protocol} (required by inventory chains: ${chainsForProtocol.join(', ')})`);
253
270
  }
254
- const externalBridgeRegistry = externalBridgeRegistryOverride ?? this.buildExternalBridgeRegistry();
271
+ const externalBridgeRegistry = externalBridgeRegistryOverride ??
272
+ (await this.buildExternalBridgeRegistry());
255
273
  if (Object.keys(externalBridgeRegistry).length === 0) {
256
274
  if (externalBridgeRegistryOverride !== undefined) {
257
275
  this.logger.debug('No external bridges in override registry, skipping inventory components');
@@ -259,21 +277,26 @@ export class RebalancerContextFactory {
259
277
  else {
260
278
  this.logger.debug('No external bridges configured, skipping inventory components');
261
279
  }
262
- const inventoryAddresses = Object.fromEntries(Object.entries(inventorySigners).map(([protocol, cfg]) => [
263
- protocol,
264
- cfg.address,
265
- ]));
280
+ const inventoryAddresses = {};
281
+ for (const protocol of Object.values(ProtocolType)) {
282
+ const cfg = inventorySigners[protocol];
283
+ if (!cfg)
284
+ continue;
285
+ inventoryAddresses[protocol] = cfg.address;
286
+ }
266
287
  const inventoryConfig = {
267
288
  inventoryAddresses,
268
289
  chains: allRelevantChains,
269
290
  };
270
291
  // Merge config addresses with runtime keys
271
292
  const mergedSigners = {};
272
- for (const [protocol, cfg] of Object.entries(inventorySigners)) {
273
- const protocolKey = protocol;
274
- mergedSigners[protocolKey] = {
293
+ for (const protocol of Object.values(ProtocolType)) {
294
+ const cfg = inventorySigners[protocol];
295
+ if (!cfg)
296
+ continue;
297
+ mergedSigners[protocol] = {
275
298
  address: cfg.address,
276
- key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocolKey],
299
+ key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocol],
277
300
  };
278
301
  }
279
302
  const inventoryRebalancer = new InventoryRebalancer({
@@ -287,10 +310,13 @@ export class RebalancerContextFactory {
287
310
  };
288
311
  }
289
312
  // 3. Build inventory config
290
- const inventoryAddresses = Object.fromEntries(Object.entries(inventorySigners).map(([protocol, cfg]) => [
291
- protocol,
292
- cfg.address,
293
- ]));
313
+ const inventoryAddresses = {};
314
+ for (const protocol of Object.values(ProtocolType)) {
315
+ const cfg = inventorySigners[protocol];
316
+ if (!cfg)
317
+ continue;
318
+ inventoryAddresses[protocol] = cfg.address;
319
+ }
294
320
  const inventoryConfig = {
295
321
  inventoryAddresses,
296
322
  chains: allRelevantChains,
@@ -298,11 +324,13 @@ export class RebalancerContextFactory {
298
324
  // 4. Create InventoryRebalancer
299
325
  // Merge config addresses with runtime keys
300
326
  const mergedSigners = {};
301
- for (const [protocol, cfg] of Object.entries(inventorySigners)) {
302
- const protocolKey = protocol;
303
- mergedSigners[protocolKey] = {
327
+ for (const protocol of Object.values(ProtocolType)) {
328
+ const cfg = inventorySigners[protocol];
329
+ if (!cfg)
330
+ continue;
331
+ mergedSigners[protocol] = {
304
332
  address: cfg.address,
305
- key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocolKey],
333
+ key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocol],
306
334
  };
307
335
  }
308
336
  const inventoryRebalancer = new InventoryRebalancer({
@@ -315,7 +343,7 @@ export class RebalancerContextFactory {
315
343
  }, 'Inventory components created successfully');
316
344
  return { inventoryRebalancer, externalBridgeRegistry, inventoryConfig };
317
345
  }
318
- buildExternalBridgeRegistry() {
346
+ async buildExternalBridgeRegistry() {
319
347
  const { externalBridges } = this.config;
320
348
  const registry = {};
321
349
  for (const bridgeType of Object.values(ExternalBridgeType)) {
@@ -323,6 +351,7 @@ export class RebalancerContextFactory {
323
351
  case ExternalBridgeType.LiFi: {
324
352
  const lifiConfig = externalBridges?.lifi;
325
353
  if (lifiConfig?.integrator) {
354
+ const { LiFiBridge } = await import('../bridges/LiFiBridge.js');
326
355
  registry[ExternalBridgeType.LiFi] = new LiFiBridge({
327
356
  integrator: lifiConfig.integrator,
328
357
  defaultSlippage: lifiConfig.defaultSlippage,
@@ -411,7 +440,8 @@ export class RebalancerContextFactory {
411
440
  chainNames.has(token.chainName)) {
412
441
  const adapter = token.getHypAdapter(this.warpCore.multiProvider);
413
442
  const bridgedSupply = await adapter.getBridgedSupply();
414
- initialTotalCollateral += bridgedSupply ?? 0n;
443
+ assert(bridgedSupply !== undefined, `Missing bridged supply for ${token.chainName} while computing initial total collateral for warp route ${this.config.warpRouteId}`);
444
+ initialTotalCollateral += normalizeToCanonical(bridgedSupply, token);
415
445
  }
416
446
  }));
417
447
  return initialTotalCollateral;