@hyperlane-xyz/rebalancer 0.1.2 → 1.0.0

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 (223) hide show
  1. package/README.md +134 -14
  2. package/dist/config/RebalancerConfig.d.ts +2 -2
  3. package/dist/config/RebalancerConfig.d.ts.map +1 -1
  4. package/dist/config/RebalancerConfig.js +4 -3
  5. package/dist/config/RebalancerConfig.js.map +1 -1
  6. package/dist/config/RebalancerConfig.test.js +434 -163
  7. package/dist/config/RebalancerConfig.test.js.map +1 -1
  8. package/dist/config/types.d.ts +1650 -290
  9. package/dist/config/types.d.ts.map +1 -1
  10. package/dist/config/types.js +124 -46
  11. package/dist/config/types.js.map +1 -1
  12. package/dist/core/Rebalancer.d.ts +14 -7
  13. package/dist/core/Rebalancer.d.ts.map +1 -1
  14. package/dist/core/Rebalancer.js +168 -99
  15. package/dist/core/Rebalancer.js.map +1 -1
  16. package/dist/core/Rebalancer.test.d.ts +2 -0
  17. package/dist/core/Rebalancer.test.d.ts.map +1 -0
  18. package/dist/core/Rebalancer.test.js +391 -0
  19. package/dist/core/Rebalancer.test.js.map +1 -0
  20. package/dist/core/RebalancerService.d.ts +16 -2
  21. package/dist/core/RebalancerService.d.ts.map +1 -1
  22. package/dist/core/RebalancerService.js +164 -21
  23. package/dist/core/RebalancerService.js.map +1 -1
  24. package/dist/core/RebalancerService.test.d.ts +2 -0
  25. package/dist/core/RebalancerService.test.d.ts.map +1 -0
  26. package/dist/core/RebalancerService.test.js +809 -0
  27. package/dist/core/RebalancerService.test.js.map +1 -0
  28. package/dist/factories/RebalancerContextFactory.d.ts +11 -0
  29. package/dist/factories/RebalancerContextFactory.d.ts.map +1 -1
  30. package/dist/factories/RebalancerContextFactory.js +60 -13
  31. package/dist/factories/RebalancerContextFactory.js.map +1 -1
  32. package/dist/index.d.ts +6 -6
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/interfaces/IMonitor.d.ts +6 -8
  37. package/dist/interfaces/IMonitor.d.ts.map +1 -1
  38. package/dist/interfaces/IMonitor.js.map +1 -1
  39. package/dist/interfaces/IRebalancer.d.ts +20 -4
  40. package/dist/interfaces/IRebalancer.d.ts.map +1 -1
  41. package/dist/interfaces/IStrategy.d.ts +18 -2
  42. package/dist/interfaces/IStrategy.d.ts.map +1 -1
  43. package/dist/metrics/Metrics.d.ts +4 -2
  44. package/dist/metrics/Metrics.d.ts.map +1 -1
  45. package/dist/metrics/Metrics.js +21 -1
  46. package/dist/metrics/Metrics.js.map +1 -1
  47. package/dist/metrics/scripts/metrics.d.ts +2 -0
  48. package/dist/metrics/scripts/metrics.d.ts.map +1 -1
  49. package/dist/metrics/scripts/metrics.js +12 -0
  50. package/dist/metrics/scripts/metrics.js.map +1 -1
  51. package/dist/monitor/Monitor.d.ts +8 -3
  52. package/dist/monitor/Monitor.d.ts.map +1 -1
  53. package/dist/monitor/Monitor.js +75 -15
  54. package/dist/monitor/Monitor.js.map +1 -1
  55. package/dist/strategy/BaseStrategy.d.ts +51 -5
  56. package/dist/strategy/BaseStrategy.d.ts.map +1 -1
  57. package/dist/strategy/BaseStrategy.js +199 -19
  58. package/dist/strategy/BaseStrategy.js.map +1 -1
  59. package/dist/strategy/CollateralDeficitStrategy.d.ts +65 -0
  60. package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -0
  61. package/dist/strategy/CollateralDeficitStrategy.js +245 -0
  62. package/dist/strategy/CollateralDeficitStrategy.js.map +1 -0
  63. package/dist/strategy/CollateralDeficitStrategy.test.d.ts +2 -0
  64. package/dist/strategy/CollateralDeficitStrategy.test.d.ts.map +1 -0
  65. package/dist/strategy/CollateralDeficitStrategy.test.js +364 -0
  66. package/dist/strategy/CollateralDeficitStrategy.test.js.map +1 -0
  67. package/dist/strategy/CompositeStrategy.d.ts +18 -0
  68. package/dist/strategy/CompositeStrategy.d.ts.map +1 -0
  69. package/dist/strategy/CompositeStrategy.js +63 -0
  70. package/dist/strategy/CompositeStrategy.js.map +1 -0
  71. package/dist/strategy/CompositeStrategy.test.d.ts +2 -0
  72. package/dist/strategy/CompositeStrategy.test.d.ts.map +1 -0
  73. package/dist/strategy/CompositeStrategy.test.js +265 -0
  74. package/dist/strategy/CompositeStrategy.test.js.map +1 -0
  75. package/dist/strategy/MinAmountStrategy.d.ts +12 -5
  76. package/dist/strategy/MinAmountStrategy.d.ts.map +1 -1
  77. package/dist/strategy/MinAmountStrategy.js +23 -14
  78. package/dist/strategy/MinAmountStrategy.js.map +1 -1
  79. package/dist/strategy/MinAmountStrategy.test.js +88 -20
  80. package/dist/strategy/MinAmountStrategy.test.js.map +1 -1
  81. package/dist/strategy/StrategyFactory.d.ts +15 -6
  82. package/dist/strategy/StrategyFactory.d.ts.map +1 -1
  83. package/dist/strategy/StrategyFactory.js +48 -10
  84. package/dist/strategy/StrategyFactory.js.map +1 -1
  85. package/dist/strategy/StrategyFactory.test.js +2 -2
  86. package/dist/strategy/StrategyFactory.test.js.map +1 -1
  87. package/dist/strategy/WeightedStrategy.d.ts +13 -4
  88. package/dist/strategy/WeightedStrategy.d.ts.map +1 -1
  89. package/dist/strategy/WeightedStrategy.js +18 -6
  90. package/dist/strategy/WeightedStrategy.js.map +1 -1
  91. package/dist/strategy/WeightedStrategy.test.js +108 -18
  92. package/dist/strategy/WeightedStrategy.test.js.map +1 -1
  93. package/dist/strategy/index.d.ts +2 -0
  94. package/dist/strategy/index.d.ts.map +1 -1
  95. package/dist/strategy/index.js +2 -0
  96. package/dist/strategy/index.js.map +1 -1
  97. package/dist/test/helpers.d.ts +93 -3
  98. package/dist/test/helpers.d.ts.map +1 -1
  99. package/dist/test/helpers.js +267 -10
  100. package/dist/test/helpers.js.map +1 -1
  101. package/dist/tracking/ActionTracker.d.ts +49 -0
  102. package/dist/tracking/ActionTracker.d.ts.map +1 -0
  103. package/dist/tracking/ActionTracker.js +422 -0
  104. package/dist/tracking/ActionTracker.js.map +1 -0
  105. package/dist/tracking/ActionTracker.test.d.ts +2 -0
  106. package/dist/tracking/ActionTracker.test.d.ts.map +1 -0
  107. package/dist/tracking/ActionTracker.test.js +637 -0
  108. package/dist/tracking/ActionTracker.test.js.map +1 -0
  109. package/dist/tracking/IActionTracker.d.ts +101 -0
  110. package/dist/tracking/IActionTracker.d.ts.map +1 -0
  111. package/dist/tracking/IActionTracker.js +2 -0
  112. package/dist/tracking/IActionTracker.js.map +1 -0
  113. package/dist/tracking/InflightContextAdapter.d.ts +18 -0
  114. package/dist/tracking/InflightContextAdapter.d.ts.map +1 -0
  115. package/dist/tracking/InflightContextAdapter.js +35 -0
  116. package/dist/tracking/InflightContextAdapter.js.map +1 -0
  117. package/dist/tracking/InflightContextAdapter.test.d.ts +2 -0
  118. package/dist/tracking/InflightContextAdapter.test.d.ts.map +1 -0
  119. package/dist/tracking/InflightContextAdapter.test.js +172 -0
  120. package/dist/tracking/InflightContextAdapter.test.js.map +1 -0
  121. package/dist/tracking/index.d.ts +7 -0
  122. package/dist/tracking/index.d.ts.map +1 -0
  123. package/dist/tracking/index.js +6 -0
  124. package/dist/tracking/index.js.map +1 -0
  125. package/dist/tracking/store/IStore.d.ts +41 -0
  126. package/dist/tracking/store/IStore.d.ts.map +1 -0
  127. package/dist/tracking/store/IStore.js +2 -0
  128. package/dist/tracking/store/IStore.js.map +1 -0
  129. package/dist/tracking/store/InMemoryStore.d.ts +21 -0
  130. package/dist/tracking/store/InMemoryStore.d.ts.map +1 -0
  131. package/dist/tracking/store/InMemoryStore.js +40 -0
  132. package/dist/tracking/store/InMemoryStore.js.map +1 -0
  133. package/dist/tracking/store/InMemoryStore.test.d.ts +2 -0
  134. package/dist/tracking/store/InMemoryStore.test.d.ts.map +1 -0
  135. package/dist/tracking/store/InMemoryStore.test.js +290 -0
  136. package/dist/tracking/store/InMemoryStore.test.js.map +1 -0
  137. package/dist/tracking/store/index.d.ts +3 -0
  138. package/dist/tracking/store/index.d.ts.map +1 -0
  139. package/dist/tracking/store/index.js +2 -0
  140. package/dist/tracking/store/index.js.map +1 -0
  141. package/dist/tracking/types.d.ts +43 -0
  142. package/dist/tracking/types.d.ts.map +1 -0
  143. package/dist/tracking/types.js +2 -0
  144. package/dist/tracking/types.js.map +1 -0
  145. package/dist/utils/ExplorerClient.d.ts +39 -1
  146. package/dist/utils/ExplorerClient.d.ts.map +1 -1
  147. package/dist/utils/ExplorerClient.js +205 -2
  148. package/dist/utils/ExplorerClient.js.map +1 -1
  149. package/dist/utils/balanceUtils.js +2 -2
  150. package/dist/utils/balanceUtils.js.map +1 -1
  151. package/dist/utils/balanceUtils.test.js +1 -0
  152. package/dist/utils/balanceUtils.test.js.map +1 -1
  153. package/dist/utils/bridgeUtils.d.ts +1 -3
  154. package/dist/utils/bridgeUtils.d.ts.map +1 -1
  155. package/dist/utils/bridgeUtils.js +1 -5
  156. package/dist/utils/bridgeUtils.js.map +1 -1
  157. package/dist/utils/bridgeUtils.test.js +3 -14
  158. package/dist/utils/bridgeUtils.test.js.map +1 -1
  159. package/package.json +11 -9
  160. package/src/config/RebalancerConfig.test.ts +459 -163
  161. package/src/config/RebalancerConfig.ts +5 -3
  162. package/src/config/types.ts +159 -52
  163. package/src/core/Rebalancer.test.ts +632 -0
  164. package/src/core/Rebalancer.ts +247 -157
  165. package/src/core/RebalancerService.test.ts +1144 -0
  166. package/src/core/RebalancerService.ts +245 -23
  167. package/src/factories/RebalancerContextFactory.ts +115 -14
  168. package/src/index.ts +16 -4
  169. package/src/interfaces/IMonitor.ts +15 -8
  170. package/src/interfaces/IRebalancer.ts +22 -4
  171. package/src/interfaces/IStrategy.ts +23 -2
  172. package/src/metrics/Metrics.ts +26 -5
  173. package/src/metrics/scripts/metrics.ts +14 -0
  174. package/src/monitor/Monitor.ts +109 -22
  175. package/src/strategy/BaseStrategy.ts +316 -26
  176. package/src/strategy/CollateralDeficitStrategy.test.ts +551 -0
  177. package/src/strategy/CollateralDeficitStrategy.ts +390 -0
  178. package/src/strategy/CompositeStrategy.test.ts +405 -0
  179. package/src/strategy/CompositeStrategy.ts +102 -0
  180. package/src/strategy/MinAmountStrategy.test.ts +189 -88
  181. package/src/strategy/MinAmountStrategy.ts +44 -13
  182. package/src/strategy/StrategyFactory.test.ts +2 -2
  183. package/src/strategy/StrategyFactory.ts +91 -8
  184. package/src/strategy/WeightedStrategy.test.ts +187 -72
  185. package/src/strategy/WeightedStrategy.ts +41 -7
  186. package/src/strategy/index.ts +2 -0
  187. package/src/test/helpers.ts +418 -14
  188. package/src/tracking/ActionTracker.test.ts +783 -0
  189. package/src/tracking/ActionTracker.ts +647 -0
  190. package/src/tracking/IActionTracker.ts +140 -0
  191. package/src/tracking/InflightContextAdapter.test.ts +203 -0
  192. package/src/tracking/InflightContextAdapter.ts +42 -0
  193. package/src/tracking/index.ts +36 -0
  194. package/src/tracking/store/IStore.ts +48 -0
  195. package/src/tracking/store/InMemoryStore.test.ts +338 -0
  196. package/src/tracking/store/InMemoryStore.ts +58 -0
  197. package/src/tracking/store/index.ts +2 -0
  198. package/src/tracking/types.ts +74 -0
  199. package/src/utils/ExplorerClient.ts +266 -3
  200. package/src/utils/balanceUtils.test.ts +1 -0
  201. package/src/utils/balanceUtils.ts +2 -2
  202. package/src/utils/bridgeUtils.test.ts +3 -15
  203. package/src/utils/bridgeUtils.ts +0 -10
  204. package/dist/core/WithInflightGuard.d.ts +0 -20
  205. package/dist/core/WithInflightGuard.d.ts.map +0 -1
  206. package/dist/core/WithInflightGuard.js +0 -47
  207. package/dist/core/WithInflightGuard.js.map +0 -1
  208. package/dist/core/WithInflightGuard.test.d.ts +0 -2
  209. package/dist/core/WithInflightGuard.test.d.ts.map +0 -1
  210. package/dist/core/WithInflightGuard.test.js +0 -64
  211. package/dist/core/WithInflightGuard.test.js.map +0 -1
  212. package/dist/core/WithSemaphore.d.ts +0 -22
  213. package/dist/core/WithSemaphore.d.ts.map +0 -1
  214. package/dist/core/WithSemaphore.js +0 -67
  215. package/dist/core/WithSemaphore.js.map +0 -1
  216. package/dist/core/WithSemaphore.test.d.ts +0 -2
  217. package/dist/core/WithSemaphore.test.d.ts.map +0 -1
  218. package/dist/core/WithSemaphore.test.js +0 -83
  219. package/dist/core/WithSemaphore.test.js.map +0 -1
  220. package/src/core/WithInflightGuard.test.ts +0 -131
  221. package/src/core/WithInflightGuard.ts +0 -67
  222. package/src/core/WithSemaphore.test.ts +0 -111
  223. package/src/core/WithSemaphore.ts +0 -92
package/README.md CHANGED
@@ -9,11 +9,13 @@ The rebalancer monitors collateral balances across warp route deployments and au
9
9
  ## Features
10
10
 
11
11
  - **Multi-Protocol Support**: Protocol-agnostic design supporting EVM chains (Cosmos, Sealevel, etc. when movable collateral contracts available)
12
- - **Flexible Strategies**: Weighted and minimum-amount rebalancing strategies
13
- - **Safety Features**: Inflight guards, semaphores, and comprehensive validation
12
+ - **Flexible Strategies**: Weighted, minimum-amount, and collateral-deficit rebalancing strategies
13
+ - **Composite Strategies**: Combine multiple strategies with different bridges for layered rebalancing
14
+ - **Inflight Tracking**: Monitors pending rebalances to prevent duplicate transfers
15
+ - **Safety Features**: Inflight message tracking and comprehensive validation
14
16
  - **Observability**: Built-in Prometheus metrics and structured logging
15
17
  - **Dual Mode**: Manual CLI execution or continuous daemon service
16
- - **Bridge Support**: Integration with Portal, Hyperlane, and other bridge providers
18
+ - **Bridge Support**: Integration with Hyperlane warp routes and external bridges
17
19
 
18
20
  ## Installation
19
21
 
@@ -90,7 +92,9 @@ await service.executeManual({
90
92
 
91
93
  ## Configuration
92
94
 
93
- The rebalancer uses a YAML configuration file. See example:
95
+ The rebalancer uses a YAML configuration file with a `warpRouteId` and `strategy` field.
96
+
97
+ ### Basic Example (Single Strategy)
94
98
 
95
99
  ```yaml
96
100
  warpRouteId: ETH/ethereum-arbitrum-optimism
@@ -99,13 +103,129 @@ strategy:
99
103
  chains:
100
104
  ethereum:
101
105
  weight: 60
102
- bridge: hyperlane
106
+ tolerance: 5
107
+ bridge: '0x1234...abcd'
103
108
  arbitrum:
104
109
  weight: 20
105
- bridge: hyperlane
106
- optimism:
107
- weight: 20
108
- bridge: portal
110
+ tolerance: 5
111
+ bridge: '0x5678...efgh'
112
+ ```
113
+
114
+ ### Composite Strategy (v1.0.0+)
115
+
116
+ The `strategy` field accepts an array of strategies for composite rebalancing. Strategies are evaluated in order - the first strategy that produces routes is used.
117
+
118
+ ```yaml
119
+ warpRouteId: USDC/base-ethereum-arbitrum
120
+ strategy:
121
+ # First: CollateralDeficitStrategy with fast bridges for reactive rebalancing
122
+ - rebalanceStrategy: collateralDeficit
123
+ chains:
124
+ base:
125
+ buffer: 0
126
+ bridge: '0x584244d02b0fBf9054A5D5C9e9cE9A2E8adA0e28'
127
+ ethereum:
128
+ buffer: 0
129
+ bridge: '0xEE4a09db2C25592C04b8b342CB89f9a7f5E20BD2'
130
+
131
+ # Second: MinAmountStrategy with standard bridges for baseline floors
132
+ - rebalanceStrategy: minAmount
133
+ chains:
134
+ base:
135
+ minAmount:
136
+ min: 0.1
137
+ target: 0.11
138
+ type: 'absolute'
139
+ bridgeLockTime: 1800
140
+ bridge: '0x33e94B6D2ae697c16a750dB7c3d9443622C4405a'
141
+ ethereum:
142
+ minAmount:
143
+ min: 0.1
144
+ target: 0.11
145
+ type: 'absolute'
146
+ bridgeLockTime: 1800
147
+ bridge: '0x8c8D831E1e879604b4B304a2c951B8AEe3aB3a23'
148
+ ```
149
+
150
+ > **Note**: When using `collateralDeficit` in a composite strategy, it must be the first strategy in the array.
151
+
152
+ ### Strategy Types
153
+
154
+ | Strategy | Use Case | Chain Config Fields |
155
+ | ------------------- | ------------------------------------------------------ | -------------------------------- |
156
+ | `weighted` | Maintain percentage distribution across chains | `weight`, `tolerance` |
157
+ | `minAmount` | Trigger rebalance when balance falls below floor | `minAmount: {min, target, type}` |
158
+ | `collateralDeficit` | React to bridged supply gaps (synthetic vs collateral) | `buffer` |
159
+
160
+ #### Weighted Strategy
161
+
162
+ Maintains target weight percentages across chains. Rebalances when deviation exceeds tolerance.
163
+
164
+ ```yaml
165
+ strategy:
166
+ rebalanceStrategy: weighted
167
+ chains:
168
+ ethereum:
169
+ weight: 60 # Target 60% of total supply
170
+ tolerance: 5 # Rebalance if >5% deviation
171
+ bridge: '0x...'
172
+ ```
173
+
174
+ #### MinAmount Strategy
175
+
176
+ Triggers rebalance when a chain's balance falls below the minimum threshold.
177
+
178
+ ```yaml
179
+ strategy:
180
+ rebalanceStrategy: minAmount
181
+ chains:
182
+ ethereum:
183
+ minAmount:
184
+ min: 100 # Trigger rebalance below this
185
+ target: 110 # Rebalance up to this amount
186
+ type: 'absolute' # or 'relative' (percentage of total)
187
+ bridge: '0x...'
188
+ ```
189
+
190
+ #### CollateralDeficit Strategy
191
+
192
+ Monitors bridged (synthetic) supply vs collateral and rebalances to cover deficits.
193
+
194
+ ```yaml
195
+ strategy:
196
+ rebalanceStrategy: collateralDeficit
197
+ chains:
198
+ ethereum:
199
+ buffer: 1000 # Extra collateral buffer above deficit
200
+ bridge: '0x...'
201
+ ```
202
+
203
+ ### Chain Config Reference
204
+
205
+ | Field | Type | Required | Description |
206
+ | ------------------------- | ---------------- | -------- | -------------------------------------------------------------- |
207
+ | `bridge` | `0x...` address | Yes | Bridge contract address for this chain |
208
+ | `bridgeLockTime` | number (seconds) | No | Expected bridge transfer duration (used for inflight tracking) |
209
+ | `bridgeMinAcceptedAmount` | number | No | Skip routes with amounts below this threshold |
210
+ | `override` | object | No | Per-destination bridge overrides (see below) |
211
+
212
+ #### Per-Destination Overrides
213
+
214
+ Use `override` to specify different bridge configs for specific destination chains:
215
+
216
+ ```yaml
217
+ strategy:
218
+ rebalanceStrategy: minAmount
219
+ chains:
220
+ ethereum:
221
+ minAmount: { min: 100, target: 110, type: 'absolute' }
222
+ bridge: '0xDefaultBridge...'
223
+ override:
224
+ arbitrum:
225
+ bridge: '0xFastArbitrumBridge...'
226
+ bridgeLockTime: 600
227
+ optimism:
228
+ bridge: '0xOptimismBridge...'
109
229
  ```
110
230
 
111
231
  ## Architecture
@@ -117,12 +237,12 @@ typescript/rebalancer/
117
237
  ├── src/
118
238
  │ ├── core/
119
239
  │ │ ├── RebalancerService.ts # Main orchestrator
120
- │ │ ├── Rebalancer.ts # Core rebalancing logic
121
- │ │ ├── WithInflightGuard.ts # Concurrency protection
122
- │ │ └── WithSemaphore.ts # Semaphore wrapper
240
+ │ │ └── Rebalancer.ts # Core rebalancing logic
123
241
  │ ├── strategy/
124
- │ │ ├── WeightedStrategy.ts # Weighted distribution
125
- │ │ └── MinAmountStrategy.ts # Minimum threshold strategy
242
+ │ │ ├── WeightedStrategy.ts # Weighted distribution
243
+ │ │ ├── MinAmountStrategy.ts # Minimum threshold strategy
244
+ │ │ ├── CollateralDeficitStrategy.ts # Bridged supply deficit strategy
245
+ │ │ └── CompositeStrategy.ts # Combines multiple strategies
126
246
  │ ├── monitor/
127
247
  │ │ └── Monitor.ts # Balance monitoring
128
248
  │ ├── metrics/
@@ -1,8 +1,8 @@
1
1
  import { type StrategyConfig } from './types.js';
2
2
  export declare class RebalancerConfig {
3
3
  readonly warpRouteId: string;
4
- readonly strategyConfig: StrategyConfig;
5
- constructor(warpRouteId: string, strategyConfig: StrategyConfig);
4
+ readonly strategyConfig: StrategyConfig[];
5
+ constructor(warpRouteId: string, strategyConfig: StrategyConfig[]);
6
6
  /**
7
7
  * Loads config from a file
8
8
  * @param configFilePath Path to the config file
@@ -1 +1 @@
1
- {"version":3,"file":"RebalancerConfig.d.ts","sourceRoot":"","sources":["../../src/config/RebalancerConfig.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,gBAAgB;aAET,WAAW,EAAE,MAAM;aACnB,cAAc,EAAE,cAAc;gBAD9B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc;IAGhD;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM;CAiBnC"}
1
+ {"version":3,"file":"RebalancerConfig.d.ts","sourceRoot":"","sources":["../../src/config/RebalancerConfig.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,YAAY,CAAC;AAEpB,qBAAa,gBAAgB;aAET,WAAW,EAAE,MAAM;aACnB,cAAc,EAAE,cAAc,EAAE;gBADhC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAAE;IAGlD;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM;CAmBnC"}
@@ -1,7 +1,6 @@
1
1
  import { fromZodError } from 'zod-validation-error';
2
- import { isObjEmpty } from '@hyperlane-xyz/utils';
3
2
  import { readYamlOrJson } from '@hyperlane-xyz/utils/fs';
4
- import { RebalancerConfigSchema, } from './types.js';
3
+ import { RebalancerConfigSchema, getStrategyChainNames, } from './types.js';
5
4
  export class RebalancerConfig {
6
5
  warpRouteId;
7
6
  strategyConfig;
@@ -20,7 +19,9 @@ export class RebalancerConfig {
20
19
  throw new Error(fromZodError(validationResult.error).message);
21
20
  }
22
21
  const { warpRouteId, strategy } = validationResult.data;
23
- if (isObjEmpty(strategy.chains)) {
22
+ // Check that at least one chain is configured across all strategies
23
+ const chainNames = getStrategyChainNames(strategy);
24
+ if (chainNames.length === 0) {
24
25
  throw new Error('No chains configured');
25
26
  }
26
27
  return new RebalancerConfig(warpRouteId, strategy);
@@ -1 +1 @@
1
- {"version":3,"file":"RebalancerConfig.js","sourceRoot":"","sources":["../../src/config/RebalancerConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAEL,sBAAsB,GAEvB,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,gBAAgB;IAET;IACA;IAFlB,YACkB,WAAmB,EACnB,cAA8B;QAD9B,gBAAW,GAAX,WAAW,CAAQ;QACnB,mBAAc,GAAd,cAAc,CAAgB;IAC7C,CAAC;IAEJ;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,cAAsB;QAChC,MAAM,MAAM,GAA8B,cAAc,CAAC,cAAc,CAAC,CAAC;QAEzE,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAElE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAExD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,gBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;CACF"}
1
+ {"version":3,"file":"RebalancerConfig.js","sourceRoot":"","sources":["../../src/config/RebalancerConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAEL,sBAAsB,EAEtB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,gBAAgB;IAET;IACA;IAFlB,YACkB,WAAmB,EACnB,cAAgC;QADhC,gBAAW,GAAX,WAAW,CAAQ;QACnB,mBAAc,GAAd,cAAc,CAAkB;IAC/C,CAAC;IAEJ;;;OAGG;IACH,MAAM,CAAC,IAAI,CAAC,cAAsB;QAChC,MAAM,MAAM,GAA8B,cAAc,CAAC,cAAc,CAAC,CAAC;QAEzE,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAElE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAExD,oEAAoE;QACpE,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,IAAI,gBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;CACF"}