@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.
- package/README.md +178 -0
- package/dist/config/RebalancerConfig.d.ts +12 -0
- package/dist/config/RebalancerConfig.d.ts.map +1 -0
- package/dist/config/RebalancerConfig.js +29 -0
- package/dist/config/RebalancerConfig.js.map +1 -0
- package/dist/config/RebalancerConfig.test.d.ts +2 -0
- package/dist/config/RebalancerConfig.test.d.ts.map +1 -0
- package/dist/config/RebalancerConfig.test.js +325 -0
- package/dist/config/RebalancerConfig.test.js.map +1 -0
- package/dist/core/Rebalancer.d.ts +23 -0
- package/dist/core/Rebalancer.d.ts.map +1 -0
- package/dist/core/Rebalancer.js +290 -0
- package/dist/core/Rebalancer.js.map +1 -0
- package/dist/core/RebalancerService.d.ts +115 -0
- package/dist/core/RebalancerService.d.ts.map +1 -0
- package/dist/core/RebalancerService.js +227 -0
- package/dist/core/RebalancerService.js.map +1 -0
- package/dist/core/WithInflightGuard.d.ts +20 -0
- package/dist/core/WithInflightGuard.d.ts.map +1 -0
- package/dist/core/WithInflightGuard.js +47 -0
- package/dist/core/WithInflightGuard.js.map +1 -0
- package/dist/core/WithInflightGuard.test.d.ts +2 -0
- package/dist/core/WithInflightGuard.test.d.ts.map +1 -0
- package/dist/core/WithInflightGuard.test.js +64 -0
- package/dist/core/WithInflightGuard.test.js.map +1 -0
- package/dist/core/WithSemaphore.d.ts +22 -0
- package/dist/core/WithSemaphore.d.ts.map +1 -0
- package/dist/core/WithSemaphore.js +67 -0
- package/dist/core/WithSemaphore.js.map +1 -0
- package/dist/core/WithSemaphore.test.d.ts +2 -0
- package/dist/core/WithSemaphore.test.d.ts.map +1 -0
- package/dist/core/WithSemaphore.test.js +83 -0
- package/dist/core/WithSemaphore.test.js.map +1 -0
- package/dist/factories/RebalancerContextFactory.d.ts +41 -0
- package/dist/factories/RebalancerContextFactory.d.ts.map +1 -0
- package/dist/factories/RebalancerContextFactory.js +115 -0
- package/dist/factories/RebalancerContextFactory.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IMetrics.d.ts +5 -0
- package/dist/interfaces/IMetrics.d.ts.map +1 -0
- package/dist/interfaces/IMetrics.js +2 -0
- package/dist/interfaces/IMetrics.js.map +1 -0
- package/dist/interfaces/IMonitor.d.ts +51 -0
- package/dist/interfaces/IMonitor.d.ts.map +1 -0
- package/dist/interfaces/IMonitor.js +14 -0
- package/dist/interfaces/IMonitor.js.map +1 -0
- package/dist/interfaces/IRebalancer.d.ts +15 -0
- package/dist/interfaces/IRebalancer.d.ts.map +1 -0
- package/dist/interfaces/IRebalancer.js +2 -0
- package/dist/interfaces/IRebalancer.js.map +1 -0
- package/dist/interfaces/IStrategy.d.ts +11 -0
- package/dist/interfaces/IStrategy.d.ts.map +1 -0
- package/dist/interfaces/IStrategy.js +2 -0
- package/dist/interfaces/IStrategy.js.map +1 -0
- package/dist/metrics/Metrics.d.ts +31 -0
- package/dist/metrics/Metrics.d.ts.map +1 -0
- package/dist/metrics/Metrics.js +302 -0
- package/dist/metrics/Metrics.js.map +1 -0
- package/dist/metrics/PriceGetter.d.ts +10 -0
- package/dist/metrics/PriceGetter.d.ts.map +1 -0
- package/dist/metrics/PriceGetter.js +41 -0
- package/dist/metrics/PriceGetter.js.map +1 -0
- package/dist/metrics/scripts/metrics.d.ts +14 -0
- package/dist/metrics/scripts/metrics.d.ts.map +1 -0
- package/dist/metrics/scripts/metrics.js +198 -0
- package/dist/metrics/scripts/metrics.js.map +1 -0
- package/dist/metrics/types.d.ts +24 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +2 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/metrics/utils/metrics.d.ts +12 -0
- package/dist/metrics/utils/metrics.d.ts.map +1 -0
- package/dist/metrics/utils/metrics.js +28 -0
- package/dist/metrics/utils/metrics.js.map +1 -0
- package/dist/monitor/Monitor.d.ts +26 -0
- package/dist/monitor/Monitor.d.ts.map +1 -0
- package/dist/monitor/Monitor.js +116 -0
- package/dist/monitor/Monitor.js.map +1 -0
- package/dist/service.d.ts +3 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +125 -0
- package/dist/service.js.map +1 -0
- package/dist/strategy/BaseStrategy.d.ts +34 -0
- package/dist/strategy/BaseStrategy.d.ts.map +1 -0
- package/dist/strategy/BaseStrategy.js +127 -0
- package/dist/strategy/BaseStrategy.js.map +1 -0
- package/dist/strategy/MinAmountStrategy.d.ts +27 -0
- package/dist/strategy/MinAmountStrategy.d.ts.map +1 -0
- package/dist/strategy/MinAmountStrategy.js +103 -0
- package/dist/strategy/MinAmountStrategy.js.map +1 -0
- package/dist/strategy/MinAmountStrategy.test.d.ts +2 -0
- package/dist/strategy/MinAmountStrategy.test.d.ts.map +1 -0
- package/dist/strategy/MinAmountStrategy.test.js +472 -0
- package/dist/strategy/MinAmountStrategy.test.js.map +1 -0
- package/dist/strategy/StrategyFactory.d.ts +16 -0
- package/dist/strategy/StrategyFactory.d.ts.map +1 -0
- package/dist/strategy/StrategyFactory.js +25 -0
- package/dist/strategy/StrategyFactory.js.map +1 -0
- package/dist/strategy/StrategyFactory.test.d.ts +2 -0
- package/dist/strategy/StrategyFactory.test.d.ts.map +1 -0
- package/dist/strategy/StrategyFactory.test.js +80 -0
- package/dist/strategy/StrategyFactory.test.js.map +1 -0
- package/dist/strategy/WeightedStrategy.d.ts +23 -0
- package/dist/strategy/WeightedStrategy.d.ts.map +1 -0
- package/dist/strategy/WeightedStrategy.js +61 -0
- package/dist/strategy/WeightedStrategy.js.map +1 -0
- package/dist/strategy/WeightedStrategy.test.d.ts +2 -0
- package/dist/strategy/WeightedStrategy.test.d.ts.map +1 -0
- package/dist/strategy/WeightedStrategy.test.js +307 -0
- package/dist/strategy/WeightedStrategy.test.js.map +1 -0
- package/dist/strategy/index.d.ts +5 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +5 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/test/helpers.d.ts +8 -0
- package/dist/test/helpers.d.ts.map +1 -0
- package/dist/test/helpers.js +33 -0
- package/dist/test/helpers.js.map +1 -0
- package/dist/utils/ExplorerClient.d.ts +14 -0
- package/dist/utils/ExplorerClient.d.ts.map +1 -0
- package/dist/utils/ExplorerClient.js +82 -0
- package/dist/utils/ExplorerClient.js.map +1 -0
- package/dist/utils/balanceUtils.d.ts +13 -0
- package/dist/utils/balanceUtils.d.ts.map +1 -0
- package/dist/utils/balanceUtils.js +43 -0
- package/dist/utils/balanceUtils.js.map +1 -0
- package/dist/utils/balanceUtils.test.d.ts +2 -0
- package/dist/utils/balanceUtils.test.d.ts.map +1 -0
- package/dist/utils/balanceUtils.test.js +54 -0
- package/dist/utils/balanceUtils.test.js.map +1 -0
- package/dist/utils/bridgeUtils.d.ts +19 -0
- package/dist/utils/bridgeUtils.d.ts.map +1 -0
- package/dist/utils/bridgeUtils.js +20 -0
- package/dist/utils/bridgeUtils.js.map +1 -0
- package/dist/utils/bridgeUtils.test.d.ts +2 -0
- package/dist/utils/bridgeUtils.test.d.ts.map +1 -0
- package/dist/utils/bridgeUtils.test.js +77 -0
- package/dist/utils/bridgeUtils.test.js.map +1 -0
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +6 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/files.d.ts +35 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +190 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/generalUtils.d.ts +3 -0
- package/dist/utils/generalUtils.d.ts.map +1 -0
- package/dist/utils/generalUtils.js +9 -0
- package/dist/utils/generalUtils.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/tokenUtils.d.ts +14 -0
- package/dist/utils/tokenUtils.d.ts.map +1 -0
- package/dist/utils/tokenUtils.js +21 -0
- package/dist/utils/tokenUtils.js.map +1 -0
- package/package.json +70 -0
- package/src/config/RebalancerConfig.test.ts +388 -0
- package/src/config/RebalancerConfig.ts +39 -0
- package/src/core/Rebalancer.ts +471 -0
- package/src/core/RebalancerService.ts +333 -0
- package/src/core/WithInflightGuard.test.ts +131 -0
- package/src/core/WithInflightGuard.ts +67 -0
- package/src/core/WithSemaphore.test.ts +112 -0
- package/src/core/WithSemaphore.ts +92 -0
- package/src/factories/RebalancerContextFactory.ts +210 -0
- package/src/index.ts +68 -0
- package/src/interfaces/IMetrics.ts +5 -0
- package/src/interfaces/IMonitor.ts +63 -0
- package/src/interfaces/IRebalancer.ts +20 -0
- package/src/interfaces/IStrategy.ts +13 -0
- package/src/metrics/Metrics.ts +558 -0
- package/src/metrics/PriceGetter.ts +74 -0
- package/src/metrics/scripts/metrics.ts +298 -0
- package/src/metrics/types.ts +27 -0
- package/src/metrics/utils/metrics.ts +33 -0
- package/src/monitor/Monitor.ts +174 -0
- package/src/service.ts +154 -0
- package/src/strategy/BaseStrategy.ts +210 -0
- package/src/strategy/MinAmountStrategy.test.ts +625 -0
- package/src/strategy/MinAmountStrategy.ts +170 -0
- package/src/strategy/StrategyFactory.test.ts +109 -0
- package/src/strategy/StrategyFactory.ts +48 -0
- package/src/strategy/WeightedStrategy.test.ts +408 -0
- package/src/strategy/WeightedStrategy.ts +93 -0
- package/src/strategy/index.ts +4 -0
- package/src/test/helpers.ts +46 -0
- package/src/utils/ExplorerClient.ts +99 -0
- package/src/utils/balanceUtils.test.ts +74 -0
- package/src/utils/balanceUtils.ts +69 -0
- package/src/utils/bridgeUtils.test.ts +92 -0
- package/src/utils/bridgeUtils.ts +42 -0
- package/src/utils/errors.ts +5 -0
- package/src/utils/files.ts +276 -0
- package/src/utils/generalUtils.ts +13 -0
- package/src/utils/index.ts +4 -0
- 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 @@
|
|
|
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"}
|