@humanode-hyperlane/rebalancer 0.0.0-stage → 27.2.2

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 (439) hide show
  1. package/LICENSE.md +193 -0
  2. package/README.md +297 -2
  3. package/dist/bridges/LiFiBridge.d.ts +93 -0
  4. package/dist/bridges/LiFiBridge.d.ts.map +1 -0
  5. package/dist/bridges/LiFiBridge.js +527 -0
  6. package/dist/bridges/LiFiBridge.js.map +1 -0
  7. package/dist/bridges/LiFiBridge.test.d.ts +2 -0
  8. package/dist/bridges/LiFiBridge.test.d.ts.map +1 -0
  9. package/dist/bridges/LiFiBridge.test.js +504 -0
  10. package/dist/bridges/LiFiBridge.test.js.map +1 -0
  11. package/dist/config/RebalancerConfig.d.ts +20 -0
  12. package/dist/config/RebalancerConfig.d.ts.map +1 -0
  13. package/dist/config/RebalancerConfig.js +35 -0
  14. package/dist/config/RebalancerConfig.js.map +1 -0
  15. package/dist/config/RebalancerConfig.test.d.ts +2 -0
  16. package/dist/config/RebalancerConfig.test.d.ts.map +1 -0
  17. package/dist/config/RebalancerConfig.test.js +798 -0
  18. package/dist/config/RebalancerConfig.test.js.map +1 -0
  19. package/dist/config/types.d.ts +3008 -0
  20. package/dist/config/types.d.ts.map +1 -0
  21. package/dist/config/types.js +451 -0
  22. package/dist/config/types.js.map +1 -0
  23. package/dist/core/InventoryRebalancer.d.ts +201 -0
  24. package/dist/core/InventoryRebalancer.d.ts.map +1 -0
  25. package/dist/core/InventoryRebalancer.js +994 -0
  26. package/dist/core/InventoryRebalancer.js.map +1 -0
  27. package/dist/core/InventoryRebalancer.test.d.ts +2 -0
  28. package/dist/core/InventoryRebalancer.test.d.ts.map +1 -0
  29. package/dist/core/InventoryRebalancer.test.js +1511 -0
  30. package/dist/core/InventoryRebalancer.test.js.map +1 -0
  31. package/dist/core/Rebalancer.d.ts +37 -0
  32. package/dist/core/Rebalancer.d.ts.map +1 -0
  33. package/dist/core/Rebalancer.js +433 -0
  34. package/dist/core/Rebalancer.js.map +1 -0
  35. package/dist/core/Rebalancer.test.d.ts +2 -0
  36. package/dist/core/Rebalancer.test.d.ts.map +1 -0
  37. package/dist/core/Rebalancer.test.js +424 -0
  38. package/dist/core/Rebalancer.test.js.map +1 -0
  39. package/dist/core/RebalancerOrchestrator.d.ts +56 -0
  40. package/dist/core/RebalancerOrchestrator.d.ts.map +1 -0
  41. package/dist/core/RebalancerOrchestrator.js +154 -0
  42. package/dist/core/RebalancerOrchestrator.js.map +1 -0
  43. package/dist/core/RebalancerOrchestrator.test.d.ts +2 -0
  44. package/dist/core/RebalancerOrchestrator.test.d.ts.map +1 -0
  45. package/dist/core/RebalancerOrchestrator.test.js +721 -0
  46. package/dist/core/RebalancerOrchestrator.test.js.map +1 -0
  47. package/dist/core/RebalancerService.d.ts +127 -0
  48. package/dist/core/RebalancerService.d.ts.map +1 -0
  49. package/dist/core/RebalancerService.js +270 -0
  50. package/dist/core/RebalancerService.js.map +1 -0
  51. package/dist/core/RebalancerService.test.d.ts +2 -0
  52. package/dist/core/RebalancerService.test.d.ts.map +1 -0
  53. package/dist/core/RebalancerService.test.js +777 -0
  54. package/dist/core/RebalancerService.test.js.map +1 -0
  55. package/dist/e2e/collateral-deficit.e2e-test.d.ts +2 -0
  56. package/dist/e2e/collateral-deficit.e2e-test.d.ts.map +1 -0
  57. package/dist/e2e/collateral-deficit.e2e-test.js +227 -0
  58. package/dist/e2e/collateral-deficit.e2e-test.js.map +1 -0
  59. package/dist/e2e/composite.e2e-test.d.ts +2 -0
  60. package/dist/e2e/composite.e2e-test.d.ts.map +1 -0
  61. package/dist/e2e/composite.e2e-test.js +666 -0
  62. package/dist/e2e/composite.e2e-test.js.map +1 -0
  63. package/dist/e2e/fixtures/routes.d.ts +89 -0
  64. package/dist/e2e/fixtures/routes.d.ts.map +1 -0
  65. package/dist/e2e/fixtures/routes.js +420 -0
  66. package/dist/e2e/fixtures/routes.js.map +1 -0
  67. package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts +38 -0
  68. package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts.map +1 -0
  69. package/dist/e2e/harness/BaseLocalDeploymentManager.js +144 -0
  70. package/dist/e2e/harness/BaseLocalDeploymentManager.js.map +1 -0
  71. package/dist/e2e/harness/BridgeSetup.d.ts +11 -0
  72. package/dist/e2e/harness/BridgeSetup.d.ts.map +1 -0
  73. package/dist/e2e/harness/BridgeSetup.js +50 -0
  74. package/dist/e2e/harness/BridgeSetup.js.map +1 -0
  75. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts +13 -0
  76. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts.map +1 -0
  77. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js +105 -0
  78. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js.map +1 -0
  79. package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts +11 -0
  80. package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts.map +1 -0
  81. package/dist/e2e/harness/Erc20LocalDeploymentManager.js +105 -0
  82. package/dist/e2e/harness/Erc20LocalDeploymentManager.js.map +1 -0
  83. package/dist/e2e/harness/ForkIndexer.d.ts +23 -0
  84. package/dist/e2e/harness/ForkIndexer.d.ts.map +1 -0
  85. package/dist/e2e/harness/ForkIndexer.js +127 -0
  86. package/dist/e2e/harness/ForkIndexer.js.map +1 -0
  87. package/dist/e2e/harness/ForkIndexer.test.d.ts +2 -0
  88. package/dist/e2e/harness/ForkIndexer.test.d.ts.map +1 -0
  89. package/dist/e2e/harness/ForkIndexer.test.js +257 -0
  90. package/dist/e2e/harness/ForkIndexer.test.js.map +1 -0
  91. package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts +21 -0
  92. package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts.map +1 -0
  93. package/dist/e2e/harness/MixedLocalDeploymentManager.js +115 -0
  94. package/dist/e2e/harness/MixedLocalDeploymentManager.js.map +1 -0
  95. package/dist/e2e/harness/MockExplorerClient.d.ts +23 -0
  96. package/dist/e2e/harness/MockExplorerClient.d.ts.map +1 -0
  97. package/dist/e2e/harness/MockExplorerClient.js +57 -0
  98. package/dist/e2e/harness/MockExplorerClient.js.map +1 -0
  99. package/dist/e2e/harness/MockExternalBridge.d.ts +32 -0
  100. package/dist/e2e/harness/MockExternalBridge.d.ts.map +1 -0
  101. package/dist/e2e/harness/MockExternalBridge.js +247 -0
  102. package/dist/e2e/harness/MockExternalBridge.js.map +1 -0
  103. package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts +13 -0
  104. package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts.map +1 -0
  105. package/dist/e2e/harness/NativeLocalDeploymentManager.js +91 -0
  106. package/dist/e2e/harness/NativeLocalDeploymentManager.js.map +1 -0
  107. package/dist/e2e/harness/SnapshotHelper.d.ts +13 -0
  108. package/dist/e2e/harness/SnapshotHelper.d.ts.map +1 -0
  109. package/dist/e2e/harness/SnapshotHelper.js +36 -0
  110. package/dist/e2e/harness/SnapshotHelper.js.map +1 -0
  111. package/dist/e2e/harness/TestHelpers.d.ts +25 -0
  112. package/dist/e2e/harness/TestHelpers.d.ts.map +1 -0
  113. package/dist/e2e/harness/TestHelpers.js +103 -0
  114. package/dist/e2e/harness/TestHelpers.js.map +1 -0
  115. package/dist/e2e/harness/TestRebalancer.d.ts +85 -0
  116. package/dist/e2e/harness/TestRebalancer.d.ts.map +1 -0
  117. package/dist/e2e/harness/TestRebalancer.js +427 -0
  118. package/dist/e2e/harness/TestRebalancer.js.map +1 -0
  119. package/dist/e2e/harness/TransferHelper.d.ts +34 -0
  120. package/dist/e2e/harness/TransferHelper.d.ts.map +1 -0
  121. package/dist/e2e/harness/TransferHelper.js +93 -0
  122. package/dist/e2e/harness/TransferHelper.js.map +1 -0
  123. package/dist/e2e/inventory-erc20-minAmount.e2e-test.d.ts +2 -0
  124. package/dist/e2e/inventory-erc20-minAmount.e2e-test.d.ts.map +1 -0
  125. package/dist/e2e/inventory-erc20-minAmount.e2e-test.js +411 -0
  126. package/dist/e2e/inventory-erc20-minAmount.e2e-test.js.map +1 -0
  127. package/dist/e2e/inventory-erc20-weighted.e2e-test.d.ts +2 -0
  128. package/dist/e2e/inventory-erc20-weighted.e2e-test.d.ts.map +1 -0
  129. package/dist/e2e/inventory-erc20-weighted.e2e-test.js +408 -0
  130. package/dist/e2e/inventory-erc20-weighted.e2e-test.js.map +1 -0
  131. package/dist/e2e/inventory-minAmount.e2e-test.d.ts +2 -0
  132. package/dist/e2e/inventory-minAmount.e2e-test.d.ts.map +1 -0
  133. package/dist/e2e/inventory-minAmount.e2e-test.js +411 -0
  134. package/dist/e2e/inventory-minAmount.e2e-test.js.map +1 -0
  135. package/dist/e2e/inventory-weighted.e2e-test.d.ts +2 -0
  136. package/dist/e2e/inventory-weighted.e2e-test.d.ts.map +1 -0
  137. package/dist/e2e/inventory-weighted.e2e-test.js +409 -0
  138. package/dist/e2e/inventory-weighted.e2e-test.js.map +1 -0
  139. package/dist/e2e/minAmount.e2e-test.d.ts +2 -0
  140. package/dist/e2e/minAmount.e2e-test.d.ts.map +1 -0
  141. package/dist/e2e/minAmount.e2e-test.js +203 -0
  142. package/dist/e2e/minAmount.e2e-test.js.map +1 -0
  143. package/dist/e2e/mixed-weighted.e2e-test.d.ts +2 -0
  144. package/dist/e2e/mixed-weighted.e2e-test.d.ts.map +1 -0
  145. package/dist/e2e/mixed-weighted.e2e-test.js +189 -0
  146. package/dist/e2e/mixed-weighted.e2e-test.js.map +1 -0
  147. package/dist/e2e/weighted.e2e-test.d.ts +2 -0
  148. package/dist/e2e/weighted.e2e-test.d.ts.map +1 -0
  149. package/dist/e2e/weighted.e2e-test.js +198 -0
  150. package/dist/e2e/weighted.e2e-test.js.map +1 -0
  151. package/dist/factories/RebalancerContextFactory.d.ts +89 -0
  152. package/dist/factories/RebalancerContextFactory.d.ts.map +1 -0
  153. package/dist/factories/RebalancerContextFactory.js +420 -0
  154. package/dist/factories/RebalancerContextFactory.js.map +1 -0
  155. package/dist/factories/RebalancerContextFactory.test.d.ts +2 -0
  156. package/dist/factories/RebalancerContextFactory.test.d.ts.map +1 -0
  157. package/dist/factories/RebalancerContextFactory.test.js +270 -0
  158. package/dist/factories/RebalancerContextFactory.test.js.map +1 -0
  159. package/dist/index.d.ts +37 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +37 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/interfaces/IExternalBridge.d.ts +103 -0
  164. package/dist/interfaces/IExternalBridge.d.ts.map +1 -0
  165. package/dist/interfaces/IExternalBridge.js +2 -0
  166. package/dist/interfaces/IExternalBridge.js.map +1 -0
  167. package/dist/interfaces/IMetrics.d.ts +5 -0
  168. package/dist/interfaces/IMetrics.d.ts.map +1 -0
  169. package/dist/interfaces/IMetrics.js +2 -0
  170. package/dist/interfaces/IMetrics.js.map +1 -0
  171. package/dist/interfaces/IMonitor.d.ts +50 -0
  172. package/dist/interfaces/IMonitor.d.ts.map +1 -0
  173. package/dist/interfaces/IMonitor.js +14 -0
  174. package/dist/interfaces/IMonitor.js.map +1 -0
  175. package/dist/interfaces/IRebalancer.d.ts +31 -0
  176. package/dist/interfaces/IRebalancer.d.ts.map +1 -0
  177. package/dist/interfaces/IRebalancer.js +2 -0
  178. package/dist/interfaces/IRebalancer.js.map +1 -0
  179. package/dist/interfaces/IStrategy.d.ts +60 -0
  180. package/dist/interfaces/IStrategy.d.ts.map +1 -0
  181. package/dist/interfaces/IStrategy.js +13 -0
  182. package/dist/interfaces/IStrategy.js.map +1 -0
  183. package/dist/metrics/Metrics.d.ts +25 -0
  184. package/dist/metrics/Metrics.d.ts.map +1 -0
  185. package/dist/metrics/Metrics.js +164 -0
  186. package/dist/metrics/Metrics.js.map +1 -0
  187. package/dist/metrics/PriceGetter.d.ts +10 -0
  188. package/dist/metrics/PriceGetter.d.ts.map +1 -0
  189. package/dist/metrics/PriceGetter.js +41 -0
  190. package/dist/metrics/PriceGetter.js.map +1 -0
  191. package/dist/metrics/scripts/metrics.d.ts +28 -0
  192. package/dist/metrics/scripts/metrics.d.ts.map +1 -0
  193. package/dist/metrics/scripts/metrics.js +61 -0
  194. package/dist/metrics/scripts/metrics.js.map +1 -0
  195. package/dist/monitor/Monitor.d.ts +40 -0
  196. package/dist/monitor/Monitor.d.ts.map +1 -0
  197. package/dist/monitor/Monitor.js +211 -0
  198. package/dist/monitor/Monitor.js.map +1 -0
  199. package/dist/service.d.ts +3 -0
  200. package/dist/service.d.ts.map +1 -0
  201. package/dist/service.js +205 -0
  202. package/dist/service.js.map +1 -0
  203. package/dist/strategy/BaseStrategy.d.ts +86 -0
  204. package/dist/strategy/BaseStrategy.d.ts.map +1 -0
  205. package/dist/strategy/BaseStrategy.js +342 -0
  206. package/dist/strategy/BaseStrategy.js.map +1 -0
  207. package/dist/strategy/CollateralDeficitStrategy.d.ts +65 -0
  208. package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -0
  209. package/dist/strategy/CollateralDeficitStrategy.js +253 -0
  210. package/dist/strategy/CollateralDeficitStrategy.js.map +1 -0
  211. package/dist/strategy/CollateralDeficitStrategy.test.d.ts +2 -0
  212. package/dist/strategy/CollateralDeficitStrategy.test.d.ts.map +1 -0
  213. package/dist/strategy/CollateralDeficitStrategy.test.js +497 -0
  214. package/dist/strategy/CollateralDeficitStrategy.test.js.map +1 -0
  215. package/dist/strategy/CompositeStrategy.d.ts +18 -0
  216. package/dist/strategy/CompositeStrategy.d.ts.map +1 -0
  217. package/dist/strategy/CompositeStrategy.js +63 -0
  218. package/dist/strategy/CompositeStrategy.js.map +1 -0
  219. package/dist/strategy/CompositeStrategy.test.d.ts +2 -0
  220. package/dist/strategy/CompositeStrategy.test.d.ts.map +1 -0
  221. package/dist/strategy/CompositeStrategy.test.js +278 -0
  222. package/dist/strategy/CompositeStrategy.test.js.map +1 -0
  223. package/dist/strategy/MinAmountStrategy.d.ts +35 -0
  224. package/dist/strategy/MinAmountStrategy.d.ts.map +1 -0
  225. package/dist/strategy/MinAmountStrategy.js +112 -0
  226. package/dist/strategy/MinAmountStrategy.js.map +1 -0
  227. package/dist/strategy/MinAmountStrategy.test.d.ts +2 -0
  228. package/dist/strategy/MinAmountStrategy.test.d.ts.map +1 -0
  229. package/dist/strategy/MinAmountStrategy.test.js +547 -0
  230. package/dist/strategy/MinAmountStrategy.test.js.map +1 -0
  231. package/dist/strategy/StrategyFactory.d.ts +27 -0
  232. package/dist/strategy/StrategyFactory.d.ts.map +1 -0
  233. package/dist/strategy/StrategyFactory.js +79 -0
  234. package/dist/strategy/StrategyFactory.js.map +1 -0
  235. package/dist/strategy/StrategyFactory.test.d.ts +2 -0
  236. package/dist/strategy/StrategyFactory.test.d.ts.map +1 -0
  237. package/dist/strategy/StrategyFactory.test.js +81 -0
  238. package/dist/strategy/StrategyFactory.test.js.map +1 -0
  239. package/dist/strategy/WeightedStrategy.d.ts +32 -0
  240. package/dist/strategy/WeightedStrategy.d.ts.map +1 -0
  241. package/dist/strategy/WeightedStrategy.js +73 -0
  242. package/dist/strategy/WeightedStrategy.js.map +1 -0
  243. package/dist/strategy/WeightedStrategy.test.d.ts +2 -0
  244. package/dist/strategy/WeightedStrategy.test.d.ts.map +1 -0
  245. package/dist/strategy/WeightedStrategy.test.js +403 -0
  246. package/dist/strategy/WeightedStrategy.test.js.map +1 -0
  247. package/dist/strategy/index.d.ts +7 -0
  248. package/dist/strategy/index.d.ts.map +1 -0
  249. package/dist/strategy/index.js +7 -0
  250. package/dist/strategy/index.js.map +1 -0
  251. package/dist/test/helpers.d.ts +99 -0
  252. package/dist/test/helpers.d.ts.map +1 -0
  253. package/dist/test/helpers.js +311 -0
  254. package/dist/test/helpers.js.map +1 -0
  255. package/dist/test/lifiMocks.d.ts +52 -0
  256. package/dist/test/lifiMocks.d.ts.map +1 -0
  257. package/dist/test/lifiMocks.js +160 -0
  258. package/dist/test/lifiMocks.js.map +1 -0
  259. package/dist/tracking/ActionTracker.d.ts +90 -0
  260. package/dist/tracking/ActionTracker.d.ts.map +1 -0
  261. package/dist/tracking/ActionTracker.js +678 -0
  262. package/dist/tracking/ActionTracker.js.map +1 -0
  263. package/dist/tracking/ActionTracker.test.d.ts +2 -0
  264. package/dist/tracking/ActionTracker.test.d.ts.map +1 -0
  265. package/dist/tracking/ActionTracker.test.js +1351 -0
  266. package/dist/tracking/ActionTracker.test.js.map +1 -0
  267. package/dist/tracking/IActionTracker.d.ts +157 -0
  268. package/dist/tracking/IActionTracker.d.ts.map +1 -0
  269. package/dist/tracking/IActionTracker.js +2 -0
  270. package/dist/tracking/IActionTracker.js.map +1 -0
  271. package/dist/tracking/InflightContextAdapter.d.ts +18 -0
  272. package/dist/tracking/InflightContextAdapter.d.ts.map +1 -0
  273. package/dist/tracking/InflightContextAdapter.js +52 -0
  274. package/dist/tracking/InflightContextAdapter.js.map +1 -0
  275. package/dist/tracking/InflightContextAdapter.test.d.ts +2 -0
  276. package/dist/tracking/InflightContextAdapter.test.d.ts.map +1 -0
  277. package/dist/tracking/InflightContextAdapter.test.js +175 -0
  278. package/dist/tracking/InflightContextAdapter.test.js.map +1 -0
  279. package/dist/tracking/store/IStore.d.ts +41 -0
  280. package/dist/tracking/store/IStore.d.ts.map +1 -0
  281. package/dist/tracking/store/IStore.js +2 -0
  282. package/dist/tracking/store/IStore.js.map +1 -0
  283. package/dist/tracking/store/InMemoryStore.d.ts +21 -0
  284. package/dist/tracking/store/InMemoryStore.d.ts.map +1 -0
  285. package/dist/tracking/store/InMemoryStore.js +40 -0
  286. package/dist/tracking/store/InMemoryStore.js.map +1 -0
  287. package/dist/tracking/store/InMemoryStore.test.d.ts +2 -0
  288. package/dist/tracking/store/InMemoryStore.test.d.ts.map +1 -0
  289. package/dist/tracking/store/InMemoryStore.test.js +290 -0
  290. package/dist/tracking/store/InMemoryStore.test.js.map +1 -0
  291. package/dist/tracking/store/index.d.ts +3 -0
  292. package/dist/tracking/store/index.d.ts.map +1 -0
  293. package/dist/tracking/store/index.js +2 -0
  294. package/dist/tracking/store/index.js.map +1 -0
  295. package/dist/tracking/types.d.ts +77 -0
  296. package/dist/tracking/types.d.ts.map +1 -0
  297. package/dist/tracking/types.js +2 -0
  298. package/dist/tracking/types.js.map +1 -0
  299. package/dist/utils/ExplorerClient.d.ts +68 -0
  300. package/dist/utils/ExplorerClient.d.ts.map +1 -0
  301. package/dist/utils/ExplorerClient.js +324 -0
  302. package/dist/utils/ExplorerClient.js.map +1 -0
  303. package/dist/utils/ExplorerClient.test.d.ts +2 -0
  304. package/dist/utils/ExplorerClient.test.d.ts.map +1 -0
  305. package/dist/utils/ExplorerClient.test.js +261 -0
  306. package/dist/utils/ExplorerClient.test.js.map +1 -0
  307. package/dist/utils/balanceUtils.d.ts +12 -0
  308. package/dist/utils/balanceUtils.d.ts.map +1 -0
  309. package/dist/utils/balanceUtils.js +40 -0
  310. package/dist/utils/balanceUtils.js.map +1 -0
  311. package/dist/utils/balanceUtils.test.d.ts +2 -0
  312. package/dist/utils/balanceUtils.test.d.ts.map +1 -0
  313. package/dist/utils/balanceUtils.test.js +55 -0
  314. package/dist/utils/balanceUtils.test.js.map +1 -0
  315. package/dist/utils/blockTag.d.ts +14 -0
  316. package/dist/utils/blockTag.d.ts.map +1 -0
  317. package/dist/utils/blockTag.js +46 -0
  318. package/dist/utils/blockTag.js.map +1 -0
  319. package/dist/utils/bridgeUtils.d.ts +40 -0
  320. package/dist/utils/bridgeUtils.d.ts.map +1 -0
  321. package/dist/utils/bridgeUtils.js +54 -0
  322. package/dist/utils/bridgeUtils.js.map +1 -0
  323. package/dist/utils/bridgeUtils.test.d.ts +2 -0
  324. package/dist/utils/bridgeUtils.test.d.ts.map +1 -0
  325. package/dist/utils/bridgeUtils.test.js +163 -0
  326. package/dist/utils/bridgeUtils.test.js.map +1 -0
  327. package/dist/utils/errors.d.ts +4 -0
  328. package/dist/utils/errors.d.ts.map +1 -0
  329. package/dist/utils/errors.js +6 -0
  330. package/dist/utils/errors.js.map +1 -0
  331. package/dist/utils/gasEstimation.d.ts +65 -0
  332. package/dist/utils/gasEstimation.d.ts.map +1 -0
  333. package/dist/utils/gasEstimation.js +206 -0
  334. package/dist/utils/gasEstimation.js.map +1 -0
  335. package/dist/utils/solanaKeyParser.d.ts +10 -0
  336. package/dist/utils/solanaKeyParser.d.ts.map +1 -0
  337. package/dist/utils/solanaKeyParser.js +87 -0
  338. package/dist/utils/solanaKeyParser.js.map +1 -0
  339. package/dist/utils/solanaKeyParser.test.d.ts +2 -0
  340. package/dist/utils/solanaKeyParser.test.d.ts.map +1 -0
  341. package/dist/utils/solanaKeyParser.test.js +71 -0
  342. package/dist/utils/solanaKeyParser.test.js.map +1 -0
  343. package/dist/utils/tokenUtils.d.ts +38 -0
  344. package/dist/utils/tokenUtils.d.ts.map +1 -0
  345. package/dist/utils/tokenUtils.js +65 -0
  346. package/dist/utils/tokenUtils.js.map +1 -0
  347. package/dist/utils/transactionUtils.d.ts +22 -0
  348. package/dist/utils/transactionUtils.d.ts.map +1 -0
  349. package/dist/utils/transactionUtils.js +26 -0
  350. package/dist/utils/transactionUtils.js.map +1 -0
  351. package/package.json +87 -3
  352. package/src/bridges/LiFiBridge.test.ts +615 -0
  353. package/src/bridges/LiFiBridge.ts +731 -0
  354. package/src/config/RebalancerConfig.test.ts +921 -0
  355. package/src/config/RebalancerConfig.ts +63 -0
  356. package/src/config/types.ts +613 -0
  357. package/src/core/InventoryRebalancer.test.ts +1858 -0
  358. package/src/core/InventoryRebalancer.ts +1455 -0
  359. package/src/core/Rebalancer.test.ts +686 -0
  360. package/src/core/Rebalancer.ts +686 -0
  361. package/src/core/RebalancerOrchestrator.test.ts +871 -0
  362. package/src/core/RebalancerOrchestrator.ts +273 -0
  363. package/src/core/RebalancerService.test.ts +1094 -0
  364. package/src/core/RebalancerService.ts +412 -0
  365. package/src/e2e/E2E_TEST_CONVENTIONS.md +222 -0
  366. package/src/e2e/collateral-deficit.e2e-test.ts +403 -0
  367. package/src/e2e/composite.e2e-test.ts +1008 -0
  368. package/src/e2e/fixtures/routes.ts +532 -0
  369. package/src/e2e/harness/BaseLocalDeploymentManager.ts +246 -0
  370. package/src/e2e/harness/BridgeSetup.ts +95 -0
  371. package/src/e2e/harness/Erc20InventoryLocalDeploymentManager.ts +183 -0
  372. package/src/e2e/harness/Erc20LocalDeploymentManager.ts +190 -0
  373. package/src/e2e/harness/ForkIndexer.test.ts +448 -0
  374. package/src/e2e/harness/ForkIndexer.ts +183 -0
  375. package/src/e2e/harness/MixedLocalDeploymentManager.ts +196 -0
  376. package/src/e2e/harness/MockExplorerClient.ts +94 -0
  377. package/src/e2e/harness/MockExternalBridge.ts +411 -0
  378. package/src/e2e/harness/NativeLocalDeploymentManager.ts +138 -0
  379. package/src/e2e/harness/SnapshotHelper.ts +56 -0
  380. package/src/e2e/harness/TestHelpers.ts +169 -0
  381. package/src/e2e/harness/TestRebalancer.ts +758 -0
  382. package/src/e2e/harness/TransferHelper.ts +188 -0
  383. package/src/e2e/inventory-erc20-minAmount.e2e-test.ts +735 -0
  384. package/src/e2e/inventory-erc20-weighted.e2e-test.ts +733 -0
  385. package/src/e2e/inventory-minAmount.e2e-test.ts +734 -0
  386. package/src/e2e/inventory-weighted.e2e-test.ts +734 -0
  387. package/src/e2e/minAmount.e2e-test.ts +313 -0
  388. package/src/e2e/mixed-weighted.e2e-test.ts +267 -0
  389. package/src/e2e/weighted.e2e-test.ts +304 -0
  390. package/src/factories/RebalancerContextFactory.test.ts +394 -0
  391. package/src/factories/RebalancerContextFactory.ts +771 -0
  392. package/src/index.ts +125 -0
  393. package/src/interfaces/IExternalBridge.ts +117 -0
  394. package/src/interfaces/IMetrics.ts +5 -0
  395. package/src/interfaces/IMonitor.ts +71 -0
  396. package/src/interfaces/IRebalancer.ts +57 -0
  397. package/src/interfaces/IStrategy.ts +81 -0
  398. package/src/metrics/Metrics.ts +335 -0
  399. package/src/metrics/PriceGetter.ts +74 -0
  400. package/src/metrics/scripts/metrics.ts +139 -0
  401. package/src/monitor/Monitor.ts +324 -0
  402. package/src/service.ts +285 -0
  403. package/src/strategy/BaseStrategy.ts +553 -0
  404. package/src/strategy/CollateralDeficitStrategy.test.ts +728 -0
  405. package/src/strategy/CollateralDeficitStrategy.ts +421 -0
  406. package/src/strategy/CompositeStrategy.test.ts +418 -0
  407. package/src/strategy/CompositeStrategy.ts +102 -0
  408. package/src/strategy/MinAmountStrategy.test.ts +732 -0
  409. package/src/strategy/MinAmountStrategy.ts +200 -0
  410. package/src/strategy/StrategyFactory.test.ts +108 -0
  411. package/src/strategy/StrategyFactory.ts +157 -0
  412. package/src/strategy/WeightedStrategy.test.ts +529 -0
  413. package/src/strategy/WeightedStrategy.ts +126 -0
  414. package/src/strategy/index.ts +6 -0
  415. package/src/test/helpers.ts +477 -0
  416. package/src/test/lifiMocks.ts +211 -0
  417. package/src/tracking/ActionTracker.test.ts +1625 -0
  418. package/src/tracking/ActionTracker.ts +1019 -0
  419. package/src/tracking/IActionTracker.ts +213 -0
  420. package/src/tracking/InflightContextAdapter.test.ts +206 -0
  421. package/src/tracking/InflightContextAdapter.ts +75 -0
  422. package/src/tracking/store/IStore.ts +48 -0
  423. package/src/tracking/store/InMemoryStore.test.ts +338 -0
  424. package/src/tracking/store/InMemoryStore.ts +59 -0
  425. package/src/tracking/store/index.ts +2 -0
  426. package/src/tracking/types.ts +118 -0
  427. package/src/utils/ExplorerClient.test.ts +386 -0
  428. package/src/utils/ExplorerClient.ts +439 -0
  429. package/src/utils/balanceUtils.test.ts +79 -0
  430. package/src/utils/balanceUtils.ts +65 -0
  431. package/src/utils/blockTag.ts +68 -0
  432. package/src/utils/bridgeUtils.test.ts +193 -0
  433. package/src/utils/bridgeUtils.ts +101 -0
  434. package/src/utils/errors.ts +5 -0
  435. package/src/utils/gasEstimation.ts +306 -0
  436. package/src/utils/solanaKeyParser.test.ts +103 -0
  437. package/src/utils/solanaKeyParser.ts +117 -0
  438. package/src/utils/tokenUtils.ts +89 -0
  439. package/src/utils/transactionUtils.ts +41 -0
@@ -0,0 +1,721 @@
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 { DEFAULT_INTENT_TTL_MS, ExecutionType, RebalancerStrategyOptions, } from '../config/types.js';
6
+ import { MonitorEventType } from '../interfaces/IMonitor.js';
7
+ import { TEST_ADDRESSES, getTestAddress } from '../test/helpers.js';
8
+ import { RebalancerOrchestrator, } from './RebalancerOrchestrator.js';
9
+ chai.use(chaiAsPromised);
10
+ const testLogger = pino({ level: 'silent' });
11
+ function createMockRebalancerConfig() {
12
+ return {
13
+ warpRouteId: 'TEST/route',
14
+ strategyConfig: [
15
+ {
16
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
17
+ chains: {
18
+ ethereum: {
19
+ bridge: TEST_ADDRESSES.bridge,
20
+ bridgeMinAcceptedAmount: 0,
21
+ weighted: { weight: 50n, tolerance: 10n },
22
+ },
23
+ arbitrum: {
24
+ bridge: TEST_ADDRESSES.bridge,
25
+ bridgeMinAcceptedAmount: 0,
26
+ weighted: { weight: 50n, tolerance: 10n },
27
+ },
28
+ },
29
+ },
30
+ ],
31
+ intentTTL: DEFAULT_INTENT_TTL_MS,
32
+ };
33
+ }
34
+ function createMockRebalancer() {
35
+ return {
36
+ rebalancerType: 'movableCollateral',
37
+ rebalance: Sinon.stub().resolves([]),
38
+ };
39
+ }
40
+ function createMockStrategy() {
41
+ return {
42
+ name: 'mock-strategy',
43
+ getRebalancingRoutes: Sinon.stub().returns([]),
44
+ };
45
+ }
46
+ function createMockActionTracker() {
47
+ return {
48
+ initialize: Sinon.stub().resolves(),
49
+ createRebalanceIntent: Sinon.stub().callsFake(async () => ({
50
+ id: `intent-${Date.now()}`,
51
+ status: 'not_started',
52
+ })),
53
+ createRebalanceAction: Sinon.stub().resolves(),
54
+ completeRebalanceAction: Sinon.stub().resolves(),
55
+ failRebalanceAction: Sinon.stub().resolves(),
56
+ completeRebalanceIntent: Sinon.stub().resolves(),
57
+ cancelRebalanceIntent: Sinon.stub().resolves(),
58
+ failRebalanceIntent: Sinon.stub().resolves(),
59
+ syncTransfers: Sinon.stub().resolves(),
60
+ syncRebalanceIntents: Sinon.stub().resolves(),
61
+ syncRebalanceActions: Sinon.stub().resolves(),
62
+ syncInventoryMovementActions: Sinon.stub().resolves({
63
+ completed: 0,
64
+ failed: 0,
65
+ }),
66
+ logStoreContents: Sinon.stub().resolves(),
67
+ getInProgressTransfers: Sinon.stub().resolves([]),
68
+ getActiveRebalanceIntents: Sinon.stub().resolves([]),
69
+ getTransfersByDestination: Sinon.stub().resolves([]),
70
+ getRebalanceIntentsByDestination: Sinon.stub().resolves([]),
71
+ getTransfer: Sinon.stub().resolves(undefined),
72
+ getRebalanceIntent: Sinon.stub().resolves(undefined),
73
+ getRebalanceAction: Sinon.stub().resolves(undefined),
74
+ getInProgressActions: Sinon.stub().resolves([]),
75
+ getPartiallyFulfilledInventoryIntents: Sinon.stub().resolves([]),
76
+ getActionsByType: Sinon.stub().resolves([]),
77
+ getActionsForIntent: Sinon.stub().resolves([]),
78
+ getInflightInventoryMovements: Sinon.stub().resolves(0n),
79
+ };
80
+ }
81
+ function createMockInflightContextAdapter() {
82
+ return {
83
+ getInflightContext: Sinon.stub().resolves({
84
+ pendingRebalances: [],
85
+ pendingTransfers: [],
86
+ }),
87
+ };
88
+ }
89
+ function createMockInventoryRebalancer() {
90
+ return {
91
+ rebalancerType: 'inventory',
92
+ rebalance: Sinon.stub().resolves([]),
93
+ setInventoryBalances: Sinon.stub(),
94
+ };
95
+ }
96
+ function createMockBridge() {
97
+ return {
98
+ bridgeId: 'lifi',
99
+ quote: Sinon.stub().resolves({}),
100
+ execute: Sinon.stub().resolves({}),
101
+ getStatus: Sinon.stub().resolves({}),
102
+ };
103
+ }
104
+ function createMockMetrics() {
105
+ return {
106
+ recordRebalancerSuccess: Sinon.stub(),
107
+ recordRebalancerFailure: Sinon.stub(),
108
+ recordIntentCreated: Sinon.stub(),
109
+ processToken: Sinon.stub().resolves(),
110
+ };
111
+ }
112
+ function createMonitorEvent(overrides) {
113
+ return {
114
+ type: MonitorEventType.TokenInfo,
115
+ tokensInfo: [
116
+ {
117
+ token: {
118
+ chainName: 'ethereum',
119
+ name: 'EthereumToken',
120
+ decimals: 18,
121
+ addressOrDenom: getTestAddress('ethereum'),
122
+ standard: 'EvmHypCollateral',
123
+ isCollateralized: () => true,
124
+ },
125
+ balance: 5000n,
126
+ bridgedSupply: 5000n,
127
+ },
128
+ {
129
+ token: {
130
+ chainName: 'arbitrum',
131
+ name: 'ArbitrumToken',
132
+ decimals: 18,
133
+ addressOrDenom: getTestAddress('arbitrum'),
134
+ standard: 'EvmHypCollateral',
135
+ isCollateralized: () => true,
136
+ },
137
+ balance: 5000n,
138
+ bridgedSupply: 5000n,
139
+ },
140
+ ],
141
+ confirmedBlockTags: {
142
+ ethereum: 100,
143
+ arbitrum: 200,
144
+ },
145
+ ...overrides,
146
+ };
147
+ }
148
+ describe('RebalancerOrchestrator', () => {
149
+ let sandbox;
150
+ beforeEach(() => {
151
+ sandbox = Sinon.createSandbox();
152
+ });
153
+ afterEach(() => {
154
+ sandbox.restore();
155
+ });
156
+ describe('executeCycle() - No Routes', () => {
157
+ it('should complete cycle when no routes proposed', async () => {
158
+ const strategy = createMockStrategy();
159
+ strategy.getRebalancingRoutes.returns([]);
160
+ const actionTracker = createMockActionTracker();
161
+ const inflightAdapter = createMockInflightContextAdapter();
162
+ const deps = {
163
+ strategy,
164
+ actionTracker,
165
+ inflightContextAdapter: inflightAdapter,
166
+ rebalancerConfig: createMockRebalancerConfig(),
167
+ logger: testLogger,
168
+ rebalancers: [],
169
+ };
170
+ const orchestrator = new RebalancerOrchestrator(deps);
171
+ const event = createMonitorEvent();
172
+ const result = await orchestrator.executeCycle(event);
173
+ expect(result.proposedRoutes).to.have.lengthOf(0);
174
+ expect(result.executedCount).to.equal(0);
175
+ expect(result.failedCount).to.equal(0);
176
+ expect(strategy.getRebalancingRoutes.calledOnce).to.be.true;
177
+ });
178
+ it('should sync action tracker even when no routes', async () => {
179
+ const strategy = createMockStrategy();
180
+ strategy.getRebalancingRoutes.returns([]);
181
+ const actionTracker = createMockActionTracker();
182
+ const inflightAdapter = createMockInflightContextAdapter();
183
+ const deps = {
184
+ strategy,
185
+ actionTracker,
186
+ inflightContextAdapter: inflightAdapter,
187
+ rebalancerConfig: createMockRebalancerConfig(),
188
+ logger: testLogger,
189
+ rebalancers: [],
190
+ };
191
+ const orchestrator = new RebalancerOrchestrator(deps);
192
+ const event = createMonitorEvent();
193
+ await orchestrator.executeCycle(event);
194
+ expect(actionTracker.syncTransfers.calledOnce).to.be
195
+ .true;
196
+ expect(actionTracker.syncRebalanceIntents.calledOnce)
197
+ .to.be.true;
198
+ expect(actionTracker.syncRebalanceActions.calledOnce)
199
+ .to.be.true;
200
+ });
201
+ });
202
+ describe('executeCycle() - Movable Collateral Routes Only', () => {
203
+ it('should execute movable collateral routes successfully', async () => {
204
+ const strategy = createMockStrategy();
205
+ strategy.getRebalancingRoutes.returns([
206
+ {
207
+ origin: 'ethereum',
208
+ destination: 'arbitrum',
209
+ amount: 1000n,
210
+ bridge: TEST_ADDRESSES.bridge,
211
+ executionType: 'movableCollateral',
212
+ },
213
+ ]);
214
+ const rebalancer = createMockRebalancer();
215
+ rebalancer.rebalance.resolves([
216
+ {
217
+ route: {
218
+ origin: 'ethereum',
219
+ destination: 'arbitrum',
220
+ amount: 1000n,
221
+ bridge: TEST_ADDRESSES.bridge,
222
+ },
223
+ success: true,
224
+ messageId: '0x1111111111111111111111111111111111111111111111111111111111111111',
225
+ txHash: '0x2222222222222222222222222222222222222222222222222222222222222222',
226
+ },
227
+ ]);
228
+ const actionTracker = createMockActionTracker();
229
+ const inflightAdapter = createMockInflightContextAdapter();
230
+ const deps = {
231
+ strategy,
232
+ rebalancers: [rebalancer],
233
+ actionTracker,
234
+ inflightContextAdapter: inflightAdapter,
235
+ rebalancerConfig: createMockRebalancerConfig(),
236
+ logger: testLogger,
237
+ };
238
+ const orchestrator = new RebalancerOrchestrator(deps);
239
+ const event = createMonitorEvent();
240
+ const result = await orchestrator.executeCycle(event);
241
+ expect(result.proposedRoutes).to.have.lengthOf(1);
242
+ expect(result.executedCount).to.equal(1);
243
+ expect(result.failedCount).to.equal(0);
244
+ expect(rebalancer.rebalance.calledOnce).to.be.true;
245
+ });
246
+ it('should handle failed movable collateral routes', async () => {
247
+ const strategy = createMockStrategy();
248
+ strategy.getRebalancingRoutes.returns([
249
+ {
250
+ origin: 'ethereum',
251
+ destination: 'arbitrum',
252
+ amount: 1000n,
253
+ bridge: TEST_ADDRESSES.bridge,
254
+ executionType: 'movableCollateral',
255
+ },
256
+ ]);
257
+ const rebalancer = createMockRebalancer();
258
+ rebalancer.rebalance.resolves([
259
+ {
260
+ route: {
261
+ origin: 'ethereum',
262
+ destination: 'arbitrum',
263
+ amount: 1000n,
264
+ bridge: TEST_ADDRESSES.bridge,
265
+ },
266
+ success: false,
267
+ error: 'Gas estimation failed',
268
+ },
269
+ ]);
270
+ const actionTracker = createMockActionTracker();
271
+ const inflightAdapter = createMockInflightContextAdapter();
272
+ const deps = {
273
+ strategy,
274
+ rebalancers: [rebalancer],
275
+ actionTracker,
276
+ inflightContextAdapter: inflightAdapter,
277
+ rebalancerConfig: createMockRebalancerConfig(),
278
+ logger: testLogger,
279
+ };
280
+ const orchestrator = new RebalancerOrchestrator(deps);
281
+ const event = createMonitorEvent();
282
+ const result = await orchestrator.executeCycle(event);
283
+ expect(result.proposedRoutes).to.have.lengthOf(1);
284
+ expect(result.executedCount).to.equal(0);
285
+ expect(result.failedCount).to.equal(1);
286
+ });
287
+ });
288
+ describe('executeCycle() - Inventory Routes Only', () => {
289
+ it('should execute inventory routes successfully', async () => {
290
+ const config = {
291
+ warpRouteId: 'TEST/route',
292
+ strategyConfig: [
293
+ {
294
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
295
+ chains: {
296
+ ethereum: {
297
+ bridge: TEST_ADDRESSES.bridge,
298
+ bridgeMinAcceptedAmount: 0,
299
+ weighted: { weight: 50n, tolerance: 10n },
300
+ executionType: ExecutionType.Inventory,
301
+ },
302
+ arbitrum: {
303
+ bridge: TEST_ADDRESSES.bridge,
304
+ bridgeMinAcceptedAmount: 0,
305
+ weighted: { weight: 50n, tolerance: 10n },
306
+ },
307
+ },
308
+ },
309
+ ],
310
+ intentTTL: DEFAULT_INTENT_TTL_MS,
311
+ };
312
+ const strategy = createMockStrategy();
313
+ strategy.getRebalancingRoutes.returns([
314
+ {
315
+ origin: 'ethereum',
316
+ destination: 'arbitrum',
317
+ amount: 1000n,
318
+ externalBridge: 'lifi',
319
+ executionType: 'inventory',
320
+ },
321
+ ]);
322
+ const inventoryRebalancer = createMockInventoryRebalancer();
323
+ inventoryRebalancer.rebalance.resolves([
324
+ {
325
+ success: true,
326
+ route: {
327
+ origin: 'ethereum',
328
+ destination: 'arbitrum',
329
+ amount: 1000n,
330
+ },
331
+ },
332
+ ]);
333
+ const actionTracker = createMockActionTracker();
334
+ const inflightAdapter = createMockInflightContextAdapter();
335
+ const deps = {
336
+ strategy,
337
+ rebalancers: [inventoryRebalancer],
338
+ actionTracker,
339
+ inflightContextAdapter: inflightAdapter,
340
+ rebalancerConfig: config,
341
+ logger: testLogger,
342
+ };
343
+ const orchestrator = new RebalancerOrchestrator(deps);
344
+ const event = createMonitorEvent();
345
+ const result = await orchestrator.executeCycle(event);
346
+ expect(result.proposedRoutes).to.have.lengthOf(1);
347
+ expect(inventoryRebalancer.rebalance.calledOnce).to.be.true;
348
+ });
349
+ });
350
+ describe('executeCycle() - Mixed Routes', () => {
351
+ it('should execute both movable collateral and inventory routes', async () => {
352
+ const config = {
353
+ warpRouteId: 'TEST/route',
354
+ strategyConfig: [
355
+ {
356
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
357
+ chains: {
358
+ ethereum: {
359
+ bridge: TEST_ADDRESSES.bridge,
360
+ bridgeMinAcceptedAmount: 0,
361
+ weighted: { weight: 33n, tolerance: 10n },
362
+ },
363
+ arbitrum: {
364
+ bridge: TEST_ADDRESSES.bridge,
365
+ bridgeMinAcceptedAmount: 0,
366
+ weighted: { weight: 33n, tolerance: 10n },
367
+ executionType: ExecutionType.Inventory,
368
+ },
369
+ optimism: {
370
+ bridge: TEST_ADDRESSES.bridge,
371
+ bridgeMinAcceptedAmount: 0,
372
+ weighted: { weight: 34n, tolerance: 10n },
373
+ },
374
+ },
375
+ },
376
+ ],
377
+ intentTTL: DEFAULT_INTENT_TTL_MS,
378
+ };
379
+ const strategy = createMockStrategy();
380
+ strategy.getRebalancingRoutes.returns([
381
+ {
382
+ origin: 'ethereum',
383
+ destination: 'optimism',
384
+ amount: 1000n,
385
+ bridge: TEST_ADDRESSES.bridge,
386
+ executionType: 'movableCollateral',
387
+ },
388
+ {
389
+ origin: 'arbitrum',
390
+ destination: 'ethereum',
391
+ amount: 500n,
392
+ externalBridge: 'lifi',
393
+ executionType: 'inventory',
394
+ },
395
+ ]);
396
+ const rebalancer = createMockRebalancer();
397
+ rebalancer.rebalance.resolves([
398
+ {
399
+ route: {
400
+ origin: 'ethereum',
401
+ destination: 'optimism',
402
+ amount: 1000n,
403
+ bridge: TEST_ADDRESSES.bridge,
404
+ },
405
+ success: true,
406
+ messageId: '0x1111',
407
+ txHash: '0x2222',
408
+ },
409
+ ]);
410
+ const inventoryRebalancer = createMockInventoryRebalancer();
411
+ inventoryRebalancer.rebalance.resolves([
412
+ {
413
+ success: true,
414
+ route: {
415
+ origin: 'arbitrum',
416
+ destination: 'ethereum',
417
+ amount: 500n,
418
+ },
419
+ },
420
+ ]);
421
+ const actionTracker = createMockActionTracker();
422
+ const inflightAdapter = createMockInflightContextAdapter();
423
+ const deps = {
424
+ strategy,
425
+ rebalancers: [rebalancer, inventoryRebalancer],
426
+ actionTracker,
427
+ inflightContextAdapter: inflightAdapter,
428
+ rebalancerConfig: config,
429
+ logger: testLogger,
430
+ };
431
+ const orchestrator = new RebalancerOrchestrator(deps);
432
+ const event = createMonitorEvent();
433
+ const result = await orchestrator.executeCycle(event);
434
+ expect(result.proposedRoutes).to.have.lengthOf(2);
435
+ expect(result.executedCount).to.equal(1);
436
+ expect(result.failedCount).to.equal(0);
437
+ expect(rebalancer.rebalance.calledOnce).to.be.true;
438
+ expect(inventoryRebalancer.rebalance.calledOnce).to.be.true;
439
+ });
440
+ });
441
+ describe('executeCycle() - Continue Inventory Intents', () => {
442
+ it('should call inventoryRebalancer.rebalance([]) when no routes proposed', async () => {
443
+ const config = {
444
+ warpRouteId: 'TEST/route',
445
+ strategyConfig: [
446
+ {
447
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
448
+ chains: {
449
+ ethereum: {
450
+ bridge: TEST_ADDRESSES.bridge,
451
+ bridgeMinAcceptedAmount: 0,
452
+ weighted: { weight: 50n, tolerance: 10n },
453
+ executionType: ExecutionType.Inventory,
454
+ },
455
+ arbitrum: {
456
+ bridge: TEST_ADDRESSES.bridge,
457
+ bridgeMinAcceptedAmount: 0,
458
+ weighted: { weight: 50n, tolerance: 10n },
459
+ },
460
+ },
461
+ },
462
+ ],
463
+ intentTTL: DEFAULT_INTENT_TTL_MS,
464
+ };
465
+ const strategy = createMockStrategy();
466
+ strategy.getRebalancingRoutes.returns([]);
467
+ const inventoryRebalancer = createMockInventoryRebalancer();
468
+ inventoryRebalancer.rebalance.resolves([]);
469
+ const actionTracker = createMockActionTracker();
470
+ const inflightAdapter = createMockInflightContextAdapter();
471
+ const deps = {
472
+ strategy,
473
+ rebalancers: [inventoryRebalancer],
474
+ actionTracker,
475
+ inflightContextAdapter: inflightAdapter,
476
+ rebalancerConfig: config,
477
+ logger: testLogger,
478
+ };
479
+ const orchestrator = new RebalancerOrchestrator(deps);
480
+ const event = createMonitorEvent();
481
+ await orchestrator.executeCycle(event);
482
+ expect(inventoryRebalancer.rebalance.calledOnce).to.be.true;
483
+ expect(inventoryRebalancer.rebalance.calledWith([])).to.be.true;
484
+ });
485
+ it('should NOT call inventoryRebalancer.rebalance([]) when routes are proposed', async () => {
486
+ const config = {
487
+ warpRouteId: 'TEST/route',
488
+ strategyConfig: [
489
+ {
490
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
491
+ chains: {
492
+ ethereum: {
493
+ bridge: TEST_ADDRESSES.bridge,
494
+ bridgeMinAcceptedAmount: 0,
495
+ weighted: { weight: 50n, tolerance: 10n },
496
+ executionType: ExecutionType.Inventory,
497
+ },
498
+ arbitrum: {
499
+ bridge: TEST_ADDRESSES.bridge,
500
+ bridgeMinAcceptedAmount: 0,
501
+ weighted: { weight: 50n, tolerance: 10n },
502
+ },
503
+ },
504
+ },
505
+ ],
506
+ intentTTL: DEFAULT_INTENT_TTL_MS,
507
+ };
508
+ const strategy = createMockStrategy();
509
+ strategy.getRebalancingRoutes.returns([
510
+ {
511
+ origin: 'ethereum',
512
+ destination: 'arbitrum',
513
+ amount: 1000n,
514
+ externalBridge: 'lifi',
515
+ executionType: 'inventory',
516
+ },
517
+ ]);
518
+ const inventoryRebalancer = createMockInventoryRebalancer();
519
+ inventoryRebalancer.rebalance.resolves([
520
+ {
521
+ success: true,
522
+ route: {
523
+ origin: 'ethereum',
524
+ destination: 'arbitrum',
525
+ amount: 1000n,
526
+ },
527
+ },
528
+ ]);
529
+ const actionTracker = createMockActionTracker();
530
+ const inflightAdapter = createMockInflightContextAdapter();
531
+ const deps = {
532
+ strategy,
533
+ rebalancers: [inventoryRebalancer],
534
+ actionTracker,
535
+ inflightContextAdapter: inflightAdapter,
536
+ rebalancerConfig: config,
537
+ logger: testLogger,
538
+ };
539
+ const orchestrator = new RebalancerOrchestrator(deps);
540
+ const event = createMonitorEvent();
541
+ await orchestrator.executeCycle(event);
542
+ expect(inventoryRebalancer.rebalance.calledOnce).to.be.true;
543
+ expect(inventoryRebalancer.rebalance.calledWith([])).to.be.false;
544
+ });
545
+ // eslint-disable-next-line jest/expect-expect
546
+ it('should NOT call inventoryRebalancer.rebalance([]) when inventoryRebalancer is not in rebalancers', async () => {
547
+ const strategy = createMockStrategy();
548
+ strategy.getRebalancingRoutes.returns([]);
549
+ const actionTracker = createMockActionTracker();
550
+ const inflightAdapter = createMockInflightContextAdapter();
551
+ const deps = {
552
+ strategy,
553
+ actionTracker,
554
+ inflightContextAdapter: inflightAdapter,
555
+ rebalancerConfig: createMockRebalancerConfig(),
556
+ logger: testLogger,
557
+ rebalancers: [],
558
+ };
559
+ const orchestrator = new RebalancerOrchestrator(deps);
560
+ const event = createMonitorEvent();
561
+ // Verifies executeCycle completes without error when rebalancers is empty
562
+ await orchestrator.executeCycle(event);
563
+ });
564
+ });
565
+ describe('syncActionTracker() Error Handling', () => {
566
+ it('should warn but continue when syncTransfers fails', async () => {
567
+ const strategy = createMockStrategy();
568
+ strategy.getRebalancingRoutes.returns([]);
569
+ const actionTracker = createMockActionTracker();
570
+ actionTracker.syncTransfers.rejects(new Error('Sync failed'));
571
+ const inflightAdapter = createMockInflightContextAdapter();
572
+ const deps = {
573
+ strategy,
574
+ actionTracker,
575
+ inflightContextAdapter: inflightAdapter,
576
+ rebalancerConfig: createMockRebalancerConfig(),
577
+ logger: testLogger,
578
+ rebalancers: [],
579
+ };
580
+ const orchestrator = new RebalancerOrchestrator(deps);
581
+ const event = createMonitorEvent();
582
+ const result = await orchestrator.executeCycle(event);
583
+ expect(result.proposedRoutes).to.have.lengthOf(0);
584
+ expect(strategy.getRebalancingRoutes.calledOnce).to.be.true;
585
+ });
586
+ it('should sync inventory movement actions when bridge is provided', async () => {
587
+ const strategy = createMockStrategy();
588
+ strategy.getRebalancingRoutes.returns([]);
589
+ const actionTracker = createMockActionTracker();
590
+ const inflightAdapter = createMockInflightContextAdapter();
591
+ const bridge = createMockBridge();
592
+ const deps = {
593
+ strategy,
594
+ actionTracker,
595
+ inflightContextAdapter: inflightAdapter,
596
+ rebalancerConfig: createMockRebalancerConfig(),
597
+ logger: testLogger,
598
+ rebalancers: [],
599
+ externalBridgeRegistry: { lifi: bridge },
600
+ };
601
+ const orchestrator = new RebalancerOrchestrator(deps);
602
+ const event = createMonitorEvent();
603
+ await orchestrator.executeCycle(event);
604
+ expect(actionTracker.syncInventoryMovementActions
605
+ .calledOnce).to.be.true;
606
+ expect(actionTracker.syncInventoryMovementActions.calledWith({ lifi: bridge })).to.be.true;
607
+ });
608
+ });
609
+ describe('Metrics Recording', () => {
610
+ it('should record success metric when all routes succeed', async () => {
611
+ const strategy = createMockStrategy();
612
+ strategy.getRebalancingRoutes.returns([
613
+ {
614
+ origin: 'ethereum',
615
+ destination: 'arbitrum',
616
+ amount: 1000n,
617
+ bridge: TEST_ADDRESSES.bridge,
618
+ executionType: 'movableCollateral',
619
+ },
620
+ ]);
621
+ const rebalancer = createMockRebalancer();
622
+ rebalancer.rebalance.resolves([
623
+ {
624
+ route: {
625
+ origin: 'ethereum',
626
+ destination: 'arbitrum',
627
+ amount: 1000n,
628
+ bridge: TEST_ADDRESSES.bridge,
629
+ },
630
+ success: true,
631
+ messageId: '0x1111',
632
+ txHash: '0x2222',
633
+ },
634
+ ]);
635
+ const actionTracker = createMockActionTracker();
636
+ const inflightAdapter = createMockInflightContextAdapter();
637
+ const metrics = createMockMetrics();
638
+ const deps = {
639
+ strategy,
640
+ rebalancers: [rebalancer],
641
+ actionTracker,
642
+ inflightContextAdapter: inflightAdapter,
643
+ rebalancerConfig: createMockRebalancerConfig(),
644
+ logger: testLogger,
645
+ metrics,
646
+ };
647
+ const orchestrator = new RebalancerOrchestrator(deps);
648
+ const event = createMonitorEvent();
649
+ await orchestrator.executeCycle(event);
650
+ expect(metrics.recordRebalancerSuccess.calledOnce).to
651
+ .be.true;
652
+ expect(metrics.recordRebalancerFailure.called).to.be
653
+ .false;
654
+ });
655
+ it('should record failure metric when any route fails', async () => {
656
+ const strategy = createMockStrategy();
657
+ strategy.getRebalancingRoutes.returns([
658
+ {
659
+ origin: 'ethereum',
660
+ destination: 'arbitrum',
661
+ amount: 1000n,
662
+ bridge: TEST_ADDRESSES.bridge,
663
+ executionType: 'movableCollateral',
664
+ },
665
+ ]);
666
+ const rebalancer = createMockRebalancer();
667
+ rebalancer.rebalance.resolves([
668
+ {
669
+ route: {
670
+ origin: 'ethereum',
671
+ destination: 'arbitrum',
672
+ amount: 1000n,
673
+ bridge: TEST_ADDRESSES.bridge,
674
+ },
675
+ success: false,
676
+ error: 'Gas estimation failed',
677
+ },
678
+ ]);
679
+ const actionTracker = createMockActionTracker();
680
+ const inflightAdapter = createMockInflightContextAdapter();
681
+ const metrics = createMockMetrics();
682
+ const deps = {
683
+ strategy,
684
+ rebalancers: [rebalancer],
685
+ actionTracker,
686
+ inflightContextAdapter: inflightAdapter,
687
+ rebalancerConfig: createMockRebalancerConfig(),
688
+ logger: testLogger,
689
+ metrics,
690
+ };
691
+ const orchestrator = new RebalancerOrchestrator(deps);
692
+ const event = createMonitorEvent();
693
+ await orchestrator.executeCycle(event);
694
+ expect(metrics.recordRebalancerFailure.calledOnce).to
695
+ .be.true;
696
+ expect(metrics.recordRebalancerSuccess.called).to.be
697
+ .false;
698
+ });
699
+ it('should process token metrics when metrics is provided', async () => {
700
+ const strategy = createMockStrategy();
701
+ strategy.getRebalancingRoutes.returns([]);
702
+ const actionTracker = createMockActionTracker();
703
+ const inflightAdapter = createMockInflightContextAdapter();
704
+ const metrics = createMockMetrics();
705
+ const deps = {
706
+ strategy,
707
+ actionTracker,
708
+ inflightContextAdapter: inflightAdapter,
709
+ rebalancerConfig: createMockRebalancerConfig(),
710
+ logger: testLogger,
711
+ rebalancers: [],
712
+ metrics,
713
+ };
714
+ const orchestrator = new RebalancerOrchestrator(deps);
715
+ const event = createMonitorEvent();
716
+ await orchestrator.executeCycle(event);
717
+ expect(metrics.processToken.calledTwice).to.be.true;
718
+ });
719
+ });
720
+ });
721
+ //# sourceMappingURL=RebalancerOrchestrator.test.js.map