@hyperlane-xyz/rebalancer 0.1.2 → 1.0.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/README.md +134 -14
- package/dist/config/RebalancerConfig.d.ts +2 -2
- package/dist/config/RebalancerConfig.d.ts.map +1 -1
- package/dist/config/RebalancerConfig.js +4 -3
- package/dist/config/RebalancerConfig.js.map +1 -1
- package/dist/config/RebalancerConfig.test.js +434 -163
- package/dist/config/RebalancerConfig.test.js.map +1 -1
- package/dist/config/types.d.ts +1650 -290
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +124 -46
- package/dist/config/types.js.map +1 -1
- package/dist/core/Rebalancer.d.ts +14 -7
- package/dist/core/Rebalancer.d.ts.map +1 -1
- package/dist/core/Rebalancer.js +168 -99
- package/dist/core/Rebalancer.js.map +1 -1
- package/dist/core/Rebalancer.test.d.ts +2 -0
- package/dist/core/Rebalancer.test.d.ts.map +1 -0
- package/dist/core/Rebalancer.test.js +391 -0
- package/dist/core/Rebalancer.test.js.map +1 -0
- package/dist/core/RebalancerService.d.ts +16 -2
- package/dist/core/RebalancerService.d.ts.map +1 -1
- package/dist/core/RebalancerService.js +164 -21
- package/dist/core/RebalancerService.js.map +1 -1
- package/dist/core/RebalancerService.test.d.ts +2 -0
- package/dist/core/RebalancerService.test.d.ts.map +1 -0
- package/dist/core/RebalancerService.test.js +809 -0
- package/dist/core/RebalancerService.test.js.map +1 -0
- package/dist/factories/RebalancerContextFactory.d.ts +11 -0
- package/dist/factories/RebalancerContextFactory.d.ts.map +1 -1
- package/dist/factories/RebalancerContextFactory.js +60 -13
- 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 +4 -3
- package/dist/index.js.map +1 -1
- package/dist/interfaces/IMonitor.d.ts +6 -8
- package/dist/interfaces/IMonitor.d.ts.map +1 -1
- package/dist/interfaces/IMonitor.js.map +1 -1
- package/dist/interfaces/IRebalancer.d.ts +20 -4
- package/dist/interfaces/IRebalancer.d.ts.map +1 -1
- package/dist/interfaces/IStrategy.d.ts +18 -2
- package/dist/interfaces/IStrategy.d.ts.map +1 -1
- package/dist/metrics/Metrics.d.ts +4 -2
- package/dist/metrics/Metrics.d.ts.map +1 -1
- package/dist/metrics/Metrics.js +21 -1
- package/dist/metrics/Metrics.js.map +1 -1
- package/dist/metrics/scripts/metrics.d.ts +2 -0
- package/dist/metrics/scripts/metrics.d.ts.map +1 -1
- package/dist/metrics/scripts/metrics.js +12 -0
- package/dist/metrics/scripts/metrics.js.map +1 -1
- package/dist/monitor/Monitor.d.ts +8 -3
- package/dist/monitor/Monitor.d.ts.map +1 -1
- package/dist/monitor/Monitor.js +75 -15
- package/dist/monitor/Monitor.js.map +1 -1
- package/dist/strategy/BaseStrategy.d.ts +51 -5
- package/dist/strategy/BaseStrategy.d.ts.map +1 -1
- package/dist/strategy/BaseStrategy.js +199 -19
- package/dist/strategy/BaseStrategy.js.map +1 -1
- package/dist/strategy/CollateralDeficitStrategy.d.ts +65 -0
- package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.js +245 -0
- package/dist/strategy/CollateralDeficitStrategy.js.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.test.d.ts +2 -0
- package/dist/strategy/CollateralDeficitStrategy.test.d.ts.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.test.js +364 -0
- package/dist/strategy/CollateralDeficitStrategy.test.js.map +1 -0
- package/dist/strategy/CompositeStrategy.d.ts +18 -0
- package/dist/strategy/CompositeStrategy.d.ts.map +1 -0
- package/dist/strategy/CompositeStrategy.js +63 -0
- package/dist/strategy/CompositeStrategy.js.map +1 -0
- package/dist/strategy/CompositeStrategy.test.d.ts +2 -0
- package/dist/strategy/CompositeStrategy.test.d.ts.map +1 -0
- package/dist/strategy/CompositeStrategy.test.js +265 -0
- package/dist/strategy/CompositeStrategy.test.js.map +1 -0
- package/dist/strategy/MinAmountStrategy.d.ts +12 -5
- package/dist/strategy/MinAmountStrategy.d.ts.map +1 -1
- package/dist/strategy/MinAmountStrategy.js +23 -14
- package/dist/strategy/MinAmountStrategy.js.map +1 -1
- package/dist/strategy/MinAmountStrategy.test.js +88 -20
- package/dist/strategy/MinAmountStrategy.test.js.map +1 -1
- package/dist/strategy/StrategyFactory.d.ts +15 -6
- package/dist/strategy/StrategyFactory.d.ts.map +1 -1
- package/dist/strategy/StrategyFactory.js +48 -10
- package/dist/strategy/StrategyFactory.js.map +1 -1
- package/dist/strategy/StrategyFactory.test.js +2 -2
- package/dist/strategy/StrategyFactory.test.js.map +1 -1
- package/dist/strategy/WeightedStrategy.d.ts +13 -4
- package/dist/strategy/WeightedStrategy.d.ts.map +1 -1
- package/dist/strategy/WeightedStrategy.js +18 -6
- package/dist/strategy/WeightedStrategy.js.map +1 -1
- package/dist/strategy/WeightedStrategy.test.js +108 -18
- package/dist/strategy/WeightedStrategy.test.js.map +1 -1
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.d.ts.map +1 -1
- package/dist/strategy/index.js +2 -0
- package/dist/strategy/index.js.map +1 -1
- package/dist/test/helpers.d.ts +93 -3
- package/dist/test/helpers.d.ts.map +1 -1
- package/dist/test/helpers.js +267 -10
- package/dist/test/helpers.js.map +1 -1
- package/dist/tracking/ActionTracker.d.ts +49 -0
- package/dist/tracking/ActionTracker.d.ts.map +1 -0
- package/dist/tracking/ActionTracker.js +422 -0
- package/dist/tracking/ActionTracker.js.map +1 -0
- package/dist/tracking/ActionTracker.test.d.ts +2 -0
- package/dist/tracking/ActionTracker.test.d.ts.map +1 -0
- package/dist/tracking/ActionTracker.test.js +637 -0
- package/dist/tracking/ActionTracker.test.js.map +1 -0
- package/dist/tracking/IActionTracker.d.ts +101 -0
- package/dist/tracking/IActionTracker.d.ts.map +1 -0
- package/dist/tracking/IActionTracker.js +2 -0
- package/dist/tracking/IActionTracker.js.map +1 -0
- package/dist/tracking/InflightContextAdapter.d.ts +18 -0
- package/dist/tracking/InflightContextAdapter.d.ts.map +1 -0
- package/dist/tracking/InflightContextAdapter.js +35 -0
- package/dist/tracking/InflightContextAdapter.js.map +1 -0
- package/dist/tracking/InflightContextAdapter.test.d.ts +2 -0
- package/dist/tracking/InflightContextAdapter.test.d.ts.map +1 -0
- package/dist/tracking/InflightContextAdapter.test.js +172 -0
- package/dist/tracking/InflightContextAdapter.test.js.map +1 -0
- package/dist/tracking/index.d.ts +7 -0
- package/dist/tracking/index.d.ts.map +1 -0
- package/dist/tracking/index.js +6 -0
- package/dist/tracking/index.js.map +1 -0
- package/dist/tracking/store/IStore.d.ts +41 -0
- package/dist/tracking/store/IStore.d.ts.map +1 -0
- package/dist/tracking/store/IStore.js +2 -0
- package/dist/tracking/store/IStore.js.map +1 -0
- package/dist/tracking/store/InMemoryStore.d.ts +21 -0
- package/dist/tracking/store/InMemoryStore.d.ts.map +1 -0
- package/dist/tracking/store/InMemoryStore.js +40 -0
- package/dist/tracking/store/InMemoryStore.js.map +1 -0
- package/dist/tracking/store/InMemoryStore.test.d.ts +2 -0
- package/dist/tracking/store/InMemoryStore.test.d.ts.map +1 -0
- package/dist/tracking/store/InMemoryStore.test.js +290 -0
- package/dist/tracking/store/InMemoryStore.test.js.map +1 -0
- package/dist/tracking/store/index.d.ts +3 -0
- package/dist/tracking/store/index.d.ts.map +1 -0
- package/dist/tracking/store/index.js +2 -0
- package/dist/tracking/store/index.js.map +1 -0
- package/dist/tracking/types.d.ts +43 -0
- package/dist/tracking/types.d.ts.map +1 -0
- package/dist/tracking/types.js +2 -0
- package/dist/tracking/types.js.map +1 -0
- package/dist/utils/ExplorerClient.d.ts +39 -1
- package/dist/utils/ExplorerClient.d.ts.map +1 -1
- package/dist/utils/ExplorerClient.js +205 -2
- package/dist/utils/ExplorerClient.js.map +1 -1
- package/dist/utils/balanceUtils.js +2 -2
- package/dist/utils/balanceUtils.js.map +1 -1
- package/dist/utils/balanceUtils.test.js +1 -0
- package/dist/utils/balanceUtils.test.js.map +1 -1
- package/dist/utils/bridgeUtils.d.ts +1 -3
- package/dist/utils/bridgeUtils.d.ts.map +1 -1
- package/dist/utils/bridgeUtils.js +1 -5
- package/dist/utils/bridgeUtils.js.map +1 -1
- package/dist/utils/bridgeUtils.test.js +3 -14
- package/dist/utils/bridgeUtils.test.js.map +1 -1
- package/package.json +11 -9
- package/src/config/RebalancerConfig.test.ts +459 -163
- package/src/config/RebalancerConfig.ts +5 -3
- package/src/config/types.ts +159 -52
- package/src/core/Rebalancer.test.ts +632 -0
- package/src/core/Rebalancer.ts +247 -157
- package/src/core/RebalancerService.test.ts +1144 -0
- package/src/core/RebalancerService.ts +245 -23
- package/src/factories/RebalancerContextFactory.ts +115 -14
- package/src/index.ts +16 -4
- package/src/interfaces/IMonitor.ts +15 -8
- package/src/interfaces/IRebalancer.ts +22 -4
- package/src/interfaces/IStrategy.ts +23 -2
- package/src/metrics/Metrics.ts +26 -5
- package/src/metrics/scripts/metrics.ts +14 -0
- package/src/monitor/Monitor.ts +109 -22
- package/src/strategy/BaseStrategy.ts +316 -26
- package/src/strategy/CollateralDeficitStrategy.test.ts +551 -0
- package/src/strategy/CollateralDeficitStrategy.ts +390 -0
- package/src/strategy/CompositeStrategy.test.ts +405 -0
- package/src/strategy/CompositeStrategy.ts +102 -0
- package/src/strategy/MinAmountStrategy.test.ts +189 -88
- package/src/strategy/MinAmountStrategy.ts +44 -13
- package/src/strategy/StrategyFactory.test.ts +2 -2
- package/src/strategy/StrategyFactory.ts +91 -8
- package/src/strategy/WeightedStrategy.test.ts +187 -72
- package/src/strategy/WeightedStrategy.ts +41 -7
- package/src/strategy/index.ts +2 -0
- package/src/test/helpers.ts +418 -14
- package/src/tracking/ActionTracker.test.ts +783 -0
- package/src/tracking/ActionTracker.ts +647 -0
- package/src/tracking/IActionTracker.ts +140 -0
- package/src/tracking/InflightContextAdapter.test.ts +203 -0
- package/src/tracking/InflightContextAdapter.ts +42 -0
- package/src/tracking/index.ts +36 -0
- package/src/tracking/store/IStore.ts +48 -0
- package/src/tracking/store/InMemoryStore.test.ts +338 -0
- package/src/tracking/store/InMemoryStore.ts +58 -0
- package/src/tracking/store/index.ts +2 -0
- package/src/tracking/types.ts +74 -0
- package/src/utils/ExplorerClient.ts +266 -3
- package/src/utils/balanceUtils.test.ts +1 -0
- package/src/utils/balanceUtils.ts +2 -2
- package/src/utils/bridgeUtils.test.ts +3 -15
- package/src/utils/bridgeUtils.ts +0 -10
- package/dist/core/WithInflightGuard.d.ts +0 -20
- package/dist/core/WithInflightGuard.d.ts.map +0 -1
- package/dist/core/WithInflightGuard.js +0 -47
- package/dist/core/WithInflightGuard.js.map +0 -1
- package/dist/core/WithInflightGuard.test.d.ts +0 -2
- package/dist/core/WithInflightGuard.test.d.ts.map +0 -1
- package/dist/core/WithInflightGuard.test.js +0 -64
- package/dist/core/WithInflightGuard.test.js.map +0 -1
- package/dist/core/WithSemaphore.d.ts +0 -22
- package/dist/core/WithSemaphore.d.ts.map +0 -1
- package/dist/core/WithSemaphore.js +0 -67
- package/dist/core/WithSemaphore.js.map +0 -1
- package/dist/core/WithSemaphore.test.d.ts +0 -2
- package/dist/core/WithSemaphore.test.d.ts.map +0 -1
- package/dist/core/WithSemaphore.test.js +0 -83
- package/dist/core/WithSemaphore.test.js.map +0 -1
- package/src/core/WithInflightGuard.test.ts +0 -131
- package/src/core/WithInflightGuard.ts +0 -67
- package/src/core/WithSemaphore.test.ts +0 -111
- package/src/core/WithSemaphore.ts +0 -92
|
@@ -6,11 +6,37 @@ export class ExplorerClient {
|
|
|
6
6
|
toBytea(addr) {
|
|
7
7
|
return addr.replace(/^0x/i, '\\x').toLowerCase();
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Normalize all hex fields in Explorer response from PostgreSQL bytea format (\\x) to standard hex (0x)
|
|
11
|
+
*/
|
|
12
|
+
normalizeExplorerMessage(msg) {
|
|
13
|
+
const normalizeHex = (hex) => {
|
|
14
|
+
if (!hex)
|
|
15
|
+
return hex;
|
|
16
|
+
return hex.startsWith('\\x') ? '0x' + hex.slice(2) : hex;
|
|
17
|
+
};
|
|
18
|
+
return {
|
|
19
|
+
msg_id: normalizeHex(msg.msg_id),
|
|
20
|
+
origin_domain_id: msg.origin_domain_id,
|
|
21
|
+
destination_domain_id: msg.destination_domain_id,
|
|
22
|
+
sender: normalizeHex(msg.sender),
|
|
23
|
+
recipient: normalizeHex(msg.recipient),
|
|
24
|
+
origin_tx_hash: normalizeHex(msg.origin_tx_hash),
|
|
25
|
+
origin_tx_sender: normalizeHex(msg.origin_tx_sender),
|
|
26
|
+
origin_tx_recipient: normalizeHex(msg.origin_tx_recipient),
|
|
27
|
+
is_delivered: msg.is_delivered,
|
|
28
|
+
message_body: normalizeHex(msg.message_body),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
9
31
|
async hasUndeliveredRebalance(params, logger) {
|
|
10
|
-
const { bridges,
|
|
32
|
+
const { bridges, routersByDomain, txSender, limit = 5 } = params;
|
|
33
|
+
// Derive routers and domains from routersByDomain
|
|
34
|
+
const routers = Object.values(routersByDomain);
|
|
35
|
+
const domains = Object.keys(routersByDomain).map(Number);
|
|
11
36
|
const variables = {
|
|
12
37
|
senders: bridges.map((a) => this.toBytea(a)),
|
|
13
38
|
recipients: bridges.map((a) => this.toBytea(a)),
|
|
39
|
+
originTxRecipients: routers.map((a) => this.toBytea(a)),
|
|
14
40
|
originDomains: domains,
|
|
15
41
|
destDomains: domains,
|
|
16
42
|
txSenders: [this.toBytea(txSender)],
|
|
@@ -21,6 +47,7 @@ export class ExplorerClient {
|
|
|
21
47
|
query InflightRebalancesForRoute(
|
|
22
48
|
$senders: [bytea!],
|
|
23
49
|
$recipients: [bytea!],
|
|
50
|
+
$originTxRecipients: [bytea!],
|
|
24
51
|
$originDomains: [Int!],
|
|
25
52
|
$destDomains: [Int!],
|
|
26
53
|
$txSenders: [bytea!],
|
|
@@ -32,6 +59,7 @@ export class ExplorerClient {
|
|
|
32
59
|
{ is_delivered: { _eq: false } },
|
|
33
60
|
{ sender: { _in: $senders } },
|
|
34
61
|
{ recipient: { _in: $recipients } },
|
|
62
|
+
{ origin_tx_recipient: { _in: $originTxRecipients } },
|
|
35
63
|
{ origin_domain_id: { _in: $originDomains } },
|
|
36
64
|
{ destination_domain_id: { _in: $destDomains } },
|
|
37
65
|
{ origin_tx_sender: { _in: $txSenders } }
|
|
@@ -47,7 +75,9 @@ export class ExplorerClient {
|
|
|
47
75
|
recipient
|
|
48
76
|
origin_tx_hash
|
|
49
77
|
origin_tx_sender
|
|
78
|
+
origin_tx_recipient
|
|
50
79
|
is_delivered
|
|
80
|
+
message_body
|
|
51
81
|
}
|
|
52
82
|
}`;
|
|
53
83
|
const res = await fetch(this.baseUrl, {
|
|
@@ -76,7 +106,180 @@ export class ExplorerClient {
|
|
|
76
106
|
const json = await res.json();
|
|
77
107
|
const rows = json?.data?.message_view ?? [];
|
|
78
108
|
logger.debug({ rows }, 'Explorer query rows');
|
|
79
|
-
|
|
109
|
+
// Post-query validation: verify each message's origin domain matches the expected router
|
|
110
|
+
const validatedRows = rows.filter((msg) => {
|
|
111
|
+
const expectedRouter = routersByDomain[msg.origin_domain_id];
|
|
112
|
+
if (!expectedRouter)
|
|
113
|
+
return false;
|
|
114
|
+
const normalizedMsgRouter = msg.origin_tx_recipient?.startsWith('\\x')
|
|
115
|
+
? '0x' + msg.origin_tx_recipient.slice(2)
|
|
116
|
+
: msg.origin_tx_recipient;
|
|
117
|
+
return (normalizedMsgRouter?.toLowerCase() === expectedRouter.toLowerCase());
|
|
118
|
+
});
|
|
119
|
+
logger.debug({ totalRows: rows.length, validatedRows: validatedRows.length }, 'Post-query validation results');
|
|
120
|
+
return validatedRows.length > 0;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Query inflight user transfers from the Explorer.
|
|
124
|
+
* Returns transfers where sender/recipient are routers, excluding rebalancer's own transactions.
|
|
125
|
+
*/
|
|
126
|
+
async getInflightUserTransfers(params, logger) {
|
|
127
|
+
const { routersByDomain, excludeTxSender, limit = 100 } = params;
|
|
128
|
+
// Derive routers and domains from routersByDomain
|
|
129
|
+
const routers = Object.values(routersByDomain);
|
|
130
|
+
const domains = Object.keys(routersByDomain).map(Number);
|
|
131
|
+
const variables = {
|
|
132
|
+
senders: routers.map((a) => this.toBytea(a)),
|
|
133
|
+
recipients: routers.map((a) => this.toBytea(a)),
|
|
134
|
+
originDomains: domains,
|
|
135
|
+
destDomains: domains,
|
|
136
|
+
excludeTxSender: this.toBytea(excludeTxSender),
|
|
137
|
+
limit,
|
|
138
|
+
};
|
|
139
|
+
logger.debug({ variables }, 'Explorer getInflightUserTransfers query');
|
|
140
|
+
const query = `
|
|
141
|
+
query InflightUserTransfers(
|
|
142
|
+
$senders: [bytea!],
|
|
143
|
+
$recipients: [bytea!],
|
|
144
|
+
$originDomains: [Int!],
|
|
145
|
+
$destDomains: [Int!],
|
|
146
|
+
$excludeTxSender: bytea!,
|
|
147
|
+
$limit: Int = 100
|
|
148
|
+
) {
|
|
149
|
+
message_view(
|
|
150
|
+
where: {
|
|
151
|
+
_and: [
|
|
152
|
+
{ is_delivered: { _eq: false } },
|
|
153
|
+
{ sender: { _in: $senders } },
|
|
154
|
+
{ recipient: { _in: $recipients } },
|
|
155
|
+
{ origin_domain_id: { _in: $originDomains } },
|
|
156
|
+
{ destination_domain_id: { _in: $destDomains } },
|
|
157
|
+
{ origin_tx_sender: { _neq: $excludeTxSender } }
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
order_by: { origin_tx_id: desc }
|
|
161
|
+
limit: $limit
|
|
162
|
+
) {
|
|
163
|
+
msg_id
|
|
164
|
+
origin_domain_id
|
|
165
|
+
destination_domain_id
|
|
166
|
+
sender
|
|
167
|
+
recipient
|
|
168
|
+
origin_tx_hash
|
|
169
|
+
origin_tx_sender
|
|
170
|
+
origin_tx_recipient
|
|
171
|
+
is_delivered
|
|
172
|
+
message_body
|
|
173
|
+
}
|
|
174
|
+
}`;
|
|
175
|
+
const res = await fetch(this.baseUrl, {
|
|
176
|
+
method: 'POST',
|
|
177
|
+
headers: { 'Content-Type': 'application/json' },
|
|
178
|
+
body: JSON.stringify({ query, variables }),
|
|
179
|
+
});
|
|
180
|
+
logger.debug({ status: res.status }, 'Explorer getInflightUserTransfers response');
|
|
181
|
+
if (!res.ok) {
|
|
182
|
+
let errorDetails;
|
|
183
|
+
try {
|
|
184
|
+
const errorJson = await res.json();
|
|
185
|
+
errorDetails = JSON.stringify(errorJson);
|
|
186
|
+
}
|
|
187
|
+
catch (_e) {
|
|
188
|
+
try {
|
|
189
|
+
errorDetails = await res.text();
|
|
190
|
+
}
|
|
191
|
+
catch (_textError) {
|
|
192
|
+
errorDetails = 'Unable to read response body';
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
throw new Error(`Explorer query failed: ${res.status} ${errorDetails}`);
|
|
196
|
+
}
|
|
197
|
+
const json = await res.json();
|
|
198
|
+
const messages = json?.data?.message_view ?? [];
|
|
199
|
+
return messages.map((msg) => this.normalizeExplorerMessage(msg));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Query inflight rebalance actions from the Explorer.
|
|
203
|
+
* Returns messages where sender/recipient are bridges, tx sender is the rebalancer,
|
|
204
|
+
* and origin_tx_recipient is one of this warp route's routers.
|
|
205
|
+
*/
|
|
206
|
+
async getInflightRebalanceActions(params, logger) {
|
|
207
|
+
const { bridges, routersByDomain, rebalancerAddress, limit = 100 } = params;
|
|
208
|
+
// Derive routers and domains from routersByDomain
|
|
209
|
+
const routers = Object.values(routersByDomain);
|
|
210
|
+
const domains = Object.keys(routersByDomain).map(Number);
|
|
211
|
+
const variables = {
|
|
212
|
+
senders: bridges.map((a) => this.toBytea(a)),
|
|
213
|
+
recipients: bridges.map((a) => this.toBytea(a)),
|
|
214
|
+
originTxRecipients: routers.map((a) => this.toBytea(a)),
|
|
215
|
+
originDomains: domains,
|
|
216
|
+
destDomains: domains,
|
|
217
|
+
txSender: this.toBytea(rebalancerAddress),
|
|
218
|
+
limit,
|
|
219
|
+
};
|
|
220
|
+
logger.debug({ variables }, 'Explorer getInflightRebalanceActions query');
|
|
221
|
+
const query = `
|
|
222
|
+
query InflightRebalanceActions(
|
|
223
|
+
$senders: [bytea!],
|
|
224
|
+
$recipients: [bytea!],
|
|
225
|
+
$originTxRecipients: [bytea!],
|
|
226
|
+
$originDomains: [Int!],
|
|
227
|
+
$destDomains: [Int!],
|
|
228
|
+
$txSender: bytea!,
|
|
229
|
+
$limit: Int = 100
|
|
230
|
+
) {
|
|
231
|
+
message_view(
|
|
232
|
+
where: {
|
|
233
|
+
_and: [
|
|
234
|
+
{ is_delivered: { _eq: false } },
|
|
235
|
+
{ sender: { _in: $senders } },
|
|
236
|
+
{ recipient: { _in: $recipients } },
|
|
237
|
+
{ origin_tx_recipient: { _in: $originTxRecipients } },
|
|
238
|
+
{ origin_domain_id: { _in: $originDomains } },
|
|
239
|
+
{ destination_domain_id: { _in: $destDomains } },
|
|
240
|
+
{ origin_tx_sender: { _eq: $txSender } }
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
order_by: { origin_tx_id: desc }
|
|
244
|
+
limit: $limit
|
|
245
|
+
) {
|
|
246
|
+
msg_id
|
|
247
|
+
origin_domain_id
|
|
248
|
+
destination_domain_id
|
|
249
|
+
sender
|
|
250
|
+
recipient
|
|
251
|
+
origin_tx_hash
|
|
252
|
+
origin_tx_sender
|
|
253
|
+
origin_tx_recipient
|
|
254
|
+
is_delivered
|
|
255
|
+
message_body
|
|
256
|
+
}
|
|
257
|
+
}`;
|
|
258
|
+
const res = await fetch(this.baseUrl, {
|
|
259
|
+
method: 'POST',
|
|
260
|
+
headers: { 'Content-Type': 'application/json' },
|
|
261
|
+
body: JSON.stringify({ query, variables }),
|
|
262
|
+
});
|
|
263
|
+
logger.debug({ status: res.status }, 'Explorer getInflightRebalanceActions response');
|
|
264
|
+
if (!res.ok) {
|
|
265
|
+
let errorDetails;
|
|
266
|
+
try {
|
|
267
|
+
const errorJson = await res.json();
|
|
268
|
+
errorDetails = JSON.stringify(errorJson);
|
|
269
|
+
}
|
|
270
|
+
catch (_e) {
|
|
271
|
+
try {
|
|
272
|
+
errorDetails = await res.text();
|
|
273
|
+
}
|
|
274
|
+
catch (_textError) {
|
|
275
|
+
errorDetails = 'Unable to read response body';
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
throw new Error(`Explorer query failed: ${res.status} ${errorDetails}`);
|
|
279
|
+
}
|
|
280
|
+
const json = await res.json();
|
|
281
|
+
const messages = json?.data?.message_view ?? [];
|
|
282
|
+
return messages.map((msg) => this.normalizeExplorerMessage(msg));
|
|
80
283
|
}
|
|
81
284
|
}
|
|
82
285
|
//# sourceMappingURL=ExplorerClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExplorerClient.js","sourceRoot":"","sources":["../../src/utils/ExplorerClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExplorerClient.js","sourceRoot":"","sources":["../../src/utils/ExplorerClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export function getRawBalances(chains, event, logger) {
|
|
|
12
12
|
const { token, bridgedSupply } = tokenInfo;
|
|
13
13
|
// Ignore tokens that are not in the provided chains list
|
|
14
14
|
if (!chainSet.has(token.chainName)) {
|
|
15
|
-
logger.
|
|
15
|
+
logger.debug({
|
|
16
16
|
context: getRawBalances.name,
|
|
17
17
|
chain: token.chainName,
|
|
18
18
|
tokenSymbol: token.symbol,
|
|
@@ -22,7 +22,7 @@ export function getRawBalances(chains, event, logger) {
|
|
|
22
22
|
}
|
|
23
23
|
// Ignore tokens that are not collateralized or are otherwise ineligible
|
|
24
24
|
if (!isCollateralizedTokenEligibleForRebalancing(token)) {
|
|
25
|
-
logger.
|
|
25
|
+
logger.debug({
|
|
26
26
|
context: getRawBalances.name,
|
|
27
27
|
chain: token.chainName,
|
|
28
28
|
tokenSymbol: token.symbol,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balanceUtils.js","sourceRoot":"","sources":["../../src/utils/balanceUtils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,2CAA2C,EAAE,MAAM,iBAAiB,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAmB,EACnB,KAAmB,EACnB,MAAc;IAEd,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAEjC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;QAE3C,yDAAyD;QACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"balanceUtils.js","sourceRoot":"","sources":["../../src/utils/balanceUtils.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,2CAA2C,EAAE,MAAM,iBAAiB,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAmB,EACnB,KAAmB,EACnB,MAAc;IAEd,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAEjC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;QAE3C,yDAAyD;QACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CACV;gBACE,OAAO,EAAE,cAAc,CAAC,IAAI;gBAC5B,KAAK,EAAE,KAAK,CAAC,SAAS;gBACtB,WAAW,EAAE,KAAK,CAAC,MAAM;gBACzB,YAAY,EAAE,KAAK,CAAC,cAAc;aACnC,EACD,+CAA+C,CAChD,CAAC;YACF,SAAS;QACX,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC,2CAA2C,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,KAAK,CACV;gBACE,OAAO,EAAE,cAAc,CAAC,IAAI;gBAC5B,KAAK,EAAE,KAAK,CAAC,SAAS;gBACtB,WAAW,EAAE,KAAK,CAAC,MAAM;gBACzB,YAAY,EAAE,KAAK,CAAC,cAAc;aACnC,EACD,kEAAkE,CACnE,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,kEAAkE,KAAK,CAAC,cAAc,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC;IAC5C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balanceUtils.test.js","sourceRoot":"","sources":["../../src/utils/balanceUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAA8B,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAI/E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE7C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,MAAmB,CAAC;IACxB,IAAI,KAAY,CAAC;IACjB,IAAI,kBAA0B,CAAC;IAC/B,IAAI,KAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;QAErB,KAAK,GAAG;YACN,SAAS,EAAE,SAAS;YACpB,cAAc,EAAE,WAAW;YAC3B,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;YAC5C,QAAQ,EAAE,aAAa,CAAC,gBAAgB;SACrB,CAAC;QAEtB,kBAAkB,GAAG,IAAI,CAAC;QAE1B,KAAK,GAAG;YACN,UAAU,EAAE;gBACV;oBACE,KAAK;oBACL,aAAa,EAAE,kBAAkB;iBAClC;aACF;
|
|
1
|
+
{"version":3,"file":"balanceUtils.test.js","sourceRoot":"","sources":["../../src/utils/balanceUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAA8B,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAI/E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE7C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,MAAmB,CAAC;IACxB,IAAI,KAAY,CAAC;IACjB,IAAI,kBAA0B,CAAC;IAC/B,IAAI,KAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;QAErB,KAAK,GAAG;YACN,SAAS,EAAE,SAAS;YACpB,cAAc,EAAE,WAAW;YAC3B,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;YAC5C,QAAQ,EAAE,aAAa,CAAC,gBAAgB;SACrB,CAAC;QAEtB,kBAAkB,GAAG,IAAI,CAAC;QAE1B,KAAK,GAAG;YACN,UAAU,EAAE;gBACV;oBACE,KAAK;oBACL,aAAa,EAAE,kBAAkB;iBAClC;aACF;YACD,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9D,OAAO,EAAE,kBAAkB;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC;QAE5C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC9D,OAAO,EAAE,kBAAkB;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC,qBAAqB,CAAC;QAErD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,EAAE,CAAC;QAEZ,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAEzC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAC9D,0EAA0E,CAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type Logger } from 'pino';
|
|
2
1
|
import type { ChainMap, ChainName } from '@hyperlane-xyz/sdk';
|
|
3
2
|
export type BridgeConfigWithOverride = BridgeConfig & {
|
|
4
3
|
override?: ChainMap<Partial<BridgeConfig>>;
|
|
@@ -6,7 +5,6 @@ export type BridgeConfigWithOverride = BridgeConfig & {
|
|
|
6
5
|
export type BridgeConfig = {
|
|
7
6
|
bridge: string;
|
|
8
7
|
bridgeMinAcceptedAmount: string | number;
|
|
9
|
-
bridgeIsWarp: boolean;
|
|
10
8
|
};
|
|
11
9
|
/**
|
|
12
10
|
* Gets the bridge configuration for a specific chain pair, applying any overrides
|
|
@@ -15,5 +13,5 @@ export type BridgeConfig = {
|
|
|
15
13
|
* @param toChain The destination chain
|
|
16
14
|
* @returns The bridge configuration with any overrides applied
|
|
17
15
|
*/
|
|
18
|
-
export declare function getBridgeConfig(bridges: ChainMap<BridgeConfigWithOverride>, fromChain: ChainName, toChain: ChainName
|
|
16
|
+
export declare function getBridgeConfig(bridges: ChainMap<BridgeConfigWithOverride>, fromChain: ChainName, toChain: ChainName): BridgeConfig;
|
|
19
17
|
//# sourceMappingURL=bridgeUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeUtils.d.ts","sourceRoot":"","sources":["../../src/utils/bridgeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bridgeUtils.d.ts","sourceRoot":"","sources":["../../src/utils/bridgeUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG;IACpD,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,EAC3C,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,GACjB,YAAY,CASd"}
|
|
@@ -5,12 +5,8 @@
|
|
|
5
5
|
* @param toChain The destination chain
|
|
6
6
|
* @returns The bridge configuration with any overrides applied
|
|
7
7
|
*/
|
|
8
|
-
export function getBridgeConfig(bridges, fromChain, toChain
|
|
8
|
+
export function getBridgeConfig(bridges, fromChain, toChain) {
|
|
9
9
|
const fromConfig = bridges[fromChain];
|
|
10
|
-
if (!fromConfig) {
|
|
11
|
-
logger.error({ fromChain }, 'Bridge config not found');
|
|
12
|
-
throw new Error(`Bridge config not found for chain ${fromChain}`);
|
|
13
|
-
}
|
|
14
10
|
const routeSpecificOverrides = fromConfig.override?.[toChain];
|
|
15
11
|
// Create a new object with the properties from bridgeConfig, excluding the overrides property
|
|
16
12
|
const { override: _, ...baseConfig } = fromConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeUtils.js","sourceRoot":"","sources":["../../src/utils/bridgeUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bridgeUtils.js","sourceRoot":"","sources":["../../src/utils/bridgeUtils.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAA2C,EAC3C,SAAoB,EACpB,OAAkB;IAElB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,sBAAsB,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;IAE9D,8FAA8F;IAC9F,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC;IAElD,6DAA6D;IAC7D,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,sBAAsB,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
import { expect } from 'chai';
|
|
2
|
-
import { pino } from 'pino';
|
|
3
2
|
import { getBridgeConfig, } from './bridgeUtils.js';
|
|
4
|
-
const testLogger = pino({ level: 'silent' });
|
|
5
3
|
describe('bridgeConfig', () => {
|
|
6
4
|
it('should return the base bridge config when no overrides exist', () => {
|
|
7
5
|
const bridges = {
|
|
8
6
|
chain1: {
|
|
9
7
|
bridge: '0x1234567890123456789012345678901234567890',
|
|
10
8
|
bridgeMinAcceptedAmount: 1000,
|
|
11
|
-
bridgeIsWarp: true,
|
|
12
9
|
},
|
|
13
10
|
chain2: {
|
|
14
11
|
bridge: '0x0987654321098765432109876543210987654321',
|
|
15
12
|
bridgeMinAcceptedAmount: 2000,
|
|
16
|
-
bridgeIsWarp: true,
|
|
17
13
|
},
|
|
18
14
|
};
|
|
19
|
-
const result = getBridgeConfig(bridges, 'chain1', 'chain2'
|
|
15
|
+
const result = getBridgeConfig(bridges, 'chain1', 'chain2');
|
|
20
16
|
expect(result).to.deep.equal({
|
|
21
17
|
bridge: '0x1234567890123456789012345678901234567890',
|
|
22
18
|
bridgeMinAcceptedAmount: 1000,
|
|
23
|
-
bridgeIsWarp: true,
|
|
24
19
|
});
|
|
25
20
|
});
|
|
26
21
|
it('should merge base config with overrides when they exist', () => {
|
|
@@ -28,7 +23,6 @@ describe('bridgeConfig', () => {
|
|
|
28
23
|
chain1: {
|
|
29
24
|
bridge: '0x1234567890123456789012345678901234567890',
|
|
30
25
|
bridgeMinAcceptedAmount: 1000,
|
|
31
|
-
bridgeIsWarp: true,
|
|
32
26
|
override: {
|
|
33
27
|
chain2: {
|
|
34
28
|
bridgeMinAcceptedAmount: 5000,
|
|
@@ -38,14 +32,12 @@ describe('bridgeConfig', () => {
|
|
|
38
32
|
chain2: {
|
|
39
33
|
bridge: '0x0987654321098765432109876543210987654321',
|
|
40
34
|
bridgeMinAcceptedAmount: 2000,
|
|
41
|
-
bridgeIsWarp: true,
|
|
42
35
|
},
|
|
43
36
|
};
|
|
44
|
-
const result = getBridgeConfig(bridges, 'chain1', 'chain2'
|
|
37
|
+
const result = getBridgeConfig(bridges, 'chain1', 'chain2');
|
|
45
38
|
expect(result).to.deep.equal({
|
|
46
39
|
bridge: '0x1234567890123456789012345678901234567890',
|
|
47
40
|
bridgeMinAcceptedAmount: 5000,
|
|
48
|
-
bridgeIsWarp: true,
|
|
49
41
|
});
|
|
50
42
|
});
|
|
51
43
|
it('should handle overrides that change the bridge address', () => {
|
|
@@ -53,7 +45,6 @@ describe('bridgeConfig', () => {
|
|
|
53
45
|
chain1: {
|
|
54
46
|
bridge: '0x1234567890123456789012345678901234567890',
|
|
55
47
|
bridgeMinAcceptedAmount: 1000,
|
|
56
|
-
bridgeIsWarp: true,
|
|
57
48
|
override: {
|
|
58
49
|
chain2: {
|
|
59
50
|
bridge: '0xABCDEF0123456789ABCDEF0123456789ABCDEF01',
|
|
@@ -63,14 +54,12 @@ describe('bridgeConfig', () => {
|
|
|
63
54
|
chain2: {
|
|
64
55
|
bridge: '0x0987654321098765432109876543210987654321',
|
|
65
56
|
bridgeMinAcceptedAmount: 2000,
|
|
66
|
-
bridgeIsWarp: true,
|
|
67
57
|
},
|
|
68
58
|
};
|
|
69
|
-
const result = getBridgeConfig(bridges, 'chain1', 'chain2'
|
|
59
|
+
const result = getBridgeConfig(bridges, 'chain1', 'chain2');
|
|
70
60
|
expect(result).to.deep.equal({
|
|
71
61
|
bridge: '0xABCDEF0123456789ABCDEF0123456789ABCDEF01',
|
|
72
62
|
bridgeMinAcceptedAmount: 1000,
|
|
73
|
-
bridgeIsWarp: true,
|
|
74
63
|
});
|
|
75
64
|
});
|
|
76
65
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridgeUtils.test.js","sourceRoot":"","sources":["../../src/utils/bridgeUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"bridgeUtils.test.js","sourceRoot":"","sources":["../../src/utils/bridgeUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAI9B,OAAO,EAEL,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,OAAO,GAAuC;YAClD,MAAM,EAAE;gBACN,MAAM,EAAE,4CAA4C;gBACpD,uBAAuB,EAAE,IAAI;aAC9B;YACD,MAAM,EAAE;gBACN,MAAM,EAAE,4CAA4C;gBACpD,uBAAuB,EAAE,IAAI;aAC9B;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,MAAM,EAAE,4CAA4C;YACpD,uBAAuB,EAAE,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,OAAO,GAAuC;YAClD,MAAM,EAAE;gBACN,MAAM,EAAE,4CAA4C;gBACpD,uBAAuB,EAAE,IAAI;gBAC7B,QAAQ,EAAE;oBACR,MAAM,EAAE;wBACN,uBAAuB,EAAE,IAAI;qBAC9B;iBACF;aACF;YACD,MAAM,EAAE;gBACN,MAAM,EAAE,4CAA4C;gBACpD,uBAAuB,EAAE,IAAI;aAC9B;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,MAAM,EAAE,4CAA4C;YACpD,uBAAuB,EAAE,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAuC;YAClD,MAAM,EAAE;gBACN,MAAM,EAAE,4CAA4C;gBACpD,uBAAuB,EAAE,IAAI;gBAC7B,QAAQ,EAAE;oBACR,MAAM,EAAE;wBACN,MAAM,EAAE,4CAA4C;qBACrD;iBACF;aACF;YACD,MAAM,EAAE;gBACN,MAAM,EAAE,4CAA4C;gBACpD,uBAAuB,EAAE,IAAI;aAC9B;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B,MAAM,EAAE,4CAA4C;YACpD,uBAAuB,EAAE,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperlane-xyz/rebalancer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Hyperlane Warp Route Collateral Rebalancer Service",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"src"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@google-cloud/pino-logging-gcp-config": "^1.0
|
|
16
|
+
"@google-cloud/pino-logging-gcp-config": "^1.3.0",
|
|
17
17
|
"@hyperlane-xyz/registry": "23.7.0",
|
|
18
18
|
"@inquirer/prompts": "3.3.2",
|
|
19
19
|
"@inquirer/select": "^1.0.0",
|
|
@@ -23,22 +23,24 @@
|
|
|
23
23
|
"pino": "^8.19.0",
|
|
24
24
|
"pino-pretty": "^13.0.0",
|
|
25
25
|
"prom-client": "^14.0.1",
|
|
26
|
+
"uuid": "^10.0.0",
|
|
26
27
|
"yaml": "2.4.5",
|
|
27
28
|
"zod": "^3.21.2",
|
|
28
29
|
"zod-validation-error": "^3.3.0",
|
|
29
30
|
"@hyperlane-xyz/core": "10.1.5",
|
|
30
|
-
"@hyperlane-xyz/provider-sdk": "1.2.
|
|
31
|
-
"@hyperlane-xyz/sdk": "
|
|
32
|
-
"@hyperlane-xyz/utils": "
|
|
33
|
-
"@hyperlane-xyz/metrics": "0.1.
|
|
31
|
+
"@hyperlane-xyz/provider-sdk": "1.2.1",
|
|
32
|
+
"@hyperlane-xyz/sdk": "23.0.0",
|
|
33
|
+
"@hyperlane-xyz/utils": "23.0.0",
|
|
34
|
+
"@hyperlane-xyz/metrics": "0.1.1"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
37
|
"@ethersproject/constants": "*",
|
|
37
38
|
"@types/chai-as-promised": "^8",
|
|
38
39
|
"@types/express": "^5.0.3",
|
|
39
40
|
"@types/mocha": "^10.0.1",
|
|
40
|
-
"@types/node": "^
|
|
41
|
+
"@types/node": "^24.10.9",
|
|
41
42
|
"@types/sinon": "^17.0.1",
|
|
43
|
+
"@types/uuid": "^10.0.0",
|
|
42
44
|
"@vercel/ncc": "^0.38.3",
|
|
43
45
|
"chai": "^4.5.0",
|
|
44
46
|
"chai-as-promised": "^8.0.1",
|
|
@@ -48,7 +50,7 @@
|
|
|
48
50
|
"sinon": "^13.0.2",
|
|
49
51
|
"tsx": "^4.19.1",
|
|
50
52
|
"typescript": "5.8.3",
|
|
51
|
-
"@hyperlane-xyz/tsconfig": "^
|
|
53
|
+
"@hyperlane-xyz/tsconfig": "^23.0.0"
|
|
52
54
|
},
|
|
53
55
|
"engines": {
|
|
54
56
|
"node": ">=18"
|
|
@@ -66,7 +68,7 @@
|
|
|
66
68
|
"license": "Apache-2.0",
|
|
67
69
|
"scripts": {
|
|
68
70
|
"build": "tsc",
|
|
69
|
-
"bundle": "rm -rf ./bundle && ncc build ./dist/service.js -o bundle -e @google-cloud/pino-logging-gcp-config && node
|
|
71
|
+
"bundle": "rm -rf ./bundle && ncc build ./dist/service.js -o bundle -e @google-cloud/pino-logging-gcp-config && node ../../scripts/ncc.post-bundle.mjs",
|
|
70
72
|
"clean": "rm -rf dist cache bundle",
|
|
71
73
|
"dev": "tsc --watch",
|
|
72
74
|
"lint": "eslint -c ./eslint.config.mjs ./src",
|