@humanode-hyperlane/rebalancer 0.0.0-stage → 27.2.2-humanode.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 (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,771 @@
1
+ import { type Logger } from 'pino';
2
+
3
+ import { IRegistry } from '@humanode-hyperlane/registry';
4
+ import {
5
+ type ChainMap,
6
+ type CoreAddresses,
7
+ MultiProtocolCore,
8
+ MultiProtocolProvider,
9
+ MultiProvider,
10
+ type Token,
11
+ WarpCore,
12
+ type WarpCoreConfig,
13
+ } from '@humanode-hyperlane/sdk';
14
+ import {
15
+ Address,
16
+ assert,
17
+ ProtocolType,
18
+ objMap,
19
+ toWei,
20
+ } from '@humanode-hyperlane/utils';
21
+
22
+ import { LiFiBridge } from '../bridges/LiFiBridge.js';
23
+ import { type RebalancerConfig } from '../config/RebalancerConfig.js';
24
+ import {
25
+ ExecutionType,
26
+ ExternalBridgeType,
27
+ getAllBridges,
28
+ getInventoryChainNames,
29
+ getInventoryOriginChainNames,
30
+ getOverrideExecutionType,
31
+ getStrategyChainConfig,
32
+ getStrategyChainNames,
33
+ } from '../config/types.js';
34
+ import {
35
+ InventoryRebalancer,
36
+ type InventorySignerConfig,
37
+ } from '../core/InventoryRebalancer.js';
38
+ import { Rebalancer } from '../core/Rebalancer.js';
39
+ import { RebalancerOrchestrator } from '../core/RebalancerOrchestrator.js';
40
+ import type { ExternalBridgeRegistry } from '../interfaces/IExternalBridge.js';
41
+ import type { IRebalancer } from '../interfaces/IRebalancer.js';
42
+ import type { IStrategy } from '../interfaces/IStrategy.js';
43
+ import { Metrics } from '../metrics/Metrics.js';
44
+ import { PriceGetter } from '../metrics/PriceGetter.js';
45
+ import { type InventoryMonitorConfig, Monitor } from '../monitor/Monitor.js';
46
+ import { StrategyFactory } from '../strategy/StrategyFactory.js';
47
+ import {
48
+ ActionTracker,
49
+ type ActionTrackerConfig,
50
+ } from '../tracking/ActionTracker.js';
51
+ import type { IActionTracker } from '../tracking/IActionTracker.js';
52
+ import { InflightContextAdapter } from '../tracking/InflightContextAdapter.js';
53
+ import { InMemoryStore } from '../tracking/store/index.js';
54
+ import type {
55
+ RebalanceAction,
56
+ RebalanceActionStatus,
57
+ RebalanceIntent,
58
+ RebalanceIntentStatus,
59
+ Transfer,
60
+ TransferStatus,
61
+ } from '../tracking/types.js';
62
+ import {
63
+ ExplorerClient,
64
+ type IExplorerClient,
65
+ } from '../utils/ExplorerClient.js';
66
+ import { isCollateralizedTokenEligibleForRebalancing } from '../utils/tokenUtils.js';
67
+
68
+ const DEFAULT_EXPLORER_URL =
69
+ process.env.EXPLORER_API_URL || 'https://explorer4.hasura.app/v1/graphql';
70
+
71
+ export class RebalancerContextFactory {
72
+ /**
73
+ * @param config - The rebalancer config
74
+ * @param warpCore - An instance of `WarpCore` configured for the specified `warpRouteId`.
75
+ * @param tokensByChainName - A map of chain->token to ease the lookup of token by chain
76
+ * @param multiProvider - MultiProvider instance (for movable collateral operations)
77
+ * @param multiProtocolProvider - MultiProtocolProvider instance (with mailbox metadata)
78
+ * @param registry - IRegistry instance
79
+ * @param logger - Logger instance
80
+ */
81
+ private constructor(
82
+ private readonly config: RebalancerConfig,
83
+ private readonly warpCore: WarpCore,
84
+ private readonly tokensByChainName: ChainMap<Token>,
85
+ private readonly multiProvider: MultiProvider,
86
+ private readonly multiProtocolProvider: MultiProtocolProvider,
87
+ private readonly registry: IRegistry,
88
+ private readonly logger: Logger,
89
+ private readonly inventorySignerKeysByProtocol?: Partial<
90
+ Record<ProtocolType, string>
91
+ >,
92
+ ) {}
93
+
94
+ /**
95
+ * @param config - The rebalancer config
96
+ * @param multiProvider - MultiProvider instance (for movable collateral operations)
97
+ * @param multiProtocolProvider - MultiProtocolProvider instance (optional, created from multiProvider if not provided)
98
+ * @param registry - IRegistry instance
99
+ * @param logger - Logger instance
100
+ */
101
+ public static async create(
102
+ config: RebalancerConfig,
103
+ multiProvider: MultiProvider,
104
+ multiProtocolProvider: MultiProtocolProvider | undefined,
105
+ registry: IRegistry,
106
+ logger: Logger,
107
+ inventorySignerKeysByProtocol?: Partial<Record<ProtocolType, string>>,
108
+ warpCoreConfigOverride?: WarpCoreConfig,
109
+ ): Promise<RebalancerContextFactory> {
110
+ logger.debug(
111
+ {
112
+ warpRouteId: config.warpRouteId,
113
+ },
114
+ 'Creating RebalancerContextFactory',
115
+ );
116
+
117
+ // TODO: should we pull addressed for chains we care about, i.e those in the warp config
118
+ const addresses = await registry.getAddresses();
119
+
120
+ // The Sealevel warp adapters require the Mailbox address, so we
121
+ // get mailboxes for all chains and merge them with the chain metadata.
122
+ const mailboxes = objMap(addresses, (_, { mailbox }) => ({ mailbox }));
123
+
124
+ // Fetch warp route config FIRST to get chain list
125
+ const warpCoreConfig =
126
+ warpCoreConfigOverride ??
127
+ (await registry.getWarpRoute(config.warpRouteId));
128
+ if (!warpCoreConfig) {
129
+ throw new Error(
130
+ `Warp route config for ${config.warpRouteId} not found in registry`,
131
+ );
132
+ }
133
+
134
+ // Force-initialize providers for EVM warp route chains only.
135
+ // This ensures fromMultiProvider() snapshots actual provider instances.
136
+ // Non-EVM chains (StarkNet, Sealevel, etc.) don't use ethers providers
137
+ // and would crash if we tried to build one (e.g. non-numeric chainId).
138
+ const warpChains = [
139
+ ...new Set(warpCoreConfig.tokens.map((t) => t.chainName)),
140
+ ];
141
+ for (const chain of warpChains) {
142
+ if (multiProvider.getProtocol(chain) !== ProtocolType.Ethereum) {
143
+ logger.debug({ chain }, 'Skipping provider init for non-EVM chain');
144
+ continue;
145
+ }
146
+ multiProvider.getProvider(chain);
147
+ }
148
+
149
+ // Create MultiProtocolProvider (convert from MultiProvider if not provided)
150
+ const mpp =
151
+ multiProtocolProvider ??
152
+ MultiProtocolProvider.fromMultiProvider(multiProvider);
153
+ const extendedMultiProtocolProvider = mpp.extendChainMetadata(mailboxes);
154
+
155
+ const warpCore = WarpCore.FromConfig(
156
+ extendedMultiProtocolProvider,
157
+ warpCoreConfig,
158
+ );
159
+ const tokensByChainName = Object.fromEntries(
160
+ warpCore.tokens.map((t) => [t.chainName, t]),
161
+ );
162
+
163
+ logger.debug(
164
+ {
165
+ warpRouteId: config.warpRouteId,
166
+ },
167
+ 'RebalancerContextFactory created successfully',
168
+ );
169
+ return new RebalancerContextFactory(
170
+ config,
171
+ warpCore,
172
+ tokensByChainName,
173
+ multiProvider,
174
+ extendedMultiProtocolProvider,
175
+ registry,
176
+ logger,
177
+ inventorySignerKeysByProtocol,
178
+ );
179
+ }
180
+
181
+ public getWarpCore(): WarpCore {
182
+ return this.warpCore;
183
+ }
184
+
185
+ public getTokenForChain(chainName: string): Token | undefined {
186
+ return this.tokensByChainName[chainName];
187
+ }
188
+
189
+ public async createMetrics(coingeckoApiKey?: string): Promise<Metrics> {
190
+ this.logger.debug(
191
+ { warpRouteId: this.config.warpRouteId },
192
+ 'Creating Metrics',
193
+ );
194
+ const tokenPriceGetter = PriceGetter.create(
195
+ this.multiProvider.metadata,
196
+ this.logger,
197
+ coingeckoApiKey,
198
+ );
199
+ const warpDeployConfig = await this.registry.getWarpDeployConfig(
200
+ this.config.warpRouteId,
201
+ );
202
+
203
+ return new Metrics(
204
+ tokenPriceGetter,
205
+ warpDeployConfig,
206
+ this.warpCore,
207
+ this.config.warpRouteId,
208
+ this.logger,
209
+ );
210
+ }
211
+
212
+ public createMonitor(
213
+ checkFrequency: number,
214
+ inventoryConfig?: InventoryMonitorConfig,
215
+ ): Monitor {
216
+ this.logger.debug(
217
+ {
218
+ warpRouteId: this.config.warpRouteId,
219
+ checkFrequency: checkFrequency,
220
+ },
221
+ 'Creating Monitor',
222
+ );
223
+ return new Monitor(
224
+ checkFrequency,
225
+ this.warpCore,
226
+ this.logger,
227
+ inventoryConfig,
228
+ );
229
+ }
230
+
231
+ public async createStrategy(metrics?: Metrics): Promise<IStrategy> {
232
+ const strategyTypes = this.config.strategyConfig.map(
233
+ (s) => s.rebalanceStrategy,
234
+ );
235
+ this.logger.debug(
236
+ {
237
+ warpRouteId: this.config.warpRouteId,
238
+ strategyTypes,
239
+ strategyCount: this.config.strategyConfig.length,
240
+ },
241
+ 'Creating Strategy',
242
+ );
243
+
244
+ // Build minAmountsByChain from chain configs
245
+ const chainNames = getStrategyChainNames(this.config.strategyConfig);
246
+ const minAmountsByChain: ChainMap<bigint> = {};
247
+
248
+ for (const chainName of chainNames) {
249
+ const chainConfig = getStrategyChainConfig(
250
+ this.config.strategyConfig,
251
+ chainName,
252
+ );
253
+ if (chainConfig?.bridgeMinAcceptedAmount) {
254
+ const token = this.tokensByChainName[chainName];
255
+ const decimals = token?.decimals ?? 18;
256
+ minAmountsByChain[chainName] = BigInt(
257
+ toWei(chainConfig.bridgeMinAcceptedAmount, decimals),
258
+ );
259
+ }
260
+ }
261
+
262
+ this.logger.debug(
263
+ {
264
+ minAmountsByChain: Object.fromEntries(
265
+ Object.entries(minAmountsByChain).map(([k, v]) => [k, v.toString()]),
266
+ ),
267
+ },
268
+ 'Built minimum amounts by chain for strategy',
269
+ );
270
+
271
+ return StrategyFactory.createStrategy(
272
+ this.config.strategyConfig,
273
+ this.tokensByChainName,
274
+ await this.getInitialTotalCollateral(),
275
+ this.logger,
276
+ metrics,
277
+ minAmountsByChain,
278
+ );
279
+ }
280
+
281
+ private createMovableCollateralRebalancer(
282
+ actionTracker: IActionTracker,
283
+ metrics?: Metrics,
284
+ ): IRebalancer {
285
+ this.logger.debug(
286
+ { warpRouteId: this.config.warpRouteId },
287
+ 'Creating Rebalancer',
288
+ );
289
+
290
+ const rebalancer = new Rebalancer(
291
+ this.warpCore,
292
+ this.multiProvider.metadata,
293
+ this.tokensByChainName,
294
+ this.multiProvider,
295
+ actionTracker,
296
+ this.logger,
297
+ metrics,
298
+ );
299
+
300
+ return rebalancer;
301
+ }
302
+
303
+ public async createActionTracker(
304
+ explorerUrlOrClient: string | IExplorerClient = DEFAULT_EXPLORER_URL,
305
+ ): Promise<{
306
+ tracker: IActionTracker;
307
+ adapter: InflightContextAdapter;
308
+ }> {
309
+ this.logger.debug(
310
+ { warpRouteId: this.config.warpRouteId },
311
+ 'Creating ActionTracker',
312
+ );
313
+
314
+ const transferStore = new InMemoryStore<Transfer, TransferStatus>();
315
+ const intentStore = new InMemoryStore<
316
+ RebalanceIntent,
317
+ RebalanceIntentStatus
318
+ >();
319
+ const actionStore = new InMemoryStore<
320
+ RebalanceAction,
321
+ RebalanceActionStatus
322
+ >();
323
+
324
+ const explorerClient =
325
+ typeof explorerUrlOrClient === 'string'
326
+ ? new ExplorerClient(explorerUrlOrClient, (domain) =>
327
+ this.multiProvider.getProtocol(domain),
328
+ )
329
+ : explorerUrlOrClient;
330
+
331
+ // 3. Get MultiProtocolCore from registry (supports all VM types)
332
+ // Only fetch/validate addresses for warp route chains (not all registry chains)
333
+ const warpRouteChains = new Set(
334
+ this.warpCore.tokens.map((t) => t.chainName),
335
+ );
336
+ const coreAddresses: ChainMap<CoreAddresses> = {};
337
+ for (const chain of warpRouteChains) {
338
+ const addrs = await this.registry.getChainAddresses(chain);
339
+ if (!addrs?.mailbox) {
340
+ throw new Error(
341
+ `Missing mailbox address for chain ${chain} in registry`,
342
+ );
343
+ }
344
+ coreAddresses[chain] = addrs as CoreAddresses;
345
+ }
346
+ const multiProtocolCore = MultiProtocolCore.fromAddressesMap(
347
+ coreAddresses,
348
+ this.multiProtocolProvider,
349
+ );
350
+
351
+ // 4. Get rebalancer address from signer
352
+ // Use the first chain in the strategy to get the signer address
353
+ const chainNames = getStrategyChainNames(this.config.strategyConfig);
354
+ if (chainNames.length === 0) {
355
+ throw new Error('No chains configured in strategy');
356
+ }
357
+ const signer = this.multiProvider.getSigner(chainNames[0]);
358
+ const rebalancerAddress = await signer.getAddress();
359
+
360
+ const bridges = getAllBridges(this.config.strategyConfig);
361
+
362
+ // Build router→domain mapping (source of truth for routers and domains)
363
+ const routersByDomain: Record<number, string> = {};
364
+ for (const token of this.warpCore.tokens) {
365
+ const domain = this.multiProvider.getDomainId(token.chainName);
366
+ routersByDomain[domain] = token.addressOrDenom;
367
+ }
368
+
369
+ const trackerConfig: ActionTrackerConfig = {
370
+ routersByDomain,
371
+ bridges,
372
+ rebalancerAddress,
373
+ inventorySignerAddresses: this.config.inventorySigners
374
+ ? (Object.entries(this.config.inventorySigners)
375
+ .filter(([protocol]) => protocol === ProtocolType.Ethereum)
376
+ .map(([, signerConfig]) => signerConfig)
377
+ .map((s) => s.address)
378
+ .filter(Boolean) as Address[])
379
+ : undefined,
380
+ intentTTL: this.config.intentTTL,
381
+ };
382
+
383
+ // 6. Create ActionTracker
384
+ const tracker = new ActionTracker(
385
+ transferStore,
386
+ intentStore,
387
+ actionStore,
388
+ explorerClient,
389
+ multiProtocolCore,
390
+ trackerConfig,
391
+ this.logger,
392
+ );
393
+
394
+ // 7. Create InflightContextAdapter
395
+ const adapter = new InflightContextAdapter(tracker, this.multiProvider);
396
+
397
+ this.logger.debug(
398
+ {
399
+ warpRouteId: this.config.warpRouteId,
400
+ routerCount: Object.keys(routersByDomain).length,
401
+ bridgeCount: bridges.length,
402
+ domainCount: Object.keys(routersByDomain).length,
403
+ },
404
+ 'ActionTracker created successfully',
405
+ );
406
+
407
+ return { tracker, adapter };
408
+ }
409
+
410
+ /**
411
+ * Creates inventory components for inventory-based rebalancing.
412
+ * Returns null if inventory config is not available.
413
+ *
414
+ * @param actionTracker - ActionTracker instance for tracking inventory actions
415
+ * @param externalBridgeRegistryOverride - Optional override for external bridge registry (for testing)
416
+ */
417
+ private async createInventoryRebalancerAndConfig(
418
+ actionTracker: IActionTracker,
419
+ externalBridgeRegistryOverride?: Partial<ExternalBridgeRegistry>,
420
+ ): Promise<{
421
+ inventoryRebalancer: IRebalancer;
422
+ externalBridgeRegistry: Partial<ExternalBridgeRegistry>;
423
+ inventoryConfig: InventoryMonitorConfig;
424
+ } | null> {
425
+ const { inventorySigners } = this.config;
426
+
427
+ if (!inventorySigners || Object.keys(inventorySigners).length === 0) {
428
+ this.logger.debug(
429
+ 'Inventory config not available, skipping inventory components creation',
430
+ );
431
+ return null;
432
+ }
433
+
434
+ const redactedInventorySigners = Object.fromEntries(
435
+ Object.entries(inventorySigners).map(([protocol, signerConfig]) => [
436
+ protocol,
437
+ signerConfig ? { address: signerConfig.address } : signerConfig,
438
+ ]),
439
+ );
440
+
441
+ this.logger.debug(
442
+ {
443
+ warpRouteId: this.config.warpRouteId,
444
+ inventorySigners: redactedInventorySigners,
445
+ },
446
+ 'Creating inventory components',
447
+ );
448
+
449
+ const inventoryChains = getInventoryChainNames(this.config.strategyConfig);
450
+ const inventoryOriginChains = getInventoryOriginChainNames(
451
+ this.config.strategyConfig,
452
+ );
453
+ const allRelevantChains = Array.from(
454
+ new Set([...inventoryChains, ...inventoryOriginChains]),
455
+ );
456
+
457
+ if (allRelevantChains.length === 0) {
458
+ this.logger.debug('No inventory chains configured');
459
+ return null;
460
+ }
461
+
462
+ const requiredProtocols = new Set(
463
+ allRelevantChains.map((chain) => {
464
+ const metadata = this.warpCore.multiProvider.getChainMetadata(chain);
465
+ assert(
466
+ metadata?.protocol,
467
+ `No protocol in chain metadata for ${chain}`,
468
+ );
469
+ return metadata.protocol;
470
+ }),
471
+ );
472
+ const SUPPORTED_INVENTORY_PROTOCOLS = new Set([
473
+ ProtocolType.Ethereum,
474
+ ProtocolType.Sealevel,
475
+ ]);
476
+ for (const protocol of requiredProtocols) {
477
+ const chainsForProtocol = allRelevantChains.filter(
478
+ (chain) =>
479
+ this.warpCore.multiProvider.getChainMetadata(chain).protocol ===
480
+ protocol,
481
+ );
482
+ assert(
483
+ SUPPORTED_INVENTORY_PROTOCOLS.has(protocol),
484
+ `Inventory rebalancing does not support protocol '${protocol}' (chains: ${chainsForProtocol.join(', ')}). Supported: ethereum, sealevel`,
485
+ );
486
+ }
487
+ for (const protocol of requiredProtocols) {
488
+ const chainsForProtocol = allRelevantChains.filter(
489
+ (chain) =>
490
+ this.warpCore.multiProvider.getChainMetadata(chain).protocol ===
491
+ protocol,
492
+ );
493
+ assert(
494
+ this.config.inventorySigners?.[protocol]?.key ??
495
+ this.inventorySignerKeysByProtocol?.[protocol],
496
+ `Missing inventory signer key for protocol ${protocol} (required by inventory chains: ${chainsForProtocol.join(', ')})`,
497
+ );
498
+ }
499
+
500
+ // Validate inventory address coverage for all required protocols
501
+ for (const protocol of requiredProtocols) {
502
+ const chainsForProtocol = allRelevantChains.filter(
503
+ (chain) =>
504
+ this.warpCore.multiProvider.getChainMetadata(chain).protocol ===
505
+ protocol,
506
+ );
507
+ assert(
508
+ inventorySigners[protocol]?.address,
509
+ `Missing inventory address for protocol ${protocol} (required by inventory chains: ${chainsForProtocol.join(', ')})`,
510
+ );
511
+ }
512
+
513
+ const externalBridgeRegistry: Partial<ExternalBridgeRegistry> =
514
+ externalBridgeRegistryOverride ?? this.buildExternalBridgeRegistry();
515
+
516
+ if (Object.keys(externalBridgeRegistry).length === 0) {
517
+ if (externalBridgeRegistryOverride !== undefined) {
518
+ this.logger.debug(
519
+ 'No external bridges in override registry, skipping inventory components',
520
+ );
521
+ } else {
522
+ this.logger.debug(
523
+ 'No external bridges configured, skipping inventory components',
524
+ );
525
+ }
526
+ const inventoryAddresses = Object.fromEntries(
527
+ Object.entries(inventorySigners).map(([protocol, cfg]) => [
528
+ protocol,
529
+ cfg.address,
530
+ ]),
531
+ ) as Partial<Record<ProtocolType, Address>>;
532
+ const inventoryConfig: InventoryMonitorConfig = {
533
+ inventoryAddresses,
534
+ chains: allRelevantChains,
535
+ };
536
+ // Merge config addresses with runtime keys
537
+ const mergedSigners: Partial<
538
+ Record<ProtocolType, InventorySignerConfig>
539
+ > = {};
540
+ for (const [protocol, cfg] of Object.entries(inventorySigners)) {
541
+ const protocolKey = protocol as ProtocolType;
542
+ mergedSigners[protocolKey] = {
543
+ address: cfg.address,
544
+ key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocolKey],
545
+ };
546
+ }
547
+ const inventoryRebalancer = new InventoryRebalancer(
548
+ {
549
+ inventorySigners: mergedSigners,
550
+ inventoryChains,
551
+ },
552
+ actionTracker,
553
+ externalBridgeRegistryOverride ?? {},
554
+ this.warpCore,
555
+ this.multiProvider,
556
+ this.logger,
557
+ );
558
+ return {
559
+ inventoryRebalancer,
560
+ externalBridgeRegistry: externalBridgeRegistryOverride ?? {},
561
+ inventoryConfig,
562
+ };
563
+ }
564
+
565
+ // 3. Build inventory config
566
+ const inventoryAddresses = Object.fromEntries(
567
+ Object.entries(inventorySigners).map(([protocol, cfg]) => [
568
+ protocol,
569
+ cfg.address,
570
+ ]),
571
+ ) as Partial<Record<ProtocolType, Address>>;
572
+ const inventoryConfig: InventoryMonitorConfig = {
573
+ inventoryAddresses,
574
+ chains: allRelevantChains,
575
+ };
576
+
577
+ // 4. Create InventoryRebalancer
578
+ // Merge config addresses with runtime keys
579
+ const mergedSigners: Partial<Record<ProtocolType, InventorySignerConfig>> =
580
+ {};
581
+ for (const [protocol, cfg] of Object.entries(inventorySigners)) {
582
+ const protocolKey = protocol as ProtocolType;
583
+ mergedSigners[protocolKey] = {
584
+ address: cfg.address,
585
+ key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocolKey],
586
+ };
587
+ }
588
+ const inventoryRebalancer = new InventoryRebalancer(
589
+ {
590
+ inventorySigners: mergedSigners,
591
+ inventoryChains,
592
+ },
593
+ actionTracker,
594
+ externalBridgeRegistry,
595
+ this.warpCore,
596
+ this.multiProvider,
597
+ this.logger,
598
+ );
599
+
600
+ this.logger.info(
601
+ {
602
+ inventoryChains,
603
+ inventorySigners: redactedInventorySigners,
604
+ },
605
+ 'Inventory components created successfully',
606
+ );
607
+
608
+ return { inventoryRebalancer, externalBridgeRegistry, inventoryConfig };
609
+ }
610
+
611
+ private buildExternalBridgeRegistry(): Partial<ExternalBridgeRegistry> {
612
+ const { externalBridges } = this.config;
613
+ const registry: Partial<ExternalBridgeRegistry> = {};
614
+
615
+ for (const bridgeType of Object.values(ExternalBridgeType)) {
616
+ switch (bridgeType) {
617
+ case ExternalBridgeType.LiFi: {
618
+ const lifiConfig = externalBridges?.lifi;
619
+ if (lifiConfig?.integrator) {
620
+ registry[ExternalBridgeType.LiFi] = new LiFiBridge(
621
+ {
622
+ integrator: lifiConfig.integrator,
623
+ defaultSlippage: lifiConfig.defaultSlippage,
624
+ chainMetadata: this.multiProvider.metadata,
625
+ },
626
+ this.logger,
627
+ );
628
+ }
629
+ break;
630
+ }
631
+ default: {
632
+ // Exhaustive check - TypeScript will error if new enum value added
633
+ const _exhaustive: never = bridgeType;
634
+ throw new Error(`Unknown bridge type: ${_exhaustive}`);
635
+ }
636
+ }
637
+ }
638
+
639
+ return registry;
640
+ }
641
+
642
+ /**
643
+ * Creates all rebalancers based on config execution types.
644
+ * Returns an array of rebalancers (movableCollateral and/or inventory)
645
+ * along with metadata needed for monitor and orchestrator.
646
+ *
647
+ * @param actionTracker - ActionTracker instance for tracking actions
648
+ * @param metrics - Optional Metrics instance
649
+ * @param externalBridgeRegistryOverride - Optional override for external bridge registry (for testing)
650
+ */
651
+ public async createRebalancers(
652
+ actionTracker: IActionTracker,
653
+ metrics?: Metrics,
654
+ externalBridgeRegistryOverride?: Partial<ExternalBridgeRegistry>,
655
+ ): Promise<{
656
+ rebalancers: IRebalancer[];
657
+ externalBridgeRegistry: Partial<ExternalBridgeRegistry>;
658
+ inventoryConfig?: InventoryMonitorConfig;
659
+ }> {
660
+ const rebalancers: IRebalancer[] = [];
661
+ let externalBridgeRegistry: Partial<ExternalBridgeRegistry> = {};
662
+ let inventoryConfig: InventoryMonitorConfig | undefined;
663
+
664
+ // Check if any chains use movableCollateral execution type
665
+ const hasMovableCollateral = this.hasMovableCollateralChains();
666
+ if (hasMovableCollateral) {
667
+ const rebalancer = this.createMovableCollateralRebalancer(
668
+ actionTracker,
669
+ metrics,
670
+ );
671
+ rebalancers.push(rebalancer);
672
+ }
673
+
674
+ // Check if any chains use inventory execution type
675
+ const inventoryComponents = await this.createInventoryRebalancerAndConfig(
676
+ actionTracker,
677
+ externalBridgeRegistryOverride,
678
+ );
679
+ if (inventoryComponents) {
680
+ rebalancers.push(inventoryComponents.inventoryRebalancer);
681
+ externalBridgeRegistry = inventoryComponents.externalBridgeRegistry;
682
+ inventoryConfig = inventoryComponents.inventoryConfig;
683
+ }
684
+
685
+ return { rebalancers, externalBridgeRegistry, inventoryConfig };
686
+ }
687
+
688
+ /**
689
+ * Creates a RebalancerOrchestrator with all required dependencies.
690
+ */
691
+ public createOrchestrator(options: {
692
+ strategy: IStrategy;
693
+ actionTracker: IActionTracker;
694
+ inflightContextAdapter: InflightContextAdapter;
695
+ rebalancers: IRebalancer[];
696
+ externalBridgeRegistry: Partial<ExternalBridgeRegistry>;
697
+ metrics?: Metrics;
698
+ }): RebalancerOrchestrator {
699
+ this.logger.debug(
700
+ { warpRouteId: this.config.warpRouteId },
701
+ 'Creating RebalancerOrchestrator',
702
+ );
703
+
704
+ return new RebalancerOrchestrator({
705
+ strategy: options.strategy,
706
+ actionTracker: options.actionTracker,
707
+ inflightContextAdapter: options.inflightContextAdapter,
708
+ rebalancerConfig: this.config,
709
+ logger: this.logger,
710
+ rebalancers: options.rebalancers,
711
+ externalBridgeRegistry: options.externalBridgeRegistry,
712
+ metrics: options.metrics,
713
+ });
714
+ }
715
+
716
+ private hasMovableCollateralChains(): boolean {
717
+ return getStrategyChainNames(this.config.strategyConfig).some(
718
+ (chainName) => {
719
+ const chainConfig = getStrategyChainConfig(
720
+ this.config.strategyConfig,
721
+ chainName,
722
+ );
723
+ if (
724
+ (chainConfig?.executionType ?? ExecutionType.MovableCollateral) ===
725
+ ExecutionType.MovableCollateral
726
+ ) {
727
+ return true;
728
+ }
729
+
730
+ if (!chainConfig?.override) {
731
+ return false;
732
+ }
733
+
734
+ return Object.values(chainConfig.override).some((overrideConfig) => {
735
+ const overrideExecutionType =
736
+ getOverrideExecutionType(overrideConfig);
737
+
738
+ return (
739
+ (overrideExecutionType ??
740
+ chainConfig.executionType ??
741
+ ExecutionType.MovableCollateral) ===
742
+ ExecutionType.MovableCollateral
743
+ );
744
+ });
745
+ },
746
+ );
747
+ }
748
+
749
+ private async getInitialTotalCollateral(): Promise<bigint> {
750
+ let initialTotalCollateral = 0n;
751
+
752
+ const chainNames = new Set(
753
+ getStrategyChainNames(this.config.strategyConfig),
754
+ );
755
+
756
+ await Promise.all(
757
+ this.warpCore.tokens.map(async (token) => {
758
+ if (
759
+ isCollateralizedTokenEligibleForRebalancing(token) &&
760
+ chainNames.has(token.chainName)
761
+ ) {
762
+ const adapter = token.getHypAdapter(this.warpCore.multiProvider);
763
+ const bridgedSupply = await adapter.getBridgedSupply();
764
+ initialTotalCollateral += bridgedSupply ?? 0n;
765
+ }
766
+ }),
767
+ );
768
+
769
+ return initialTotalCollateral;
770
+ }
771
+ }