@humanode-hyperlane/rebalancer 27.2.2 → 1029.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/dist/bridges/LiFiBridge.d.ts +3 -3
  2. package/dist/bridges/LiFiBridge.d.ts.map +1 -1
  3. package/dist/bridges/LiFiBridge.js +66 -55
  4. package/dist/bridges/LiFiBridge.js.map +1 -1
  5. package/dist/bridges/LiFiBridge.test.js +213 -0
  6. package/dist/bridges/LiFiBridge.test.js.map +1 -1
  7. package/dist/config/RebalancerConfig.d.ts +4 -3
  8. package/dist/config/RebalancerConfig.d.ts.map +1 -1
  9. package/dist/config/RebalancerConfig.js +7 -5
  10. package/dist/config/RebalancerConfig.js.map +1 -1
  11. package/dist/config/RebalancerConfig.test.js +278 -2
  12. package/dist/config/RebalancerConfig.test.js.map +1 -1
  13. package/dist/config/types.d.ts +707 -2664
  14. package/dist/config/types.d.ts.map +1 -1
  15. package/dist/config/types.js +62 -7
  16. package/dist/config/types.js.map +1 -1
  17. package/dist/core/InventoryRebalancer.d.ts +13 -19
  18. package/dist/core/InventoryRebalancer.d.ts.map +1 -1
  19. package/dist/core/InventoryRebalancer.js +404 -276
  20. package/dist/core/InventoryRebalancer.js.map +1 -1
  21. package/dist/core/InventoryRebalancer.test.js +814 -25
  22. package/dist/core/InventoryRebalancer.test.js.map +1 -1
  23. package/dist/core/Rebalancer.d.ts.map +1 -1
  24. package/dist/core/Rebalancer.js +12 -6
  25. package/dist/core/Rebalancer.js.map +1 -1
  26. package/dist/core/Rebalancer.test.js +51 -0
  27. package/dist/core/Rebalancer.test.js.map +1 -1
  28. package/dist/core/RebalancerOrchestrator.d.ts.map +1 -1
  29. package/dist/core/RebalancerOrchestrator.test.js +0 -1
  30. package/dist/core/RebalancerOrchestrator.test.js.map +1 -1
  31. package/dist/core/RebalancerService.d.ts.map +1 -1
  32. package/dist/core/RebalancerService.js +3 -2
  33. package/dist/core/RebalancerService.js.map +1 -1
  34. package/dist/core/RebalancerService.test.js +24 -0
  35. package/dist/core/RebalancerService.test.js.map +1 -1
  36. package/dist/e2e/fixtures/routes.d.ts +3 -3
  37. package/dist/e2e/fixtures/routes.d.ts.map +1 -1
  38. package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts.map +1 -1
  39. package/dist/e2e/harness/BaseLocalDeploymentManager.js +3 -2
  40. package/dist/e2e/harness/BaseLocalDeploymentManager.js.map +1 -1
  41. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts.map +1 -1
  42. package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js.map +1 -1
  43. package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts.map +1 -1
  44. package/dist/e2e/harness/ForkIndexer.d.ts.map +1 -1
  45. package/dist/e2e/harness/ForkIndexer.js.map +1 -1
  46. package/dist/e2e/harness/LocalProvider.d.ts +3 -0
  47. package/dist/e2e/harness/LocalProvider.d.ts.map +1 -0
  48. package/dist/e2e/harness/LocalProvider.js +9 -0
  49. package/dist/e2e/harness/LocalProvider.js.map +1 -0
  50. package/dist/e2e/harness/LocalProvider.test.d.ts +2 -0
  51. package/dist/e2e/harness/LocalProvider.test.d.ts.map +1 -0
  52. package/dist/e2e/harness/LocalProvider.test.js +14 -0
  53. package/dist/e2e/harness/LocalProvider.test.js.map +1 -0
  54. package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts.map +1 -1
  55. package/dist/e2e/harness/MixedLocalDeploymentManager.js.map +1 -1
  56. package/dist/e2e/harness/MockExplorerClient.d.ts.map +1 -1
  57. package/dist/e2e/harness/MockExplorerClient.js.map +1 -1
  58. package/dist/e2e/harness/MockExternalBridge.d.ts.map +1 -1
  59. package/dist/e2e/harness/MockExternalBridge.js.map +1 -1
  60. package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts.map +1 -1
  61. package/dist/e2e/harness/NativeLocalDeploymentManager.js +2 -1
  62. package/dist/e2e/harness/NativeLocalDeploymentManager.js.map +1 -1
  63. package/dist/e2e/harness/SnapshotHelper.d.ts.map +1 -1
  64. package/dist/e2e/harness/SnapshotHelper.js +3 -5
  65. package/dist/e2e/harness/SnapshotHelper.js.map +1 -1
  66. package/dist/e2e/harness/TestHelpers.js +1 -2
  67. package/dist/e2e/harness/TestHelpers.js.map +1 -1
  68. package/dist/e2e/harness/TestRebalancer.d.ts +5 -1
  69. package/dist/e2e/harness/TestRebalancer.d.ts.map +1 -1
  70. package/dist/e2e/harness/TestRebalancer.js +14 -4
  71. package/dist/e2e/harness/TestRebalancer.js.map +1 -1
  72. package/dist/e2e/relayer-denylist.e2e-test.d.ts +2 -0
  73. package/dist/e2e/relayer-denylist.e2e-test.d.ts.map +1 -0
  74. package/dist/e2e/relayer-denylist.e2e-test.js +388 -0
  75. package/dist/e2e/relayer-denylist.e2e-test.js.map +1 -0
  76. package/dist/factories/RebalancerContextFactory.d.ts.map +1 -1
  77. package/dist/factories/RebalancerContextFactory.js +61 -31
  78. package/dist/factories/RebalancerContextFactory.js.map +1 -1
  79. package/dist/factories/RebalancerContextFactory.test.js +336 -5
  80. package/dist/factories/RebalancerContextFactory.test.js.map +1 -1
  81. package/dist/index.d.ts +2 -2
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +1 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/interfaces/IRebalancer.d.ts +4 -2
  86. package/dist/interfaces/IRebalancer.d.ts.map +1 -1
  87. package/dist/metrics/Metrics.d.ts.map +1 -1
  88. package/dist/metrics/Metrics.js +1 -1
  89. package/dist/metrics/Metrics.js.map +1 -1
  90. package/dist/metrics/PriceGetter.d.ts +1 -0
  91. package/dist/metrics/PriceGetter.d.ts.map +1 -1
  92. package/dist/metrics/PriceGetter.js +14 -4
  93. package/dist/metrics/PriceGetter.js.map +1 -1
  94. package/dist/metrics/PriceGetter.test.d.ts +2 -0
  95. package/dist/metrics/PriceGetter.test.d.ts.map +1 -0
  96. package/dist/metrics/PriceGetter.test.js +84 -0
  97. package/dist/metrics/PriceGetter.test.js.map +1 -0
  98. package/dist/metrics/scripts/metrics.d.ts +4 -4
  99. package/dist/monitor/Monitor.d.ts +1 -0
  100. package/dist/monitor/Monitor.d.ts.map +1 -1
  101. package/dist/monitor/Monitor.js +55 -46
  102. package/dist/monitor/Monitor.js.map +1 -1
  103. package/dist/monitor/Monitor.test.d.ts +2 -0
  104. package/dist/monitor/Monitor.test.d.ts.map +1 -0
  105. package/dist/monitor/Monitor.test.js +346 -0
  106. package/dist/monitor/Monitor.test.js.map +1 -0
  107. package/dist/service.d.ts +1 -1
  108. package/dist/service.d.ts.map +1 -1
  109. package/dist/service.js +9 -5
  110. package/dist/service.js.map +1 -1
  111. package/dist/strategy/BaseStrategy.d.ts.map +1 -1
  112. package/dist/strategy/BaseStrategy.js +13 -11
  113. package/dist/strategy/BaseStrategy.js.map +1 -1
  114. package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -1
  115. package/dist/strategy/CollateralDeficitStrategy.js +2 -2
  116. package/dist/strategy/CollateralDeficitStrategy.js.map +1 -1
  117. package/dist/strategy/CompositeStrategy.d.ts.map +1 -1
  118. package/dist/strategy/CompositeStrategy.js.map +1 -1
  119. package/dist/strategy/CompositeStrategy.test.js.map +1 -1
  120. package/dist/strategy/MinAmountStrategy.d.ts +1 -0
  121. package/dist/strategy/MinAmountStrategy.d.ts.map +1 -1
  122. package/dist/strategy/MinAmountStrategy.js +12 -8
  123. package/dist/strategy/MinAmountStrategy.js.map +1 -1
  124. package/dist/strategy/MinAmountStrategy.test.js +189 -2
  125. package/dist/strategy/MinAmountStrategy.test.js.map +1 -1
  126. package/dist/strategy/StrategyFactory.d.ts.map +1 -1
  127. package/dist/strategy/StrategyFactory.js.map +1 -1
  128. package/dist/strategy/WeightedStrategy.d.ts.map +1 -1
  129. package/dist/test/helpers.d.ts +11 -3
  130. package/dist/test/helpers.d.ts.map +1 -1
  131. package/dist/test/helpers.js +9 -11
  132. package/dist/test/helpers.js.map +1 -1
  133. package/dist/test/lifiMocks.d.ts +6 -6
  134. package/dist/test/lifiMocks.d.ts.map +1 -1
  135. package/dist/test/lifiMocks.js +5 -2
  136. package/dist/test/lifiMocks.js.map +1 -1
  137. package/dist/test/pendingTransferMiddlewareMocks.d.ts +17 -0
  138. package/dist/test/pendingTransferMiddlewareMocks.d.ts.map +1 -0
  139. package/dist/test/pendingTransferMiddlewareMocks.js +43 -0
  140. package/dist/test/pendingTransferMiddlewareMocks.js.map +1 -0
  141. package/dist/tracking/ActionTracker.d.ts +4 -0
  142. package/dist/tracking/ActionTracker.d.ts.map +1 -1
  143. package/dist/tracking/ActionTracker.js +76 -9
  144. package/dist/tracking/ActionTracker.js.map +1 -1
  145. package/dist/tracking/ActionTracker.test.js +418 -1
  146. package/dist/tracking/ActionTracker.test.js.map +1 -1
  147. package/dist/tracking/IActionTracker.d.ts +4 -2
  148. package/dist/tracking/IActionTracker.d.ts.map +1 -1
  149. package/dist/tracking/InflightContextAdapter.d.ts.map +1 -1
  150. package/dist/tracking/InflightContextAdapter.js.map +1 -1
  151. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.d.ts +64 -0
  152. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.d.ts.map +1 -0
  153. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.js +474 -0
  154. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.js.map +1 -0
  155. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.d.ts +2 -0
  156. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.d.ts.map +1 -0
  157. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.js +1168 -0
  158. package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.js.map +1 -0
  159. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.d.ts +61 -0
  160. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.d.ts.map +1 -0
  161. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.js +160 -0
  162. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.js.map +1 -0
  163. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.d.ts +2 -0
  164. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.d.ts.map +1 -0
  165. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.js +369 -0
  166. package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.js.map +1 -0
  167. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.d.ts +60 -0
  168. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.d.ts.map +1 -0
  169. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.js +288 -0
  170. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.js.map +1 -0
  171. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.d.ts +2 -0
  172. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.d.ts.map +1 -0
  173. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.js +606 -0
  174. package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.js.map +1 -0
  175. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.d.ts +25 -0
  176. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.d.ts.map +1 -0
  177. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js +41 -0
  178. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js.map +1 -0
  179. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.d.ts +2 -0
  180. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.d.ts.map +1 -0
  181. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.js +141 -0
  182. package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.js.map +1 -0
  183. package/dist/tracking/pendingTransferMiddlewares/matchBody.d.ts +12 -0
  184. package/dist/tracking/pendingTransferMiddlewares/matchBody.d.ts.map +1 -0
  185. package/dist/tracking/pendingTransferMiddlewares/matchBody.js +29 -0
  186. package/dist/tracking/pendingTransferMiddlewares/matchBody.js.map +1 -0
  187. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.d.ts +59 -0
  188. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.d.ts.map +1 -0
  189. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.js +661 -0
  190. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.js.map +1 -0
  191. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.d.ts +2 -0
  192. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.d.ts.map +1 -0
  193. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.js +1093 -0
  194. package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.js.map +1 -0
  195. package/dist/tracking/pendingTransferMiddlewares/types.d.ts +2 -0
  196. package/dist/tracking/pendingTransferMiddlewares/types.d.ts.map +1 -0
  197. package/dist/tracking/pendingTransferMiddlewares/types.js +4 -0
  198. package/dist/tracking/pendingTransferMiddlewares/types.js.map +1 -0
  199. package/dist/tracking/store/InMemoryStore.d.ts.map +1 -1
  200. package/dist/utils/ExplorerClient.d.ts +1 -0
  201. package/dist/utils/ExplorerClient.d.ts.map +1 -1
  202. package/dist/utils/ExplorerClient.js +8 -3
  203. package/dist/utils/ExplorerClient.js.map +1 -1
  204. package/dist/utils/ExplorerClient.test.js +25 -0
  205. package/dist/utils/ExplorerClient.test.js.map +1 -1
  206. package/dist/utils/balanceUtils.d.ts +7 -1
  207. package/dist/utils/balanceUtils.d.ts.map +1 -1
  208. package/dist/utils/balanceUtils.js +39 -1
  209. package/dist/utils/balanceUtils.js.map +1 -1
  210. package/dist/utils/balanceUtils.test.js +55 -1
  211. package/dist/utils/balanceUtils.test.js.map +1 -1
  212. package/dist/utils/blockTag.d.ts +5 -4
  213. package/dist/utils/blockTag.d.ts.map +1 -1
  214. package/dist/utils/blockTag.js +26 -10
  215. package/dist/utils/blockTag.js.map +1 -1
  216. package/dist/utils/blockTag.test.d.ts +2 -0
  217. package/dist/utils/blockTag.test.d.ts.map +1 -0
  218. package/dist/utils/blockTag.test.js +132 -0
  219. package/dist/utils/blockTag.test.js.map +1 -0
  220. package/dist/utils/bridgeUtils.js.map +1 -1
  221. package/dist/utils/errors.d.ts.map +1 -1
  222. package/dist/utils/gasEstimation.d.ts +2 -1
  223. package/dist/utils/gasEstimation.d.ts.map +1 -1
  224. package/dist/utils/gasEstimation.js +16 -13
  225. package/dist/utils/gasEstimation.js.map +1 -1
  226. package/dist/utils/gasEstimation.test.d.ts +2 -0
  227. package/dist/utils/gasEstimation.test.d.ts.map +1 -0
  228. package/dist/utils/gasEstimation.test.js +104 -0
  229. package/dist/utils/gasEstimation.test.js.map +1 -0
  230. package/dist/utils/tokenUtils.d.ts.map +1 -1
  231. package/dist/utils/tokenUtils.js +5 -2
  232. package/dist/utils/tokenUtils.js.map +1 -1
  233. package/package.json +23 -22
  234. package/src/bridges/LiFiBridge.test.ts +270 -0
  235. package/src/bridges/LiFiBridge.ts +90 -71
  236. package/src/config/RebalancerConfig.test.ts +315 -1
  237. package/src/config/RebalancerConfig.ts +6 -3
  238. package/src/config/types.ts +98 -8
  239. package/src/core/InventoryRebalancer.test.ts +1092 -38
  240. package/src/core/InventoryRebalancer.ts +584 -351
  241. package/src/core/Rebalancer.test.ts +84 -0
  242. package/src/core/Rebalancer.ts +22 -6
  243. package/src/core/RebalancerOrchestrator.test.ts +0 -1
  244. package/src/core/RebalancerService.test.ts +35 -0
  245. package/src/core/RebalancerService.ts +3 -2
  246. package/src/e2e/harness/BaseLocalDeploymentManager.ts +3 -1
  247. package/src/e2e/harness/LocalProvider.test.ts +16 -0
  248. package/src/e2e/harness/LocalProvider.ts +10 -0
  249. package/src/e2e/harness/NativeLocalDeploymentManager.ts +2 -1
  250. package/src/e2e/harness/SnapshotHelper.ts +2 -5
  251. package/src/e2e/harness/TestHelpers.ts +3 -3
  252. package/src/e2e/harness/TestRebalancer.ts +21 -1
  253. package/src/e2e/relayer-denylist.e2e-test.ts +558 -0
  254. package/src/factories/RebalancerContextFactory.test.ts +489 -8
  255. package/src/factories/RebalancerContextFactory.ts +86 -36
  256. package/src/index.ts +2 -0
  257. package/src/interfaces/IRebalancer.ts +4 -1
  258. package/src/metrics/Metrics.ts +1 -0
  259. package/src/metrics/PriceGetter.test.ts +113 -0
  260. package/src/metrics/PriceGetter.ts +18 -3
  261. package/src/monitor/Monitor.test.ts +408 -0
  262. package/src/monitor/Monitor.ts +123 -97
  263. package/src/service.ts +14 -8
  264. package/src/strategy/BaseStrategy.ts +18 -15
  265. package/src/strategy/CollateralDeficitStrategy.ts +4 -3
  266. package/src/strategy/MinAmountStrategy.test.ts +238 -2
  267. package/src/strategy/MinAmountStrategy.ts +29 -17
  268. package/src/test/helpers.ts +13 -12
  269. package/src/test/lifiMocks.ts +5 -2
  270. package/src/test/pendingTransferMiddlewareMocks.ts +65 -0
  271. package/src/tracking/ActionTracker.test.ts +635 -3
  272. package/src/tracking/ActionTracker.ts +92 -12
  273. package/src/tracking/IActionTracker.ts +4 -2
  274. package/src/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.ts +1693 -0
  275. package/src/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.ts +784 -0
  276. package/src/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.ts +554 -0
  277. package/src/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.ts +233 -0
  278. package/src/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.ts +894 -0
  279. package/src/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.ts +404 -0
  280. package/src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.ts +205 -0
  281. package/src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.ts +89 -0
  282. package/src/tracking/pendingTransferMiddlewares/fixtures/mainnet-denylist.json +3556 -0
  283. package/src/tracking/pendingTransferMiddlewares/matchBody.ts +43 -0
  284. package/src/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.ts +1220 -0
  285. package/src/tracking/pendingTransferMiddlewares/relayerDenylistRules.ts +934 -0
  286. package/src/tracking/pendingTransferMiddlewares/types.ts +3 -0
  287. package/src/utils/ExplorerClient.test.ts +42 -0
  288. package/src/utils/ExplorerClient.ts +14 -3
  289. package/src/utils/balanceUtils.test.ts +87 -1
  290. package/src/utils/balanceUtils.ts +73 -2
  291. package/src/utils/blockTag.test.ts +173 -0
  292. package/src/utils/blockTag.ts +35 -15
  293. package/src/utils/gasEstimation.test.ts +192 -0
  294. package/src/utils/gasEstimation.ts +17 -11
  295. package/src/utils/tokenUtils.ts +5 -2
package/src/service.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
+ import 'zod/compile';
3
+
2
4
  /**
3
5
  * Hyperlane Rebalancer Service Entry Point
4
6
  *
@@ -33,6 +35,7 @@ import { MultiProvider } from '@humanode-hyperlane/sdk';
33
35
  import {
34
36
  applyRpcUrlOverridesFromEnv,
35
37
  createServiceLogger,
38
+ isEVMLike,
36
39
  ProtocolType,
37
40
  rootLogger,
38
41
  } from '@humanode-hyperlane/utils';
@@ -151,12 +154,15 @@ async function main(): Promise<void> {
151
154
  Record<ProtocolType, InventorySignerConfig>
152
155
  > = {};
153
156
 
154
- for (const [protocol, privateKey] of Object.entries(inventoryPrivateKeys)) {
157
+ for (const protocol of Object.values(ProtocolType)) {
158
+ const privateKey = inventoryPrivateKeys[protocol];
155
159
  if (!privateKey) continue;
156
160
 
157
161
  let derivedAddress: string;
158
162
 
159
- if (protocol === ProtocolType.Ethereum) {
163
+ if (isEVMLike(protocol)) {
164
+ // Tron uses same hex private key format as Ethereum.
165
+ // Derive 0x-prefixed hex address via ethers Wallet (TronWallet extends Wallet).
160
166
  derivedAddress = new Wallet(privateKey).address;
161
167
  } else if (protocol === ProtocolType.Sealevel) {
162
168
  const keyBytes = parseSolanaPrivateKey(privateKey);
@@ -172,12 +178,11 @@ async function main(): Promise<void> {
172
178
 
173
179
  // Validate against config if present
174
180
  const configuredAddress =
175
- rebalancerConfig.inventorySigners?.[protocol as ProtocolType]?.address;
181
+ rebalancerConfig.inventorySigners?.[protocol]?.address;
176
182
  if (configuredAddress) {
177
- const mismatch =
178
- protocol === ProtocolType.Ethereum
179
- ? configuredAddress.toLowerCase() !== derivedAddress.toLowerCase()
180
- : configuredAddress !== derivedAddress;
183
+ const mismatch = isEVMLike(protocol)
184
+ ? configuredAddress.toLowerCase() !== derivedAddress.toLowerCase()
185
+ : configuredAddress !== derivedAddress;
181
186
  if (mismatch) {
182
187
  throw new Error(
183
188
  `inventorySigners.${protocol} mismatch: config has ${configuredAddress} but HYP_INVENTORY_KEY_${protocol.toUpperCase()} derives to ${derivedAddress}`,
@@ -185,7 +190,7 @@ async function main(): Promise<void> {
185
190
  }
186
191
  }
187
192
 
188
- inventorySigners[protocol as ProtocolType] = {
193
+ inventorySigners[protocol] = {
189
194
  address: derivedAddress,
190
195
  key: privateKey,
191
196
  };
@@ -242,6 +247,7 @@ async function main(): Promise<void> {
242
247
  rebalancerConfig.intentTTL,
243
248
  mergedInventorySigners,
244
249
  rebalancerConfig.externalBridges,
250
+ rebalancerConfig.pendingTransferMiddlewares,
245
251
  )
246
252
  : rebalancerConfig;
247
253
 
@@ -1,7 +1,6 @@
1
1
  import { type Logger } from 'pino';
2
2
 
3
3
  import type { ChainMap, ChainName, Token } from '@humanode-hyperlane/sdk';
4
- import { toWei } from '@humanode-hyperlane/utils';
5
4
 
6
5
  import type {
7
6
  IStrategy,
@@ -18,6 +17,7 @@ import {
18
17
  createStrategyRoute,
19
18
  getBridgeConfig,
20
19
  } from '../utils/bridgeUtils.js';
20
+ import { normalizeConfiguredAmount } from '../utils/balanceUtils.js';
21
21
 
22
22
  export type Delta = { chain: ChainName; amount: bigint };
23
23
 
@@ -528,21 +528,24 @@ export abstract class BaseStrategy implements IStrategy {
528
528
  route.origin,
529
529
  route.destination,
530
530
  );
531
- const minAmount = BigInt(
532
- toWei(bridgeConfig.bridgeMinAcceptedAmount, token.decimals),
533
- );
534
- if (route.amount < minAmount) {
535
- this.logger.info(
536
- {
537
- context: this.constructor.name,
538
- origin: route.origin,
539
- destination: route.destination,
540
- amount: route.amount.toString(),
541
- minAmount: minAmount.toString(),
542
- },
543
- 'Dropping route below bridgeMinAcceptedAmount',
531
+ if (bridgeConfig.bridgeMinAcceptedAmount != null) {
532
+ const minAmount = normalizeConfiguredAmount(
533
+ bridgeConfig.bridgeMinAcceptedAmount,
534
+ token,
544
535
  );
545
- return false;
536
+ if (route.amount < minAmount) {
537
+ this.logger.info(
538
+ {
539
+ context: this.constructor.name,
540
+ origin: route.origin,
541
+ destination: route.destination,
542
+ amount: route.amount.toString(),
543
+ minAmount: minAmount.toString(),
544
+ },
545
+ 'Dropping route below bridgeMinAcceptedAmount',
546
+ );
547
+ return false;
548
+ }
546
549
  }
547
550
  }
548
551
  }
@@ -5,7 +5,6 @@ import {
5
5
  type ChainName,
6
6
  type Token,
7
7
  } from '@humanode-hyperlane/sdk';
8
- import { toWei } from '@humanode-hyperlane/utils';
9
8
 
10
9
  import {
11
10
  type CollateralDeficitStrategyConfig,
@@ -24,6 +23,7 @@ import {
24
23
  isInventoryConfig,
25
24
  isMovableCollateralConfig,
26
25
  } from '../utils/bridgeUtils.js';
26
+ import { normalizeConfiguredAmount } from '../utils/balanceUtils.js';
27
27
 
28
28
  import { BaseStrategy, type Delta } from './BaseStrategy.js';
29
29
 
@@ -106,8 +106,9 @@ export class CollateralDeficitStrategy extends BaseStrategy {
106
106
  for (const chain of this.chains) {
107
107
  const balance = simulatedBalances[chain];
108
108
  const token = this.getTokenByChainName(chain);
109
- const bufferWei = BigInt(
110
- toWei(this.config[chain].buffer, token.decimals),
109
+ const bufferWei = normalizeConfiguredAmount(
110
+ this.config[chain].buffer,
111
+ token,
111
112
  );
112
113
 
113
114
  if (balance < 0n) {
@@ -10,8 +10,10 @@ import {
10
10
  } from '@humanode-hyperlane/sdk';
11
11
 
12
12
  import { RebalancerMinAmountType } from '../config/types.js';
13
+ import { type MonitorEvent } from '../interfaces/IMonitor.js';
13
14
  import type { RawBalances } from '../interfaces/IStrategy.js';
14
15
  import { extractBridgeConfigs } from '../test/helpers.js';
16
+ import { getRawBalances } from '../utils/balanceUtils.js';
15
17
 
16
18
  import { MinAmountStrategy } from './MinAmountStrategy.js';
17
19
 
@@ -64,7 +66,6 @@ describe('MinAmountStrategy', () => {
64
66
  ).to.throw('At least two chains must be configured');
65
67
  });
66
68
 
67
- // eslint-disable-next-line jest/expect-expect -- testing constructor doesn't throw
68
69
  it('should create a strategy with minAmount and target using absolute values', () => {
69
70
  new MinAmountStrategy(
70
71
  {
@@ -94,7 +95,6 @@ describe('MinAmountStrategy', () => {
94
95
  );
95
96
  });
96
97
 
97
- // eslint-disable-next-line jest/expect-expect -- testing constructor doesn't throw
98
98
  it('should create a strategy with minAmount and target using relative values', () => {
99
99
  new MinAmountStrategy(
100
100
  {
@@ -415,6 +415,146 @@ describe('MinAmountStrategy', () => {
415
415
  ]);
416
416
  });
417
417
 
418
+ it('should normalize absolute thresholds for mixed-decimal routes', () => {
419
+ const mixedTokensByChainName: ChainMap<Token> = {
420
+ [chain1]: new Token({
421
+ ...tokenArgs,
422
+ chainName: chain1,
423
+ decimals: 18,
424
+ scale: { numerator: 1, denominator: 1_000_000_000_000 },
425
+ }),
426
+ [chain2]: new Token({
427
+ ...tokenArgs,
428
+ chainName: chain2,
429
+ decimals: 6,
430
+ }),
431
+ };
432
+ const config = {
433
+ [chain1]: {
434
+ minAmount: {
435
+ min: '100',
436
+ target: '120',
437
+ type: RebalancerMinAmountType.Absolute,
438
+ },
439
+ bridge: AddressZero,
440
+ bridgeLockTime: 1,
441
+ },
442
+ [chain2]: {
443
+ minAmount: {
444
+ min: '100',
445
+ target: '120',
446
+ type: RebalancerMinAmountType.Absolute,
447
+ },
448
+ bridge: AddressZero,
449
+ bridgeLockTime: 1,
450
+ },
451
+ };
452
+
453
+ const strategy = new MinAmountStrategy(
454
+ config,
455
+ mixedTokensByChainName,
456
+ 250_000_000n,
457
+ testLogger,
458
+ extractBridgeConfigs(config),
459
+ );
460
+
461
+ const routes = strategy.getRebalancingRoutes({
462
+ [chain1]: 50_000_000n,
463
+ [chain2]: 200_000_000n,
464
+ });
465
+
466
+ expect(routes).to.deep.equal([
467
+ {
468
+ origin: chain2,
469
+ destination: chain1,
470
+ amount: 70_000_000n,
471
+ bridge: AddressZero,
472
+ executionType: 'movableCollateral',
473
+ },
474
+ ]);
475
+ });
476
+
477
+ it('normalizes mixed-decimal local balances before routing', () => {
478
+ const mixedTokensByChainName: ChainMap<Token> = {
479
+ [chain1]: new Token({
480
+ ...tokenArgs,
481
+ chainName: chain1,
482
+ standard: TokenStandard.EvmHypCollateral,
483
+ decimals: 18,
484
+ scale: { numerator: 1, denominator: 1_000_000_000_000 },
485
+ }),
486
+ [chain2]: new Token({
487
+ ...tokenArgs,
488
+ chainName: chain2,
489
+ standard: TokenStandard.EvmHypCollateral,
490
+ decimals: 6,
491
+ }),
492
+ };
493
+ const config = {
494
+ [chain1]: {
495
+ minAmount: {
496
+ min: '100',
497
+ target: '120',
498
+ type: RebalancerMinAmountType.Absolute,
499
+ },
500
+ bridge: AddressZero,
501
+ bridgeLockTime: 1,
502
+ },
503
+ [chain2]: {
504
+ minAmount: {
505
+ min: '100',
506
+ target: '120',
507
+ type: RebalancerMinAmountType.Absolute,
508
+ },
509
+ bridge: AddressZero,
510
+ bridgeLockTime: 1,
511
+ },
512
+ };
513
+
514
+ const strategy = new MinAmountStrategy(
515
+ config,
516
+ mixedTokensByChainName,
517
+ 250_000_000n,
518
+ testLogger,
519
+ extractBridgeConfigs(config),
520
+ );
521
+
522
+ const event: MonitorEvent = {
523
+ tokensInfo: [
524
+ {
525
+ token: mixedTokensByChainName[chain1],
526
+ bridgedSupply: 50_000_000_000_000_000_000n,
527
+ },
528
+ {
529
+ token: mixedTokensByChainName[chain2],
530
+ bridgedSupply: 200_000_000n,
531
+ },
532
+ ],
533
+ confirmedBlockTags: {
534
+ [chain1]: 1,
535
+ [chain2]: 1,
536
+ },
537
+ };
538
+
539
+ const rawBalances = getRawBalances([chain1, chain2], event, testLogger);
540
+ expect(rawBalances).to.deep.equal({
541
+ [chain1]: 50_000_000n,
542
+ [chain2]: 200_000_000n,
543
+ });
544
+
545
+ const routes = strategy.getRebalancingRoutes(rawBalances);
546
+
547
+ expect(routes).to.deep.equal([
548
+ {
549
+ origin: chain2,
550
+ destination: chain1,
551
+ amount: 70_000_000n,
552
+ bridge: AddressZero,
553
+ executionType: 'movableCollateral',
554
+ },
555
+ ]);
556
+ });
557
+
418
558
  it('should return multiple routes for multiple chains below minimum amount', () => {
419
559
  const config = {
420
560
  [chain1]: {
@@ -514,6 +654,102 @@ describe('MinAmountStrategy', () => {
514
654
  );
515
655
  });
516
656
 
657
+ it('should keep minAmount validation errors human-readable for mixed-decimal routes', () => {
658
+ const mixedTokensByChainName: ChainMap<Token> = {
659
+ [chain1]: new Token({
660
+ ...tokenArgs,
661
+ chainName: chain1,
662
+ decimals: 18,
663
+ scale: { numerator: 1, denominator: 1_000_000_000_000 },
664
+ }),
665
+ [chain2]: new Token({
666
+ ...tokenArgs,
667
+ chainName: chain2,
668
+ decimals: 6,
669
+ }),
670
+ };
671
+
672
+ expect(
673
+ () =>
674
+ new MinAmountStrategy(
675
+ {
676
+ [chain1]: {
677
+ minAmount: {
678
+ min: '100',
679
+ target: '120',
680
+ type: RebalancerMinAmountType.Absolute,
681
+ },
682
+ bridge: AddressZero,
683
+ bridgeLockTime: 1,
684
+ },
685
+ [chain2]: {
686
+ minAmount: {
687
+ min: '100',
688
+ target: '120',
689
+ type: RebalancerMinAmountType.Absolute,
690
+ },
691
+ bridge: AddressZero,
692
+ bridgeLockTime: 1,
693
+ },
694
+ },
695
+ mixedTokensByChainName,
696
+ 230_000_000n,
697
+ testLogger,
698
+ {},
699
+ ),
700
+ ).to.throw(
701
+ `Consider reducing the targets as the sum (240) is greater than sum of collaterals (230)`,
702
+ );
703
+ });
704
+
705
+ it('should keep fractional minAmount validation errors human-readable across heterogeneous decimals', () => {
706
+ const mixedTokensByChainName: ChainMap<Token> = {
707
+ [chain1]: new Token({
708
+ ...tokenArgs,
709
+ chainName: chain1,
710
+ decimals: 6,
711
+ }),
712
+ [chain2]: new Token({
713
+ ...tokenArgs,
714
+ chainName: chain2,
715
+ decimals: 18,
716
+ scale: { numerator: 1, denominator: 1_000_000_000_000 },
717
+ }),
718
+ };
719
+
720
+ expect(
721
+ () =>
722
+ new MinAmountStrategy(
723
+ {
724
+ [chain1]: {
725
+ minAmount: {
726
+ min: '100',
727
+ target: '120.25',
728
+ type: RebalancerMinAmountType.Absolute,
729
+ },
730
+ bridge: AddressZero,
731
+ bridgeLockTime: 1,
732
+ },
733
+ [chain2]: {
734
+ minAmount: {
735
+ min: '100',
736
+ target: '120.25',
737
+ type: RebalancerMinAmountType.Absolute,
738
+ },
739
+ bridge: AddressZero,
740
+ bridgeLockTime: 1,
741
+ },
742
+ },
743
+ mixedTokensByChainName,
744
+ 230_500_000n,
745
+ testLogger,
746
+ {},
747
+ ),
748
+ ).to.throw(
749
+ `Consider reducing the targets as the sum (240.5) is greater than sum of collaterals (230.5)`,
750
+ );
751
+ });
752
+
517
753
  it('should handle case where there is not enough surplus to meet all minimum requirements by scaling down deficits', () => {
518
754
  const config = {
519
755
  [chain1]: {
@@ -1,8 +1,12 @@
1
1
  import { BigNumber } from 'bignumber.js';
2
2
  import { type Logger } from 'pino';
3
3
 
4
- import { type ChainMap, type Token } from '@humanode-hyperlane/sdk';
5
- import { fromWei, toWei } from '@humanode-hyperlane/utils';
4
+ import {
5
+ localAmountFromMessage,
6
+ type ChainMap,
7
+ type Token,
8
+ } from '@humanode-hyperlane/sdk';
9
+ import { fromWei } from '@humanode-hyperlane/utils';
6
10
 
7
11
  import {
8
12
  type MinAmountStrategyConfig,
@@ -16,6 +20,7 @@ import type {
16
20
  } from '../interfaces/IStrategy.js';
17
21
  import { type Metrics } from '../metrics/Metrics.js';
18
22
  import type { BridgeConfigWithOverride } from '../utils/bridgeUtils.js';
23
+ import { normalizeConfiguredAmount } from '../utils/balanceUtils.js';
19
24
 
20
25
  import { BaseStrategy, type Delta } from './BaseStrategy.js';
21
26
 
@@ -116,9 +121,13 @@ export class MinAmountStrategy extends BaseStrategy {
116
121
  if (chainConfig.minAmount.type === RebalancerMinAmountType.Absolute) {
117
122
  const token = this.getTokenByChainName(chain);
118
123
 
119
- minAmount = BigInt(toWei(chainConfig.minAmount.min, token.decimals));
120
- targetAmount = BigInt(
121
- toWei(chainConfig.minAmount.target, token.decimals),
124
+ minAmount = normalizeConfiguredAmount(
125
+ chainConfig.minAmount.min,
126
+ token,
127
+ );
128
+ targetAmount = normalizeConfiguredAmount(
129
+ chainConfig.minAmount.target,
130
+ token,
122
131
  );
123
132
  } else {
124
133
  minAmount = BigInt(
@@ -172,29 +181,32 @@ export class MinAmountStrategy extends BaseStrategy {
172
181
 
173
182
  if (minAmountType === RebalancerMinAmountType.Absolute) {
174
183
  let totalTargets = 0n;
175
- let decimals: number = 0;
184
+ const displayToken = this.getTokenByChainName(this.chains[0]);
176
185
 
177
186
  for (const chainName of this.chains) {
178
187
  const token = this.getTokenByChainName(chainName);
179
- // all the tokens have the same amount of decimals
180
- decimals = token.decimals;
181
-
182
- totalTargets += BigInt(
183
- toWei(config[chainName].minAmount.target, token.decimals),
188
+ totalTargets += normalizeConfiguredAmount(
189
+ config[chainName].minAmount.target,
190
+ token,
184
191
  );
185
192
  }
186
193
 
187
194
  if (totalTargets > totalCollateral) {
188
195
  throw new Error(
189
- `Consider reducing the targets as the sum (${fromWei(
190
- totalTargets.toString(),
191
- decimals,
192
- )}) is greater than sum of collaterals (${fromWei(
193
- totalCollateral.toString(),
194
- decimals,
196
+ `Consider reducing the targets as the sum (${this.formatCanonicalAmount(
197
+ totalTargets,
198
+ displayToken,
199
+ )}) is greater than sum of collaterals (${this.formatCanonicalAmount(
200
+ totalCollateral,
201
+ displayToken,
195
202
  )})`,
196
203
  );
197
204
  }
198
205
  }
199
206
  }
207
+
208
+ private formatCanonicalAmount(amount: bigint, token: Token): string {
209
+ const localAmount = localAmountFromMessage(amount, token.scale);
210
+ return fromWei(localAmount.toString(), token.decimals);
211
+ }
200
212
  }
@@ -6,10 +6,11 @@ import {
6
6
  type ChainMetadata,
7
7
  type ChainName,
8
8
  EvmMovableCollateralAdapter,
9
+ type IToken,
9
10
  type InterchainGasQuote,
10
11
  type MultiProvider,
11
12
  type Token,
12
- type TokenAmount,
13
+ TokenAmount,
13
14
  type WarpCore,
14
15
  } from '@humanode-hyperlane/sdk';
15
16
 
@@ -115,17 +116,14 @@ export function buildTestPreparedTransaction(
115
116
 
116
117
  // === Mock Factories ===
117
118
 
118
- export function createMockTokenAmount(amount: bigint): TokenAmount {
119
- return {
120
- amount,
121
- token: {
122
- name: 'TestToken',
123
- symbol: 'TEST',
124
- decimals: 18,
125
- addressOrDenom: TEST_ADDRESSES.token,
126
- },
127
- getDecimalFormattedAmount: () => ethers.utils.formatEther(amount),
128
- } as unknown as TokenAmount;
119
+ export function createMockTokenAmount(amount: bigint): TokenAmount<IToken> {
120
+ const token = {
121
+ name: 'TestToken',
122
+ symbol: 'TEST',
123
+ decimals: 18,
124
+ addressOrDenom: TEST_ADDRESSES.token,
125
+ } as IToken;
126
+ return new TokenAmount(amount, token);
129
127
  }
130
128
 
131
129
  export interface MockAdapterConfig {
@@ -173,6 +171,7 @@ export interface MockTokenConfig {
173
171
  name?: string;
174
172
  decimals?: number;
175
173
  addressOrDenom?: string;
174
+ scale?: Token['scale'];
176
175
  adapter?: ReturnType<typeof createMockAdapter>;
177
176
  }
178
177
 
@@ -181,6 +180,7 @@ export function createMockToken(config: MockTokenConfig = {}) {
181
180
  name = 'TestToken',
182
181
  decimals = 18,
183
182
  addressOrDenom = TEST_ADDRESSES.token,
183
+ scale,
184
184
  adapter = createMockAdapter(),
185
185
  } = config;
186
186
 
@@ -188,6 +188,7 @@ export function createMockToken(config: MockTokenConfig = {}) {
188
188
  name,
189
189
  decimals,
190
190
  addressOrDenom,
191
+ scale,
191
192
  amount: (amt: bigint) => createMockTokenAmount(amt),
192
193
  getHypAdapter: Sinon.stub().returns(adapter),
193
194
  };
@@ -128,15 +128,18 @@ export function createMockBridgeQuote(
128
128
  const route = overrides?.route as
129
129
  | { action?: { fromChainId?: number; toChainId?: number } }
130
130
  | undefined;
131
+ const usesReverseQuote = overrides?.requestParams?.toAmount !== undefined;
131
132
 
132
133
  const defaultRequestParams: BridgeQuoteParams = {
133
134
  fromChain: 42161,
134
135
  toChain: 1399811149,
135
136
  fromToken: '0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
136
137
  toToken: '0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
137
- fromAddress: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
138
138
  toAddress: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
139
- fromAmount: 10000000000n,
139
+ fromAddress: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
140
+ ...(usesReverseQuote
141
+ ? { toAmount: 9950000000n }
142
+ : { fromAmount: 10000000000n }),
140
143
  };
141
144
  const requestParams: BridgeQuoteParams = {
142
145
  ...defaultRequestParams,
@@ -0,0 +1,65 @@
1
+ import type { Logger } from 'pino';
2
+
3
+ import type {
4
+ ExplorerMessage,
5
+ IExplorerClient,
6
+ RebalanceActionQueryParams,
7
+ UserTransferQueryParams,
8
+ } from '../utils/ExplorerClient.js';
9
+
10
+ export const ID_A =
11
+ '0x8960c5e41eb0d91973140ebc196892f5f07f512dd86047e8536e71424462c5d3';
12
+ export const ID_B =
13
+ '0xdae65a8dd678bf8ea03faed7d53b99e52f5bdbae7c95834eff009cc37a18103c';
14
+ export const ID_C =
15
+ '0x1c3b5f0e2d4a6c8e0f1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f70';
16
+
17
+ export const PARAMS: UserTransferQueryParams = {
18
+ routersByDomain: { 1: '0x67899664446ccfadf75e0d3f5668be262acd1069' },
19
+ excludeTxSenders: ['0x995a921d333029512aa166885856c8af760e9381'],
20
+ };
21
+
22
+ export const REBALANCE_PARAMS: RebalanceActionQueryParams = {
23
+ bridges: ['0x867a19a5b257bcb99e1840de2ef852268efd5e46'],
24
+ routersByDomain: PARAMS.routersByDomain,
25
+ rebalancerAddress: '0x995a921d333029512aa166885856c8af760e9381',
26
+ };
27
+
28
+ export function buildMessage(msgId: string): ExplorerMessage {
29
+ return {
30
+ msg_id: msgId,
31
+ origin_domain_id: 42161,
32
+ destination_domain_id: 1,
33
+ sender: '0x867a19a5b257bcb99e1840de2ef852268efd5e46',
34
+ recipient: '0x67899664446ccfadf75e0d3f5668be262acd1069',
35
+ origin_tx_hash:
36
+ '0x5e3c1f6a3c1a7f86e0f2d5e9c9c1b8d1e1e7e2b6c4d8a9f0e1d2c3b4a5968778',
37
+ origin_tx_sender: '0x995a921d333029512aa166885856c8af760e9381',
38
+ origin_tx_recipient: '0x867a19a5b257bcb99e1840de2ef852268efd5e46',
39
+ is_delivered: false,
40
+ message_body: `0x${'00'.repeat(63)}64`,
41
+ send_occurred_at: null,
42
+ };
43
+ }
44
+
45
+ export class StubExplorerClient implements IExplorerClient {
46
+ readonly userTransferParams: UserTransferQueryParams[] = [];
47
+ rebalanceActions: ExplorerMessage[] = [buildMessage(ID_C)];
48
+
49
+ constructor(public userTransfers: ExplorerMessage[]) {}
50
+
51
+ async getInflightUserTransfers(
52
+ params: UserTransferQueryParams,
53
+ _logger: Logger,
54
+ ): Promise<ExplorerMessage[]> {
55
+ this.userTransferParams.push(params);
56
+ return this.userTransfers;
57
+ }
58
+
59
+ async getInflightRebalanceActions(
60
+ _params: RebalanceActionQueryParams,
61
+ _logger: Logger,
62
+ ): Promise<ExplorerMessage[]> {
63
+ return this.rebalanceActions;
64
+ }
65
+ }