@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
@@ -3,6 +3,7 @@ import { expect } from 'chai';
3
3
  import { pino } from 'pino';
4
4
  import { Token, TokenStandard, } from '@hyperlane-xyz/sdk';
5
5
  import { RebalancerMinAmountType } from '../config/types.js';
6
+ import { extractBridgeConfigs } from '../test/helpers.js';
6
7
  import { MinAmountStrategy } from './MinAmountStrategy.js';
7
8
  const testLogger = pino({ level: 'silent' });
8
9
  describe('MinAmountStrategy', () => {
@@ -38,7 +39,7 @@ describe('MinAmountStrategy', () => {
38
39
  bridge: AddressZero,
39
40
  bridgeLockTime: 1,
40
41
  },
41
- }, tokensByChainName, totalCollateral, testLogger)).to.throw('At least two chains must be configured');
42
+ }, tokensByChainName, totalCollateral, testLogger, {})).to.throw('At least two chains must be configured');
42
43
  });
43
44
  it('should create a strategy with minAmount and target using absolute values', () => {
44
45
  new MinAmountStrategy({
@@ -60,7 +61,7 @@ describe('MinAmountStrategy', () => {
60
61
  bridge: AddressZero,
61
62
  bridgeLockTime: 1,
62
63
  },
63
- }, tokensByChainName, totalCollateral, testLogger);
64
+ }, tokensByChainName, totalCollateral, testLogger, {});
64
65
  });
65
66
  it('should create a strategy with minAmount and target using relative values', () => {
66
67
  new MinAmountStrategy({
@@ -82,7 +83,7 @@ describe('MinAmountStrategy', () => {
82
83
  bridge: AddressZero,
83
84
  bridgeLockTime: 1,
84
85
  },
85
- }, tokensByChainName, totalCollateral, testLogger);
86
+ }, tokensByChainName, totalCollateral, testLogger, {});
86
87
  });
87
88
  it('should throw an error when minAmount is negative', () => {
88
89
  expect(() => new MinAmountStrategy({
@@ -104,7 +105,7 @@ describe('MinAmountStrategy', () => {
104
105
  bridge: AddressZero,
105
106
  bridgeLockTime: 1,
106
107
  },
107
- }, tokensByChainName, totalCollateral, testLogger)).to.throw('Minimum amount (-10) cannot be negative for chain chain2');
108
+ }, tokensByChainName, totalCollateral, testLogger, {})).to.throw('Minimum amount (-10) cannot be negative for chain chain2');
108
109
  });
109
110
  it('should throw an error when target is less than min', () => {
110
111
  expect(() => new MinAmountStrategy({
@@ -126,7 +127,7 @@ describe('MinAmountStrategy', () => {
126
127
  bridge: AddressZero,
127
128
  bridgeLockTime: 1,
128
129
  },
129
- }, tokensByChainName, totalCollateral, testLogger)).to.throw('Target (80) must be greater than or equal to min (100) for chain chain1');
130
+ }, tokensByChainName, totalCollateral, testLogger, {})).to.throw('Target (80) must be greater than or equal to min (100) for chain chain1');
130
131
  });
131
132
  it('should throw an error when relative target is less than relative min', () => {
132
133
  expect(() => new MinAmountStrategy({
@@ -148,7 +149,7 @@ describe('MinAmountStrategy', () => {
148
149
  bridge: AddressZero,
149
150
  bridgeLockTime: 1,
150
151
  },
151
- }, tokensByChainName, totalCollateral, testLogger)).to.throw('Target (0.4) must be greater than or equal to min (0.5) for chain chain1');
152
+ }, tokensByChainName, totalCollateral, testLogger, {})).to.throw('Target (0.4) must be greater than or equal to min (0.5) for chain chain1');
152
153
  });
153
154
  it('should throw an error when raw balances chains length does not match configured chains length', () => {
154
155
  expect(() => new MinAmountStrategy({
@@ -170,7 +171,7 @@ describe('MinAmountStrategy', () => {
170
171
  bridge: AddressZero,
171
172
  bridgeLockTime: 1,
172
173
  },
173
- }, tokensByChainName, totalCollateral, testLogger).getRebalancingRoutes({
174
+ }, tokensByChainName, totalCollateral, testLogger, {}).getRebalancingRoutes({
174
175
  [chain1]: 100n,
175
176
  [chain2]: 200n,
176
177
  [chain3]: 300n,
@@ -196,7 +197,7 @@ describe('MinAmountStrategy', () => {
196
197
  bridge: AddressZero,
197
198
  bridgeLockTime: 1,
198
199
  },
199
- }, tokensByChainName, totalCollateral, testLogger).getRebalancingRoutes({
200
+ }, tokensByChainName, totalCollateral, testLogger, {}).getRebalancingRoutes({
200
201
  [chain1]: 100n,
201
202
  [chain3]: 300n,
202
203
  })).to.throw('Raw balance for chain chain2 not found');
@@ -221,7 +222,7 @@ describe('MinAmountStrategy', () => {
221
222
  bridge: AddressZero,
222
223
  bridgeLockTime: 1,
223
224
  },
224
- }, tokensByChainName, totalCollateral, testLogger).getRebalancingRoutes({
225
+ }, tokensByChainName, totalCollateral, testLogger, {}).getRebalancingRoutes({
225
226
  [chain1]: 100n,
226
227
  [chain2]: -2n,
227
228
  })).to.throw('Raw balance for chain chain2 is negative');
@@ -248,7 +249,7 @@ describe('MinAmountStrategy', () => {
248
249
  bridge: AddressZero,
249
250
  bridgeLockTime: 1,
250
251
  },
251
- }, tokensByChainName, totalCollateral, testLogger);
252
+ }, tokensByChainName, totalCollateral, testLogger, {});
252
253
  const rawBalances = {
253
254
  [chain1]: BigInt(120e18),
254
255
  [chain2]: BigInt(120e18),
@@ -257,7 +258,7 @@ describe('MinAmountStrategy', () => {
257
258
  expect(routes).to.be.empty;
258
259
  });
259
260
  it('should return a single route when a chain is below minimum amount', () => {
260
- const strategy = new MinAmountStrategy({
261
+ const config = {
261
262
  [chain1]: {
262
263
  minAmount: {
263
264
  min: '100',
@@ -276,7 +277,9 @@ describe('MinAmountStrategy', () => {
276
277
  bridge: AddressZero,
277
278
  bridgeLockTime: 1,
278
279
  },
279
- }, tokensByChainName, totalCollateral, testLogger);
280
+ };
281
+ const bridgeConfigs = extractBridgeConfigs(config);
282
+ const strategy = new MinAmountStrategy(config, tokensByChainName, totalCollateral, testLogger, bridgeConfigs);
280
283
  const rawBalances = {
281
284
  [chain1]: BigInt(50e18),
282
285
  [chain2]: BigInt(200e18),
@@ -287,11 +290,12 @@ describe('MinAmountStrategy', () => {
287
290
  origin: chain2,
288
291
  destination: chain1,
289
292
  amount: BigInt(70e18),
293
+ bridge: AddressZero,
290
294
  },
291
295
  ]);
292
296
  });
293
297
  it('should return multiple routes for multiple chains below minimum amount', () => {
294
- const strategy = new MinAmountStrategy({
298
+ const config = {
295
299
  [chain1]: {
296
300
  minAmount: {
297
301
  min: '80',
@@ -319,7 +323,9 @@ describe('MinAmountStrategy', () => {
319
323
  bridge: AddressZero,
320
324
  bridgeLockTime: 1,
321
325
  },
322
- }, tokensByChainName, totalCollateral, testLogger);
326
+ };
327
+ const bridgeConfigs = extractBridgeConfigs(config);
328
+ const strategy = new MinAmountStrategy(config, tokensByChainName, totalCollateral, testLogger, bridgeConfigs);
323
329
  const rawBalances = {
324
330
  [chain1]: BigInt(50e18),
325
331
  [chain2]: BigInt(75e18),
@@ -331,11 +337,13 @@ describe('MinAmountStrategy', () => {
331
337
  origin: chain3,
332
338
  destination: chain1,
333
339
  amount: BigInt(50e18),
340
+ bridge: AddressZero,
334
341
  },
335
342
  {
336
343
  origin: chain3,
337
344
  destination: chain2,
338
345
  amount: BigInt(25e18),
346
+ bridge: AddressZero,
339
347
  },
340
348
  ]);
341
349
  });
@@ -359,10 +367,10 @@ describe('MinAmountStrategy', () => {
359
367
  bridge: AddressZero,
360
368
  bridgeLockTime: 1,
361
369
  },
362
- }, tokensByChainName, totalCollateral, testLogger)).to.throw(`Consider reducing the targets as the sum (340) is greater than sum of collaterals (300)`);
370
+ }, tokensByChainName, totalCollateral, testLogger, {})).to.throw(`Consider reducing the targets as the sum (340) is greater than sum of collaterals (300)`);
363
371
  });
364
372
  it('should handle case where there is not enough surplus to meet all minimum requirements by scaling down deficits', () => {
365
- const strategy = new MinAmountStrategy({
373
+ const config = {
366
374
  [chain1]: {
367
375
  minAmount: {
368
376
  min: '100',
@@ -390,7 +398,9 @@ describe('MinAmountStrategy', () => {
390
398
  bridge: AddressZero,
391
399
  bridgeLockTime: 1,
392
400
  },
393
- }, tokensByChainName, totalCollateral, testLogger);
401
+ };
402
+ const bridgeConfigs = extractBridgeConfigs(config);
403
+ const strategy = new MinAmountStrategy(config, tokensByChainName, totalCollateral, testLogger, bridgeConfigs);
394
404
  const rawBalances = {
395
405
  [chain1]: BigInt(50e18),
396
406
  [chain2]: BigInt(50e18),
@@ -406,6 +416,61 @@ describe('MinAmountStrategy', () => {
406
416
  expect(routes[1].destination).to.equal(chain2);
407
417
  expect(routes[1].amount).to.equal(BigInt(25e18));
408
418
  });
419
+ it('should not produce zero-amount routes when scaling causes amounts to round to zero', () => {
420
+ // This test ensures that when deficit scaling produces zero amounts (due to integer division),
421
+ // these zero-amount routes are NOT included in the output.
422
+ // Bug scenario: totalSurplus=1, totalDeficit=3 -> each deficit of 1 scales to (1*1)/3 = 0
423
+ const config = {
424
+ [chain1]: {
425
+ minAmount: {
426
+ min: '90',
427
+ target: '100',
428
+ type: RebalancerMinAmountType.Absolute,
429
+ },
430
+ bridge: AddressZero,
431
+ bridgeLockTime: 1,
432
+ },
433
+ [chain2]: {
434
+ minAmount: {
435
+ min: '90',
436
+ target: '100',
437
+ type: RebalancerMinAmountType.Absolute,
438
+ },
439
+ bridge: AddressZero,
440
+ bridgeLockTime: 1,
441
+ },
442
+ [chain3]: {
443
+ minAmount: {
444
+ min: '90',
445
+ target: '100',
446
+ type: RebalancerMinAmountType.Absolute,
447
+ },
448
+ bridge: AddressZero,
449
+ bridgeLockTime: 1,
450
+ },
451
+ };
452
+ const bridgeConfigs = extractBridgeConfigs(config);
453
+ const strategy = new MinAmountStrategy(config, tokensByChainName, totalCollateral, testLogger, bridgeConfigs);
454
+ // chain1 and chain2 are at 1 token each (far below min 90)
455
+ // chain3 has 91 tokens (surplus of 1 above min)
456
+ // Deficits: chain1 needs 99 (100-1), chain2 needs 99 (100-1), total = 198
457
+ // Surplus: chain3 has 1 (91-90)
458
+ // Scaling: each deficit of 99 becomes (99 * 1) / 198 = 0 (integer division!)
459
+ const rawBalances = {
460
+ [chain1]: BigInt(1e18),
461
+ [chain2]: BigInt(1e18),
462
+ [chain3]: BigInt(91e18),
463
+ };
464
+ const routes = strategy.getRebalancingRoutes(rawBalances);
465
+ // All routes should have non-zero amounts
466
+ // (Chai's greaterThan doesn't support BigInt, so use direct comparison)
467
+ for (const route of routes) {
468
+ expect(route.amount > 0n, `Route amount should be > 0, got ${route.amount}`).to.be.true;
469
+ }
470
+ // The single token of surplus may produce one route (or none if both scale to 0)
471
+ // Either way, no zero-amount routes should exist
472
+ expect(routes.every((r) => r.amount > 0n), 'All routes must have non-zero amounts').to.be.true;
473
+ });
409
474
  it('should have no surplus or deficit when all at min', () => {
410
475
  const strategy = new MinAmountStrategy({
411
476
  [chain1]: {
@@ -426,7 +491,7 @@ describe('MinAmountStrategy', () => {
426
491
  bridge: AddressZero,
427
492
  bridgeLockTime: 1,
428
493
  },
429
- }, tokensByChainName, totalCollateral, testLogger);
494
+ }, tokensByChainName, totalCollateral, testLogger, {});
430
495
  const rawBalances = {
431
496
  [chain1]: BigInt(100e18),
432
497
  [chain2]: BigInt(100e18),
@@ -435,7 +500,7 @@ describe('MinAmountStrategy', () => {
435
500
  expect(routes).to.be.empty;
436
501
  });
437
502
  it('should consider the target amount with relative configuration', () => {
438
- const strategy = new MinAmountStrategy({
503
+ const config = {
439
504
  [chain1]: {
440
505
  minAmount: {
441
506
  min: 0.25,
@@ -454,7 +519,9 @@ describe('MinAmountStrategy', () => {
454
519
  bridge: AddressZero,
455
520
  bridgeLockTime: 1,
456
521
  },
457
- }, tokensByChainName, totalCollateral, testLogger);
522
+ };
523
+ const bridgeConfigs = extractBridgeConfigs(config);
524
+ const strategy = new MinAmountStrategy(config, tokensByChainName, totalCollateral, testLogger, bridgeConfigs);
458
525
  const rawBalances = {
459
526
  [chain1]: 200n,
460
527
  [chain2]: 800n,
@@ -465,6 +532,7 @@ describe('MinAmountStrategy', () => {
465
532
  origin: chain2,
466
533
  destination: chain1,
467
534
  amount: 100n,
535
+ bridge: AddressZero,
468
536
  },
469
537
  ]);
470
538
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MinAmountStrategy.test.js","sourceRoot":"","sources":["../../src/strategy/MinAmountStrategy.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MinAmountStrategy.test.js","sourceRoot":"","sources":["../../src/strategy/MinAmountStrategy.test.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,22 @@ import { type IStrategy } from '../interfaces/IStrategy.js';
5
5
  import { type Metrics } from '../metrics/Metrics.js';
6
6
  export declare class StrategyFactory {
7
7
  /**
8
- * @param strategyConfig A discriminated union of strategy-specific configurations.
9
- * @param tokensByChainName - A map of chain->token to ease the lookup of token by chain
10
- * @param initialTotalCollateral - The initial total collateral of the rebalancer
11
- * @param logger - The logger to use for the strategy
12
- * @param metrics - The metrics to use for the strategy
8
+ * Creates a strategy from an array of strategy configs.
9
+ * - Single strategy (array with 1 element): Creates that strategy directly
10
+ * - Multiple strategies (array with 2+ elements): Creates CompositeStrategy
11
+ *
12
+ * @param strategyConfigs Array of strategy configurations (always array format)
13
+ * @param tokensByChainName A map of chain->token to ease the lookup of token by chain
14
+ * @param initialTotalCollateral The initial total collateral of the rebalancer
15
+ * @param logger The logger to use for the strategy
16
+ * @param metrics The metrics to use for the strategy
13
17
  * @returns A concrete strategy implementation
14
18
  */
15
- static createStrategy(strategyConfig: StrategyConfig, tokensByChainName: ChainMap<Token>, initialTotalCollateral: bigint, logger: Logger, metrics?: Metrics): IStrategy;
19
+ static createStrategy(strategyConfigs: StrategyConfig[], tokensByChainName: ChainMap<Token>, initialTotalCollateral: bigint, logger: Logger, metrics?: Metrics): IStrategy;
20
+ /**
21
+ * Create a single strategy from config.
22
+ */
23
+ private static createSingleStrategy;
24
+ private static extractBridgeConfigs;
16
25
  }
17
26
  //# sourceMappingURL=StrategyFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StrategyFactory.d.ts","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAKrD,qBAAa,eAAe;IAC1B;;;;;;;OAOG;IACH,MAAM,CAAC,cAAc,CACnB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,EAClC,sBAAsB,EAAE,MAAM,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,GAChB,SAAS;CAiBb"}
1
+ {"version":3,"file":"StrategyFactory.d.ts","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAQrD,qBAAa,eAAe;IAC1B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,cAAc,CACnB,eAAe,EAAE,cAAc,EAAE,EACjC,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,EAClC,sBAAsB,EAAE,MAAM,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,GAChB,SAAS;IA6BZ;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IA4CnC,OAAO,CAAC,MAAM,CAAC,oBAAoB;CAiBpC"}
@@ -1,25 +1,63 @@
1
1
  import { RebalancerStrategyOptions, } from '../config/types.js';
2
+ import { CollateralDeficitStrategy } from './CollateralDeficitStrategy.js';
3
+ import { CompositeStrategy } from './CompositeStrategy.js';
2
4
  import { MinAmountStrategy } from './MinAmountStrategy.js';
3
5
  import { WeightedStrategy } from './WeightedStrategy.js';
4
6
  export class StrategyFactory {
5
7
  /**
6
- * @param strategyConfig A discriminated union of strategy-specific configurations.
7
- * @param tokensByChainName - A map of chain->token to ease the lookup of token by chain
8
- * @param initialTotalCollateral - The initial total collateral of the rebalancer
9
- * @param logger - The logger to use for the strategy
10
- * @param metrics - The metrics to use for the strategy
8
+ * Creates a strategy from an array of strategy configs.
9
+ * - Single strategy (array with 1 element): Creates that strategy directly
10
+ * - Multiple strategies (array with 2+ elements): Creates CompositeStrategy
11
+ *
12
+ * @param strategyConfigs Array of strategy configurations (always array format)
13
+ * @param tokensByChainName A map of chain->token to ease the lookup of token by chain
14
+ * @param initialTotalCollateral The initial total collateral of the rebalancer
15
+ * @param logger The logger to use for the strategy
16
+ * @param metrics The metrics to use for the strategy
11
17
  * @returns A concrete strategy implementation
12
18
  */
13
- static createStrategy(strategyConfig, tokensByChainName, initialTotalCollateral, logger, metrics) {
19
+ static createStrategy(strategyConfigs, tokensByChainName, initialTotalCollateral, logger, metrics) {
20
+ if (strategyConfigs.length === 0) {
21
+ throw new Error('At least one strategy must be configured');
22
+ }
23
+ // Single strategy - create directly without CompositeStrategy wrapper
24
+ if (strategyConfigs.length === 1) {
25
+ return this.createSingleStrategy(strategyConfigs[0], tokensByChainName, initialTotalCollateral, logger, metrics);
26
+ }
27
+ // Multiple strategies - create CompositeStrategy
28
+ const subStrategies = strategyConfigs.map((config) => this.createSingleStrategy(config, tokensByChainName, initialTotalCollateral, logger, metrics));
29
+ return new CompositeStrategy(subStrategies, logger);
30
+ }
31
+ /**
32
+ * Create a single strategy from config.
33
+ */
34
+ static createSingleStrategy(strategyConfig, tokensByChainName, initialTotalCollateral, logger, metrics) {
35
+ const bridgeConfigs = this.extractBridgeConfigs(strategyConfig);
14
36
  switch (strategyConfig.rebalanceStrategy) {
15
- case RebalancerStrategyOptions.Weighted:
16
- return new WeightedStrategy(strategyConfig.chains, logger, metrics);
17
- case RebalancerStrategyOptions.MinAmount:
18
- return new MinAmountStrategy(strategyConfig.chains, tokensByChainName, initialTotalCollateral, logger, metrics);
37
+ case RebalancerStrategyOptions.Weighted: {
38
+ return new WeightedStrategy(strategyConfig.chains, logger, bridgeConfigs, metrics, tokensByChainName);
39
+ }
40
+ case RebalancerStrategyOptions.MinAmount: {
41
+ return new MinAmountStrategy(strategyConfig.chains, tokensByChainName, initialTotalCollateral, logger, bridgeConfigs, metrics);
42
+ }
43
+ case RebalancerStrategyOptions.CollateralDeficit: {
44
+ return new CollateralDeficitStrategy(strategyConfig.chains, tokensByChainName, logger, bridgeConfigs, metrics);
45
+ }
19
46
  default: {
20
47
  throw new Error('Unsupported strategy type');
21
48
  }
22
49
  }
23
50
  }
51
+ static extractBridgeConfigs(strategyConfig) {
52
+ const bridgeConfigs = {};
53
+ for (const [chain, config] of Object.entries(strategyConfig.chains)) {
54
+ bridgeConfigs[chain] = {
55
+ bridge: config.bridge,
56
+ bridgeMinAcceptedAmount: config.bridgeMinAcceptedAmount ?? 0,
57
+ override: config.override,
58
+ };
59
+ }
60
+ return bridgeConfigs;
61
+ }
24
62
  }
25
63
  //# sourceMappingURL=StrategyFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StrategyFactory.js","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,yBAAyB,GAE1B,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,OAAO,eAAe;IAC1B;;;;;;;OAOG;IACH,MAAM,CAAC,cAAc,CACnB,cAA8B,EAC9B,iBAAkC,EAClC,sBAA8B,EAC9B,MAAc,EACd,OAAiB;QAEjB,QAAQ,cAAc,CAAC,iBAAiB,EAAE,CAAC;YACzC,KAAK,yBAAyB,CAAC,QAAQ;gBACrC,OAAO,IAAI,gBAAgB,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACtE,KAAK,yBAAyB,CAAC,SAAS;gBACtC,OAAO,IAAI,iBAAiB,CAC1B,cAAc,CAAC,MAAM,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,MAAM,EACN,OAAO,CACR,CAAC;YACJ,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"StrategyFactory.js","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,yBAAyB,GAE1B,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,OAAO,eAAe;IAC1B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,cAAc,CACnB,eAAiC,EACjC,iBAAkC,EAClC,sBAA8B,EAC9B,MAAc,EACd,OAAiB;QAEjB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,sEAAsE;QACtE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,oBAAoB,CAC9B,eAAe,CAAC,CAAC,CAAC,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,MAAM,EACN,OAAO,CACR,CAAC;QACJ,CAAC;QAED,iDAAiD;QACjD,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACnD,IAAI,CAAC,oBAAoB,CACvB,MAAM,EACN,iBAAiB,EACjB,sBAAsB,EACtB,MAAM,EACN,OAAO,CACR,CACF,CAAC;QACF,OAAO,IAAI,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,oBAAoB,CACjC,cAA8B,EAC9B,iBAAkC,EAClC,sBAA8B,EAC9B,MAAc,EACd,OAAiB;QAEjB,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QAEhE,QAAQ,cAAc,CAAC,iBAAiB,EAAE,CAAC;YACzC,KAAK,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACxC,OAAO,IAAI,gBAAgB,CACzB,cAAc,CAAC,MAAM,EACrB,MAAM,EACN,aAAa,EACb,OAAO,EACP,iBAAiB,CAClB,CAAC;YACJ,CAAC;YACD,KAAK,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC;gBACzC,OAAO,IAAI,iBAAiB,CAC1B,cAAc,CAAC,MAAM,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,MAAM,EACN,aAAa,EACb,OAAO,CACR,CAAC;YACJ,CAAC;YACD,KAAK,yBAAyB,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACjD,OAAO,IAAI,yBAAyB,CAClC,cAAc,CAAC,MAAM,EACrB,iBAAiB,EACjB,MAAM,EACN,aAAa,EACb,OAAO,CACR,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,oBAAoB,CACjC,cAA8B;QAE9B,MAAM,aAAa,GAAuC,EAAE,CAAC;QAE7D,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACpE,aAAa,CAAC,KAAK,CAAC,GAAG;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,IAAI,CAAC;gBAC5D,QAAQ,EAAE,MAAM,CAAC,QAEhB;aACF,CAAC;QACJ,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;CACF"}
@@ -45,7 +45,7 @@ describe('StrategyFactory', () => {
45
45
  rebalanceStrategy: RebalancerStrategyOptions.Weighted,
46
46
  chains: config,
47
47
  };
48
- const strategy = StrategyFactory.createStrategy(strategyConfig, tokensByChainName, totalCollateral, testLogger);
48
+ const strategy = StrategyFactory.createStrategy([strategyConfig], tokensByChainName, totalCollateral, testLogger);
49
49
  expect(strategy).to.be.instanceOf(WeightedStrategy);
50
50
  });
51
51
  it('creates a MinAmountStrategy when given minAmount configuration', () => {
@@ -73,7 +73,7 @@ describe('StrategyFactory', () => {
73
73
  rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
74
74
  chains: config,
75
75
  };
76
- const strategy = StrategyFactory.createStrategy(strategyConfig, tokensByChainName, totalCollateral, testLogger);
76
+ const strategy = StrategyFactory.createStrategy([strategyConfig], tokensByChainName, totalCollateral, testLogger);
77
77
  expect(strategy).to.be.instanceOf(MinAmountStrategy);
78
78
  });
79
79
  });
@@ -1 +1 @@
1
- {"version":3,"file":"StrategyFactory.test.js","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAiB,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EAEL,uBAAuB,EACvB,yBAAyB,GAG1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE7C,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC;IACxB,MAAM,MAAM,GAAG,QAAQ,CAAC;IACxB,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEtC,MAAM,iBAAiB,GAAoB,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG;QAChB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,aAAa,CAAC,KAAK;QAC7B,cAAc,EAAE,EAAE;KACnB,CAAC;IACF,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAE3E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACtE,MAAM,MAAM,GAA2B;gBACrC,CAAC,MAAM,CAAC,EAAE;oBACR,QAAQ,EAAE;wBACR,MAAM,EAAE,IAAI;wBACZ,SAAS,EAAE,EAAE;qBACd;oBACD,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW;oBACpC,cAAc,EAAE,CAAC;iBAClB;gBACD,CAAC,MAAM,CAAC,EAAE;oBACR,QAAQ,EAAE;wBACR,MAAM,EAAE,IAAI;wBACZ,SAAS,EAAE,EAAE;qBACd;oBACD,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW;oBACpC,cAAc,EAAE,CAAC;iBAClB;aACF,CAAC;YAEF,MAAM,cAAc,GAAmB;gBACrC,iBAAiB,EAAE,yBAAyB,CAAC,QAAQ;gBACrD,MAAM,EAAE,MAAM;aACf,CAAC;YAEF,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAC7C,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,UAAU,CACX,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,MAAM,GAA4B;gBACtC,CAAC,MAAM,CAAC,EAAE;oBACR,SAAS,EAAE;wBACT,GAAG,EAAE,CAAC;wBACN,MAAM,EAAE,EAAE;wBACV,IAAI,EAAE,uBAAuB,CAAC,QAAQ;qBACvC;oBACD,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW;oBACpC,cAAc,EAAE,CAAC;iBAClB;gBACD,CAAC,MAAM,CAAC,EAAE;oBACR,SAAS,EAAE;wBACT,GAAG,EAAE,CAAC;wBACN,MAAM,EAAE,EAAE;wBACV,IAAI,EAAE,uBAAuB,CAAC,QAAQ;qBACvC;oBACD,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW;oBACpC,cAAc,EAAE,CAAC;iBAClB;aACF,CAAC;YAEF,MAAM,cAAc,GAAmB;gBACrC,iBAAiB,EAAE,yBAAyB,CAAC,SAAS;gBACtD,MAAM,EAAE,MAAM;aACf,CAAC;YAEF,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAC7C,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,UAAU,CACX,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"StrategyFactory.test.js","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.test.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,30 @@
1
1
  import { type Logger } from 'pino';
2
- import type { WeightedStrategyConfig } from '../config/types.js';
3
- import type { RawBalances } from '../interfaces/IStrategy.js';
2
+ import type { ChainMap, Token } from '@hyperlane-xyz/sdk';
3
+ import { RebalancerStrategyOptions, type WeightedStrategyConfig } from '../config/types.js';
4
+ import type { RawBalances, Route, StrategyRoute } from '../interfaces/IStrategy.js';
4
5
  import { type Metrics } from '../metrics/Metrics.js';
6
+ import type { BridgeConfigWithOverride } from '../utils/bridgeUtils.js';
5
7
  import { BaseStrategy, type Delta } from './BaseStrategy.js';
6
8
  /**
7
9
  * Strategy implementation that rebalance based on weights
8
10
  * It distributes funds across chains based on their weights
9
11
  */
10
12
  export declare class WeightedStrategy extends BaseStrategy {
13
+ readonly name = RebalancerStrategyOptions.Weighted;
11
14
  private readonly config;
12
15
  private readonly totalWeight;
13
16
  protected readonly logger: Logger;
14
- constructor(config: WeightedStrategyConfig, logger: Logger, metrics?: Metrics);
17
+ constructor(config: WeightedStrategyConfig, logger: Logger, bridgeConfigs: ChainMap<BridgeConfigWithOverride>, metrics?: Metrics, tokensByChainName?: ChainMap<Token>);
15
18
  /**
16
19
  * Gets balances categorized by surplus and deficit based on weights
20
+ *
21
+ * Simulates both types of rebalances before calculating surpluses/deficits:
22
+ * - pendingRebalances: in-flight intents (origin tx confirmed, add to destination only)
23
+ * - proposedRebalances: routes from earlier strategies (subtract from origin AND add to destination)
24
+ *
25
+ * This prevents over-rebalancing when multiple strategies run in sequence.
17
26
  */
18
- protected getCategorizedBalances(rawBalances: RawBalances): {
27
+ protected getCategorizedBalances(rawBalances: RawBalances, pendingRebalances?: Route[], proposedRebalances?: StrategyRoute[]): {
19
28
  surpluses: Delta[];
20
29
  deficits: Delta[];
21
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"WeightedStrategy.d.ts","sourceRoot":"","sources":["../../src/strategy/WeightedStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE7D;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGhC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO;IAkCnB;;OAEG;IACH,SAAS,CAAC,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG;QAC1D,SAAS,EAAE,KAAK,EAAE,CAAC;QACnB,QAAQ,EAAE,KAAK,EAAE,CAAC;KACnB;CA+BF"}
1
+ {"version":3,"file":"WeightedStrategy.d.ts","sourceRoot":"","sources":["../../src/strategy/WeightedStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EACL,yBAAyB,EACzB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,WAAW,EACX,KAAK,EACL,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE7D;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,QAAQ,CAAC,IAAI,sCAAsC;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGhC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,QAAQ,CAAC,wBAAwB,CAAC,EACjD,OAAO,CAAC,EAAE,OAAO,EACjB,iBAAiB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAkCrC;;;;;;;;OAQG;IACH,SAAS,CAAC,sBAAsB,CAC9B,WAAW,EAAE,WAAW,EACxB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAC3B,kBAAkB,CAAC,EAAE,aAAa,EAAE,GACnC;QACD,SAAS,EAAE,KAAK,EAAE,CAAC;QACnB,QAAQ,EAAE,KAAK,EAAE,CAAC;KACnB;CA0CF"}
@@ -1,16 +1,18 @@
1
+ import { RebalancerStrategyOptions, } from '../config/types.js';
1
2
  import { BaseStrategy } from './BaseStrategy.js';
2
3
  /**
3
4
  * Strategy implementation that rebalance based on weights
4
5
  * It distributes funds across chains based on their weights
5
6
  */
6
7
  export class WeightedStrategy extends BaseStrategy {
8
+ name = RebalancerStrategyOptions.Weighted;
7
9
  config;
8
10
  totalWeight;
9
11
  logger;
10
- constructor(config, logger, metrics) {
12
+ constructor(config, logger, bridgeConfigs, metrics, tokensByChainName) {
11
13
  const chains = Object.keys(config);
12
14
  const log = logger.child({ class: WeightedStrategy.name });
13
- super(chains, log, metrics);
15
+ super(chains, log, bridgeConfigs, metrics, tokensByChainName);
14
16
  this.logger = log;
15
17
  let totalWeight = 0n;
16
18
  for (const chain of chains) {
@@ -32,15 +34,25 @@ export class WeightedStrategy extends BaseStrategy {
32
34
  }
33
35
  /**
34
36
  * Gets balances categorized by surplus and deficit based on weights
37
+ *
38
+ * Simulates both types of rebalances before calculating surpluses/deficits:
39
+ * - pendingRebalances: in-flight intents (origin tx confirmed, add to destination only)
40
+ * - proposedRebalances: routes from earlier strategies (subtract from origin AND add to destination)
41
+ *
42
+ * This prevents over-rebalancing when multiple strategies run in sequence.
35
43
  */
36
- getCategorizedBalances(rawBalances) {
37
- // Get the total balance from all chains
38
- const total = this.chains.reduce((sum, chain) => sum + rawBalances[chain], 0n);
44
+ getCategorizedBalances(rawBalances, pendingRebalances, proposedRebalances) {
45
+ // Step 1: Simulate pending rebalances (in-flight, origin already deducted on-chain)
46
+ let simulatedBalances = this.simulatePendingRebalances(rawBalances, pendingRebalances ?? []);
47
+ // Step 2: Simulate proposed rebalances (from earlier strategies, not yet executed)
48
+ simulatedBalances = this.simulateProposedRebalances(simulatedBalances, proposedRebalances ?? []);
49
+ // Get the total balance from all chains (using simulated balances)
50
+ const total = this.chains.reduce((sum, chain) => sum + simulatedBalances[chain], 0n);
39
51
  return this.chains.reduce((acc, chain) => {
40
52
  const { weight, tolerance } = this.config[chain].weighted;
41
53
  const target = (total * weight) / this.totalWeight;
42
54
  const toleranceAmount = (target * tolerance) / 100n;
43
- const balance = rawBalances[chain];
55
+ const balance = simulatedBalances[chain];
44
56
  // Apply the tolerance to deficits to prevent small imbalances
45
57
  if (balance < target - toleranceAmount) {
46
58
  acc.deficits.push({ chain, amount: target - balance });
@@ -1 +1 @@
1
- {"version":3,"file":"WeightedStrategy.js","sourceRoot":"","sources":["../../src/strategy/WeightedStrategy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAc,MAAM,mBAAmB,CAAC;AAE7D;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAC/B,MAAM,CAAyB;IAC/B,WAAW,CAAS;IAClB,MAAM,CAAS;IAElC,YACE,MAA8B,EAC9B,MAAc,EACd,OAAiB;QAEjB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAElB,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;YAErD,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,8BAA8B,KAAK,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,IAAI,SAAS,GAAG,EAAE,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;gBACvC,MAAM,IAAI,KAAK,CACb,cAAc,SAAS,mCAAmC,KAAK,EAAE,CAClE,CAAC;YACJ,CAAC;YAED,WAAW,IAAI,MAAM,CAAC;QACxB,CAAC;QAED,IAAI,WAAW,IAAI,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACO,sBAAsB,CAAC,WAAwB;QAIvD,wCAAwC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,EACxC,EAAE,CACH,CAAC;QAEF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CACvB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACb,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;YAC1D,MAAM,MAAM,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;YACnD,MAAM,eAAe,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;YACpD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAEnC,8DAA8D;YAC9D,IAAI,OAAO,GAAG,MAAM,GAAG,eAAe,EAAE,CAAC;gBACvC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;iBAAM,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;gBAC5B,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,iDAAiD;YACnD,CAAC;YAED,OAAO,GAAG,CAAC;QACb,CAAC,EACD;YACE,SAAS,EAAE,EAAa;YACxB,QAAQ,EAAE,EAAa;SACxB,CACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"WeightedStrategy.js","sourceRoot":"","sources":["../../src/strategy/WeightedStrategy.ts"],"names":[],"mappings":"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"}