@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
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { Counter, Gauge, Registry } from 'prom-client';
|
|
2
|
+
import { TokenStandard } from '@hyperlane-xyz/sdk';
|
|
3
|
+
export const metricsRegister = new Registry();
|
|
4
|
+
const warpRouteMetricLabels = [
|
|
5
|
+
'chain_name',
|
|
6
|
+
'token_address',
|
|
7
|
+
'token_name',
|
|
8
|
+
'wallet_address',
|
|
9
|
+
'token_standard',
|
|
10
|
+
'warp_route_id',
|
|
11
|
+
'related_chain_names',
|
|
12
|
+
];
|
|
13
|
+
const warpRouteTokenBalance = new Gauge({
|
|
14
|
+
name: 'hyperlane_warp_route_token_balance',
|
|
15
|
+
help: 'HypERC20 token balance of a Warp Route',
|
|
16
|
+
registers: [metricsRegister],
|
|
17
|
+
labelNames: warpRouteMetricLabels,
|
|
18
|
+
});
|
|
19
|
+
const warpRouteCollateralValue = new Gauge({
|
|
20
|
+
name: 'hyperlane_warp_route_collateral_value',
|
|
21
|
+
help: 'Total value of collateral held in a HypERC20Collateral or HypNative contract of a Warp Route',
|
|
22
|
+
registers: [metricsRegister],
|
|
23
|
+
labelNames: warpRouteMetricLabels,
|
|
24
|
+
});
|
|
25
|
+
const warpRouteValueAtRiskMetricLabels = [
|
|
26
|
+
'chain_name',
|
|
27
|
+
'collateral_chain_name',
|
|
28
|
+
'token_address',
|
|
29
|
+
'token_name',
|
|
30
|
+
'collateral_token_standard',
|
|
31
|
+
'warp_route_id',
|
|
32
|
+
];
|
|
33
|
+
const warpRouteValueAtRisk = new Gauge({
|
|
34
|
+
name: 'hyperlane_warp_route_value_at_risk',
|
|
35
|
+
help: 'Value at risk on chain for a given Warp Route',
|
|
36
|
+
registers: [metricsRegister],
|
|
37
|
+
labelNames: warpRouteValueAtRiskMetricLabels,
|
|
38
|
+
});
|
|
39
|
+
export const rebalancerExecutionTotal = new Counter({
|
|
40
|
+
name: 'hyperlane_rebalancer_executions_total',
|
|
41
|
+
help: 'Total number of rebalance execution attempts.',
|
|
42
|
+
registers: [metricsRegister],
|
|
43
|
+
labelNames: ['warp_route_id', 'succeeded'],
|
|
44
|
+
});
|
|
45
|
+
export const rebalancerExecutionAmount = new Counter({
|
|
46
|
+
name: 'hyperlane_rebalancer_execution_amount',
|
|
47
|
+
help: 'Total amount of tokens rebalanced.',
|
|
48
|
+
registers: [metricsRegister],
|
|
49
|
+
labelNames: ['warp_route_id', 'origin', 'destination', 'token'],
|
|
50
|
+
});
|
|
51
|
+
export const rebalancerPollingErrorsTotal = new Counter({
|
|
52
|
+
name: 'hyperlane_rebalancer_polling_errors_total',
|
|
53
|
+
help: 'Total number of errors during the monitor polling phase.',
|
|
54
|
+
registers: [metricsRegister],
|
|
55
|
+
labelNames: ['warp_route_id'],
|
|
56
|
+
});
|
|
57
|
+
const walletBalanceGauge = new Gauge({
|
|
58
|
+
// Mirror the rust/main/ethers-prometheus `wallet_balance` gauge metric.
|
|
59
|
+
name: 'hyperlane_wallet_balance',
|
|
60
|
+
help: 'Current balance of a wallet for a token',
|
|
61
|
+
registers: [metricsRegister],
|
|
62
|
+
labelNames: [
|
|
63
|
+
'chain',
|
|
64
|
+
'wallet_address',
|
|
65
|
+
'wallet_name',
|
|
66
|
+
'token_address',
|
|
67
|
+
'token_symbol',
|
|
68
|
+
'token_name',
|
|
69
|
+
],
|
|
70
|
+
});
|
|
71
|
+
const xERC20LimitsGauge = new Gauge({
|
|
72
|
+
name: 'hyperlane_xerc20_limits',
|
|
73
|
+
help: 'Current minting and burning limits of xERC20 tokens',
|
|
74
|
+
registers: [metricsRegister],
|
|
75
|
+
labelNames: [
|
|
76
|
+
'chain_name',
|
|
77
|
+
'limit_type',
|
|
78
|
+
'token_name',
|
|
79
|
+
'bridge_address',
|
|
80
|
+
'token_address',
|
|
81
|
+
'bridge_label',
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
export function updateTokenBalanceMetrics(warpCore, token, balanceInfo, warpRouteId, logger) {
|
|
85
|
+
const allChains = warpCore.getTokenChains().sort();
|
|
86
|
+
const relatedChains = allChains.filter((chainName) => chainName !== token.chainName);
|
|
87
|
+
const metrics = {
|
|
88
|
+
chain_name: token.chainName,
|
|
89
|
+
token_address: balanceInfo.tokenAddress,
|
|
90
|
+
token_name: token.name,
|
|
91
|
+
wallet_address:
|
|
92
|
+
// the balance for an EvmHypERC20 token is returned as the total supply of the xERC20 token,
|
|
93
|
+
// therefore we set the wallet address to the token address,
|
|
94
|
+
// we follow the same pattern or synthetic tokens
|
|
95
|
+
token.standard !== TokenStandard.EvmHypXERC20
|
|
96
|
+
? token.addressOrDenom
|
|
97
|
+
: balanceInfo.tokenAddress,
|
|
98
|
+
token_standard:
|
|
99
|
+
// as we are reporting the total supply for clarity we report the standard as xERC20
|
|
100
|
+
token.standard !== TokenStandard.EvmHypXERC20 ? token.standard : 'xERC20',
|
|
101
|
+
warp_route_id: warpRouteId,
|
|
102
|
+
// TODO: consider deprecating this label given that we have the value at risk metric
|
|
103
|
+
related_chain_names: relatedChains.join(','),
|
|
104
|
+
};
|
|
105
|
+
warpRouteTokenBalance.labels(metrics).set(balanceInfo.balance);
|
|
106
|
+
logger.info({
|
|
107
|
+
labels: metrics,
|
|
108
|
+
balance: balanceInfo.balance,
|
|
109
|
+
}, 'Wallet balance updated for token');
|
|
110
|
+
if (balanceInfo.valueUSD) {
|
|
111
|
+
// TODO: consider deprecating this metric in favor of the value at risk metric
|
|
112
|
+
warpRouteCollateralValue.labels(metrics).set(balanceInfo.valueUSD);
|
|
113
|
+
logger.info({
|
|
114
|
+
labels: metrics,
|
|
115
|
+
valueUSD: balanceInfo.valueUSD,
|
|
116
|
+
}, 'Wallet value updated for token');
|
|
117
|
+
for (const chainName of allChains) {
|
|
118
|
+
const labels = {
|
|
119
|
+
chain_name: chainName,
|
|
120
|
+
collateral_chain_name: metrics.chain_name,
|
|
121
|
+
token_address: metrics.token_address,
|
|
122
|
+
token_name: metrics.token_name,
|
|
123
|
+
collateral_token_standard: metrics.token_standard,
|
|
124
|
+
warp_route_id: metrics.warp_route_id,
|
|
125
|
+
};
|
|
126
|
+
warpRouteValueAtRisk.labels(labels).set(balanceInfo.valueUSD);
|
|
127
|
+
logger.info({
|
|
128
|
+
labels,
|
|
129
|
+
valueUSD: balanceInfo.valueUSD,
|
|
130
|
+
}, `Value at risk on ${chainName} updated for token`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// TODO: This does not need to be a separate function, we can redefine updateTokenBalanceMetrics to be generic
|
|
135
|
+
// TODO: Consider adding some identifier for the managedLockbox contract, could be adding collateralName label for lockboxes, this would help different manages lockboxes that has a different collateral token
|
|
136
|
+
export function updateManagedLockboxBalanceMetrics(warpCore, chainName, tokenName, tokenAddress, lockBoxAddress, balanceInfo, warpRouteId, logger) {
|
|
137
|
+
const metrics = {
|
|
138
|
+
chain_name: chainName,
|
|
139
|
+
token_address: tokenAddress,
|
|
140
|
+
token_name: tokenName,
|
|
141
|
+
wallet_address: lockBoxAddress,
|
|
142
|
+
token_standard: 'EvmManagedLockbox', // TODO: we should eventually a new TokenStandard for this
|
|
143
|
+
warp_route_id: warpRouteId,
|
|
144
|
+
related_chain_names: warpCore
|
|
145
|
+
.getTokenChains()
|
|
146
|
+
.filter((_chainName) => _chainName !== chainName)
|
|
147
|
+
.sort()
|
|
148
|
+
.join(','),
|
|
149
|
+
};
|
|
150
|
+
warpRouteTokenBalance.labels(metrics).set(balanceInfo.balance);
|
|
151
|
+
logger.info({
|
|
152
|
+
labels: metrics,
|
|
153
|
+
balance: balanceInfo.balance,
|
|
154
|
+
}, 'ManagedLockbox collateral balance updated');
|
|
155
|
+
if (balanceInfo.valueUSD) {
|
|
156
|
+
warpRouteCollateralValue.labels(metrics).set(balanceInfo.valueUSD);
|
|
157
|
+
logger.info({
|
|
158
|
+
labels: metrics,
|
|
159
|
+
valueUSD: balanceInfo.valueUSD,
|
|
160
|
+
}, 'ManagedLockbox value updated for token');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export function updateNativeWalletBalanceMetrics(balance, logger) {
|
|
164
|
+
walletBalanceGauge
|
|
165
|
+
.labels({
|
|
166
|
+
chain: balance.chain,
|
|
167
|
+
wallet_address: balance.walletAddress,
|
|
168
|
+
wallet_name: balance.walletName,
|
|
169
|
+
token_symbol: 'Native',
|
|
170
|
+
token_name: 'Native',
|
|
171
|
+
})
|
|
172
|
+
.set(balance.balance);
|
|
173
|
+
logger.info({
|
|
174
|
+
balanceInfo: balance,
|
|
175
|
+
}, 'Native wallet balance updated');
|
|
176
|
+
}
|
|
177
|
+
export function updateXERC20LimitsMetrics(token, limits, bridgeAddress, bridgeLabel, xERC20Address, logger) {
|
|
178
|
+
const labels = {
|
|
179
|
+
chain_name: token.chainName,
|
|
180
|
+
token_name: token.name,
|
|
181
|
+
bridge_address: bridgeAddress,
|
|
182
|
+
token_address: xERC20Address,
|
|
183
|
+
bridge_label: bridgeLabel,
|
|
184
|
+
};
|
|
185
|
+
for (const [limitType, limit] of Object.entries(limits)) {
|
|
186
|
+
xERC20LimitsGauge
|
|
187
|
+
.labels({
|
|
188
|
+
...labels,
|
|
189
|
+
limit_type: limitType,
|
|
190
|
+
})
|
|
191
|
+
.set(limit);
|
|
192
|
+
}
|
|
193
|
+
logger.info({
|
|
194
|
+
...labels,
|
|
195
|
+
limits,
|
|
196
|
+
}, 'xERC20 limits updated for bridge on token');
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/metrics/scripts/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ChainName } from '@hyperlane-xyz/sdk';
|
|
2
|
+
import { Address } from '@hyperlane-xyz/utils';
|
|
3
|
+
export interface XERC20Limit {
|
|
4
|
+
mint: number;
|
|
5
|
+
burn: number;
|
|
6
|
+
mintMax: number;
|
|
7
|
+
burnMax: number;
|
|
8
|
+
}
|
|
9
|
+
export interface XERC20Info {
|
|
10
|
+
limits: XERC20Limit;
|
|
11
|
+
xERC20Address: Address;
|
|
12
|
+
}
|
|
13
|
+
export interface WarpRouteBalance {
|
|
14
|
+
balance: number;
|
|
15
|
+
valueUSD?: number;
|
|
16
|
+
tokenAddress: Address;
|
|
17
|
+
}
|
|
18
|
+
export interface NativeWalletBalance {
|
|
19
|
+
chain: ChainName;
|
|
20
|
+
walletAddress: Address;
|
|
21
|
+
walletName: string;
|
|
22
|
+
balance: number;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="pino-http" />
|
|
3
|
+
import http from 'http';
|
|
4
|
+
import { Registry } from 'prom-client';
|
|
5
|
+
/**
|
|
6
|
+
* Start a simple HTTP server to host metrics. This just takes the registry and dumps the text
|
|
7
|
+
* string to people who request `GET /metrics`.
|
|
8
|
+
*
|
|
9
|
+
* PROMETHEUS_PORT env var is used to determine what port to host on, defaults to 9090.
|
|
10
|
+
*/
|
|
11
|
+
export declare function startMetricsServer(register: Registry): http.Server;
|
|
12
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/metrics/utils/metrics.ts"],"names":[],"mappings":";;AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMvC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,CAmBlE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import http from 'http';
|
|
2
|
+
import { rootLogger } from '@hyperlane-xyz/utils';
|
|
3
|
+
const logger = rootLogger.child({ module: 'metrics' });
|
|
4
|
+
/**
|
|
5
|
+
* Start a simple HTTP server to host metrics. This just takes the registry and dumps the text
|
|
6
|
+
* string to people who request `GET /metrics`.
|
|
7
|
+
*
|
|
8
|
+
* PROMETHEUS_PORT env var is used to determine what port to host on, defaults to 9090.
|
|
9
|
+
*/
|
|
10
|
+
export function startMetricsServer(register) {
|
|
11
|
+
return http
|
|
12
|
+
.createServer((req, res) => {
|
|
13
|
+
if (req.url != '/metrics') {
|
|
14
|
+
return res.writeHead(404, 'Invalid url').end();
|
|
15
|
+
}
|
|
16
|
+
if (req.method != 'GET') {
|
|
17
|
+
return res.writeHead(405, 'Invalid method').end();
|
|
18
|
+
}
|
|
19
|
+
return register
|
|
20
|
+
.metrics()
|
|
21
|
+
.then((metricsStr) => {
|
|
22
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' }).end(metricsStr);
|
|
23
|
+
})
|
|
24
|
+
.catch((err) => logger.error(err));
|
|
25
|
+
})
|
|
26
|
+
.listen(parseInt(process.env['PROMETHEUS_PORT'] || '9090'));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/metrics/utils/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACnD,OAAO,IAAI;SACR,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,GAAG,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC;QACjD,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,GAAG,EAAE,CAAC;QACpD,CAAC;QAED,OAAO,QAAQ;aACZ,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;YACnB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvE,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC;SACD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Logger } from 'pino';
|
|
2
|
+
import type { WarpCore } from '@hyperlane-xyz/sdk';
|
|
3
|
+
import { type IMonitor, type MonitorEvent, MonitorEventType } from '../interfaces/IMonitor.js';
|
|
4
|
+
/**
|
|
5
|
+
* Simple monitor implementation that polls warp route collateral balances and emits them as MonitorEvent.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Monitor implements IMonitor {
|
|
8
|
+
private readonly checkFrequency;
|
|
9
|
+
private readonly warpCore;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly emitter;
|
|
12
|
+
private isMonitorRunning;
|
|
13
|
+
private resolveStop;
|
|
14
|
+
private stopPromise;
|
|
15
|
+
/**
|
|
16
|
+
* @param checkFrequency - The frequency to poll balances in ms.
|
|
17
|
+
*/
|
|
18
|
+
constructor(checkFrequency: number, warpCore: WarpCore, logger: Logger);
|
|
19
|
+
on(eventName: MonitorEventType.TokenInfo, fn: (event: MonitorEvent) => void): this;
|
|
20
|
+
on(eventName: MonitorEventType.Error, fn: (event: Error) => void): this;
|
|
21
|
+
on(eventName: MonitorEventType.Start, fn: () => void): this;
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
private getTokenBridgedSupply;
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Monitor.d.ts","sourceRoot":"","sources":["../../src/monitor/Monitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,KAAK,EAAS,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,gBAAgB,EAGjB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,qBAAa,OAAQ,YAAW,QAAQ;IAUpC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAA8B;IAEjD;;OAEG;gBAEgB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM;IAIjC,EAAE,CACA,SAAS,EAAE,gBAAgB,CAAC,SAAS,EACrC,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAChC,IAAI;IACP,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IACvE,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAMrD,KAAK;YAgFG,qBAAqB;IAgCnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBtB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import EventEmitter from 'events';
|
|
2
|
+
import { sleep } from '@hyperlane-xyz/utils';
|
|
3
|
+
import { MonitorEventType, MonitorPollingError, MonitorStartError, } from '../interfaces/IMonitor.js';
|
|
4
|
+
/**
|
|
5
|
+
* Simple monitor implementation that polls warp route collateral balances and emits them as MonitorEvent.
|
|
6
|
+
*/
|
|
7
|
+
export class Monitor {
|
|
8
|
+
checkFrequency;
|
|
9
|
+
warpCore;
|
|
10
|
+
logger;
|
|
11
|
+
emitter = new EventEmitter();
|
|
12
|
+
isMonitorRunning = false;
|
|
13
|
+
resolveStop = null;
|
|
14
|
+
stopPromise = null;
|
|
15
|
+
/**
|
|
16
|
+
* @param checkFrequency - The frequency to poll balances in ms.
|
|
17
|
+
*/
|
|
18
|
+
constructor(checkFrequency, warpCore, logger) {
|
|
19
|
+
this.checkFrequency = checkFrequency;
|
|
20
|
+
this.warpCore = warpCore;
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
}
|
|
23
|
+
on(eventName, fn) {
|
|
24
|
+
this.emitter.on(eventName, fn);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
async start() {
|
|
28
|
+
if (this.isMonitorRunning) {
|
|
29
|
+
// Cannot start the same monitor multiple times
|
|
30
|
+
this.emitter.emit(MonitorEventType.Error, new MonitorStartError('Monitor already running'));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
this.isMonitorRunning = true;
|
|
35
|
+
this.logger.debug({ checkFrequency: this.checkFrequency }, 'Monitor started');
|
|
36
|
+
this.emitter.emit(MonitorEventType.Start);
|
|
37
|
+
while (this.isMonitorRunning) {
|
|
38
|
+
try {
|
|
39
|
+
this.logger.debug('Polling cycle started');
|
|
40
|
+
const event = {
|
|
41
|
+
tokensInfo: [],
|
|
42
|
+
};
|
|
43
|
+
for (const token of this.warpCore.tokens) {
|
|
44
|
+
this.logger.debug({
|
|
45
|
+
chain: token.chainName,
|
|
46
|
+
tokenSymbol: token.symbol,
|
|
47
|
+
tokenAddress: token.addressOrDenom,
|
|
48
|
+
}, 'Checking token');
|
|
49
|
+
const bridgedSupply = await this.getTokenBridgedSupply(token);
|
|
50
|
+
event.tokensInfo.push({
|
|
51
|
+
token,
|
|
52
|
+
bridgedSupply,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Emit the event warp routes info
|
|
56
|
+
this.emitter.emit(MonitorEventType.TokenInfo, event);
|
|
57
|
+
this.logger.debug('Polling cycle completed');
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
this.emitter.emit(MonitorEventType.Error, new MonitorPollingError(`Error during monitor execution cycle: ${error.message}`, error));
|
|
61
|
+
}
|
|
62
|
+
// Wait for the specified check frequency before the next iteration
|
|
63
|
+
await sleep(this.checkFrequency);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
this.emitter.emit(MonitorEventType.Error, new MonitorStartError(`Error starting monitor: ${error.message}`, error));
|
|
68
|
+
}
|
|
69
|
+
// After the loop has been gracefully terminated, we can clean up.
|
|
70
|
+
this.emitter.removeAllListeners();
|
|
71
|
+
this.logger.info('Monitor stopped');
|
|
72
|
+
// If stop() was called, resolve the promise to signal that we're done.
|
|
73
|
+
if (this.resolveStop) {
|
|
74
|
+
this.resolveStop();
|
|
75
|
+
this.resolveStop = null;
|
|
76
|
+
this.stopPromise = null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async getTokenBridgedSupply(token) {
|
|
80
|
+
if (!token.isHypToken()) {
|
|
81
|
+
this.logger.warn({
|
|
82
|
+
chain: token.chainName,
|
|
83
|
+
tokenSymbol: token.symbol,
|
|
84
|
+
tokenAddress: token.addressOrDenom,
|
|
85
|
+
}, 'Cannot get bridged balance for a non-Hyperlane token');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const adapter = token.getHypAdapter(this.warpCore.multiProvider);
|
|
89
|
+
const bridgedSupply = await adapter.getBridgedSupply();
|
|
90
|
+
if (bridgedSupply === undefined) {
|
|
91
|
+
this.logger.warn({
|
|
92
|
+
chain: token.chainName,
|
|
93
|
+
tokenSymbol: token.symbol,
|
|
94
|
+
tokenAddress: token.addressOrDenom,
|
|
95
|
+
}, 'Bridged supply not found for token');
|
|
96
|
+
}
|
|
97
|
+
return bridgedSupply;
|
|
98
|
+
}
|
|
99
|
+
stop() {
|
|
100
|
+
if (!this.isMonitorRunning)
|
|
101
|
+
return Promise.resolve();
|
|
102
|
+
// If stop is already in progress, return the existing promise
|
|
103
|
+
if (this.stopPromise)
|
|
104
|
+
return this.stopPromise;
|
|
105
|
+
this.logger.info('Stopping monitor...');
|
|
106
|
+
// Signal the while loop to terminate after its current iteration
|
|
107
|
+
this.isMonitorRunning = false;
|
|
108
|
+
// Create a promise that will be resolved by the start() method
|
|
109
|
+
// once the loop and cleanup are complete.
|
|
110
|
+
this.stopPromise = new Promise((resolve) => {
|
|
111
|
+
this.resolveStop = resolve;
|
|
112
|
+
});
|
|
113
|
+
return this.stopPromise;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=Monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Monitor.js","sourceRoot":"","sources":["../../src/monitor/Monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":""}
|
package/dist/service.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hyperlane Rebalancer Service Entry Point
|
|
4
|
+
*
|
|
5
|
+
* This is the main entry point for running the rebalancer as a standalone service
|
|
6
|
+
* in Kubernetes or other container environments. It reads configuration from
|
|
7
|
+
* environment variables and files, then starts the rebalancer in daemon mode.
|
|
8
|
+
*
|
|
9
|
+
* Environment Variables:
|
|
10
|
+
* - REBALANCER_CONFIG_FILE: Path to the rebalancer configuration YAML file (required)
|
|
11
|
+
* - HYP_KEY: Private key for signing transactions (required)
|
|
12
|
+
* - COINGECKO_API_KEY: API key for CoinGecko price fetching (optional, for metrics)
|
|
13
|
+
* - CHECK_FREQUENCY: Balance check frequency in ms (default: 60000)
|
|
14
|
+
* - WITH_METRICS: Enable Prometheus metrics (default: "true")
|
|
15
|
+
* - MONITOR_ONLY: Run in monitor-only mode without executing transactions (default: "false")
|
|
16
|
+
* - LOG_LEVEL: Logging level (default: "info") - supported by pino
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* node dist/service.js
|
|
20
|
+
* REBALANCER_CONFIG_FILE=/config/rebalancer.yaml HYP_KEY=0x... node dist/service.js
|
|
21
|
+
*/
|
|
22
|
+
import { Wallet } from 'ethers';
|
|
23
|
+
import fs from 'fs';
|
|
24
|
+
import path from 'path';
|
|
25
|
+
import { fileURLToPath } from 'url';
|
|
26
|
+
import { getRegistry } from '@hyperlane-xyz/registry/fs';
|
|
27
|
+
import { MultiProtocolProvider, MultiProvider } from '@hyperlane-xyz/sdk';
|
|
28
|
+
import { createServiceLogger, rootLogger } from '@hyperlane-xyz/utils';
|
|
29
|
+
import { RebalancerConfig } from './config/RebalancerConfig.js';
|
|
30
|
+
import { RebalancerService } from './core/RebalancerService.js';
|
|
31
|
+
function getVersion() {
|
|
32
|
+
try {
|
|
33
|
+
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
34
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf-8'));
|
|
35
|
+
return packageJson.version;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
rootLogger.warn({ error }, 'Could not read version from package.json');
|
|
39
|
+
return 'unknown';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function main() {
|
|
43
|
+
const VERSION = getVersion();
|
|
44
|
+
// Validate required environment variables
|
|
45
|
+
const configFile = process.env.REBALANCER_CONFIG_FILE;
|
|
46
|
+
if (!configFile) {
|
|
47
|
+
rootLogger.error('REBALANCER_CONFIG_FILE environment variable is required');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const privateKey = process.env.HYP_KEY;
|
|
51
|
+
if (!privateKey) {
|
|
52
|
+
rootLogger.error('HYP_KEY environment variable is required');
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
// Parse optional environment variables
|
|
56
|
+
let checkFrequency = 60000;
|
|
57
|
+
if (process.env.CHECK_FREQUENCY) {
|
|
58
|
+
const parsed = parseInt(process.env.CHECK_FREQUENCY, 10);
|
|
59
|
+
if (isNaN(parsed) || parsed <= 0) {
|
|
60
|
+
rootLogger.error('CHECK_FREQUENCY must be a positive number (milliseconds)');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
checkFrequency = parsed;
|
|
64
|
+
}
|
|
65
|
+
const withMetrics = process.env.WITH_METRICS !== 'false';
|
|
66
|
+
const monitorOnly = process.env.MONITOR_ONLY === 'true';
|
|
67
|
+
const coingeckoApiKey = process.env.COINGECKO_API_KEY;
|
|
68
|
+
// Create logger (uses LOG_LEVEL environment variable for level configuration)
|
|
69
|
+
const logger = await createServiceLogger({
|
|
70
|
+
service: 'rebalancer',
|
|
71
|
+
version: VERSION,
|
|
72
|
+
});
|
|
73
|
+
logger.info({
|
|
74
|
+
version: VERSION,
|
|
75
|
+
configFile,
|
|
76
|
+
checkFrequency,
|
|
77
|
+
withMetrics,
|
|
78
|
+
monitorOnly,
|
|
79
|
+
}, 'Starting Hyperlane Rebalancer Service');
|
|
80
|
+
try {
|
|
81
|
+
// Load rebalancer configuration
|
|
82
|
+
const rebalancerConfig = RebalancerConfig.load(configFile);
|
|
83
|
+
logger.info('✅ Loaded rebalancer configuration');
|
|
84
|
+
// Initialize registry (uses default registry URIs)
|
|
85
|
+
const registry = getRegistry({
|
|
86
|
+
registryUris: [],
|
|
87
|
+
enableProxy: false,
|
|
88
|
+
logger: rootLogger,
|
|
89
|
+
});
|
|
90
|
+
logger.info('✅ Initialized registry');
|
|
91
|
+
// Get chain metadata from registry
|
|
92
|
+
const chainMetadata = await registry.getMetadata();
|
|
93
|
+
logger.info(`✅ Loaded metadata for ${Object.keys(chainMetadata).length} chains`);
|
|
94
|
+
// Create MultiProvider with signer
|
|
95
|
+
const multiProvider = new MultiProvider(chainMetadata);
|
|
96
|
+
const signer = new Wallet(privateKey);
|
|
97
|
+
multiProvider.setSharedSigner(signer);
|
|
98
|
+
logger.info('✅ Initialized MultiProvider with signer');
|
|
99
|
+
// Create MultiProtocolProvider
|
|
100
|
+
const multiProtocolProvider = new MultiProtocolProvider(chainMetadata);
|
|
101
|
+
logger.info('✅ Initialized MultiProtocolProvider');
|
|
102
|
+
// Create the rebalancer service
|
|
103
|
+
const service = new RebalancerService(multiProvider, multiProtocolProvider, registry, rebalancerConfig, {
|
|
104
|
+
mode: 'daemon',
|
|
105
|
+
checkFrequency,
|
|
106
|
+
monitorOnly,
|
|
107
|
+
withMetrics,
|
|
108
|
+
coingeckoApiKey,
|
|
109
|
+
logger,
|
|
110
|
+
version: VERSION,
|
|
111
|
+
});
|
|
112
|
+
// Start the service
|
|
113
|
+
await service.start();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
logger.error({ error }, 'Failed to start rebalancer service');
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Run the service
|
|
121
|
+
main().catch((error) => {
|
|
122
|
+
rootLogger.error({ error }, 'Fatal error');
|
|
123
|
+
process.exit(1);
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Logger } from 'pino';
|
|
2
|
+
import type { ChainName } from '@hyperlane-xyz/sdk';
|
|
3
|
+
import type { IStrategy, RawBalances, RebalancingRoute } from '../interfaces/IStrategy.js';
|
|
4
|
+
import { Metrics } from '../metrics/Metrics.js';
|
|
5
|
+
export type Delta = {
|
|
6
|
+
chain: ChainName;
|
|
7
|
+
amount: bigint;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Base abstract class for rebalancing strategies
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class BaseStrategy implements IStrategy {
|
|
13
|
+
protected readonly chains: ChainName[];
|
|
14
|
+
protected readonly metrics?: Metrics;
|
|
15
|
+
protected readonly logger: Logger;
|
|
16
|
+
constructor(chains: ChainName[], logger: Logger, metrics?: Metrics);
|
|
17
|
+
/**
|
|
18
|
+
* Main method to get rebalancing routes
|
|
19
|
+
*/
|
|
20
|
+
getRebalancingRoutes(rawBalances: RawBalances): RebalancingRoute[];
|
|
21
|
+
/**
|
|
22
|
+
* Abstract method to get balances categorized by surplus and deficit
|
|
23
|
+
* Each specific strategy should implement its own logic
|
|
24
|
+
*/
|
|
25
|
+
protected abstract getCategorizedBalances(rawBalances: RawBalances): {
|
|
26
|
+
surpluses: Delta[];
|
|
27
|
+
deficits: Delta[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Validates the raw balances against the chains configuration
|
|
31
|
+
*/
|
|
32
|
+
protected validateRawBalances(rawBalances: RawBalances): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=BaseStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseStrategy.d.ts","sourceRoot":"","sources":["../../src/strategy/BaseStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,MAAM,MAAM,KAAK,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;GAEG;AACH,8BAAsB,YAAa,YAAW,SAAS;IACrD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IACvC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEtB,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;IAUlE;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,gBAAgB,EAAE;IAgJlE;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG;QACnE,SAAS,EAAE,KAAK,EAAE,CAAC;QACnB,QAAQ,EAAE,KAAK,EAAE,CAAC;KACnB;IAED;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAmB9D"}
|