@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,324 @@
1
+ import { addressToByteHexString, isEVMLike, } from '@humanode-hyperlane/utils';
2
+ export class ExplorerClient {
3
+ baseUrl;
4
+ getProtocol;
5
+ constructor(baseUrl, getProtocol) {
6
+ this.baseUrl = baseUrl;
7
+ this.getProtocol = getProtocol;
8
+ }
9
+ /**
10
+ * Convert an address to PostgreSQL bytea format (\\x-prefixed hex).
11
+ * When `domain` is provided, resolves the chain's protocol to encode
12
+ * non-EVM addresses (e.g. base58 Solana, 32-byte Starknet) correctly
13
+ * via `addressToByteHexString`. Without `domain`, assumes the address
14
+ * is already EVM-format hex (used for bridges, txSender, etc. which
15
+ * are always EVM addresses).
16
+ */
17
+ toBytea(addr, domain) {
18
+ const protocol = domain !== undefined ? this.getProtocol(domain) : undefined;
19
+ if (protocol && !isEVMLike(protocol)) {
20
+ const hex = addressToByteHexString(addr, protocol);
21
+ return hex.replace(/^0x/i, '\\x').toLowerCase();
22
+ }
23
+ return addr.replace(/^0x/i, '\\x').toLowerCase();
24
+ }
25
+ /**
26
+ * Normalize all hex fields in Explorer response from PostgreSQL bytea format (\\x) to standard hex (0x)
27
+ */
28
+ normalizeExplorerMessage(msg) {
29
+ const normalizeHex = (hex) => {
30
+ if (!hex)
31
+ return hex;
32
+ return hex.startsWith('\\x') ? '0x' + hex.slice(2) : hex;
33
+ };
34
+ return {
35
+ msg_id: normalizeHex(msg.msg_id),
36
+ origin_domain_id: msg.origin_domain_id,
37
+ destination_domain_id: msg.destination_domain_id,
38
+ sender: normalizeHex(msg.sender),
39
+ recipient: normalizeHex(msg.recipient),
40
+ origin_tx_hash: normalizeHex(msg.origin_tx_hash),
41
+ origin_tx_sender: normalizeHex(msg.origin_tx_sender),
42
+ origin_tx_recipient: normalizeHex(msg.origin_tx_recipient),
43
+ is_delivered: msg.is_delivered,
44
+ message_body: normalizeHex(msg.message_body),
45
+ send_occurred_at: msg.send_occurred_at ?? null,
46
+ };
47
+ }
48
+ async hasUndeliveredRebalance(params, logger) {
49
+ const { bridges, routersByDomain, txSender, limit = 5 } = params;
50
+ // Derive routers and domains from routersByDomain
51
+ const routerEntries = Object.entries(routersByDomain);
52
+ const domains = Object.keys(routersByDomain).map(Number);
53
+ const variables = {
54
+ // NOTE: bridges are always EVM addresses; pass domain here if non-EVM bridges are added
55
+ senders: bridges.map((a) => this.toBytea(a)),
56
+ // NOTE: bridges are always EVM addresses; pass domain here if non-EVM bridges are added
57
+ recipients: bridges.map((a) => this.toBytea(a)),
58
+ originTxRecipients: routerEntries.map(([domain, addr]) => this.toBytea(addr, Number(domain))),
59
+ originDomains: domains,
60
+ destDomains: domains,
61
+ // NOTE: txSender is always an EVM address (rebalancer signer)
62
+ txSenders: [this.toBytea(txSender)],
63
+ limit,
64
+ };
65
+ logger.debug({ variables }, 'Explorer query variables');
66
+ const query = `
67
+ query InflightRebalancesForRoute(
68
+ $senders: [bytea!],
69
+ $recipients: [bytea!],
70
+ $originTxRecipients: [bytea!],
71
+ $originDomains: [Int!],
72
+ $destDomains: [Int!],
73
+ $txSenders: [bytea!],
74
+ $limit: Int = 25
75
+ ) {
76
+ message_view(
77
+ where: {
78
+ _and: [
79
+ { is_delivered: { _eq: false } },
80
+ { sender: { _in: $senders } },
81
+ { recipient: { _in: $recipients } },
82
+ { origin_tx_recipient: { _in: $originTxRecipients } },
83
+ { origin_domain_id: { _in: $originDomains } },
84
+ { destination_domain_id: { _in: $destDomains } },
85
+ { origin_tx_sender: { _in: $txSenders } }
86
+ ]
87
+ }
88
+ order_by: { origin_tx_id: desc }
89
+ limit: $limit
90
+ ) {
91
+ msg_id
92
+ origin_domain_id
93
+ destination_domain_id
94
+ sender
95
+ recipient
96
+ origin_tx_hash
97
+ origin_tx_sender
98
+ origin_tx_recipient
99
+ is_delivered
100
+ message_body
101
+ }
102
+ }`;
103
+ const res = await fetch(this.baseUrl, {
104
+ method: 'POST',
105
+ headers: { 'Content-Type': 'application/json' },
106
+ body: JSON.stringify({ query, variables }),
107
+ });
108
+ logger.debug({ status: res.status }, 'Explorer query response');
109
+ if (!res.ok) {
110
+ let errorDetails;
111
+ try {
112
+ const errorJson = await res.json();
113
+ errorDetails = JSON.stringify(errorJson);
114
+ }
115
+ catch (_e) {
116
+ try {
117
+ // Fallback to text if JSON parsing fails
118
+ errorDetails = await res.text();
119
+ }
120
+ catch (_textError) {
121
+ errorDetails = 'Unable to read response body';
122
+ }
123
+ }
124
+ throw new Error(`Explorer query failed: ${res.status} ${errorDetails}`);
125
+ }
126
+ const json = await res.json();
127
+ const rows = json?.data?.message_view ?? [];
128
+ logger.debug({ rows }, 'Explorer query rows');
129
+ // Post-query validation: verify each message's origin domain matches the expected router
130
+ const validatedRows = rows.filter((msg) => {
131
+ const expectedRouter = routersByDomain[msg.origin_domain_id];
132
+ if (!expectedRouter)
133
+ return false;
134
+ const protocol = this.getProtocol(msg.origin_domain_id);
135
+ const normalizedMsgRouter = msg.origin_tx_recipient?.startsWith('\\x')
136
+ ? '0x' + msg.origin_tx_recipient.slice(2)
137
+ : msg.origin_tx_recipient;
138
+ if (protocol && !isEVMLike(protocol)) {
139
+ const expectedHex = addressToByteHexString(expectedRouter, protocol).toLowerCase();
140
+ return normalizedMsgRouter?.toLowerCase() === expectedHex;
141
+ }
142
+ return (normalizedMsgRouter?.toLowerCase() === expectedRouter.toLowerCase());
143
+ });
144
+ logger.debug({ totalRows: rows.length, validatedRows: validatedRows.length }, 'Post-query validation results');
145
+ return validatedRows.length > 0;
146
+ }
147
+ /**
148
+ * Query inflight user transfers from the Explorer.
149
+ * Returns transfers where sender/recipient are routers, excluding rebalancer's own transactions.
150
+ */
151
+ async getInflightUserTransfers(params, logger) {
152
+ const { routersByDomain, excludeTxSenders, limit = 100 } = params;
153
+ // Derive routers and domains from routersByDomain
154
+ const routerEntries = Object.entries(routersByDomain);
155
+ const domains = Object.keys(routersByDomain).map(Number);
156
+ const variables = {
157
+ senders: routerEntries.map(([domain, addr]) => this.toBytea(addr, Number(domain))),
158
+ recipients: routerEntries.map(([domain, addr]) => this.toBytea(addr, Number(domain))),
159
+ originDomains: domains,
160
+ destDomains: domains,
161
+ // NOTE: excludeTxSenders are always EVM addresses
162
+ excludeTxSenders: excludeTxSenders.map((a) => this.toBytea(a)),
163
+ limit,
164
+ };
165
+ logger.debug({ variables }, 'Explorer getInflightUserTransfers query');
166
+ const query = `
167
+ query InflightUserTransfers(
168
+ $senders: [bytea!],
169
+ $recipients: [bytea!],
170
+ $originDomains: [Int!],
171
+ $destDomains: [Int!],
172
+ $excludeTxSenders: [bytea!],
173
+ $limit: Int = 100
174
+ ) {
175
+ message_view(
176
+ where: {
177
+ _and: [
178
+ { is_delivered: { _eq: false } },
179
+ { sender: { _in: $senders } },
180
+ { recipient: { _in: $recipients } },
181
+ { origin_domain_id: { _in: $originDomains } },
182
+ { destination_domain_id: { _in: $destDomains } },
183
+ { origin_tx_sender: { _nin: $excludeTxSenders } }
184
+ ]
185
+ }
186
+ order_by: { origin_tx_id: desc }
187
+ limit: $limit
188
+ ) {
189
+ msg_id
190
+ origin_domain_id
191
+ destination_domain_id
192
+ sender
193
+ recipient
194
+ origin_tx_hash
195
+ origin_tx_sender
196
+ origin_tx_recipient
197
+ is_delivered
198
+ message_body
199
+ send_occurred_at
200
+ }
201
+ }`;
202
+ const res = await fetch(this.baseUrl, {
203
+ method: 'POST',
204
+ headers: { 'Content-Type': 'application/json' },
205
+ body: JSON.stringify({ query, variables }),
206
+ });
207
+ logger.debug({ status: res.status }, 'Explorer getInflightUserTransfers response');
208
+ if (!res.ok) {
209
+ let errorDetails;
210
+ try {
211
+ const errorJson = await res.json();
212
+ errorDetails = JSON.stringify(errorJson);
213
+ }
214
+ catch (_e) {
215
+ try {
216
+ errorDetails = await res.text();
217
+ }
218
+ catch (_textError) {
219
+ errorDetails = 'Unable to read response body';
220
+ }
221
+ }
222
+ throw new Error(`Explorer query failed: ${res.status} ${errorDetails}`);
223
+ }
224
+ const json = await res.json();
225
+ const messages = json?.data?.message_view ?? [];
226
+ return messages.map((msg) => this.normalizeExplorerMessage(msg));
227
+ }
228
+ /**
229
+ * Query inflight rebalance actions from the Explorer.
230
+ * Returns messages where sender/recipient are bridges, tx sender is the rebalancer,
231
+ * and origin_tx_recipient is one of this warp route's routers.
232
+ */
233
+ async getInflightRebalanceActions(params, logger) {
234
+ const { bridges, routersByDomain, rebalancerAddress, inventorySignerAddresses, limit = 100, } = params;
235
+ // Derive routers and domains from routersByDomain
236
+ const routerEntries = Object.entries(routersByDomain);
237
+ const domains = Object.keys(routersByDomain).map(Number);
238
+ // Build list of tx senders to include (rebalancer + optional inventory signer)
239
+ // NOTE: rebalancerAddress is always an EVM address (rebalancer signer)
240
+ const txSenders = [this.toBytea(rebalancerAddress)];
241
+ if (inventorySignerAddresses) {
242
+ for (const addr of inventorySignerAddresses) {
243
+ // NOTE: inventorySignerAddresses are filtered to ProtocolType.Ethereum
244
+ txSenders.push(this.toBytea(addr));
245
+ }
246
+ }
247
+ const variables = {
248
+ // NOTE: bridges are always EVM addresses; pass domain here if non-EVM bridges are added
249
+ senders: bridges.map((a) => this.toBytea(a)),
250
+ // NOTE: bridges are always EVM addresses; pass domain here if non-EVM bridges are added
251
+ recipients: bridges.map((a) => this.toBytea(a)),
252
+ originTxRecipients: routerEntries.map(([domain, addr]) => this.toBytea(addr, Number(domain))),
253
+ originDomains: domains,
254
+ destDomains: domains,
255
+ txSenders,
256
+ limit,
257
+ };
258
+ logger.debug({ variables }, 'Explorer getInflightRebalanceActions query');
259
+ const query = `
260
+ query InflightRebalanceActions(
261
+ $senders: [bytea!],
262
+ $recipients: [bytea!],
263
+ $originTxRecipients: [bytea!],
264
+ $originDomains: [Int!],
265
+ $destDomains: [Int!],
266
+ $txSenders: [bytea!],
267
+ $limit: Int = 100
268
+ ) {
269
+ message_view(
270
+ where: {
271
+ _and: [
272
+ { is_delivered: { _eq: false } },
273
+ { sender: { _in: $senders } },
274
+ { recipient: { _in: $recipients } },
275
+ { origin_tx_recipient: { _in: $originTxRecipients } },
276
+ { origin_domain_id: { _in: $originDomains } },
277
+ { destination_domain_id: { _in: $destDomains } },
278
+ { origin_tx_sender: { _in: $txSenders } }
279
+ ]
280
+ }
281
+ order_by: { origin_tx_id: desc }
282
+ limit: $limit
283
+ ) {
284
+ msg_id
285
+ origin_domain_id
286
+ destination_domain_id
287
+ sender
288
+ recipient
289
+ origin_tx_hash
290
+ origin_tx_sender
291
+ origin_tx_recipient
292
+ is_delivered
293
+ message_body
294
+ send_occurred_at
295
+ }
296
+ }`;
297
+ const res = await fetch(this.baseUrl, {
298
+ method: 'POST',
299
+ headers: { 'Content-Type': 'application/json' },
300
+ body: JSON.stringify({ query, variables }),
301
+ });
302
+ logger.debug({ status: res.status }, 'Explorer getInflightRebalanceActions response');
303
+ if (!res.ok) {
304
+ let errorDetails;
305
+ try {
306
+ const errorJson = await res.json();
307
+ errorDetails = JSON.stringify(errorJson);
308
+ }
309
+ catch (_e) {
310
+ try {
311
+ errorDetails = await res.text();
312
+ }
313
+ catch (_textError) {
314
+ errorDetails = 'Unable to read response body';
315
+ }
316
+ }
317
+ throw new Error(`Explorer query failed: ${res.status} ${errorDetails}`);
318
+ }
319
+ const json = await res.json();
320
+ const messages = json?.data?.message_view ?? [];
321
+ return messages.map((msg) => this.normalizeExplorerMessage(msg));
322
+ }
323
+ }
324
+ //# sourceMappingURL=ExplorerClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplorerClient.js","sourceRoot":"","sources":["../../src/utils/ExplorerClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ExplorerClient.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplorerClient.test.d.ts","sourceRoot":"","sources":["../../src/utils/ExplorerClient.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,261 @@
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 { addressToByteHexString, ProtocolType, } from '@humanode-hyperlane/utils';
6
+ import { ExplorerClient } from './ExplorerClient.js';
7
+ chai.use(chaiAsPromised);
8
+ const testLogger = pino({ level: 'silent' });
9
+ describe('ExplorerClient', () => {
10
+ let fetchStub;
11
+ beforeEach(() => {
12
+ fetchStub = Sinon.stub(globalThis, 'fetch').resolves(new Response(JSON.stringify({ data: { message_view: [] } }), {
13
+ status: 200,
14
+ }));
15
+ });
16
+ afterEach(() => {
17
+ fetchStub.restore();
18
+ });
19
+ describe('getInflightUserTransfers address encoding', () => {
20
+ it('encodes EVM router addresses as 20-byte hex bytea', async () => {
21
+ const evmAddr = '0x5a0e13290ec57f5e9031d01d03c6a40029cc24ea';
22
+ const getProtocol = Sinon.stub().returns(ProtocolType.Ethereum);
23
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
24
+ await client.getInflightUserTransfers({
25
+ routersByDomain: { 1: evmAddr },
26
+ excludeTxSenders: [],
27
+ }, testLogger);
28
+ expect(fetchStub.calledOnce).to.be.true;
29
+ const body = JSON.parse(fetchStub.firstCall.args[1].body);
30
+ expect(body.variables.senders).to.deep.equal([
31
+ '\\x5a0e13290ec57f5e9031d01d03c6a40029cc24ea',
32
+ ]);
33
+ expect(body.variables.recipients).to.deep.equal([
34
+ '\\x5a0e13290ec57f5e9031d01d03c6a40029cc24ea',
35
+ ]);
36
+ });
37
+ it('encodes Solana router addresses as 32-byte hex bytea', async () => {
38
+ const solAddr = 'E5rVV8zXwtc4TKGypCJvSBaYbgxa4XaYg5MS6N9QGdeo';
39
+ const getProtocol = Sinon.stub().returns(ProtocolType.Sealevel);
40
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
41
+ await client.getInflightUserTransfers({
42
+ routersByDomain: { 1399811149: solAddr },
43
+ excludeTxSenders: [],
44
+ }, testLogger);
45
+ expect(fetchStub.calledOnce).to.be.true;
46
+ const body = JSON.parse(fetchStub.firstCall.args[1].body);
47
+ const expectedHex = addressToByteHexString(solAddr, ProtocolType.Sealevel);
48
+ const expectedBytea = expectedHex.replace(/^0x/i, '\\x').toLowerCase();
49
+ expect(body.variables.senders).to.deep.equal([expectedBytea]);
50
+ expect(body.variables.recipients).to.deep.equal([expectedBytea]);
51
+ // 32 bytes = 64 hex chars + 2-char \\x prefix
52
+ expect(expectedBytea.length).to.equal(66);
53
+ });
54
+ it('encodes Starknet router addresses as hex bytea', async () => {
55
+ const starkAddr = '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7';
56
+ const getProtocol = Sinon.stub().returns(ProtocolType.Starknet);
57
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
58
+ await client.getInflightUserTransfers({
59
+ routersByDomain: { 4009: starkAddr },
60
+ excludeTxSenders: [],
61
+ }, testLogger);
62
+ expect(fetchStub.calledOnce).to.be.true;
63
+ const body = JSON.parse(fetchStub.firstCall.args[1].body);
64
+ const expectedHex = addressToByteHexString(starkAddr, ProtocolType.Starknet);
65
+ const expectedBytea = expectedHex.replace(/^0x/i, '\\x').toLowerCase();
66
+ expect(body.variables.senders).to.deep.equal([expectedBytea]);
67
+ });
68
+ it('encodes mixed EVM+Solana routersByDomain correctly', async () => {
69
+ const evmAddr = '0x5a0e13290ec57f5e9031d01d03c6a40029cc24ea';
70
+ const solAddr = 'E5rVV8zXwtc4TKGypCJvSBaYbgxa4XaYg5MS6N9QGdeo';
71
+ const getProtocol = Sinon.stub().callsFake((domain) => {
72
+ if (domain === 1)
73
+ return ProtocolType.Ethereum;
74
+ if (domain === 1399811149)
75
+ return ProtocolType.Sealevel;
76
+ return ProtocolType.Ethereum;
77
+ });
78
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
79
+ await client.getInflightUserTransfers({
80
+ routersByDomain: { 1: evmAddr, 1399811149: solAddr },
81
+ excludeTxSenders: [],
82
+ }, testLogger);
83
+ expect(fetchStub.calledOnce).to.be.true;
84
+ const body = JSON.parse(fetchStub.firstCall.args[1].body);
85
+ const expectedEvmBytea = '\\x5a0e13290ec57f5e9031d01d03c6a40029cc24ea';
86
+ const expectedSolHex = addressToByteHexString(solAddr, ProtocolType.Sealevel);
87
+ const expectedSolBytea = expectedSolHex
88
+ .replace(/^0x/i, '\\x')
89
+ .toLowerCase();
90
+ expect(body.variables.senders).to.include(expectedEvmBytea);
91
+ expect(body.variables.senders).to.include(expectedSolBytea);
92
+ expect(body.variables.recipients).to.include(expectedEvmBytea);
93
+ expect(body.variables.recipients).to.include(expectedSolBytea);
94
+ });
95
+ it('handles empty routersByDomain gracefully', async () => {
96
+ const getProtocol = Sinon.stub().returns(ProtocolType.Ethereum);
97
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
98
+ await client.getInflightUserTransfers({
99
+ routersByDomain: {},
100
+ excludeTxSenders: [],
101
+ }, testLogger);
102
+ expect(fetchStub.calledOnce).to.be.true;
103
+ const body = JSON.parse(fetchStub.firstCall.args[1].body);
104
+ expect(body.variables.senders).to.deep.equal([]);
105
+ expect(body.variables.recipients).to.deep.equal([]);
106
+ expect(body.variables.originDomains).to.deep.equal([]);
107
+ });
108
+ });
109
+ describe('getInflightRebalanceActions address encoding', () => {
110
+ it('encodes mixed EVM+Solana routersByDomain in originTxRecipients', async () => {
111
+ const evmAddr = '0x5a0e13290ec57f5e9031d01d03c6a40029cc24ea';
112
+ const solAddr = 'E5rVV8zXwtc4TKGypCJvSBaYbgxa4XaYg5MS6N9QGdeo';
113
+ const bridgeAddr = '0x1234567890abcdef1234567890abcdef12345678';
114
+ const rebalancerAddr = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
115
+ const getProtocol = Sinon.stub().callsFake((domain) => {
116
+ if (domain === 1)
117
+ return ProtocolType.Ethereum;
118
+ if (domain === 1399811149)
119
+ return ProtocolType.Sealevel;
120
+ return ProtocolType.Ethereum;
121
+ });
122
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
123
+ await client.getInflightRebalanceActions({
124
+ bridges: [bridgeAddr],
125
+ routersByDomain: { 1: evmAddr, 1399811149: solAddr },
126
+ rebalancerAddress: rebalancerAddr,
127
+ }, testLogger);
128
+ expect(fetchStub.calledOnce).to.be.true;
129
+ const body = JSON.parse(fetchStub.firstCall.args[1].body);
130
+ // bridges encoded as EVM bytea (20-byte)
131
+ expect(body.variables.senders).to.deep.equal([
132
+ '\\x1234567890abcdef1234567890abcdef12345678',
133
+ ]);
134
+ expect(body.variables.recipients).to.deep.equal([
135
+ '\\x1234567890abcdef1234567890abcdef12345678',
136
+ ]);
137
+ // rebalancer encoded as EVM bytea
138
+ expect(body.variables.txSenders).to.deep.equal([
139
+ '\\xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
140
+ ]);
141
+ // originTxRecipients: EVM router as 20-byte bytea, Solana as 32-byte bytea
142
+ const expectedEvmBytea = '\\x5a0e13290ec57f5e9031d01d03c6a40029cc24ea';
143
+ const expectedSolHex = addressToByteHexString(solAddr, ProtocolType.Sealevel);
144
+ const expectedSolBytea = expectedSolHex
145
+ .replace(/^0x/i, '\\x')
146
+ .toLowerCase();
147
+ expect(body.variables.originTxRecipients).to.include(expectedEvmBytea);
148
+ expect(body.variables.originTxRecipients).to.include(expectedSolBytea);
149
+ // 32 bytes = 64 hex chars + 2-char \\x prefix
150
+ expect(expectedSolBytea.length).to.equal(66);
151
+ });
152
+ });
153
+ describe('hasUndeliveredRebalance post-query validation', () => {
154
+ it('validates non-EVM router addresses correctly in post-query filter', async () => {
155
+ const solAddr = 'E5rVV8zXwtc4TKGypCJvSBaYbgxa4XaYg5MS6N9QGdeo';
156
+ const solHex = addressToByteHexString(solAddr, ProtocolType.Sealevel);
157
+ const solBytea = solHex.replace(/^0x/i, '\\x').toLowerCase();
158
+ const bridgeAddr = '0x1234567890abcdef1234567890abcdef12345678';
159
+ const txSenderAddr = '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
160
+ const getProtocol = Sinon.stub().returns(ProtocolType.Sealevel);
161
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
162
+ fetchStub.resolves(new Response(JSON.stringify({
163
+ data: {
164
+ message_view: [
165
+ {
166
+ msg_id: '\\xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
167
+ origin_domain_id: 1399811149,
168
+ destination_domain_id: 1,
169
+ sender: '\\x1234567890abcdef1234567890abcdef12345678',
170
+ recipient: '\\x1234567890abcdef1234567890abcdef12345678',
171
+ origin_tx_hash: '\\xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
172
+ origin_tx_sender: '\\xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
173
+ origin_tx_recipient: solBytea,
174
+ is_delivered: false,
175
+ },
176
+ ],
177
+ },
178
+ }), { status: 200 }));
179
+ const result = await client.hasUndeliveredRebalance({
180
+ bridges: [bridgeAddr],
181
+ routersByDomain: { 1399811149: solAddr },
182
+ txSender: txSenderAddr,
183
+ }, testLogger);
184
+ expect(result).to.be.true;
185
+ });
186
+ it('returns false when origin_tx_recipient does not match expected router', async () => {
187
+ const evmAddr = '0x5a0e13290ec57f5e9031d01d03c6a40029cc24ea';
188
+ const wrongRouter = '0xffffffffffffffffffffffffffffffffffffffff';
189
+ const getProtocol = Sinon.stub().returns(ProtocolType.Ethereum);
190
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
191
+ fetchStub.resolves(new Response(JSON.stringify({
192
+ data: {
193
+ message_view: [
194
+ {
195
+ msg_id: '\\xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
196
+ origin_domain_id: 1,
197
+ destination_domain_id: 137,
198
+ sender: '\\x1234567890abcdef1234567890abcdef12345678',
199
+ recipient: '\\x1234567890abcdef1234567890abcdef12345678',
200
+ origin_tx_hash: '\\xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
201
+ origin_tx_sender: '\\xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
202
+ origin_tx_recipient: '\\x' + wrongRouter.slice(2),
203
+ is_delivered: false,
204
+ },
205
+ ],
206
+ },
207
+ }), { status: 200 }));
208
+ const result = await client.hasUndeliveredRebalance({
209
+ bridges: ['0x1234567890abcdef1234567890abcdef12345678'],
210
+ routersByDomain: { 1: evmAddr },
211
+ txSender: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
212
+ }, testLogger);
213
+ expect(result).to.be.false;
214
+ });
215
+ it('validates EVM router addresses correctly in post-query filter', async () => {
216
+ const evmAddr = '0x5a0e13290ec57f5e9031d01d03c6a40029cc24ea';
217
+ const getProtocol = Sinon.stub().returns(ProtocolType.Ethereum);
218
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
219
+ fetchStub.resolves(new Response(JSON.stringify({
220
+ data: {
221
+ message_view: [
222
+ {
223
+ msg_id: '\\xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
224
+ origin_domain_id: 1,
225
+ destination_domain_id: 137,
226
+ sender: '\\x1234567890abcdef1234567890abcdef12345678',
227
+ recipient: '\\x1234567890abcdef1234567890abcdef12345678',
228
+ origin_tx_hash: '\\xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
229
+ origin_tx_sender: '\\xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
230
+ origin_tx_recipient: '\\x5a0e13290ec57f5e9031d01d03c6a40029cc24ea',
231
+ is_delivered: false,
232
+ },
233
+ ],
234
+ },
235
+ }), { status: 200 }));
236
+ const result = await client.hasUndeliveredRebalance({
237
+ bridges: ['0x1234567890abcdef1234567890abcdef12345678'],
238
+ routersByDomain: { 1: evmAddr },
239
+ txSender: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
240
+ }, testLogger);
241
+ expect(result).to.be.true;
242
+ });
243
+ });
244
+ describe('error handling', () => {
245
+ it('throws on non-200 response from explorer', async () => {
246
+ const getProtocol = Sinon.stub().returns(ProtocolType.Ethereum);
247
+ const client = new ExplorerClient('https://explorer.test', getProtocol);
248
+ fetchStub.resolves(new Response(JSON.stringify({
249
+ errors: [{ message: 'Internal Server Error' }],
250
+ }), { status: 500 }));
251
+ await expect(client.hasUndeliveredRebalance({
252
+ bridges: ['0x1234567890abcdef1234567890abcdef12345678'],
253
+ routersByDomain: {
254
+ 1: '0x5a0e13290ec57f5e9031d01d03c6a40029cc24ea',
255
+ },
256
+ txSender: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
257
+ }, testLogger)).to.be.rejectedWith('Explorer query failed: 500');
258
+ });
259
+ });
260
+ });
261
+ //# sourceMappingURL=ExplorerClient.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExplorerClient.test.js","sourceRoot":"","sources":["../../src/utils/ExplorerClient.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type Logger } from 'pino';
2
+ import { type ChainName } from '@humanode-hyperlane/sdk';
3
+ import { type MonitorEvent } from '../interfaces/IMonitor.js';
4
+ import { type RawBalances } from '../interfaces/IStrategy.js';
5
+ /**
6
+ * Returns the raw balances required by the strategies from the monitor event
7
+ * @param chains - The chains that should be included in the raw balances (e.g. the chains in the rebalancer config)
8
+ * @param event - The monitor event to extract the raw balances from
9
+ * @returns An object mapping chain names to their raw balances.
10
+ */
11
+ export declare function getRawBalances(chains: ChainName[], event: MonitorEvent, logger: Logger): RawBalances;
12
+ //# sourceMappingURL=balanceUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balanceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/balanceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAI9D;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EAAE,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,GACb,WAAW,CA6Cb"}