@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
@@ -0,0 +1,65 @@
1
+ import { Logger } from 'pino';
2
+ import { type ChainMap, type Token } from '@hyperlane-xyz/sdk';
3
+ import { type CollateralDeficitStrategyConfig, RebalancerStrategyOptions } from '../config/types.js';
4
+ import type { InflightContext, RawBalances, Route, StrategyRoute } from '../interfaces/IStrategy.js';
5
+ import { Metrics } from '../metrics/Metrics.js';
6
+ import type { BridgeConfigWithOverride } from '../utils/bridgeUtils.js';
7
+ import { BaseStrategy, type Delta } from './BaseStrategy.js';
8
+ /**
9
+ * Strategy that detects collateral deficits (negative effective balances)
10
+ * and proposes JIT rebalances using fast bridges.
11
+ *
12
+ * Logic:
13
+ * 1. Filter pendingRebalances to only those using this strategy's configured bridges
14
+ * 2. Simulate filtered pending rebalances to get projected balances
15
+ * 3. Negative simulated balance = deficit (magnitude + buffer)
16
+ * 4. Positive simulated balance = potential surplus
17
+ */
18
+ export declare class CollateralDeficitStrategy extends BaseStrategy {
19
+ readonly name = RebalancerStrategyOptions.CollateralDeficit;
20
+ private readonly config;
21
+ protected readonly logger: Logger;
22
+ constructor(config: CollateralDeficitStrategyConfig, tokensByChainName: ChainMap<Token>, logger: Logger, bridgeConfigs: ChainMap<BridgeConfigWithOverride>, metrics?: Metrics);
23
+ /**
24
+ * Categorizes balances into surpluses and deficits.
25
+ *
26
+ * 1. Filter pendingRebalances/proposedRebalances by configured bridges
27
+ * 2. Simulate those rebalances to get projected balances
28
+ * 3. Negative balance = deficit (magnitude + buffer)
29
+ * 4. Positive balance = potential surplus
30
+ */
31
+ protected getCategorizedBalances(rawBalances: RawBalances, pendingRebalances?: Route[], proposedRebalances?: StrategyRoute[]): {
32
+ surpluses: Delta[];
33
+ deficits: Delta[];
34
+ };
35
+ /**
36
+ * Override to prefer transfer origins when selecting surplus chains.
37
+ *
38
+ * When a user transfer creates a deficit, the origin chain of that transfer
39
+ * is the natural source of funds (user deposited there). This prevents
40
+ * unnecessarily draining the largest balance (typically ethereum at 70%).
41
+ */
42
+ getRebalancingRoutes(rawBalances: RawBalances, inflightContext?: InflightContext): StrategyRoute[];
43
+ /**
44
+ * Filter pending rebalances to only those using this strategy's configured bridges.
45
+ * A rebalance matches if:
46
+ * - Its bridge matches the configured bridge (with overrides) for the route, OR
47
+ * - It has no bridge (recovered from Explorer, can't verify - include to be safe)
48
+ */
49
+ private filterByConfiguredBridges;
50
+ /**
51
+ * Build a map from deficit chains to their transfer origin chains.
52
+ * This identifies which surplus chains are "natural" sources for each deficit.
53
+ */
54
+ private buildTransferOriginMap;
55
+ /**
56
+ * Sort surpluses to prefer transfer origins over largest balances.
57
+ *
58
+ * Sorting priority:
59
+ * 1. Chains that are origins of transfers TO any deficit chain (preferred)
60
+ * 2. By amount descending (tiebreaker)
61
+ */
62
+ private sortSurplusesWithOriginPreference;
63
+ protected getTokenByChainName(chainName: string): Token;
64
+ }
65
+ //# sourceMappingURL=CollateralDeficitStrategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollateralDeficitStrategy.d.ts","sourceRoot":"","sources":["../../src/strategy/CollateralDeficitStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,KAAK,QAAQ,EAAkB,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG/E,OAAO,EACL,KAAK,+BAA+B,EACpC,yBAAyB,EAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,KAAK,EACL,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE7D;;;;;;;;;GASG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,QAAQ,CAAC,IAAI,+CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGhC,MAAM,EAAE,+BAA+B,EACvC,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,EAClC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,QAAQ,CAAC,wBAAwB,CAAC,EACjD,OAAO,CAAC,EAAE,OAAO;IAUnB;;;;;;;OAOG;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;IA4ED;;;;;;OAMG;IACM,oBAAoB,CAC3B,WAAW,EAAE,WAAW,EACxB,eAAe,CAAC,EAAE,eAAe,GAChC,aAAa,EAAE;IA0IlB;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAqBjC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmB9B;;;;;;OAMG;IACH,OAAO,CAAC,iCAAiC;IAoCzC,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK;CAOxD"}
@@ -0,0 +1,245 @@
1
+ import { toWei } from '@hyperlane-xyz/utils';
2
+ import { RebalancerStrategyOptions, } from '../config/types.js';
3
+ import { BaseStrategy } from './BaseStrategy.js';
4
+ /**
5
+ * Strategy that detects collateral deficits (negative effective balances)
6
+ * and proposes JIT rebalances using fast bridges.
7
+ *
8
+ * Logic:
9
+ * 1. Filter pendingRebalances to only those using this strategy's configured bridges
10
+ * 2. Simulate filtered pending rebalances to get projected balances
11
+ * 3. Negative simulated balance = deficit (magnitude + buffer)
12
+ * 4. Positive simulated balance = potential surplus
13
+ */
14
+ export class CollateralDeficitStrategy extends BaseStrategy {
15
+ name = RebalancerStrategyOptions.CollateralDeficit;
16
+ config;
17
+ logger;
18
+ constructor(config, tokensByChainName, logger, bridgeConfigs, metrics) {
19
+ const chains = Object.keys(config);
20
+ const log = logger.child({ class: CollateralDeficitStrategy.name });
21
+ super(chains, log, bridgeConfigs, metrics, tokensByChainName);
22
+ this.logger = log;
23
+ this.config = config;
24
+ this.logger.info('CollateralDeficitStrategy created');
25
+ }
26
+ /**
27
+ * Categorizes balances into surpluses and deficits.
28
+ *
29
+ * 1. Filter pendingRebalances/proposedRebalances by configured bridges
30
+ * 2. Simulate those rebalances to get projected balances
31
+ * 3. Negative balance = deficit (magnitude + buffer)
32
+ * 4. Positive balance = potential surplus
33
+ */
34
+ getCategorizedBalances(rawBalances, pendingRebalances, proposedRebalances) {
35
+ // Filter pending rebalances to only those using this strategy's bridges
36
+ const filteredPending = this.filterByConfiguredBridges(pendingRebalances);
37
+ const filteredProposed = this.filterByConfiguredBridges(proposedRebalances);
38
+ this.logger.debug({
39
+ context: this.constructor.name,
40
+ totalPending: pendingRebalances?.length ?? 0,
41
+ filteredPending: filteredPending.length,
42
+ totalProposed: proposedRebalances?.length ?? 0,
43
+ filteredProposed: filteredProposed.length,
44
+ }, 'Filtered rebalances by configured bridges');
45
+ // Step 1: Simulate pending rebalances (in-flight, origin already deducted on-chain)
46
+ let simulatedBalances = this.simulatePendingRebalances(rawBalances, filteredPending);
47
+ // Step 2: Simulate proposed rebalances (from earlier strategies, not yet executed)
48
+ simulatedBalances = this.simulateProposedRebalances(simulatedBalances, filteredProposed);
49
+ const surpluses = [];
50
+ const deficits = [];
51
+ for (const chain of this.chains) {
52
+ const balance = simulatedBalances[chain];
53
+ const token = this.getTokenByChainName(chain);
54
+ const bufferWei = BigInt(toWei(this.config[chain].buffer, token.decimals));
55
+ if (balance < 0n) {
56
+ // Negative balance indicates deficit
57
+ const deficitAmount = -balance + bufferWei;
58
+ deficits.push({ chain, amount: deficitAmount });
59
+ this.logger.debug({
60
+ context: this.constructor.name,
61
+ chain,
62
+ simulatedBalance: balance.toString(),
63
+ buffer: bufferWei.toString(),
64
+ deficitAmount: deficitAmount.toString(),
65
+ }, 'Detected collateral deficit');
66
+ }
67
+ else if (balance > 0n) {
68
+ // Positive balance is potential surplus
69
+ surpluses.push({ chain, amount: balance });
70
+ }
71
+ }
72
+ this.logger.info({
73
+ surpluses: surpluses.map((s) => ({
74
+ chain: s.chain,
75
+ amount: s.amount.toString(),
76
+ })),
77
+ deficits: deficits.map((d) => ({
78
+ chain: d.chain,
79
+ amount: d.amount.toString(),
80
+ })),
81
+ }, 'Balance categorization');
82
+ return { surpluses, deficits };
83
+ }
84
+ /**
85
+ * Override to prefer transfer origins when selecting surplus chains.
86
+ *
87
+ * When a user transfer creates a deficit, the origin chain of that transfer
88
+ * is the natural source of funds (user deposited there). This prevents
89
+ * unnecessarily draining the largest balance (typically ethereum at 70%).
90
+ */
91
+ getRebalancingRoutes(rawBalances, inflightContext) {
92
+ const pendingRebalances = inflightContext?.pendingRebalances ?? [];
93
+ const pendingTransfers = inflightContext?.pendingTransfers ?? [];
94
+ this.logger.info({
95
+ strategy: this.name,
96
+ balances: Object.entries(rawBalances).map(([c, b]) => ({
97
+ chain: c,
98
+ balance: b.toString(),
99
+ })),
100
+ pendingRebalances: pendingRebalances.length,
101
+ pendingTransfers: pendingTransfers.length,
102
+ }, 'Strategy evaluating');
103
+ this.validateRawBalances(rawBalances);
104
+ const actualBalances = rawBalances;
105
+ // Step 1: Reserve collateral for pending user transfers
106
+ const effectiveBalances = this.reserveCollateral(rawBalances, pendingTransfers);
107
+ // Step 2: Get categorized balances
108
+ const { surpluses, deficits } = this.getCategorizedBalances(effectiveBalances, pendingRebalances);
109
+ this.logger.debug({ context: this.constructor.name, surpluses }, 'Surpluses calculated');
110
+ this.logger.debug({ context: this.constructor.name, deficits }, 'Deficits calculated');
111
+ const totalSurplus = surpluses.reduce((sum, s) => sum + s.amount, 0n);
112
+ const totalDeficit = deficits.reduce((sum, d) => sum + d.amount, 0n);
113
+ this.logger.debug({ context: this.constructor.name, totalSurplus: totalSurplus.toString() }, 'Total surplus calculated');
114
+ this.logger.debug({ context: this.constructor.name, totalDeficit: totalDeficit.toString() }, 'Total deficit calculated');
115
+ // Scale deficits if needed
116
+ if (totalSurplus < totalDeficit) {
117
+ this.logger.warn({
118
+ context: this.constructor.name,
119
+ totalSurplus: totalSurplus.toString(),
120
+ totalDeficit: totalDeficit.toString(),
121
+ }, 'Deficits are greater than surpluses. Scaling deficits');
122
+ this.metrics?.recordRebalancerFailure();
123
+ for (const deficit of deficits) {
124
+ deficit.amount = (deficit.amount * totalSurplus) / totalDeficit;
125
+ }
126
+ this.logger.debug({ context: this.constructor.name, deficits }, 'Scaled deficits');
127
+ }
128
+ // Build transfer origin map for deficit chains
129
+ const deficitChains = new Set(deficits.map((d) => d.chain));
130
+ const transferOriginMap = this.buildTransferOriginMap(pendingTransfers, deficitChains);
131
+ // Sort surpluses with transfer origin preference (KEY CHANGE from base class)
132
+ this.sortSurplusesWithOriginPreference(surpluses, transferOriginMap);
133
+ // Sort deficits by amount (largest first)
134
+ deficits.sort((a, b) => (a.amount > b.amount ? -1 : 1));
135
+ const routes = [];
136
+ // Match surpluses to deficits
137
+ while (deficits.length > 0 && surpluses.length > 0) {
138
+ const surplus = surpluses[0];
139
+ const deficit = deficits[0];
140
+ const transferAmount = surplus.amount > deficit.amount ? deficit.amount : surplus.amount;
141
+ if (transferAmount > 0n) {
142
+ const bridgeConfig = this.getBridgeConfigForRoute(surplus.chain, deficit.chain);
143
+ routes.push({
144
+ origin: surplus.chain,
145
+ destination: deficit.chain,
146
+ amount: transferAmount,
147
+ bridge: bridgeConfig.bridge,
148
+ });
149
+ }
150
+ deficit.amount -= transferAmount;
151
+ surplus.amount -= transferAmount;
152
+ if (deficit.amount <= 0n)
153
+ deficits.shift();
154
+ if (surplus.amount <= 0n)
155
+ surpluses.shift();
156
+ }
157
+ this.logger.debug({ context: this.constructor.name, routes }, 'Generated routes');
158
+ this.logger.info({ context: this.constructor.name, numberOfRoutes: routes.length }, 'Found rebalancing routes');
159
+ const filteredRoutes = this.filterRoutes(routes, actualBalances);
160
+ this.logger.debug({
161
+ context: this.constructor.name,
162
+ filteredRoutesCount: filteredRoutes.length,
163
+ droppedCount: routes.length - filteredRoutes.length,
164
+ }, 'Filtered rebalancing routes');
165
+ return filteredRoutes;
166
+ }
167
+ /**
168
+ * Filter pending rebalances to only those using this strategy's configured bridges.
169
+ * A rebalance matches if:
170
+ * - Its bridge matches the configured bridge (with overrides) for the route, OR
171
+ * - It has no bridge (recovered from Explorer, can't verify - include to be safe)
172
+ */
173
+ filterByConfiguredBridges(pendingRebalances) {
174
+ if (!pendingRebalances || pendingRebalances.length === 0) {
175
+ return [];
176
+ }
177
+ return pendingRebalances.filter((rebalance) => {
178
+ if (!('bridge' in rebalance) || !rebalance.bridge) {
179
+ this.logger.debug({ origin: rebalance.origin, destination: rebalance.destination }, 'Including pending rebalance without bridge (recovered intent)');
180
+ return true;
181
+ }
182
+ const bridgeConfig = this.getBridgeConfigForRoute(rebalance.origin, rebalance.destination);
183
+ return bridgeConfig?.bridge === rebalance.bridge;
184
+ });
185
+ }
186
+ /**
187
+ * Build a map from deficit chains to their transfer origin chains.
188
+ * This identifies which surplus chains are "natural" sources for each deficit.
189
+ */
190
+ buildTransferOriginMap(pendingTransfers, deficitChains) {
191
+ const originMap = new Map();
192
+ for (const transfer of pendingTransfers) {
193
+ // Only track transfers TO deficit chains
194
+ if (deficitChains.has(transfer.destination)) {
195
+ if (!originMap.has(transfer.destination)) {
196
+ originMap.set(transfer.destination, new Set());
197
+ }
198
+ originMap.get(transfer.destination).add(transfer.origin);
199
+ }
200
+ }
201
+ return originMap;
202
+ }
203
+ /**
204
+ * Sort surpluses to prefer transfer origins over largest balances.
205
+ *
206
+ * Sorting priority:
207
+ * 1. Chains that are origins of transfers TO any deficit chain (preferred)
208
+ * 2. By amount descending (tiebreaker)
209
+ */
210
+ sortSurplusesWithOriginPreference(surpluses, transferOriginMap) {
211
+ // Collect all origin chains across all deficits
212
+ const allOriginChains = new Set();
213
+ for (const origins of transferOriginMap.values()) {
214
+ for (const origin of origins) {
215
+ allOriginChains.add(origin);
216
+ }
217
+ }
218
+ surpluses.sort((a, b) => {
219
+ const aIsOrigin = allOriginChains.has(a.chain);
220
+ const bIsOrigin = allOriginChains.has(b.chain);
221
+ // Prefer transfer origins
222
+ if (aIsOrigin && !bIsOrigin)
223
+ return -1;
224
+ if (!aIsOrigin && bIsOrigin)
225
+ return 1;
226
+ // Tiebreaker: larger amount first
227
+ return a.amount > b.amount ? -1 : 1;
228
+ });
229
+ if (allOriginChains.size > 0) {
230
+ this.logger.debug({
231
+ context: this.constructor.name,
232
+ preferredOrigins: Array.from(allOriginChains),
233
+ sortedSurpluses: surpluses.map((s) => s.chain),
234
+ }, 'Sorted surpluses with transfer origin preference');
235
+ }
236
+ }
237
+ getTokenByChainName(chainName) {
238
+ const token = this.tokensByChainName[chainName];
239
+ if (token === undefined) {
240
+ throw new Error(`Token not found for chain ${chainName}`);
241
+ }
242
+ return token;
243
+ }
244
+ }
245
+ //# sourceMappingURL=CollateralDeficitStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollateralDeficitStrategy.js","sourceRoot":"","sources":["../../src/strategy/CollateralDeficitStrategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CollateralDeficitStrategy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollateralDeficitStrategy.test.d.ts","sourceRoot":"","sources":["../../src/strategy/CollateralDeficitStrategy.test.ts"],"names":[],"mappings":""}