@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
@@ -0,0 +1,472 @@
1
+ import { AddressZero } from '@ethersproject/constants';
2
+ import { expect } from 'chai';
3
+ import { pino } from 'pino';
4
+ import { RebalancerMinAmountType, Token, TokenStandard, } from '@hyperlane-xyz/sdk';
5
+ import { MinAmountStrategy } from './MinAmountStrategy.js';
6
+ const testLogger = pino({ level: 'silent' });
7
+ describe('MinAmountStrategy', () => {
8
+ let chain1;
9
+ let chain2;
10
+ let chain3;
11
+ const tokensByChainName = {};
12
+ const tokenArgs = {
13
+ name: 'token',
14
+ decimals: 18,
15
+ symbol: 'TOKEN',
16
+ standard: TokenStandard.ERC20,
17
+ addressOrDenom: '',
18
+ };
19
+ const totalCollateral = BigInt(300e18);
20
+ beforeEach(() => {
21
+ chain1 = 'chain1';
22
+ chain2 = 'chain2';
23
+ chain3 = 'chain3';
24
+ tokensByChainName[chain1] = new Token({ ...tokenArgs, chainName: chain1 });
25
+ tokensByChainName[chain2] = new Token({ ...tokenArgs, chainName: chain2 });
26
+ tokensByChainName[chain3] = new Token({ ...tokenArgs, chainName: chain3 });
27
+ });
28
+ describe('constructor', () => {
29
+ it('should throw an error when less than two chains are configured', () => {
30
+ expect(() => new MinAmountStrategy({
31
+ [chain1]: {
32
+ minAmount: {
33
+ min: '100',
34
+ target: '120',
35
+ type: RebalancerMinAmountType.Absolute,
36
+ },
37
+ bridge: AddressZero,
38
+ bridgeLockTime: 1,
39
+ },
40
+ }, tokensByChainName, totalCollateral, testLogger)).to.throw('At least two chains must be configured');
41
+ });
42
+ it('should create a strategy with minAmount and target using absolute values', () => {
43
+ new MinAmountStrategy({
44
+ [chain1]: {
45
+ minAmount: {
46
+ min: '100',
47
+ target: '120',
48
+ type: RebalancerMinAmountType.Absolute,
49
+ },
50
+ bridge: AddressZero,
51
+ bridgeLockTime: 1,
52
+ },
53
+ [chain2]: {
54
+ minAmount: {
55
+ min: '100',
56
+ target: '120',
57
+ type: RebalancerMinAmountType.Absolute,
58
+ },
59
+ bridge: AddressZero,
60
+ bridgeLockTime: 1,
61
+ },
62
+ }, tokensByChainName, totalCollateral, testLogger);
63
+ });
64
+ it('should create a strategy with minAmount and target using relative values', () => {
65
+ new MinAmountStrategy({
66
+ [chain1]: {
67
+ minAmount: {
68
+ min: 0.3,
69
+ target: 0.4,
70
+ type: RebalancerMinAmountType.Relative,
71
+ },
72
+ bridge: AddressZero,
73
+ bridgeLockTime: 1,
74
+ },
75
+ [chain2]: {
76
+ minAmount: {
77
+ min: 0.4,
78
+ target: 0.5,
79
+ type: RebalancerMinAmountType.Relative,
80
+ },
81
+ bridge: AddressZero,
82
+ bridgeLockTime: 1,
83
+ },
84
+ }, tokensByChainName, totalCollateral, testLogger);
85
+ });
86
+ it('should throw an error when minAmount is negative', () => {
87
+ expect(() => new MinAmountStrategy({
88
+ [chain1]: {
89
+ minAmount: {
90
+ min: 100,
91
+ target: '120',
92
+ type: RebalancerMinAmountType.Absolute,
93
+ },
94
+ bridge: AddressZero,
95
+ bridgeLockTime: 1,
96
+ },
97
+ [chain2]: {
98
+ minAmount: {
99
+ min: '-10',
100
+ target: '120',
101
+ type: RebalancerMinAmountType.Absolute,
102
+ },
103
+ bridge: AddressZero,
104
+ bridgeLockTime: 1,
105
+ },
106
+ }, tokensByChainName, totalCollateral, testLogger)).to.throw('Minimum amount (-10) cannot be negative for chain chain2');
107
+ });
108
+ it('should throw an error when target is less than min', () => {
109
+ expect(() => new MinAmountStrategy({
110
+ [chain1]: {
111
+ minAmount: {
112
+ min: '100',
113
+ target: '80',
114
+ type: RebalancerMinAmountType.Absolute,
115
+ },
116
+ bridge: AddressZero,
117
+ bridgeLockTime: 1,
118
+ },
119
+ [chain2]: {
120
+ minAmount: {
121
+ min: '100',
122
+ target: '120',
123
+ type: RebalancerMinAmountType.Absolute,
124
+ },
125
+ bridge: AddressZero,
126
+ bridgeLockTime: 1,
127
+ },
128
+ }, tokensByChainName, totalCollateral, testLogger)).to.throw('Target (80) must be greater than or equal to min (100) for chain chain1');
129
+ });
130
+ it('should throw an error when relative target is less than relative min', () => {
131
+ expect(() => new MinAmountStrategy({
132
+ [chain1]: {
133
+ minAmount: {
134
+ min: 0.5,
135
+ target: 0.4,
136
+ type: RebalancerMinAmountType.Relative,
137
+ },
138
+ bridge: AddressZero,
139
+ bridgeLockTime: 1,
140
+ },
141
+ [chain2]: {
142
+ minAmount: {
143
+ min: 0.3,
144
+ target: 0.5,
145
+ type: RebalancerMinAmountType.Relative,
146
+ },
147
+ bridge: AddressZero,
148
+ bridgeLockTime: 1,
149
+ },
150
+ }, tokensByChainName, totalCollateral, testLogger)).to.throw('Target (0.4) must be greater than or equal to min (0.5) for chain chain1');
151
+ });
152
+ it('should throw an error when raw balances chains length does not match configured chains length', () => {
153
+ expect(() => new MinAmountStrategy({
154
+ [chain1]: {
155
+ minAmount: {
156
+ min: '100',
157
+ target: '120',
158
+ type: RebalancerMinAmountType.Absolute,
159
+ },
160
+ bridge: AddressZero,
161
+ bridgeLockTime: 1,
162
+ },
163
+ [chain2]: {
164
+ minAmount: {
165
+ min: '100',
166
+ target: '120',
167
+ type: RebalancerMinAmountType.Absolute,
168
+ },
169
+ bridge: AddressZero,
170
+ bridgeLockTime: 1,
171
+ },
172
+ }, tokensByChainName, totalCollateral, testLogger).getRebalancingRoutes({
173
+ [chain1]: 100n,
174
+ [chain2]: 200n,
175
+ [chain3]: 300n,
176
+ })).to.throw('Config chains do not match raw balances chains length');
177
+ });
178
+ it('should throw an error when a raw balance is missing', () => {
179
+ expect(() => new MinAmountStrategy({
180
+ [chain1]: {
181
+ minAmount: {
182
+ min: '100',
183
+ target: '120',
184
+ type: RebalancerMinAmountType.Absolute,
185
+ },
186
+ bridge: AddressZero,
187
+ bridgeLockTime: 1,
188
+ },
189
+ [chain2]: {
190
+ minAmount: {
191
+ min: '100',
192
+ target: '120',
193
+ type: RebalancerMinAmountType.Absolute,
194
+ },
195
+ bridge: AddressZero,
196
+ bridgeLockTime: 1,
197
+ },
198
+ }, tokensByChainName, totalCollateral, testLogger).getRebalancingRoutes({
199
+ [chain1]: 100n,
200
+ [chain3]: 300n,
201
+ })).to.throw('Raw balance for chain chain2 not found');
202
+ });
203
+ it('should throw an error when a raw balance is negative', () => {
204
+ expect(() => new MinAmountStrategy({
205
+ [chain1]: {
206
+ minAmount: {
207
+ min: '100',
208
+ target: '120',
209
+ type: RebalancerMinAmountType.Absolute,
210
+ },
211
+ bridge: AddressZero,
212
+ bridgeLockTime: 1,
213
+ },
214
+ [chain2]: {
215
+ minAmount: {
216
+ min: '100',
217
+ target: '120',
218
+ type: RebalancerMinAmountType.Absolute,
219
+ },
220
+ bridge: AddressZero,
221
+ bridgeLockTime: 1,
222
+ },
223
+ }, tokensByChainName, totalCollateral, testLogger).getRebalancingRoutes({
224
+ [chain1]: 100n,
225
+ [chain2]: -2n,
226
+ })).to.throw('Raw balance for chain chain2 is negative');
227
+ });
228
+ });
229
+ describe('getRebalancingRoutes', () => {
230
+ it('should return an empty array when all chains have at least the minimum amount', () => {
231
+ const strategy = new MinAmountStrategy({
232
+ [chain1]: {
233
+ minAmount: {
234
+ min: '100',
235
+ target: '120',
236
+ type: RebalancerMinAmountType.Absolute,
237
+ },
238
+ bridge: AddressZero,
239
+ bridgeLockTime: 1,
240
+ },
241
+ [chain2]: {
242
+ minAmount: {
243
+ min: '100',
244
+ target: '120',
245
+ type: RebalancerMinAmountType.Absolute,
246
+ },
247
+ bridge: AddressZero,
248
+ bridgeLockTime: 1,
249
+ },
250
+ }, tokensByChainName, totalCollateral, testLogger);
251
+ const rawBalances = {
252
+ [chain1]: BigInt(120e18),
253
+ [chain2]: BigInt(120e18),
254
+ };
255
+ const routes = strategy.getRebalancingRoutes(rawBalances);
256
+ expect(routes).to.be.empty;
257
+ });
258
+ it('should return a single route when a chain is below minimum amount', () => {
259
+ const strategy = new MinAmountStrategy({
260
+ [chain1]: {
261
+ minAmount: {
262
+ min: '100',
263
+ target: '120',
264
+ type: RebalancerMinAmountType.Absolute,
265
+ },
266
+ bridge: AddressZero,
267
+ bridgeLockTime: 1,
268
+ },
269
+ [chain2]: {
270
+ minAmount: {
271
+ min: '100',
272
+ target: '120',
273
+ type: RebalancerMinAmountType.Absolute,
274
+ },
275
+ bridge: AddressZero,
276
+ bridgeLockTime: 1,
277
+ },
278
+ }, tokensByChainName, totalCollateral, testLogger);
279
+ const rawBalances = {
280
+ [chain1]: BigInt(50e18),
281
+ [chain2]: BigInt(200e18),
282
+ };
283
+ const routes = strategy.getRebalancingRoutes(rawBalances);
284
+ expect(routes).to.deep.equal([
285
+ {
286
+ origin: chain2,
287
+ destination: chain1,
288
+ amount: BigInt(70e18),
289
+ },
290
+ ]);
291
+ });
292
+ it('should return multiple routes for multiple chains below minimum amount', () => {
293
+ const strategy = new MinAmountStrategy({
294
+ [chain1]: {
295
+ minAmount: {
296
+ min: '80',
297
+ target: '100',
298
+ type: RebalancerMinAmountType.Absolute,
299
+ },
300
+ bridge: AddressZero,
301
+ bridgeLockTime: 1,
302
+ },
303
+ [chain2]: {
304
+ minAmount: {
305
+ min: '80',
306
+ target: '100',
307
+ type: RebalancerMinAmountType.Absolute,
308
+ },
309
+ bridge: AddressZero,
310
+ bridgeLockTime: 1,
311
+ },
312
+ [chain3]: {
313
+ minAmount: {
314
+ min: '80',
315
+ target: '100',
316
+ type: RebalancerMinAmountType.Absolute,
317
+ },
318
+ bridge: AddressZero,
319
+ bridgeLockTime: 1,
320
+ },
321
+ }, tokensByChainName, totalCollateral, testLogger);
322
+ const rawBalances = {
323
+ [chain1]: BigInt(50e18),
324
+ [chain2]: BigInt(75e18),
325
+ [chain3]: BigInt(300e18),
326
+ };
327
+ const routes = strategy.getRebalancingRoutes(rawBalances);
328
+ expect(routes).to.deep.equal([
329
+ {
330
+ origin: chain3,
331
+ destination: chain1,
332
+ amount: BigInt(50e18),
333
+ },
334
+ {
335
+ origin: chain3,
336
+ destination: chain2,
337
+ amount: BigInt(25e18),
338
+ },
339
+ ]);
340
+ });
341
+ it('should throw an error when the sum of `target` is greater than the sum of collaterals', () => {
342
+ expect(() => new MinAmountStrategy({
343
+ [chain1]: {
344
+ minAmount: {
345
+ min: '100',
346
+ target: '220',
347
+ type: RebalancerMinAmountType.Absolute,
348
+ },
349
+ bridge: AddressZero,
350
+ bridgeLockTime: 1,
351
+ },
352
+ [chain2]: {
353
+ minAmount: {
354
+ min: '100',
355
+ target: '120',
356
+ type: RebalancerMinAmountType.Absolute,
357
+ },
358
+ bridge: AddressZero,
359
+ bridgeLockTime: 1,
360
+ },
361
+ }, tokensByChainName, totalCollateral, testLogger)).to.throw(`Consider reducing the targets as the sum (340) is greater than sum of collaterals (300)`);
362
+ });
363
+ it('should handle case where there is not enough surplus to meet all minimum requirements by scaling down deficits', () => {
364
+ const strategy = new MinAmountStrategy({
365
+ [chain1]: {
366
+ minAmount: {
367
+ min: '100',
368
+ target: '100',
369
+ type: RebalancerMinAmountType.Absolute,
370
+ },
371
+ bridge: AddressZero,
372
+ bridgeLockTime: 1,
373
+ },
374
+ [chain2]: {
375
+ minAmount: {
376
+ min: '100',
377
+ target: '100',
378
+ type: RebalancerMinAmountType.Absolute,
379
+ },
380
+ bridge: AddressZero,
381
+ bridgeLockTime: 1,
382
+ },
383
+ [chain3]: {
384
+ minAmount: {
385
+ min: '100',
386
+ target: '100',
387
+ type: RebalancerMinAmountType.Absolute,
388
+ },
389
+ bridge: AddressZero,
390
+ bridgeLockTime: 1,
391
+ },
392
+ }, tokensByChainName, totalCollateral, testLogger);
393
+ const rawBalances = {
394
+ [chain1]: BigInt(50e18),
395
+ [chain2]: BigInt(50e18),
396
+ [chain3]: BigInt(150e18), // Only 50n of surplus, not enough to bring both chains up to minimum
397
+ };
398
+ const routes = strategy.getRebalancingRoutes(rawBalances);
399
+ // It scales down the deficits to prevent sending all surplus to a single chain
400
+ expect(routes.length).to.equal(2);
401
+ expect(routes[0].origin).to.equal(chain3);
402
+ expect(routes[0].destination).to.equal(chain1);
403
+ expect(routes[0].amount).to.equal(BigInt(25e18));
404
+ expect(routes[1].origin).to.equal(chain3);
405
+ expect(routes[1].destination).to.equal(chain2);
406
+ expect(routes[1].amount).to.equal(BigInt(25e18));
407
+ });
408
+ it('should have no surplus or deficit when all at min', () => {
409
+ const strategy = new MinAmountStrategy({
410
+ [chain1]: {
411
+ minAmount: {
412
+ min: '100',
413
+ target: '100',
414
+ type: RebalancerMinAmountType.Absolute,
415
+ },
416
+ bridge: AddressZero,
417
+ bridgeLockTime: 1,
418
+ },
419
+ [chain2]: {
420
+ minAmount: {
421
+ min: '100',
422
+ target: '100',
423
+ type: RebalancerMinAmountType.Absolute,
424
+ },
425
+ bridge: AddressZero,
426
+ bridgeLockTime: 1,
427
+ },
428
+ }, tokensByChainName, totalCollateral, testLogger);
429
+ const rawBalances = {
430
+ [chain1]: BigInt(100e18),
431
+ [chain2]: BigInt(100e18),
432
+ };
433
+ const routes = strategy.getRebalancingRoutes(rawBalances);
434
+ expect(routes).to.be.empty;
435
+ });
436
+ it('should consider the target amount with relative configuration', () => {
437
+ const strategy = new MinAmountStrategy({
438
+ [chain1]: {
439
+ minAmount: {
440
+ min: 0.25,
441
+ target: 0.3,
442
+ type: RebalancerMinAmountType.Relative,
443
+ },
444
+ bridge: AddressZero,
445
+ bridgeLockTime: 1,
446
+ },
447
+ [chain2]: {
448
+ minAmount: {
449
+ min: 0.25,
450
+ target: 0.3,
451
+ type: RebalancerMinAmountType.Relative,
452
+ },
453
+ bridge: AddressZero,
454
+ bridgeLockTime: 1,
455
+ },
456
+ }, tokensByChainName, totalCollateral, testLogger);
457
+ const rawBalances = {
458
+ [chain1]: 200n,
459
+ [chain2]: 800n,
460
+ };
461
+ const routes = strategy.getRebalancingRoutes(rawBalances);
462
+ expect(routes).to.deep.equal([
463
+ {
464
+ origin: chain2,
465
+ destination: chain1,
466
+ amount: 100n,
467
+ },
468
+ ]);
469
+ });
470
+ });
471
+ });
472
+ //# sourceMappingURL=MinAmountStrategy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MinAmountStrategy.test.js","sourceRoot":"","sources":["../../src/strategy/MinAmountStrategy.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Logger } from 'pino';
2
+ import { ChainMap, StrategyConfig, Token } from '@hyperlane-xyz/sdk';
3
+ import { type IStrategy } from '../interfaces/IStrategy.js';
4
+ import { Metrics } from '../metrics/Metrics.js';
5
+ export declare class StrategyFactory {
6
+ /**
7
+ * @param strategyConfig A discriminated union of strategy-specific configurations.
8
+ * @param tokensByChainName - A map of chain->token to ease the lookup of token by chain
9
+ * @param initialTotalCollateral - The initial total collateral of the rebalancer
10
+ * @param logger - The logger to use for the strategy
11
+ * @param metrics - The metrics to use for the strategy
12
+ * @returns A concrete strategy implementation
13
+ */
14
+ static createStrategy(strategyConfig: StrategyConfig, tokensByChainName: ChainMap<Token>, initialTotalCollateral: bigint, logger: Logger, metrics?: Metrics): IStrategy;
15
+ }
16
+ //# sourceMappingURL=StrategyFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrategyFactory.d.ts","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EACL,QAAQ,EAER,cAAc,EACd,KAAK,EACN,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAKhD,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"}
@@ -0,0 +1,25 @@
1
+ import { RebalancerStrategyOptions, } from '@hyperlane-xyz/sdk';
2
+ import { MinAmountStrategy } from './MinAmountStrategy.js';
3
+ import { WeightedStrategy } from './WeightedStrategy.js';
4
+ export class StrategyFactory {
5
+ /**
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
11
+ * @returns A concrete strategy implementation
12
+ */
13
+ static createStrategy(strategyConfig, tokensByChainName, initialTotalCollateral, logger, metrics) {
14
+ 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);
19
+ default: {
20
+ throw new Error('Unsupported strategy type');
21
+ }
22
+ }
23
+ }
24
+ }
25
+ //# sourceMappingURL=StrategyFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrategyFactory.js","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,yBAAyB,GAG1B,MAAM,oBAAoB,CAAC;AAK5B,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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=StrategyFactory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrategyFactory.test.d.ts","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { expect } from 'chai';
2
+ import { ethers } from 'ethers';
3
+ import { pino } from 'pino';
4
+ import { RebalancerMinAmountType, RebalancerStrategyOptions, Token, TokenStandard, } from '@hyperlane-xyz/sdk';
5
+ import { MinAmountStrategy } from './MinAmountStrategy.js';
6
+ import { StrategyFactory } from './StrategyFactory.js';
7
+ import { WeightedStrategy } from './WeightedStrategy.js';
8
+ const testLogger = pino({ level: 'silent' });
9
+ describe('StrategyFactory', () => {
10
+ const chain1 = 'chain1';
11
+ const chain2 = 'chain2';
12
+ const totalCollateral = BigInt(20e18);
13
+ const tokensByChainName = {};
14
+ const tokenArgs = {
15
+ name: 'token',
16
+ decimals: 18,
17
+ symbol: 'TOKEN',
18
+ standard: TokenStandard.ERC20,
19
+ addressOrDenom: '',
20
+ };
21
+ tokensByChainName[chain1] = new Token({ ...tokenArgs, chainName: chain1 });
22
+ tokensByChainName[chain2] = new Token({ ...tokenArgs, chainName: chain2 });
23
+ describe('createStrategy', () => {
24
+ it('creates a WeightedStrategy when given weighted configuration', () => {
25
+ const config = {
26
+ [chain1]: {
27
+ weighted: {
28
+ weight: 100n,
29
+ tolerance: 0n,
30
+ },
31
+ bridge: ethers.constants.AddressZero,
32
+ bridgeLockTime: 1,
33
+ },
34
+ [chain2]: {
35
+ weighted: {
36
+ weight: 100n,
37
+ tolerance: 0n,
38
+ },
39
+ bridge: ethers.constants.AddressZero,
40
+ bridgeLockTime: 1,
41
+ },
42
+ };
43
+ const strategyConfig = {
44
+ rebalanceStrategy: RebalancerStrategyOptions.Weighted,
45
+ chains: config,
46
+ };
47
+ const strategy = StrategyFactory.createStrategy(strategyConfig, tokensByChainName, totalCollateral, testLogger);
48
+ expect(strategy).to.be.instanceOf(WeightedStrategy);
49
+ });
50
+ it('creates a MinAmountStrategy when given minAmount configuration', () => {
51
+ const config = {
52
+ [chain1]: {
53
+ minAmount: {
54
+ min: 8,
55
+ target: 10,
56
+ type: RebalancerMinAmountType.Absolute,
57
+ },
58
+ bridge: ethers.constants.AddressZero,
59
+ bridgeLockTime: 1,
60
+ },
61
+ [chain2]: {
62
+ minAmount: {
63
+ min: 8,
64
+ target: 10,
65
+ type: RebalancerMinAmountType.Absolute,
66
+ },
67
+ bridge: ethers.constants.AddressZero,
68
+ bridgeLockTime: 1,
69
+ },
70
+ };
71
+ const strategyConfig = {
72
+ rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
73
+ chains: config,
74
+ };
75
+ const strategy = StrategyFactory.createStrategy(strategyConfig, tokensByChainName, totalCollateral, testLogger);
76
+ expect(strategy).to.be.instanceOf(MinAmountStrategy);
77
+ });
78
+ });
79
+ });
80
+ //# sourceMappingURL=StrategyFactory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrategyFactory.test.js","sourceRoot":"","sources":["../../src/strategy/StrategyFactory.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Logger } from 'pino';
2
+ import type { WeightedStrategyConfig } from '@hyperlane-xyz/sdk';
3
+ import type { RawBalances } from '../interfaces/IStrategy.js';
4
+ import { Metrics } from '../metrics/Metrics.js';
5
+ import { BaseStrategy, type Delta } from './BaseStrategy.js';
6
+ /**
7
+ * Strategy implementation that rebalance based on weights
8
+ * It distributes funds across chains based on their weights
9
+ */
10
+ export declare class WeightedStrategy extends BaseStrategy {
11
+ private readonly config;
12
+ private readonly totalWeight;
13
+ protected readonly logger: Logger;
14
+ constructor(config: WeightedStrategyConfig, logger: Logger, metrics?: Metrics);
15
+ /**
16
+ * Gets balances categorized by surplus and deficit based on weights
17
+ */
18
+ protected getCategorizedBalances(rawBalances: RawBalances): {
19
+ surpluses: Delta[];
20
+ deficits: Delta[];
21
+ };
22
+ }
23
+ //# sourceMappingURL=WeightedStrategy.d.ts.map