@hyperlane-xyz/rebalancer 2.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bridges/LiFiBridge.d.ts +67 -0
- package/dist/bridges/LiFiBridge.d.ts.map +1 -0
- package/dist/bridges/LiFiBridge.js +386 -0
- package/dist/bridges/LiFiBridge.js.map +1 -0
- package/dist/config/RebalancerConfig.d.ts +8 -2
- package/dist/config/RebalancerConfig.d.ts.map +1 -1
- package/dist/config/RebalancerConfig.js +9 -4
- package/dist/config/RebalancerConfig.js.map +1 -1
- package/dist/config/RebalancerConfig.test.js +135 -1
- package/dist/config/RebalancerConfig.test.js.map +1 -1
- package/dist/config/types.d.ts +1023 -304
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +113 -10
- package/dist/config/types.js.map +1 -1
- package/dist/core/InventoryRebalancer.d.ts +190 -0
- package/dist/core/InventoryRebalancer.d.ts.map +1 -0
- package/dist/core/InventoryRebalancer.js +892 -0
- package/dist/core/InventoryRebalancer.js.map +1 -0
- package/dist/core/InventoryRebalancer.test.d.ts +2 -0
- package/dist/core/InventoryRebalancer.test.d.ts.map +1 -0
- package/dist/core/InventoryRebalancer.test.js +1382 -0
- package/dist/core/InventoryRebalancer.test.js.map +1 -0
- package/dist/core/Rebalancer.d.ts +11 -4
- package/dist/core/Rebalancer.d.ts.map +1 -1
- package/dist/core/Rebalancer.js +92 -9
- package/dist/core/Rebalancer.js.map +1 -1
- package/dist/core/Rebalancer.test.js +82 -49
- package/dist/core/Rebalancer.test.js.map +1 -1
- package/dist/core/RebalancerOrchestrator.d.ts +30 -9
- package/dist/core/RebalancerOrchestrator.d.ts.map +1 -1
- package/dist/core/RebalancerOrchestrator.js +79 -71
- package/dist/core/RebalancerOrchestrator.js.map +1 -1
- package/dist/core/RebalancerOrchestrator.test.d.ts +2 -0
- package/dist/core/RebalancerOrchestrator.test.d.ts.map +1 -0
- package/dist/core/RebalancerOrchestrator.test.js +719 -0
- package/dist/core/RebalancerOrchestrator.test.js.map +1 -0
- package/dist/core/RebalancerService.d.ts +7 -3
- package/dist/core/RebalancerService.d.ts.map +1 -1
- package/dist/core/RebalancerService.js +44 -24
- package/dist/core/RebalancerService.js.map +1 -1
- package/dist/core/RebalancerService.test.js +74 -110
- package/dist/core/RebalancerService.test.js.map +1 -1
- package/dist/e2e/collateral-deficit.e2e-test.js +1 -3
- package/dist/e2e/collateral-deficit.e2e-test.js.map +1 -1
- package/dist/e2e/composite.e2e-test.js.map +1 -1
- package/dist/e2e/harness/BridgeSetup.d.ts +6 -0
- package/dist/e2e/harness/BridgeSetup.d.ts.map +1 -1
- package/dist/e2e/harness/BridgeSetup.js +10 -1
- package/dist/e2e/harness/BridgeSetup.js.map +1 -1
- package/dist/e2e/harness/ForkIndexer.d.ts.map +1 -1
- package/dist/e2e/harness/ForkIndexer.js +1 -0
- package/dist/e2e/harness/ForkIndexer.js.map +1 -1
- package/dist/e2e/harness/TestHelpers.d.ts.map +1 -1
- package/dist/e2e/harness/TestHelpers.js +1 -4
- package/dist/e2e/harness/TestHelpers.js.map +1 -1
- package/dist/e2e/harness/TestRebalancer.d.ts +1 -1
- package/dist/e2e/harness/TestRebalancer.d.ts.map +1 -1
- package/dist/e2e/harness/TestRebalancer.js +9 -9
- package/dist/e2e/harness/TestRebalancer.js.map +1 -1
- package/dist/e2e/minAmount.e2e-test.js +0 -1
- package/dist/e2e/minAmount.e2e-test.js.map +1 -1
- package/dist/e2e/weighted.e2e-test.js +0 -1
- package/dist/e2e/weighted.e2e-test.js.map +1 -1
- package/dist/factories/RebalancerContextFactory.d.ts +48 -6
- package/dist/factories/RebalancerContextFactory.d.ts.map +1 -1
- package/dist/factories/RebalancerContextFactory.js +171 -17
- package/dist/factories/RebalancerContextFactory.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/interfaces/IExternalBridge.d.ts +101 -0
- package/dist/interfaces/IExternalBridge.d.ts.map +1 -0
- package/dist/interfaces/IExternalBridge.js +2 -0
- package/dist/interfaces/IExternalBridge.js.map +1 -0
- package/dist/interfaces/IMonitor.d.ts +1 -0
- package/dist/interfaces/IMonitor.d.ts.map +1 -1
- package/dist/interfaces/IRebalancer.d.ts +25 -25
- package/dist/interfaces/IRebalancer.d.ts.map +1 -1
- package/dist/interfaces/IStrategy.d.ts +36 -3
- package/dist/interfaces/IStrategy.d.ts.map +1 -1
- package/dist/interfaces/IStrategy.js +12 -1
- package/dist/interfaces/IStrategy.js.map +1 -1
- package/dist/metrics/PriceGetter.js +1 -1
- package/dist/metrics/PriceGetter.js.map +1 -1
- package/dist/metrics/scripts/metrics.d.ts +3 -3
- package/dist/monitor/Monitor.d.ts +12 -2
- package/dist/monitor/Monitor.d.ts.map +1 -1
- package/dist/monitor/Monitor.js +46 -1
- package/dist/monitor/Monitor.js.map +1 -1
- package/dist/service.js +40 -17
- package/dist/service.js.map +1 -1
- package/dist/strategy/BaseStrategy.d.ts +12 -6
- package/dist/strategy/BaseStrategy.d.ts.map +1 -1
- package/dist/strategy/BaseStrategy.js +56 -21
- package/dist/strategy/BaseStrategy.js.map +1 -1
- package/dist/strategy/CollateralDeficitStrategy.d.ts +1 -1
- package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -1
- package/dist/strategy/CollateralDeficitStrategy.js +19 -11
- package/dist/strategy/CollateralDeficitStrategy.js.map +1 -1
- package/dist/strategy/CollateralDeficitStrategy.test.js +135 -2
- package/dist/strategy/CollateralDeficitStrategy.test.js.map +1 -1
- package/dist/strategy/CompositeStrategy.test.js +13 -0
- package/dist/strategy/CompositeStrategy.test.js.map +1 -1
- package/dist/strategy/MinAmountStrategy.test.js +4 -0
- package/dist/strategy/MinAmountStrategy.test.js.map +1 -1
- package/dist/strategy/StrategyFactory.d.ts +2 -1
- package/dist/strategy/StrategyFactory.d.ts.map +1 -1
- package/dist/strategy/StrategyFactory.js +24 -8
- package/dist/strategy/StrategyFactory.js.map +1 -1
- package/dist/strategy/WeightedStrategy.test.js +6 -0
- package/dist/strategy/WeightedStrategy.test.js.map +1 -1
- package/dist/test/helpers.d.ts +8 -7
- package/dist/test/helpers.d.ts.map +1 -1
- package/dist/test/helpers.js +23 -5
- package/dist/test/helpers.js.map +1 -1
- package/dist/test/lifiMocks.d.ts +51 -0
- package/dist/test/lifiMocks.d.ts.map +1 -0
- package/dist/test/lifiMocks.js +130 -0
- package/dist/test/lifiMocks.js.map +1 -0
- package/dist/tracking/ActionTracker.d.ts +34 -1
- package/dist/tracking/ActionTracker.d.ts.map +1 -1
- package/dist/tracking/ActionTracker.js +233 -26
- package/dist/tracking/ActionTracker.js.map +1 -1
- package/dist/tracking/ActionTracker.test.js +380 -19
- package/dist/tracking/ActionTracker.test.js.map +1 -1
- package/dist/tracking/IActionTracker.d.ts +48 -3
- package/dist/tracking/IActionTracker.d.ts.map +1 -1
- package/dist/tracking/InflightContextAdapter.d.ts.map +1 -1
- package/dist/tracking/InflightContextAdapter.js +24 -7
- package/dist/tracking/InflightContextAdapter.js.map +1 -1
- package/dist/tracking/InflightContextAdapter.test.js +7 -4
- package/dist/tracking/InflightContextAdapter.test.js.map +1 -1
- package/dist/tracking/types.d.ts +33 -2
- package/dist/tracking/types.d.ts.map +1 -1
- package/dist/utils/ExplorerClient.d.ts +3 -1
- package/dist/utils/ExplorerClient.d.ts.map +1 -1
- package/dist/utils/ExplorerClient.js +16 -8
- package/dist/utils/ExplorerClient.js.map +1 -1
- package/dist/utils/bridgeUtils.d.ts +27 -4
- package/dist/utils/bridgeUtils.d.ts.map +1 -1
- package/dist/utils/bridgeUtils.js +38 -0
- package/dist/utils/bridgeUtils.js.map +1 -1
- package/dist/utils/bridgeUtils.test.js +9 -0
- package/dist/utils/bridgeUtils.test.js.map +1 -1
- package/dist/utils/gasEstimation.d.ts +65 -0
- package/dist/utils/gasEstimation.d.ts.map +1 -0
- package/dist/utils/gasEstimation.js +176 -0
- package/dist/utils/gasEstimation.js.map +1 -0
- package/dist/utils/tokenUtils.d.ts +9 -1
- package/dist/utils/tokenUtils.d.ts.map +1 -1
- package/dist/utils/tokenUtils.js +11 -0
- package/dist/utils/tokenUtils.js.map +1 -1
- package/package.json +9 -7
- package/src/bridges/LiFiBridge.ts +538 -0
- package/src/config/RebalancerConfig.test.ts +162 -0
- package/src/config/RebalancerConfig.ts +21 -3
- package/src/config/types.ts +147 -10
- package/src/core/InventoryRebalancer.test.ts +1721 -0
- package/src/core/InventoryRebalancer.ts +1265 -0
- package/src/core/Rebalancer.test.ts +84 -30
- package/src/core/Rebalancer.ts +144 -23
- package/src/core/RebalancerOrchestrator.test.ts +869 -0
- package/src/core/RebalancerOrchestrator.ts +146 -95
- package/src/core/RebalancerService.test.ts +86 -124
- package/src/core/RebalancerService.ts +67 -33
- package/src/e2e/collateral-deficit.e2e-test.ts +2 -4
- package/src/e2e/composite.e2e-test.ts +5 -5
- package/src/e2e/harness/BridgeSetup.ts +28 -1
- package/src/e2e/harness/ForkIndexer.ts +1 -0
- package/src/e2e/harness/TestHelpers.ts +1 -4
- package/src/e2e/harness/TestRebalancer.ts +10 -7
- package/src/e2e/minAmount.e2e-test.ts +1 -2
- package/src/e2e/weighted.e2e-test.ts +1 -2
- package/src/factories/RebalancerContextFactory.ts +294 -24
- package/src/index.ts +22 -5
- package/src/interfaces/IExternalBridge.ts +115 -0
- package/src/interfaces/IMonitor.ts +1 -0
- package/src/interfaces/IRebalancer.ts +45 -29
- package/src/interfaces/IStrategy.ts +50 -3
- package/src/metrics/PriceGetter.ts +1 -1
- package/src/monitor/Monitor.ts +81 -2
- package/src/service.ts +59 -18
- package/src/strategy/BaseStrategy.ts +77 -24
- package/src/strategy/CollateralDeficitStrategy.test.ts +181 -4
- package/src/strategy/CollateralDeficitStrategy.ts +42 -15
- package/src/strategy/CompositeStrategy.test.ts +13 -0
- package/src/strategy/MinAmountStrategy.test.ts +4 -0
- package/src/strategy/StrategyFactory.ts +33 -6
- package/src/strategy/WeightedStrategy.test.ts +6 -0
- package/src/test/helpers.ts +39 -14
- package/src/test/lifiMocks.ts +174 -0
- package/src/tracking/ActionTracker.test.ts +443 -19
- package/src/tracking/ActionTracker.ts +339 -28
- package/src/tracking/IActionTracker.ts +59 -3
- package/src/tracking/InflightContextAdapter.test.ts +7 -4
- package/src/tracking/InflightContextAdapter.ts +42 -9
- package/src/tracking/types.ts +45 -2
- package/src/utils/ExplorerClient.ts +27 -10
- package/src/utils/bridgeUtils.test.ts +9 -0
- package/src/utils/bridgeUtils.ts +75 -6
- package/src/utils/gasEstimation.ts +272 -0
- package/src/utils/tokenUtils.ts +12 -0
- package/dist/tracking/index.d.ts +0 -7
- package/dist/tracking/index.d.ts.map +0 -1
- package/dist/tracking/index.js +0 -6
- package/dist/tracking/index.js.map +0 -1
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -5
- package/dist/utils/index.js.map +0 -1
- package/src/tracking/index.ts +0 -36
- package/src/utils/index.ts +0 -4
|
@@ -1,52 +1,81 @@
|
|
|
1
1
|
import { Logger } from 'pino';
|
|
2
2
|
|
|
3
|
-
import { type MultiProvider } from '@hyperlane-xyz/sdk';
|
|
4
|
-
|
|
5
3
|
import { RebalancerConfig } from '../config/RebalancerConfig.js';
|
|
6
4
|
import { getStrategyChainNames } from '../config/types.js';
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
5
|
+
import type { ExternalBridgeRegistry } from '../interfaces/IExternalBridge.js';
|
|
6
|
+
import {
|
|
7
|
+
type ConfirmedBlockTags,
|
|
8
|
+
type MonitorEvent,
|
|
9
|
+
} from '../interfaces/IMonitor.js';
|
|
10
|
+
import type {
|
|
11
|
+
ExecutionResult,
|
|
12
|
+
IRebalancer,
|
|
13
|
+
RebalancerType,
|
|
14
|
+
} from '../interfaces/IRebalancer.js';
|
|
9
15
|
import type { IStrategy, StrategyRoute } from '../interfaces/IStrategy.js';
|
|
10
|
-
import { Metrics } from '../metrics/Metrics.js';
|
|
11
16
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
} from '../
|
|
17
|
+
isInventoryRoute,
|
|
18
|
+
isMovableCollateralRoute,
|
|
19
|
+
} from '../interfaces/IStrategy.js';
|
|
20
|
+
import { Metrics } from '../metrics/Metrics.js';
|
|
21
|
+
import type { IActionTracker } from '../tracking/IActionTracker.js';
|
|
22
|
+
import { InflightContextAdapter } from '../tracking/InflightContextAdapter.js';
|
|
15
23
|
import { getRawBalances } from '../utils/balanceUtils.js';
|
|
16
24
|
|
|
25
|
+
import { InventoryRebalancer } from './InventoryRebalancer.js';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Result of a rebalancing cycle.
|
|
29
|
+
* executedCount/failedCount: Counts from movable_collateral execution ONLY
|
|
30
|
+
*/
|
|
31
|
+
export interface CycleResult {
|
|
32
|
+
balances: Record<string, bigint>;
|
|
33
|
+
proposedRoutes: StrategyRoute[];
|
|
34
|
+
executedCount: number;
|
|
35
|
+
failedCount: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
17
38
|
export interface RebalancerOrchestratorDeps {
|
|
18
39
|
strategy: IStrategy;
|
|
19
|
-
rebalancer: IRebalancer | undefined;
|
|
20
40
|
actionTracker: IActionTracker;
|
|
21
41
|
inflightContextAdapter: InflightContextAdapter;
|
|
22
|
-
multiProvider: MultiProvider;
|
|
23
42
|
rebalancerConfig: RebalancerConfig;
|
|
24
43
|
logger: Logger;
|
|
44
|
+
|
|
45
|
+
rebalancers: IRebalancer[];
|
|
46
|
+
|
|
47
|
+
externalBridgeRegistry?: Partial<ExternalBridgeRegistry>;
|
|
25
48
|
metrics?: Metrics;
|
|
26
49
|
}
|
|
27
50
|
|
|
28
51
|
export class RebalancerOrchestrator {
|
|
29
52
|
private readonly strategy: IStrategy;
|
|
30
|
-
private readonly rebalancer: IRebalancer | undefined;
|
|
31
53
|
private readonly actionTracker: IActionTracker;
|
|
32
54
|
private readonly inflightContextAdapter: InflightContextAdapter;
|
|
33
|
-
private readonly multiProvider: MultiProvider;
|
|
34
55
|
private readonly rebalancerConfig: RebalancerConfig;
|
|
35
56
|
private readonly logger: Logger;
|
|
57
|
+
private readonly rebalancersByType: Map<RebalancerType, IRebalancer>;
|
|
58
|
+
private readonly externalBridgeRegistry?: Partial<ExternalBridgeRegistry>;
|
|
36
59
|
private readonly metrics?: Metrics;
|
|
37
60
|
|
|
38
61
|
constructor(deps: RebalancerOrchestratorDeps) {
|
|
39
62
|
this.strategy = deps.strategy;
|
|
40
|
-
this.rebalancer = deps.rebalancer;
|
|
41
63
|
this.actionTracker = deps.actionTracker;
|
|
42
64
|
this.inflightContextAdapter = deps.inflightContextAdapter;
|
|
43
|
-
this.multiProvider = deps.multiProvider;
|
|
44
65
|
this.rebalancerConfig = deps.rebalancerConfig;
|
|
45
66
|
this.logger = deps.logger;
|
|
67
|
+
this.rebalancersByType = new Map(
|
|
68
|
+
deps.rebalancers.map((r) => [r.rebalancerType, r]),
|
|
69
|
+
);
|
|
70
|
+
this.externalBridgeRegistry = deps.externalBridgeRegistry;
|
|
46
71
|
this.metrics = deps.metrics;
|
|
47
72
|
}
|
|
48
73
|
|
|
49
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Execute a single rebalancing cycle.
|
|
76
|
+
* Processes monitor event, evaluates strategy, and executes routes.
|
|
77
|
+
*/
|
|
78
|
+
async executeCycle(event: MonitorEvent): Promise<CycleResult> {
|
|
50
79
|
this.logger.info('Polling cycle started');
|
|
51
80
|
|
|
52
81
|
const { metrics } = this;
|
|
@@ -74,12 +103,17 @@ export class RebalancerOrchestrator {
|
|
|
74
103
|
'Router balances',
|
|
75
104
|
);
|
|
76
105
|
|
|
106
|
+
// Get inflight context for strategy decision-making
|
|
77
107
|
const inflightContext = await this.getInflightContext();
|
|
108
|
+
|
|
78
109
|
const strategyRoutes = this.strategy.getRebalancingRoutes(
|
|
79
110
|
rawBalances,
|
|
80
111
|
inflightContext,
|
|
81
112
|
);
|
|
82
113
|
|
|
114
|
+
let executedCount = 0;
|
|
115
|
+
let failedCount = 0;
|
|
116
|
+
|
|
83
117
|
if (strategyRoutes.length > 0) {
|
|
84
118
|
this.logger.info(
|
|
85
119
|
{
|
|
@@ -92,18 +126,33 @@ export class RebalancerOrchestrator {
|
|
|
92
126
|
'Routes proposed',
|
|
93
127
|
);
|
|
94
128
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
129
|
+
const results = await this.executeWithTracking(strategyRoutes, event);
|
|
130
|
+
executedCount = results.executedCount;
|
|
131
|
+
failedCount = results.failedCount;
|
|
98
132
|
} else {
|
|
99
133
|
this.logger.info('No rebalancing needed');
|
|
100
134
|
}
|
|
101
135
|
|
|
136
|
+
const inventoryRebalancer = this.rebalancersByType.get('inventory');
|
|
137
|
+
if (inventoryRebalancer && strategyRoutes.length === 0) {
|
|
138
|
+
await this.executeRoutes([], inventoryRebalancer, event);
|
|
139
|
+
}
|
|
140
|
+
|
|
102
141
|
this.logger.info('Polling cycle completed');
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
balances: rawBalances,
|
|
145
|
+
proposedRoutes: strategyRoutes,
|
|
146
|
+
executedCount,
|
|
147
|
+
failedCount,
|
|
148
|
+
};
|
|
103
149
|
}
|
|
104
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Sync action tracker with current chain state.
|
|
153
|
+
*/
|
|
105
154
|
private async syncActionTracker(
|
|
106
|
-
confirmedBlockTags
|
|
155
|
+
confirmedBlockTags?: ConfirmedBlockTags,
|
|
107
156
|
): Promise<void> {
|
|
108
157
|
try {
|
|
109
158
|
await Promise.all([
|
|
@@ -111,6 +160,14 @@ export class RebalancerOrchestrator {
|
|
|
111
160
|
this.actionTracker.syncRebalanceIntents(),
|
|
112
161
|
this.actionTracker.syncRebalanceActions(confirmedBlockTags),
|
|
113
162
|
]);
|
|
163
|
+
|
|
164
|
+
// Sync inventory movement actions via external bridge API
|
|
165
|
+
if (this.externalBridgeRegistry) {
|
|
166
|
+
await this.actionTracker.syncInventoryMovementActions(
|
|
167
|
+
this.externalBridgeRegistry,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
114
171
|
await this.actionTracker.logStoreContents();
|
|
115
172
|
} catch (error) {
|
|
116
173
|
this.logger.warn(
|
|
@@ -120,103 +177,97 @@ export class RebalancerOrchestrator {
|
|
|
120
177
|
}
|
|
121
178
|
}
|
|
122
179
|
|
|
180
|
+
/**
|
|
181
|
+
* Get inflight context for strategy decision-making
|
|
182
|
+
*/
|
|
123
183
|
private async getInflightContext() {
|
|
124
184
|
return this.inflightContextAdapter.getInflightContext();
|
|
125
185
|
}
|
|
126
186
|
|
|
127
187
|
private async executeWithTracking(
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
188
|
+
routes: StrategyRoute[],
|
|
189
|
+
event: MonitorEvent,
|
|
190
|
+
): Promise<{ executedCount: number; failedCount: number }> {
|
|
191
|
+
const movableCollateral = routes.filter(isMovableCollateralRoute);
|
|
192
|
+
const inventory = routes.filter(isInventoryRoute);
|
|
193
|
+
|
|
194
|
+
let executedCount = 0;
|
|
195
|
+
let failedCount = 0;
|
|
196
|
+
|
|
197
|
+
const movableCollateralRebalancer =
|
|
198
|
+
this.rebalancersByType.get('movableCollateral');
|
|
199
|
+
if (movableCollateral.length > 0 && movableCollateralRebalancer) {
|
|
200
|
+
const results = await this.executeRoutes(
|
|
201
|
+
movableCollateral,
|
|
202
|
+
movableCollateralRebalancer,
|
|
203
|
+
event,
|
|
204
|
+
);
|
|
205
|
+
executedCount = results.filter((r) => r.success).length;
|
|
206
|
+
failedCount = results.filter((r) => !r.success).length;
|
|
133
207
|
}
|
|
134
208
|
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
for (const route of strategyRoutes) {
|
|
139
|
-
const intent = await this.actionTracker.createRebalanceIntent({
|
|
140
|
-
origin: this.multiProvider.getDomainId(route.origin),
|
|
141
|
-
destination: this.multiProvider.getDomainId(route.destination),
|
|
142
|
-
amount: route.amount,
|
|
143
|
-
bridge: route.bridge,
|
|
144
|
-
});
|
|
145
|
-
intentIds.push(intent.id);
|
|
146
|
-
rebalanceRoutes.push({
|
|
147
|
-
...route,
|
|
148
|
-
intentId: intent.id,
|
|
149
|
-
});
|
|
209
|
+
const inventoryRebalancer = this.rebalancersByType.get('inventory');
|
|
210
|
+
if (inventory.length > 0 && inventoryRebalancer) {
|
|
211
|
+
await this.executeRoutes(inventory, inventoryRebalancer, event);
|
|
150
212
|
}
|
|
151
213
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
'Created rebalance intents',
|
|
155
|
-
);
|
|
214
|
+
return { executedCount, failedCount };
|
|
215
|
+
}
|
|
156
216
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
'Rebalancer cycle completed with failures',
|
|
166
|
-
);
|
|
167
|
-
} else {
|
|
168
|
-
this.metrics?.recordRebalancerSuccess();
|
|
169
|
-
this.logger.info('Rebalancer completed a cycle successfully');
|
|
170
|
-
}
|
|
171
|
-
} catch (error) {
|
|
172
|
-
this.metrics?.recordRebalancerFailure();
|
|
173
|
-
this.logger.error({ error }, 'Error while rebalancing');
|
|
174
|
-
await Promise.all(
|
|
175
|
-
intentIds.map((id) => this.actionTracker.failRebalanceIntent(id)),
|
|
217
|
+
private async executeRoutes(
|
|
218
|
+
routes: StrategyRoute[],
|
|
219
|
+
rebalancer: IRebalancer,
|
|
220
|
+
event: MonitorEvent,
|
|
221
|
+
): Promise<ExecutionResult[]> {
|
|
222
|
+
if (rebalancer.rebalancerType === 'inventory' && event.inventoryBalances) {
|
|
223
|
+
(rebalancer as InventoryRebalancer).setInventoryBalances(
|
|
224
|
+
event.inventoryBalances,
|
|
176
225
|
);
|
|
177
|
-
return;
|
|
178
226
|
}
|
|
179
227
|
|
|
180
|
-
|
|
181
|
-
|
|
228
|
+
try {
|
|
229
|
+
const results = await rebalancer.rebalance(routes);
|
|
182
230
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
intentId,
|
|
191
|
-
origin: this.multiProvider.getDomainId(result.route.origin),
|
|
192
|
-
destination: this.multiProvider.getDomainId(result.route.destination),
|
|
193
|
-
amount: result.route.amount,
|
|
194
|
-
messageId: result.messageId,
|
|
195
|
-
txHash: result.txHash,
|
|
196
|
-
});
|
|
231
|
+
const successful = results.filter((r) => r.success);
|
|
232
|
+
const failed = results.filter((r) => !r.success);
|
|
233
|
+
|
|
234
|
+
if (successful.length > 0) {
|
|
235
|
+
if (rebalancer.rebalancerType === 'movableCollateral') {
|
|
236
|
+
this.metrics?.recordRebalancerSuccess();
|
|
237
|
+
}
|
|
197
238
|
this.logger.info(
|
|
198
|
-
{
|
|
199
|
-
|
|
200
|
-
messageId: result.messageId,
|
|
201
|
-
txHash: result.txHash,
|
|
202
|
-
origin: result.route.origin,
|
|
203
|
-
destination: result.route.destination,
|
|
204
|
-
},
|
|
205
|
-
'Rebalance action created successfully',
|
|
239
|
+
{ count: successful.length, type: rebalancer.rebalancerType },
|
|
240
|
+
'Rebalancer completed successfully',
|
|
206
241
|
);
|
|
207
|
-
}
|
|
208
|
-
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (failed.length > 0) {
|
|
245
|
+
if (rebalancer.rebalancerType === 'movableCollateral') {
|
|
246
|
+
this.metrics?.recordRebalancerFailure();
|
|
247
|
+
}
|
|
209
248
|
this.logger.warn(
|
|
210
249
|
{
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
250
|
+
count: failed.length,
|
|
251
|
+
type: rebalancer.rebalancerType,
|
|
252
|
+
errors: failed.map((r) => ({
|
|
253
|
+
route: `${r.route.origin} -> ${r.route.destination}`,
|
|
254
|
+
error: r.error,
|
|
255
|
+
})),
|
|
216
256
|
},
|
|
217
|
-
'
|
|
257
|
+
'Some routes failed',
|
|
218
258
|
);
|
|
219
259
|
}
|
|
260
|
+
|
|
261
|
+
return results;
|
|
262
|
+
} catch (error: any) {
|
|
263
|
+
if (rebalancer.rebalancerType === 'movableCollateral') {
|
|
264
|
+
this.metrics?.recordRebalancerFailure();
|
|
265
|
+
}
|
|
266
|
+
this.logger.error(
|
|
267
|
+
{ error, type: rebalancer.rebalancerType },
|
|
268
|
+
'Error while executing routes',
|
|
269
|
+
);
|
|
270
|
+
return [];
|
|
220
271
|
}
|
|
221
272
|
}
|
|
222
273
|
}
|