@hyperlane-xyz/rebalancer 0.1.0-beta.5a8bd28ab

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 (202) hide show
  1. package/README.md +178 -0
  2. package/dist/config/RebalancerConfig.d.ts +12 -0
  3. package/dist/config/RebalancerConfig.d.ts.map +1 -0
  4. package/dist/config/RebalancerConfig.js +29 -0
  5. package/dist/config/RebalancerConfig.js.map +1 -0
  6. package/dist/config/RebalancerConfig.test.d.ts +2 -0
  7. package/dist/config/RebalancerConfig.test.d.ts.map +1 -0
  8. package/dist/config/RebalancerConfig.test.js +325 -0
  9. package/dist/config/RebalancerConfig.test.js.map +1 -0
  10. package/dist/core/Rebalancer.d.ts +23 -0
  11. package/dist/core/Rebalancer.d.ts.map +1 -0
  12. package/dist/core/Rebalancer.js +290 -0
  13. package/dist/core/Rebalancer.js.map +1 -0
  14. package/dist/core/RebalancerService.d.ts +115 -0
  15. package/dist/core/RebalancerService.d.ts.map +1 -0
  16. package/dist/core/RebalancerService.js +227 -0
  17. package/dist/core/RebalancerService.js.map +1 -0
  18. package/dist/core/WithInflightGuard.d.ts +20 -0
  19. package/dist/core/WithInflightGuard.d.ts.map +1 -0
  20. package/dist/core/WithInflightGuard.js +47 -0
  21. package/dist/core/WithInflightGuard.js.map +1 -0
  22. package/dist/core/WithInflightGuard.test.d.ts +2 -0
  23. package/dist/core/WithInflightGuard.test.d.ts.map +1 -0
  24. package/dist/core/WithInflightGuard.test.js +64 -0
  25. package/dist/core/WithInflightGuard.test.js.map +1 -0
  26. package/dist/core/WithSemaphore.d.ts +22 -0
  27. package/dist/core/WithSemaphore.d.ts.map +1 -0
  28. package/dist/core/WithSemaphore.js +67 -0
  29. package/dist/core/WithSemaphore.js.map +1 -0
  30. package/dist/core/WithSemaphore.test.d.ts +2 -0
  31. package/dist/core/WithSemaphore.test.d.ts.map +1 -0
  32. package/dist/core/WithSemaphore.test.js +83 -0
  33. package/dist/core/WithSemaphore.test.js.map +1 -0
  34. package/dist/factories/RebalancerContextFactory.d.ts +41 -0
  35. package/dist/factories/RebalancerContextFactory.d.ts.map +1 -0
  36. package/dist/factories/RebalancerContextFactory.js +115 -0
  37. package/dist/factories/RebalancerContextFactory.js.map +1 -0
  38. package/dist/index.d.ts +33 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +35 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/interfaces/IMetrics.d.ts +5 -0
  43. package/dist/interfaces/IMetrics.d.ts.map +1 -0
  44. package/dist/interfaces/IMetrics.js +2 -0
  45. package/dist/interfaces/IMetrics.js.map +1 -0
  46. package/dist/interfaces/IMonitor.d.ts +51 -0
  47. package/dist/interfaces/IMonitor.d.ts.map +1 -0
  48. package/dist/interfaces/IMonitor.js +14 -0
  49. package/dist/interfaces/IMonitor.js.map +1 -0
  50. package/dist/interfaces/IRebalancer.d.ts +15 -0
  51. package/dist/interfaces/IRebalancer.d.ts.map +1 -0
  52. package/dist/interfaces/IRebalancer.js +2 -0
  53. package/dist/interfaces/IRebalancer.js.map +1 -0
  54. package/dist/interfaces/IStrategy.d.ts +11 -0
  55. package/dist/interfaces/IStrategy.d.ts.map +1 -0
  56. package/dist/interfaces/IStrategy.js +2 -0
  57. package/dist/interfaces/IStrategy.js.map +1 -0
  58. package/dist/metrics/Metrics.d.ts +31 -0
  59. package/dist/metrics/Metrics.d.ts.map +1 -0
  60. package/dist/metrics/Metrics.js +302 -0
  61. package/dist/metrics/Metrics.js.map +1 -0
  62. package/dist/metrics/PriceGetter.d.ts +10 -0
  63. package/dist/metrics/PriceGetter.d.ts.map +1 -0
  64. package/dist/metrics/PriceGetter.js +41 -0
  65. package/dist/metrics/PriceGetter.js.map +1 -0
  66. package/dist/metrics/scripts/metrics.d.ts +14 -0
  67. package/dist/metrics/scripts/metrics.d.ts.map +1 -0
  68. package/dist/metrics/scripts/metrics.js +198 -0
  69. package/dist/metrics/scripts/metrics.js.map +1 -0
  70. package/dist/metrics/types.d.ts +24 -0
  71. package/dist/metrics/types.d.ts.map +1 -0
  72. package/dist/metrics/types.js +2 -0
  73. package/dist/metrics/types.js.map +1 -0
  74. package/dist/metrics/utils/metrics.d.ts +12 -0
  75. package/dist/metrics/utils/metrics.d.ts.map +1 -0
  76. package/dist/metrics/utils/metrics.js +28 -0
  77. package/dist/metrics/utils/metrics.js.map +1 -0
  78. package/dist/monitor/Monitor.d.ts +26 -0
  79. package/dist/monitor/Monitor.d.ts.map +1 -0
  80. package/dist/monitor/Monitor.js +116 -0
  81. package/dist/monitor/Monitor.js.map +1 -0
  82. package/dist/service.d.ts +3 -0
  83. package/dist/service.d.ts.map +1 -0
  84. package/dist/service.js +125 -0
  85. package/dist/service.js.map +1 -0
  86. package/dist/strategy/BaseStrategy.d.ts +34 -0
  87. package/dist/strategy/BaseStrategy.d.ts.map +1 -0
  88. package/dist/strategy/BaseStrategy.js +127 -0
  89. package/dist/strategy/BaseStrategy.js.map +1 -0
  90. package/dist/strategy/MinAmountStrategy.d.ts +27 -0
  91. package/dist/strategy/MinAmountStrategy.d.ts.map +1 -0
  92. package/dist/strategy/MinAmountStrategy.js +103 -0
  93. package/dist/strategy/MinAmountStrategy.js.map +1 -0
  94. package/dist/strategy/MinAmountStrategy.test.d.ts +2 -0
  95. package/dist/strategy/MinAmountStrategy.test.d.ts.map +1 -0
  96. package/dist/strategy/MinAmountStrategy.test.js +472 -0
  97. package/dist/strategy/MinAmountStrategy.test.js.map +1 -0
  98. package/dist/strategy/StrategyFactory.d.ts +16 -0
  99. package/dist/strategy/StrategyFactory.d.ts.map +1 -0
  100. package/dist/strategy/StrategyFactory.js +25 -0
  101. package/dist/strategy/StrategyFactory.js.map +1 -0
  102. package/dist/strategy/StrategyFactory.test.d.ts +2 -0
  103. package/dist/strategy/StrategyFactory.test.d.ts.map +1 -0
  104. package/dist/strategy/StrategyFactory.test.js +80 -0
  105. package/dist/strategy/StrategyFactory.test.js.map +1 -0
  106. package/dist/strategy/WeightedStrategy.d.ts +23 -0
  107. package/dist/strategy/WeightedStrategy.d.ts.map +1 -0
  108. package/dist/strategy/WeightedStrategy.js +61 -0
  109. package/dist/strategy/WeightedStrategy.js.map +1 -0
  110. package/dist/strategy/WeightedStrategy.test.d.ts +2 -0
  111. package/dist/strategy/WeightedStrategy.test.d.ts.map +1 -0
  112. package/dist/strategy/WeightedStrategy.test.js +307 -0
  113. package/dist/strategy/WeightedStrategy.test.js.map +1 -0
  114. package/dist/strategy/index.d.ts +5 -0
  115. package/dist/strategy/index.d.ts.map +1 -0
  116. package/dist/strategy/index.js +5 -0
  117. package/dist/strategy/index.js.map +1 -0
  118. package/dist/test/helpers.d.ts +8 -0
  119. package/dist/test/helpers.d.ts.map +1 -0
  120. package/dist/test/helpers.js +33 -0
  121. package/dist/test/helpers.js.map +1 -0
  122. package/dist/utils/ExplorerClient.d.ts +14 -0
  123. package/dist/utils/ExplorerClient.d.ts.map +1 -0
  124. package/dist/utils/ExplorerClient.js +82 -0
  125. package/dist/utils/ExplorerClient.js.map +1 -0
  126. package/dist/utils/balanceUtils.d.ts +13 -0
  127. package/dist/utils/balanceUtils.d.ts.map +1 -0
  128. package/dist/utils/balanceUtils.js +43 -0
  129. package/dist/utils/balanceUtils.js.map +1 -0
  130. package/dist/utils/balanceUtils.test.d.ts +2 -0
  131. package/dist/utils/balanceUtils.test.d.ts.map +1 -0
  132. package/dist/utils/balanceUtils.test.js +54 -0
  133. package/dist/utils/balanceUtils.test.js.map +1 -0
  134. package/dist/utils/bridgeUtils.d.ts +19 -0
  135. package/dist/utils/bridgeUtils.d.ts.map +1 -0
  136. package/dist/utils/bridgeUtils.js +20 -0
  137. package/dist/utils/bridgeUtils.js.map +1 -0
  138. package/dist/utils/bridgeUtils.test.d.ts +2 -0
  139. package/dist/utils/bridgeUtils.test.d.ts.map +1 -0
  140. package/dist/utils/bridgeUtils.test.js +77 -0
  141. package/dist/utils/bridgeUtils.test.js.map +1 -0
  142. package/dist/utils/errors.d.ts +4 -0
  143. package/dist/utils/errors.d.ts.map +1 -0
  144. package/dist/utils/errors.js +6 -0
  145. package/dist/utils/errors.js.map +1 -0
  146. package/dist/utils/files.d.ts +35 -0
  147. package/dist/utils/files.d.ts.map +1 -0
  148. package/dist/utils/files.js +190 -0
  149. package/dist/utils/files.js.map +1 -0
  150. package/dist/utils/generalUtils.d.ts +3 -0
  151. package/dist/utils/generalUtils.d.ts.map +1 -0
  152. package/dist/utils/generalUtils.js +9 -0
  153. package/dist/utils/generalUtils.js.map +1 -0
  154. package/dist/utils/index.d.ts +5 -0
  155. package/dist/utils/index.d.ts.map +1 -0
  156. package/dist/utils/index.js +5 -0
  157. package/dist/utils/index.js.map +1 -0
  158. package/dist/utils/tokenUtils.d.ts +14 -0
  159. package/dist/utils/tokenUtils.d.ts.map +1 -0
  160. package/dist/utils/tokenUtils.js +21 -0
  161. package/dist/utils/tokenUtils.js.map +1 -0
  162. package/package.json +70 -0
  163. package/src/config/RebalancerConfig.test.ts +388 -0
  164. package/src/config/RebalancerConfig.ts +39 -0
  165. package/src/core/Rebalancer.ts +471 -0
  166. package/src/core/RebalancerService.ts +333 -0
  167. package/src/core/WithInflightGuard.test.ts +131 -0
  168. package/src/core/WithInflightGuard.ts +67 -0
  169. package/src/core/WithSemaphore.test.ts +112 -0
  170. package/src/core/WithSemaphore.ts +92 -0
  171. package/src/factories/RebalancerContextFactory.ts +210 -0
  172. package/src/index.ts +68 -0
  173. package/src/interfaces/IMetrics.ts +5 -0
  174. package/src/interfaces/IMonitor.ts +63 -0
  175. package/src/interfaces/IRebalancer.ts +20 -0
  176. package/src/interfaces/IStrategy.ts +13 -0
  177. package/src/metrics/Metrics.ts +558 -0
  178. package/src/metrics/PriceGetter.ts +74 -0
  179. package/src/metrics/scripts/metrics.ts +298 -0
  180. package/src/metrics/types.ts +27 -0
  181. package/src/metrics/utils/metrics.ts +33 -0
  182. package/src/monitor/Monitor.ts +174 -0
  183. package/src/service.ts +154 -0
  184. package/src/strategy/BaseStrategy.ts +210 -0
  185. package/src/strategy/MinAmountStrategy.test.ts +625 -0
  186. package/src/strategy/MinAmountStrategy.ts +170 -0
  187. package/src/strategy/StrategyFactory.test.ts +109 -0
  188. package/src/strategy/StrategyFactory.ts +48 -0
  189. package/src/strategy/WeightedStrategy.test.ts +408 -0
  190. package/src/strategy/WeightedStrategy.ts +93 -0
  191. package/src/strategy/index.ts +4 -0
  192. package/src/test/helpers.ts +46 -0
  193. package/src/utils/ExplorerClient.ts +99 -0
  194. package/src/utils/balanceUtils.test.ts +74 -0
  195. package/src/utils/balanceUtils.ts +69 -0
  196. package/src/utils/bridgeUtils.test.ts +92 -0
  197. package/src/utils/bridgeUtils.ts +42 -0
  198. package/src/utils/errors.ts +5 -0
  199. package/src/utils/files.ts +276 -0
  200. package/src/utils/generalUtils.ts +13 -0
  201. package/src/utils/index.ts +4 -0
  202. package/src/utils/tokenUtils.ts +26 -0
package/README.md ADDED
@@ -0,0 +1,178 @@
1
+ # @hyperlane-xyz/rebalancer
2
+
3
+ Hyperlane Warp Route Collateral Rebalancer Service - maintains optimal collateral distribution across chains for Hyperlane warp routes.
4
+
5
+ ## Overview
6
+
7
+ The rebalancer monitors collateral balances across warp route deployments and automatically transfers tokens between chains to maintain configured target balances. It supports both manual one-off rebalances and continuous daemon mode for production deployments.
8
+
9
+ ## Features
10
+
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
14
+ - **Observability**: Built-in Prometheus metrics and structured logging
15
+ - **Dual Mode**: Manual CLI execution or continuous daemon service
16
+ - **Bridge Support**: Integration with Portal, Hyperlane, and other bridge providers
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ # From monorepo root
22
+ yarn install
23
+
24
+ # Build the package
25
+ yarn workspace @hyperlane-xyz/rebalancer build
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ ### Manual Rebalancing (CLI)
31
+
32
+ Execute a one-off rebalance using the CLI:
33
+
34
+ ```bash
35
+ # Via CLI package
36
+ yarn workspace @hyperlane-xyz/cli hyperlane warp rebalancer \
37
+ --config /path/to/rebalancer-config.yaml \
38
+ --manual \
39
+ --origin ethereum \
40
+ --destination arbitrum \
41
+ --amount 1000
42
+ ```
43
+
44
+ ### Daemon Mode (Service)
45
+
46
+ Run as a continuous service (typically in K8s):
47
+
48
+ ```bash
49
+ # Set environment variables
50
+ export REBALANCER_CONFIG_FILE=/path/to/rebalancer-config.yaml
51
+ export HYP_KEY=your_private_key
52
+ export COINGECKO_API_KEY=your_api_key
53
+
54
+ # Start the service
55
+ yarn workspace @hyperlane-xyz/rebalancer start
56
+
57
+ # Or with direct node
58
+ node dist/service.js
59
+ ```
60
+
61
+ ### Programmatic Usage
62
+
63
+ ```typescript
64
+ import { RebalancerService } from '@hyperlane-xyz/rebalancer';
65
+
66
+ const service = new RebalancerService(
67
+ multiProvider,
68
+ multiProtocolProvider,
69
+ registry,
70
+ rebalancerConfig,
71
+ {
72
+ mode: 'daemon',
73
+ checkFrequency: 60_000,
74
+ withMetrics: true,
75
+ coingeckoApiKey: process.env.COINGECKO_API_KEY,
76
+ logger: console,
77
+ },
78
+ );
79
+
80
+ // Start daemon
81
+ await service.start();
82
+
83
+ // Or execute manual rebalance
84
+ await service.executeManual({
85
+ origin: 'ethereum',
86
+ destination: 'arbitrum',
87
+ amount: '1000',
88
+ });
89
+ ```
90
+
91
+ ## Configuration
92
+
93
+ The rebalancer uses a YAML configuration file. See example:
94
+
95
+ ```yaml
96
+ warpRouteId: ETH/ethereum-arbitrum-optimism
97
+ strategy:
98
+ rebalanceStrategy: weighted
99
+ chains:
100
+ ethereum:
101
+ weight: 60
102
+ bridge: hyperlane
103
+ arbitrum:
104
+ weight: 20
105
+ bridge: hyperlane
106
+ optimism:
107
+ weight: 20
108
+ bridge: portal
109
+ ```
110
+
111
+ ## Architecture
112
+
113
+ ### Package Structure
114
+
115
+ ```
116
+ typescript/rebalancer/
117
+ ├── src/
118
+ │ ├── core/
119
+ │ │ ├── RebalancerService.ts # Main orchestrator
120
+ │ │ ├── Rebalancer.ts # Core rebalancing logic
121
+ │ │ ├── WithInflightGuard.ts # Concurrency protection
122
+ │ │ └── WithSemaphore.ts # Semaphore wrapper
123
+ │ ├── strategy/
124
+ │ │ ├── WeightedStrategy.ts # Weighted distribution
125
+ │ │ └── MinAmountStrategy.ts # Minimum threshold strategy
126
+ │ ├── monitor/
127
+ │ │ └── Monitor.ts # Balance monitoring
128
+ │ ├── metrics/
129
+ │ │ └── Metrics.ts # Prometheus metrics collection
130
+ │ ├── config/
131
+ │ │ └── RebalancerConfig.ts # Config loading/validation
132
+ │ ├── utils/
133
+ │ ├── interfaces/
134
+ │ ├── service.ts # Service entry point
135
+ │ └── index.ts # Public API
136
+ ```
137
+
138
+ ### Dependencies
139
+
140
+ - `@hyperlane-xyz/sdk`: Core SDK with MultiProvider and WarpCore
141
+ - `@hyperlane-xyz/provider-sdk`: Protocol-agnostic provider abstractions
142
+ - `@hyperlane-xyz/utils`: Shared utilities and types
143
+ - `prom-client`: Prometheus metrics
144
+ - `pino`: Structured logging
145
+
146
+ ## Development
147
+
148
+ ### Running Tests
149
+
150
+ ```bash
151
+ yarn workspace @hyperlane-xyz/rebalancer test
152
+ ```
153
+
154
+ ### Local Development
155
+
156
+ ```bash
157
+ # Watch mode
158
+ yarn workspace @hyperlane-xyz/rebalancer dev
159
+
160
+ # Start with test config
161
+ HYP_KEY=your_test_key \
162
+ REBALANCER_CONFIG_FILE=./test-config.yaml \
163
+ yarn workspace @hyperlane-xyz/rebalancer start:dev
164
+ ```
165
+
166
+ ## Migration from CLI
167
+
168
+ This package replaces the rebalancer functionality previously embedded in `@hyperlane-xyz/cli`. Key changes:
169
+
170
+ 1. **Dedicated Package**: Now a standalone service package
171
+ 2. **Direct Entry Point**: K8s deployments use `service.ts` directly (no CLI wrapper)
172
+ 3. **Metrics Included**: Prometheus metrics stay with the service
173
+ 4. **Protocol-Agnostic**: Aligned with multi-VM architecture
174
+ 5. **Dual Mode Support**: Single codebase for both manual and daemon modes
175
+
176
+ ## License
177
+
178
+ Apache-2.0
@@ -0,0 +1,12 @@
1
+ import { type StrategyConfig } from '@hyperlane-xyz/sdk';
2
+ export declare class RebalancerConfig {
3
+ readonly warpRouteId: string;
4
+ readonly strategyConfig: StrategyConfig;
5
+ constructor(warpRouteId: string, strategyConfig: StrategyConfig);
6
+ /**
7
+ * Loads config from a file
8
+ * @param configFilePath Path to the config file
9
+ */
10
+ static load(configFilePath: string): RebalancerConfig;
11
+ }
12
+ //# sourceMappingURL=RebalancerConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RebalancerConfig.d.ts","sourceRoot":"","sources":["../../src/config/RebalancerConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAK5B,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"}
@@ -0,0 +1,29 @@
1
+ import { fromZodError } from 'zod-validation-error';
2
+ import { RebalancerConfigSchema, } from '@hyperlane-xyz/sdk';
3
+ import { isObjEmpty } from '@hyperlane-xyz/utils';
4
+ import { readYamlOrJson } from '../utils/files.js';
5
+ export class RebalancerConfig {
6
+ warpRouteId;
7
+ strategyConfig;
8
+ constructor(warpRouteId, strategyConfig) {
9
+ this.warpRouteId = warpRouteId;
10
+ this.strategyConfig = strategyConfig;
11
+ }
12
+ /**
13
+ * Loads config from a file
14
+ * @param configFilePath Path to the config file
15
+ */
16
+ static load(configFilePath) {
17
+ const config = readYamlOrJson(configFilePath);
18
+ const validationResult = RebalancerConfigSchema.safeParse(config);
19
+ if (!validationResult.success) {
20
+ throw new Error(fromZodError(validationResult.error).message);
21
+ }
22
+ const { warpRouteId, strategy } = validationResult.data;
23
+ if (isObjEmpty(strategy.chains)) {
24
+ throw new Error('No chains configured');
25
+ }
26
+ return new RebalancerConfig(warpRouteId, strategy);
27
+ }
28
+ }
29
+ //# sourceMappingURL=RebalancerConfig.js.map
@@ -0,0 +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,EAEL,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RebalancerConfig.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RebalancerConfig.test.d.ts","sourceRoot":"","sources":["../../src/config/RebalancerConfig.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,325 @@
1
+ import { expect } from 'chai';
2
+ import { ethers } from 'ethers';
3
+ import { rmSync } from 'fs';
4
+ import { tmpdir } from 'os';
5
+ import { join } from 'path';
6
+ import { RebalancerMinAmountType, RebalancerStrategyOptions, } from '@hyperlane-xyz/sdk';
7
+ import { writeYamlOrJson } from '../utils/files.js';
8
+ import { RebalancerConfig } from './RebalancerConfig.js';
9
+ const TEST_CONFIG_PATH = join(tmpdir(), 'rebalancer-config-test.yaml');
10
+ describe('RebalancerConfig', () => {
11
+ let data;
12
+ beforeEach(() => {
13
+ data = {
14
+ warpRouteId: 'warpRouteId',
15
+ strategy: {
16
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
17
+ chains: {
18
+ chain1: {
19
+ weighted: {
20
+ weight: 100,
21
+ tolerance: 0,
22
+ },
23
+ bridge: ethers.constants.AddressZero,
24
+ bridgeLockTime: 1,
25
+ },
26
+ chain2: {
27
+ weighted: {
28
+ weight: 100,
29
+ tolerance: 0,
30
+ },
31
+ bridge: ethers.constants.AddressZero,
32
+ bridgeLockTime: 1,
33
+ },
34
+ },
35
+ },
36
+ };
37
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
38
+ });
39
+ afterEach(() => {
40
+ rmSync(TEST_CONFIG_PATH, { force: true });
41
+ });
42
+ it('should throw when the config file does not exist', () => {
43
+ rmSync(TEST_CONFIG_PATH, { force: true });
44
+ expect(() => RebalancerConfig.load(TEST_CONFIG_PATH)).to.throw(`File doesn't exist at ${TEST_CONFIG_PATH}`);
45
+ });
46
+ it('should load config from file', () => {
47
+ expect(RebalancerConfig.load(TEST_CONFIG_PATH)).to.deep.equal({
48
+ warpRouteId: 'warpRouteId',
49
+ strategyConfig: {
50
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
51
+ chains: {
52
+ chain1: {
53
+ weighted: {
54
+ weight: 100n,
55
+ tolerance: 0n,
56
+ },
57
+ bridge: ethers.constants.AddressZero,
58
+ bridgeLockTime: 1000,
59
+ },
60
+ chain2: {
61
+ weighted: {
62
+ weight: 100n,
63
+ tolerance: 0n,
64
+ },
65
+ bridge: ethers.constants.AddressZero,
66
+ bridgeLockTime: 1000,
67
+ },
68
+ },
69
+ },
70
+ });
71
+ });
72
+ it('should throw if chains are not configured', () => {
73
+ data.strategy.chains = {};
74
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
75
+ expect(() => RebalancerConfig.load(TEST_CONFIG_PATH)).to.throw('No chains configured');
76
+ });
77
+ it('should throw if no warp route id is configured', () => {
78
+ // @ts-ignore
79
+ delete data.warpRouteId;
80
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
81
+ expect(() => RebalancerConfig.load(TEST_CONFIG_PATH)).to.throw('Validation error: Required at "warpRouteId"');
82
+ });
83
+ it('should load relative params without modifications', () => {
84
+ data = {
85
+ warpRouteId: 'warpRouteId',
86
+ strategy: {
87
+ rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
88
+ chains: {
89
+ chain1: {
90
+ minAmount: {
91
+ min: '0.2',
92
+ target: 0.3,
93
+ type: RebalancerMinAmountType.Relative,
94
+ },
95
+ bridge: ethers.constants.AddressZero,
96
+ bridgeLockTime: 1,
97
+ },
98
+ chain2: {
99
+ minAmount: {
100
+ min: '0.2',
101
+ target: 0.3,
102
+ type: RebalancerMinAmountType.Relative,
103
+ },
104
+ bridge: ethers.constants.AddressZero,
105
+ bridgeLockTime: 1,
106
+ },
107
+ },
108
+ },
109
+ };
110
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
111
+ expect(RebalancerConfig.load(TEST_CONFIG_PATH).strategyConfig.chains.chain1).to.deep.equal({
112
+ ...data.strategy.chains.chain1,
113
+ bridgeLockTime: 1000,
114
+ });
115
+ });
116
+ it('should load absolute params without modifications', () => {
117
+ data = {
118
+ warpRouteId: 'warpRouteId',
119
+ strategy: {
120
+ rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
121
+ chains: {
122
+ chain1: {
123
+ minAmount: {
124
+ min: '100000',
125
+ target: 140000,
126
+ type: RebalancerMinAmountType.Absolute,
127
+ },
128
+ bridge: ethers.constants.AddressZero,
129
+ bridgeLockTime: 1,
130
+ },
131
+ chain2: {
132
+ minAmount: {
133
+ min: '100000',
134
+ target: 140000,
135
+ type: RebalancerMinAmountType.Absolute,
136
+ },
137
+ bridge: ethers.constants.AddressZero,
138
+ bridgeLockTime: 1,
139
+ },
140
+ },
141
+ },
142
+ };
143
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
144
+ expect(RebalancerConfig.load(TEST_CONFIG_PATH).strategyConfig.chains.chain1).to.deep.equal({
145
+ ...data.strategy.chains.chain1,
146
+ bridgeLockTime: 1000,
147
+ });
148
+ });
149
+ describe('override functionality', () => {
150
+ it('should parse a config with overrides', () => {
151
+ data = {
152
+ warpRouteId: 'warpRouteId',
153
+ strategy: {
154
+ rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
155
+ chains: {
156
+ chain1: {
157
+ minAmount: {
158
+ min: 1000,
159
+ target: 1100,
160
+ type: RebalancerMinAmountType.Absolute,
161
+ },
162
+ bridge: ethers.constants.AddressZero,
163
+ bridgeLockTime: 1,
164
+ override: {
165
+ chain2: {
166
+ bridge: '0x1234567890123456789012345678901234567890',
167
+ },
168
+ },
169
+ },
170
+ chain2: {
171
+ minAmount: {
172
+ min: 2000,
173
+ target: 2200,
174
+ type: RebalancerMinAmountType.Absolute,
175
+ },
176
+ bridge: ethers.constants.AddressZero,
177
+ bridgeLockTime: 1,
178
+ },
179
+ chain3: {
180
+ minAmount: {
181
+ min: 3000,
182
+ target: 3300,
183
+ type: RebalancerMinAmountType.Absolute,
184
+ },
185
+ bridge: ethers.constants.AddressZero,
186
+ bridgeLockTime: 1,
187
+ },
188
+ },
189
+ },
190
+ };
191
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
192
+ const config = RebalancerConfig.load(TEST_CONFIG_PATH);
193
+ expect(config.strategyConfig.chains.chain1).to.have.property('override');
194
+ const override = config.strategyConfig.chains.chain1.override;
195
+ expect(override).to.not.be.undefined;
196
+ expect(override).to.have.property('chain2');
197
+ const toChain2Override = override.chain2;
198
+ expect(toChain2Override).to.have.property('bridge');
199
+ expect(toChain2Override.bridge).to.equal('0x1234567890123456789012345678901234567890');
200
+ });
201
+ it('should throw when an override references a non-existent chain', () => {
202
+ data = {
203
+ warpRouteId: 'warpRouteId',
204
+ strategy: {
205
+ rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
206
+ chains: {
207
+ chain1: {
208
+ minAmount: {
209
+ min: 1000,
210
+ target: 1100,
211
+ type: RebalancerMinAmountType.Absolute,
212
+ },
213
+ bridge: ethers.constants.AddressZero,
214
+ bridgeLockTime: 1,
215
+ override: {
216
+ chain2: {
217
+ bridge: '0x1234567890123456789012345678901234567890',
218
+ },
219
+ chain3: {
220
+ bridgeMinAcceptedAmount: 1000,
221
+ },
222
+ },
223
+ },
224
+ chain2: {
225
+ minAmount: {
226
+ min: 2000,
227
+ target: 2200,
228
+ type: RebalancerMinAmountType.Absolute,
229
+ },
230
+ bridge: ethers.constants.AddressZero,
231
+ bridgeLockTime: 1,
232
+ },
233
+ },
234
+ },
235
+ };
236
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
237
+ expect(() => RebalancerConfig.load(TEST_CONFIG_PATH)).to.throw("Chain 'chain1' has an override for 'chain3', but 'chain3' is not defined in the config");
238
+ });
239
+ it('should throw when an override references itself', () => {
240
+ data = {
241
+ warpRouteId: 'warpRouteId',
242
+ strategy: {
243
+ rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
244
+ chains: {
245
+ chain1: {
246
+ minAmount: {
247
+ min: 1000,
248
+ target: 1100,
249
+ type: RebalancerMinAmountType.Absolute,
250
+ },
251
+ bridge: ethers.constants.AddressZero,
252
+ bridgeLockTime: 1,
253
+ override: {
254
+ chain1: {
255
+ bridgeMinAcceptedAmount: 1000,
256
+ },
257
+ },
258
+ },
259
+ chain2: {
260
+ minAmount: {
261
+ min: 2000,
262
+ target: 2200,
263
+ type: RebalancerMinAmountType.Absolute,
264
+ },
265
+ bridge: ethers.constants.AddressZero,
266
+ bridgeLockTime: 1,
267
+ },
268
+ },
269
+ },
270
+ };
271
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
272
+ expect(() => RebalancerConfig.load(TEST_CONFIG_PATH)).to.throw("Chain 'chain1' has an override for 'chain1', but 'chain1' is self-referencing");
273
+ });
274
+ it('should allow multiple chain overrides', () => {
275
+ data.strategy.chains.chain1 = {
276
+ bridge: ethers.constants.AddressZero,
277
+ bridgeMinAcceptedAmount: 3000,
278
+ bridgeLockTime: 1,
279
+ weighted: {
280
+ weight: 100,
281
+ tolerance: 0,
282
+ },
283
+ override: {
284
+ chain2: {
285
+ bridgeMinAcceptedAmount: 4000,
286
+ },
287
+ chain3: {
288
+ bridge: '0x1234567890123456789012345678901234567890',
289
+ },
290
+ },
291
+ };
292
+ data.strategy.chains.chain2 = {
293
+ bridge: ethers.constants.AddressZero,
294
+ bridgeMinAcceptedAmount: 5000,
295
+ bridgeLockTime: 1,
296
+ weighted: {
297
+ weight: 100,
298
+ tolerance: 0,
299
+ },
300
+ };
301
+ data.strategy.chains.chain3 = {
302
+ bridge: ethers.constants.AddressZero,
303
+ bridgeMinAcceptedAmount: 6000,
304
+ bridgeLockTime: 1,
305
+ weighted: {
306
+ weight: 100,
307
+ tolerance: 0,
308
+ },
309
+ };
310
+ writeYamlOrJson(TEST_CONFIG_PATH, data);
311
+ const config = RebalancerConfig.load(TEST_CONFIG_PATH);
312
+ const chain1Overrides = config.strategyConfig.chains.chain1.override;
313
+ expect(chain1Overrides).to.not.be.undefined;
314
+ expect(chain1Overrides).to.have.property('chain2');
315
+ expect(chain1Overrides).to.have.property('chain3');
316
+ const chain2Overrides = chain1Overrides.chain2;
317
+ expect(chain2Overrides).to.have.property('bridgeMinAcceptedAmount');
318
+ expect(chain2Overrides.bridgeMinAcceptedAmount).to.equal(4000);
319
+ const chain3Overrides = chain1Overrides.chain3;
320
+ expect(chain3Overrides).to.have.property('bridge');
321
+ expect(chain3Overrides.bridge).to.equal('0x1234567890123456789012345678901234567890');
322
+ });
323
+ });
324
+ });
325
+ //# sourceMappingURL=RebalancerConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RebalancerConfig.test.js","sourceRoot":"","sources":["../../src/config/RebalancerConfig.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Logger } from 'pino';
2
+ import { type ChainMap, type ChainMetadata, type MultiProvider, type Token, type WarpCore } from '@hyperlane-xyz/sdk';
3
+ import type { IRebalancer } from '../interfaces/IRebalancer.js';
4
+ import type { RebalancingRoute } from '../interfaces/IStrategy.js';
5
+ import { Metrics } from '../metrics/Metrics.js';
6
+ import { type BridgeConfigWithOverride } from '../utils/index.js';
7
+ export declare class Rebalancer implements IRebalancer {
8
+ private readonly bridges;
9
+ private readonly warpCore;
10
+ private readonly chainMetadata;
11
+ private readonly tokensByChainName;
12
+ private readonly multiProvider;
13
+ private readonly metrics?;
14
+ private readonly logger;
15
+ constructor(bridges: ChainMap<BridgeConfigWithOverride>, warpCore: WarpCore, chainMetadata: ChainMap<ChainMetadata>, tokensByChainName: ChainMap<Token>, multiProvider: MultiProvider, logger: Logger, metrics?: Metrics | undefined);
16
+ rebalance(routes: RebalancingRoute[]): Promise<void>;
17
+ private prepareTransactions;
18
+ private prepareTransaction;
19
+ private validateRoute;
20
+ private executeTransactions;
21
+ private filterTransactions;
22
+ }
23
+ //# sourceMappingURL=Rebalancer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rebalancer.d.ts","sourceRoot":"","sources":["../../src/core/Rebalancer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,aAAa,EAGlB,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EACV,WAAW,EAEZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,UAAW,YAAW,WAAW;IAG1C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAR3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEb,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,EAC3C,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,EACtC,iBAAiB,EAAE,QAAQ,CAAC,KAAK,CAAC,EAClC,aAAa,EAAE,aAAa,EAC7C,MAAM,EAAE,MAAM,EACG,OAAO,CAAC,qBAAS;IAK9B,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAwD5C,mBAAmB;YAuBnB,kBAAkB;YAuFlB,aAAa;YAmHb,mBAAmB;IAkHjC,OAAO,CAAC,kBAAkB;CAoC3B"}