@humanode-hyperlane/rebalancer 27.2.2 → 1029.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 +3 -3
- package/dist/bridges/LiFiBridge.d.ts.map +1 -1
- package/dist/bridges/LiFiBridge.js +66 -55
- package/dist/bridges/LiFiBridge.js.map +1 -1
- package/dist/bridges/LiFiBridge.test.js +213 -0
- package/dist/bridges/LiFiBridge.test.js.map +1 -1
- package/dist/config/RebalancerConfig.d.ts +4 -3
- package/dist/config/RebalancerConfig.d.ts.map +1 -1
- package/dist/config/RebalancerConfig.js +7 -5
- package/dist/config/RebalancerConfig.js.map +1 -1
- package/dist/config/RebalancerConfig.test.js +278 -2
- package/dist/config/RebalancerConfig.test.js.map +1 -1
- package/dist/config/types.d.ts +707 -2664
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +62 -7
- package/dist/config/types.js.map +1 -1
- package/dist/core/InventoryRebalancer.d.ts +13 -19
- package/dist/core/InventoryRebalancer.d.ts.map +1 -1
- package/dist/core/InventoryRebalancer.js +404 -276
- package/dist/core/InventoryRebalancer.js.map +1 -1
- package/dist/core/InventoryRebalancer.test.js +814 -25
- package/dist/core/InventoryRebalancer.test.js.map +1 -1
- package/dist/core/Rebalancer.d.ts.map +1 -1
- package/dist/core/Rebalancer.js +12 -6
- package/dist/core/Rebalancer.js.map +1 -1
- package/dist/core/Rebalancer.test.js +51 -0
- package/dist/core/Rebalancer.test.js.map +1 -1
- package/dist/core/RebalancerOrchestrator.d.ts.map +1 -1
- package/dist/core/RebalancerOrchestrator.test.js +0 -1
- package/dist/core/RebalancerOrchestrator.test.js.map +1 -1
- package/dist/core/RebalancerService.d.ts.map +1 -1
- package/dist/core/RebalancerService.js +3 -2
- package/dist/core/RebalancerService.js.map +1 -1
- package/dist/core/RebalancerService.test.js +24 -0
- package/dist/core/RebalancerService.test.js.map +1 -1
- package/dist/e2e/fixtures/routes.d.ts +3 -3
- package/dist/e2e/fixtures/routes.d.ts.map +1 -1
- package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts.map +1 -1
- package/dist/e2e/harness/BaseLocalDeploymentManager.js +3 -2
- package/dist/e2e/harness/BaseLocalDeploymentManager.js.map +1 -1
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts.map +1 -1
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js.map +1 -1
- package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts.map +1 -1
- package/dist/e2e/harness/ForkIndexer.d.ts.map +1 -1
- package/dist/e2e/harness/ForkIndexer.js.map +1 -1
- package/dist/e2e/harness/LocalProvider.d.ts +3 -0
- package/dist/e2e/harness/LocalProvider.d.ts.map +1 -0
- package/dist/e2e/harness/LocalProvider.js +9 -0
- package/dist/e2e/harness/LocalProvider.js.map +1 -0
- package/dist/e2e/harness/LocalProvider.test.d.ts +2 -0
- package/dist/e2e/harness/LocalProvider.test.d.ts.map +1 -0
- package/dist/e2e/harness/LocalProvider.test.js +14 -0
- package/dist/e2e/harness/LocalProvider.test.js.map +1 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts.map +1 -1
- package/dist/e2e/harness/MixedLocalDeploymentManager.js.map +1 -1
- package/dist/e2e/harness/MockExplorerClient.d.ts.map +1 -1
- package/dist/e2e/harness/MockExplorerClient.js.map +1 -1
- package/dist/e2e/harness/MockExternalBridge.d.ts.map +1 -1
- package/dist/e2e/harness/MockExternalBridge.js.map +1 -1
- package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts.map +1 -1
- package/dist/e2e/harness/NativeLocalDeploymentManager.js +2 -1
- package/dist/e2e/harness/NativeLocalDeploymentManager.js.map +1 -1
- package/dist/e2e/harness/SnapshotHelper.d.ts.map +1 -1
- package/dist/e2e/harness/SnapshotHelper.js +3 -5
- package/dist/e2e/harness/SnapshotHelper.js.map +1 -1
- package/dist/e2e/harness/TestHelpers.js +1 -2
- package/dist/e2e/harness/TestHelpers.js.map +1 -1
- package/dist/e2e/harness/TestRebalancer.d.ts +5 -1
- package/dist/e2e/harness/TestRebalancer.d.ts.map +1 -1
- package/dist/e2e/harness/TestRebalancer.js +14 -4
- package/dist/e2e/harness/TestRebalancer.js.map +1 -1
- package/dist/e2e/relayer-denylist.e2e-test.d.ts +2 -0
- package/dist/e2e/relayer-denylist.e2e-test.d.ts.map +1 -0
- package/dist/e2e/relayer-denylist.e2e-test.js +388 -0
- package/dist/e2e/relayer-denylist.e2e-test.js.map +1 -0
- package/dist/factories/RebalancerContextFactory.d.ts.map +1 -1
- package/dist/factories/RebalancerContextFactory.js +61 -31
- package/dist/factories/RebalancerContextFactory.js.map +1 -1
- package/dist/factories/RebalancerContextFactory.test.js +336 -5
- package/dist/factories/RebalancerContextFactory.test.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/IRebalancer.d.ts +4 -2
- package/dist/interfaces/IRebalancer.d.ts.map +1 -1
- package/dist/metrics/Metrics.d.ts.map +1 -1
- package/dist/metrics/Metrics.js +1 -1
- package/dist/metrics/Metrics.js.map +1 -1
- package/dist/metrics/PriceGetter.d.ts +1 -0
- package/dist/metrics/PriceGetter.d.ts.map +1 -1
- package/dist/metrics/PriceGetter.js +14 -4
- package/dist/metrics/PriceGetter.js.map +1 -1
- package/dist/metrics/PriceGetter.test.d.ts +2 -0
- package/dist/metrics/PriceGetter.test.d.ts.map +1 -0
- package/dist/metrics/PriceGetter.test.js +84 -0
- package/dist/metrics/PriceGetter.test.js.map +1 -0
- package/dist/metrics/scripts/metrics.d.ts +4 -4
- package/dist/monitor/Monitor.d.ts +1 -0
- package/dist/monitor/Monitor.d.ts.map +1 -1
- package/dist/monitor/Monitor.js +55 -46
- package/dist/monitor/Monitor.js.map +1 -1
- package/dist/monitor/Monitor.test.d.ts +2 -0
- package/dist/monitor/Monitor.test.d.ts.map +1 -0
- package/dist/monitor/Monitor.test.js +346 -0
- package/dist/monitor/Monitor.test.js.map +1 -0
- package/dist/service.d.ts +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +9 -5
- package/dist/service.js.map +1 -1
- package/dist/strategy/BaseStrategy.d.ts.map +1 -1
- package/dist/strategy/BaseStrategy.js +13 -11
- package/dist/strategy/BaseStrategy.js.map +1 -1
- package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -1
- package/dist/strategy/CollateralDeficitStrategy.js +2 -2
- package/dist/strategy/CollateralDeficitStrategy.js.map +1 -1
- package/dist/strategy/CompositeStrategy.d.ts.map +1 -1
- package/dist/strategy/CompositeStrategy.js.map +1 -1
- package/dist/strategy/CompositeStrategy.test.js.map +1 -1
- package/dist/strategy/MinAmountStrategy.d.ts +1 -0
- package/dist/strategy/MinAmountStrategy.d.ts.map +1 -1
- package/dist/strategy/MinAmountStrategy.js +12 -8
- package/dist/strategy/MinAmountStrategy.js.map +1 -1
- package/dist/strategy/MinAmountStrategy.test.js +189 -2
- package/dist/strategy/MinAmountStrategy.test.js.map +1 -1
- package/dist/strategy/StrategyFactory.d.ts.map +1 -1
- package/dist/strategy/StrategyFactory.js.map +1 -1
- package/dist/strategy/WeightedStrategy.d.ts.map +1 -1
- package/dist/test/helpers.d.ts +11 -3
- package/dist/test/helpers.d.ts.map +1 -1
- package/dist/test/helpers.js +9 -11
- package/dist/test/helpers.js.map +1 -1
- package/dist/test/lifiMocks.d.ts +6 -6
- package/dist/test/lifiMocks.d.ts.map +1 -1
- package/dist/test/lifiMocks.js +5 -2
- package/dist/test/lifiMocks.js.map +1 -1
- package/dist/test/pendingTransferMiddlewareMocks.d.ts +17 -0
- package/dist/test/pendingTransferMiddlewareMocks.d.ts.map +1 -0
- package/dist/test/pendingTransferMiddlewareMocks.js +43 -0
- package/dist/test/pendingTransferMiddlewareMocks.js.map +1 -0
- package/dist/tracking/ActionTracker.d.ts +4 -0
- package/dist/tracking/ActionTracker.d.ts.map +1 -1
- package/dist/tracking/ActionTracker.js +76 -9
- package/dist/tracking/ActionTracker.js.map +1 -1
- package/dist/tracking/ActionTracker.test.js +418 -1
- package/dist/tracking/ActionTracker.test.js.map +1 -1
- package/dist/tracking/IActionTracker.d.ts +4 -2
- package/dist/tracking/IActionTracker.d.ts.map +1 -1
- package/dist/tracking/InflightContextAdapter.d.ts.map +1 -1
- package/dist/tracking/InflightContextAdapter.js.map +1 -1
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.d.ts +64 -0
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.js +474 -0
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.d.ts +2 -0
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.js +1168 -0
- package/dist/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.d.ts +61 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.js +160 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.d.ts +2 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.js +369 -0
- package/dist/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.d.ts +60 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.js +288 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.d.ts +2 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.js +606 -0
- package/dist/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.d.ts +25 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js +41 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.d.ts +2 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.js +141 -0
- package/dist/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/matchBody.d.ts +12 -0
- package/dist/tracking/pendingTransferMiddlewares/matchBody.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/matchBody.js +29 -0
- package/dist/tracking/pendingTransferMiddlewares/matchBody.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.d.ts +59 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.js +661 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.d.ts +2 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.js +1093 -0
- package/dist/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.js.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/types.d.ts +2 -0
- package/dist/tracking/pendingTransferMiddlewares/types.d.ts.map +1 -0
- package/dist/tracking/pendingTransferMiddlewares/types.js +4 -0
- package/dist/tracking/pendingTransferMiddlewares/types.js.map +1 -0
- package/dist/tracking/store/InMemoryStore.d.ts.map +1 -1
- package/dist/utils/ExplorerClient.d.ts +1 -0
- package/dist/utils/ExplorerClient.d.ts.map +1 -1
- package/dist/utils/ExplorerClient.js +8 -3
- package/dist/utils/ExplorerClient.js.map +1 -1
- package/dist/utils/ExplorerClient.test.js +25 -0
- package/dist/utils/ExplorerClient.test.js.map +1 -1
- package/dist/utils/balanceUtils.d.ts +7 -1
- package/dist/utils/balanceUtils.d.ts.map +1 -1
- package/dist/utils/balanceUtils.js +39 -1
- package/dist/utils/balanceUtils.js.map +1 -1
- package/dist/utils/balanceUtils.test.js +55 -1
- package/dist/utils/balanceUtils.test.js.map +1 -1
- package/dist/utils/blockTag.d.ts +5 -4
- package/dist/utils/blockTag.d.ts.map +1 -1
- package/dist/utils/blockTag.js +26 -10
- package/dist/utils/blockTag.js.map +1 -1
- package/dist/utils/blockTag.test.d.ts +2 -0
- package/dist/utils/blockTag.test.d.ts.map +1 -0
- package/dist/utils/blockTag.test.js +132 -0
- package/dist/utils/blockTag.test.js.map +1 -0
- package/dist/utils/bridgeUtils.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/gasEstimation.d.ts +2 -1
- package/dist/utils/gasEstimation.d.ts.map +1 -1
- package/dist/utils/gasEstimation.js +16 -13
- package/dist/utils/gasEstimation.js.map +1 -1
- package/dist/utils/gasEstimation.test.d.ts +2 -0
- package/dist/utils/gasEstimation.test.d.ts.map +1 -0
- package/dist/utils/gasEstimation.test.js +104 -0
- package/dist/utils/gasEstimation.test.js.map +1 -0
- package/dist/utils/tokenUtils.d.ts.map +1 -1
- package/dist/utils/tokenUtils.js +5 -2
- package/dist/utils/tokenUtils.js.map +1 -1
- package/package.json +23 -22
- package/src/bridges/LiFiBridge.test.ts +270 -0
- package/src/bridges/LiFiBridge.ts +90 -71
- package/src/config/RebalancerConfig.test.ts +315 -1
- package/src/config/RebalancerConfig.ts +6 -3
- package/src/config/types.ts +98 -8
- package/src/core/InventoryRebalancer.test.ts +1092 -38
- package/src/core/InventoryRebalancer.ts +584 -351
- package/src/core/Rebalancer.test.ts +84 -0
- package/src/core/Rebalancer.ts +22 -6
- package/src/core/RebalancerOrchestrator.test.ts +0 -1
- package/src/core/RebalancerService.test.ts +35 -0
- package/src/core/RebalancerService.ts +3 -2
- package/src/e2e/harness/BaseLocalDeploymentManager.ts +3 -1
- package/src/e2e/harness/LocalProvider.test.ts +16 -0
- package/src/e2e/harness/LocalProvider.ts +10 -0
- package/src/e2e/harness/NativeLocalDeploymentManager.ts +2 -1
- package/src/e2e/harness/SnapshotHelper.ts +2 -5
- package/src/e2e/harness/TestHelpers.ts +3 -3
- package/src/e2e/harness/TestRebalancer.ts +21 -1
- package/src/e2e/relayer-denylist.e2e-test.ts +558 -0
- package/src/factories/RebalancerContextFactory.test.ts +489 -8
- package/src/factories/RebalancerContextFactory.ts +86 -36
- package/src/index.ts +2 -0
- package/src/interfaces/IRebalancer.ts +4 -1
- package/src/metrics/Metrics.ts +1 -0
- package/src/metrics/PriceGetter.test.ts +113 -0
- package/src/metrics/PriceGetter.ts +18 -3
- package/src/monitor/Monitor.test.ts +408 -0
- package/src/monitor/Monitor.ts +123 -97
- package/src/service.ts +14 -8
- package/src/strategy/BaseStrategy.ts +18 -15
- package/src/strategy/CollateralDeficitStrategy.ts +4 -3
- package/src/strategy/MinAmountStrategy.test.ts +238 -2
- package/src/strategy/MinAmountStrategy.ts +29 -17
- package/src/test/helpers.ts +13 -12
- package/src/test/lifiMocks.ts +5 -2
- package/src/test/pendingTransferMiddlewareMocks.ts +65 -0
- package/src/tracking/ActionTracker.test.ts +635 -3
- package/src/tracking/ActionTracker.ts +92 -12
- package/src/tracking/IActionTracker.ts +4 -2
- package/src/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.test.ts +1693 -0
- package/src/tracking/pendingTransferMiddlewares/BlacklistIsmMiddleware.ts +784 -0
- package/src/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.test.ts +554 -0
- package/src/tracking/pendingTransferMiddlewares/PendingTransferMiddleware.ts +233 -0
- package/src/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.test.ts +894 -0
- package/src/tracking/pendingTransferMiddlewares/RelayerDenylistMiddleware.ts +404 -0
- package/src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.test.ts +205 -0
- package/src/tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.ts +89 -0
- package/src/tracking/pendingTransferMiddlewares/fixtures/mainnet-denylist.json +3556 -0
- package/src/tracking/pendingTransferMiddlewares/matchBody.ts +43 -0
- package/src/tracking/pendingTransferMiddlewares/relayerDenylistRules.test.ts +1220 -0
- package/src/tracking/pendingTransferMiddlewares/relayerDenylistRules.ts +934 -0
- package/src/tracking/pendingTransferMiddlewares/types.ts +3 -0
- package/src/utils/ExplorerClient.test.ts +42 -0
- package/src/utils/ExplorerClient.ts +14 -3
- package/src/utils/balanceUtils.test.ts +87 -1
- package/src/utils/balanceUtils.ts +73 -2
- package/src/utils/blockTag.test.ts +173 -0
- package/src/utils/blockTag.ts +35 -15
- package/src/utils/gasEstimation.test.ts +192 -0
- package/src/utils/gasEstimation.ts +17 -11
- package/src/utils/tokenUtils.ts +5 -2
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { BigNumber, ethers } from 'ethers';
|
|
3
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { pathToFileURL } from 'node:url';
|
|
7
|
+
import { ERC20__factory } from '@humanode-hyperlane/core';
|
|
8
|
+
import { HyperlaneCore, snapshot, } from '@humanode-hyperlane/sdk';
|
|
9
|
+
import { assert, sleep } from '@humanode-hyperlane/utils';
|
|
10
|
+
import { PendingTransferMiddlewareType, RebalancerStrategyOptions, } from '../config/types.js';
|
|
11
|
+
import { ANVIL_TEST_PRIVATE_KEY, DOMAIN_IDS, TEST_CHAINS, } from './fixtures/routes.js';
|
|
12
|
+
import { getAllCollateralBalances } from './harness/BridgeSetup.js';
|
|
13
|
+
import { Erc20LocalDeploymentManager } from './harness/Erc20LocalDeploymentManager.js';
|
|
14
|
+
import { resetSnapshotsAndRefreshProviders } from './harness/SnapshotHelper.js';
|
|
15
|
+
import { getFirstMonitorEvent } from './harness/TestHelpers.js';
|
|
16
|
+
import { TestRebalancer, } from './harness/TestRebalancer.js';
|
|
17
|
+
import { tryRelayMessage } from './harness/TransferHelper.js';
|
|
18
|
+
const USDC = 1000000n;
|
|
19
|
+
const REBALANCE_MESSAGE = 'rebalance_message';
|
|
20
|
+
// Re-reads the denylist on every Explorer query, so a rule written between
|
|
21
|
+
// cycles applies to the next one. Config files cannot set 0: the schema
|
|
22
|
+
// requires a positive interval.
|
|
23
|
+
const DENYLIST_REFRESH_INTERVAL_SECS = 0;
|
|
24
|
+
const POSITIVE_REFRESH_INTERVAL_SECS = 20;
|
|
25
|
+
const REFRESH_WAIT_MARGIN_MS = 1_000;
|
|
26
|
+
describe('RelayerDenylist middleware rebalance messages E2E', function () {
|
|
27
|
+
this.timeout(300_000);
|
|
28
|
+
let deploymentManager;
|
|
29
|
+
let multiProvider;
|
|
30
|
+
let localProviders;
|
|
31
|
+
let snapshotIds;
|
|
32
|
+
let hyperlaneCore;
|
|
33
|
+
let deployedAddresses;
|
|
34
|
+
let weightedStrategyConfig;
|
|
35
|
+
let denylistDir;
|
|
36
|
+
let denylistPath;
|
|
37
|
+
before(async function () {
|
|
38
|
+
deploymentManager = new Erc20LocalDeploymentManager();
|
|
39
|
+
const ctx = await deploymentManager.start();
|
|
40
|
+
multiProvider = ctx.multiProvider;
|
|
41
|
+
localProviders = ctx.providers;
|
|
42
|
+
deployedAddresses = ctx.deployedAddresses;
|
|
43
|
+
const coreAddresses = {};
|
|
44
|
+
for (const chain of TEST_CHAINS) {
|
|
45
|
+
coreAddresses[chain] = {
|
|
46
|
+
mailbox: deployedAddresses.chains[chain].mailbox,
|
|
47
|
+
interchainSecurityModule: deployedAddresses.chains[chain].ism,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
hyperlaneCore = HyperlaneCore.fromAddressesMap(coreAddresses, multiProvider);
|
|
51
|
+
weightedStrategyConfig = [
|
|
52
|
+
{
|
|
53
|
+
rebalanceStrategy: RebalancerStrategyOptions.Weighted,
|
|
54
|
+
chains: {
|
|
55
|
+
anvil1: {
|
|
56
|
+
weighted: { weight: 60n, tolerance: 5n },
|
|
57
|
+
bridge: deployedAddresses.bridgeRoute1.anvil1,
|
|
58
|
+
},
|
|
59
|
+
anvil2: {
|
|
60
|
+
weighted: { weight: 20n, tolerance: 5n },
|
|
61
|
+
bridge: deployedAddresses.bridgeRoute1.anvil2,
|
|
62
|
+
},
|
|
63
|
+
anvil3: {
|
|
64
|
+
weighted: { weight: 20n, tolerance: 5n },
|
|
65
|
+
bridge: deployedAddresses.bridgeRoute1.anvil3,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
snapshotIds = new Map();
|
|
71
|
+
for (const [chain, provider] of localProviders) {
|
|
72
|
+
snapshotIds.set(chain, await snapshot(provider));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
beforeEach(function () {
|
|
76
|
+
denylistDir = mkdtempSync(join(tmpdir(), 'rebalancer-denylist-e2e-'));
|
|
77
|
+
denylistPath = join(denylistDir, 'denylist.json');
|
|
78
|
+
writeDenylist([]);
|
|
79
|
+
});
|
|
80
|
+
afterEach(async function () {
|
|
81
|
+
rmSync(denylistDir, { recursive: true, force: true });
|
|
82
|
+
await resetSnapshotsAndRefreshProviders({
|
|
83
|
+
localProviders,
|
|
84
|
+
multiProvider,
|
|
85
|
+
snapshotIds,
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
after(async function () {
|
|
89
|
+
if (deploymentManager) {
|
|
90
|
+
await deploymentManager.stop();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
function writeDenylist(messageIds, matches = []) {
|
|
94
|
+
writeFileSync(denylistPath, JSON.stringify({
|
|
95
|
+
rules: [
|
|
96
|
+
...messageIds.map((messageId) => ({ messageId })),
|
|
97
|
+
...matches,
|
|
98
|
+
].map((match) => ({
|
|
99
|
+
reason: 'CCTP delivered the funds out of band',
|
|
100
|
+
addedBy: 'e2e',
|
|
101
|
+
match,
|
|
102
|
+
})),
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
function buildContext(balances, mockRebalanceActions = [], refreshIntervalSecs = DENYLIST_REFRESH_INTERVAL_SECS) {
|
|
106
|
+
const builder = TestRebalancer.builder(deploymentManager, multiProvider)
|
|
107
|
+
.withStrategy(weightedStrategyConfig)
|
|
108
|
+
.withBalances(balances)
|
|
109
|
+
.withPendingTransferMiddlewares([
|
|
110
|
+
{
|
|
111
|
+
type: PendingTransferMiddlewareType.RelayerDenylist,
|
|
112
|
+
url: pathToFileURL(denylistPath).href,
|
|
113
|
+
refreshIntervalSecs,
|
|
114
|
+
},
|
|
115
|
+
])
|
|
116
|
+
.withExecutionMode('execute');
|
|
117
|
+
for (const message of mockRebalanceActions) {
|
|
118
|
+
builder.withMockRebalanceAction(message);
|
|
119
|
+
}
|
|
120
|
+
return builder.build();
|
|
121
|
+
}
|
|
122
|
+
async function runCycle(context) {
|
|
123
|
+
const event = await getFirstMonitorEvent(context.createMonitor(0));
|
|
124
|
+
await context.orchestrator.executeCycle(event);
|
|
125
|
+
}
|
|
126
|
+
function getBalances() {
|
|
127
|
+
return getAllCollateralBalances(localProviders, TEST_CHAINS, deployedAddresses.monitoredRoute, deployedAddresses.tokens);
|
|
128
|
+
}
|
|
129
|
+
function expectBalances(balances, expected) {
|
|
130
|
+
for (const chain of TEST_CHAINS) {
|
|
131
|
+
expect(balances[chain].toBigInt(), `${chain} collateral`).to.equal(expected[chain]);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Simulates CCTP minting the bridged funds to the destination router while
|
|
135
|
+
// the companion Hyperlane message stays undeliverable.
|
|
136
|
+
async function deliverOutOfBand(chain, amount) {
|
|
137
|
+
const provider = localProviders.get(chain);
|
|
138
|
+
assert(provider, `Missing provider for chain ${chain}`);
|
|
139
|
+
const token = ERC20__factory.connect(deployedAddresses.tokens[chain], new ethers.Wallet(ANVIL_TEST_PRIVATE_KEY, provider));
|
|
140
|
+
const tx = await token.transfer(deployedAddresses.monitoredRoute[chain], amount);
|
|
141
|
+
await tx.wait();
|
|
142
|
+
}
|
|
143
|
+
function findAction(actions, destination) {
|
|
144
|
+
const action = actions.find((a) => a.destination === DOMAIN_IDS[destination]);
|
|
145
|
+
assert(action, `Missing rebalance action to ${destination}`);
|
|
146
|
+
return action;
|
|
147
|
+
}
|
|
148
|
+
function getMessageId(action) {
|
|
149
|
+
assert(action.messageId, `Missing message id on action ${action.id}`);
|
|
150
|
+
return action.messageId;
|
|
151
|
+
}
|
|
152
|
+
// Cycle 1 moves 1000 USDC anvil1 -> anvil3; CCTP then delivers it out of
|
|
153
|
+
// band, leaving the routers balanced at 6000/2000/2000.
|
|
154
|
+
async function rebalanceAndDeliverOutOfBand(context) {
|
|
155
|
+
await runCycle(context);
|
|
156
|
+
const intents = await context.tracker.getActiveRebalanceIntents();
|
|
157
|
+
expect(intents.length).to.equal(1);
|
|
158
|
+
const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
159
|
+
expect(actions.length).to.equal(1);
|
|
160
|
+
const [action] = actions;
|
|
161
|
+
expect(action.intentId).to.equal(intents[0].id);
|
|
162
|
+
expect(action.origin).to.equal(DOMAIN_IDS.anvil1);
|
|
163
|
+
expect(action.destination).to.equal(DOMAIN_IDS.anvil3);
|
|
164
|
+
expect(action.amount).to.equal(1000n * USDC);
|
|
165
|
+
expect(action.status).to.equal('in_progress');
|
|
166
|
+
expectBalances(await getBalances(), {
|
|
167
|
+
anvil1: 6000n * USDC,
|
|
168
|
+
anvil2: 2000n * USDC,
|
|
169
|
+
anvil3: 1000n * USDC,
|
|
170
|
+
});
|
|
171
|
+
await deliverOutOfBand('anvil3', action.amount);
|
|
172
|
+
expectBalances(await getBalances(), {
|
|
173
|
+
anvil1: 6000n * USDC,
|
|
174
|
+
anvil2: 2000n * USDC,
|
|
175
|
+
anvil3: 2000n * USDC,
|
|
176
|
+
});
|
|
177
|
+
return action;
|
|
178
|
+
}
|
|
179
|
+
// Seen as still in flight, the out-of-band 1000 USDC inflates the total to
|
|
180
|
+
// 11000, so anvil3 looks 800 over its 2200 target.
|
|
181
|
+
async function expectDoubleCounted(context, action) {
|
|
182
|
+
const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
183
|
+
expect(actions.length).to.equal(3);
|
|
184
|
+
const toAnvil1 = findAction(actions, 'anvil1');
|
|
185
|
+
expect(toAnvil1.origin).to.equal(DOMAIN_IDS.anvil3);
|
|
186
|
+
expect(toAnvil1.amount).to.equal(600n * USDC);
|
|
187
|
+
const toAnvil2 = findAction(actions, 'anvil2');
|
|
188
|
+
expect(toAnvil2.origin).to.equal(DOMAIN_IDS.anvil3);
|
|
189
|
+
expect(toAnvil2.amount).to.equal(200n * USDC);
|
|
190
|
+
const intents = await context.tracker.getActiveRebalanceIntents();
|
|
191
|
+
expect(intents.map((i) => i.id)).to.have.members([
|
|
192
|
+
action.intentId,
|
|
193
|
+
toAnvil1.intentId,
|
|
194
|
+
toAnvil2.intentId,
|
|
195
|
+
]);
|
|
196
|
+
}
|
|
197
|
+
async function getIndexedMessage(context, messageId) {
|
|
198
|
+
await context.forkIndexer.sync(await context.getConfirmedBlockTags());
|
|
199
|
+
const message = context.forkIndexer
|
|
200
|
+
.getRebalanceActions()
|
|
201
|
+
.find((m) => m.msg_id === messageId);
|
|
202
|
+
assert(message, `Fork indexer did not index message ${messageId}`);
|
|
203
|
+
return message;
|
|
204
|
+
}
|
|
205
|
+
async function expectStillInProgress(context, action) {
|
|
206
|
+
const storedAction = await context.tracker.getRebalanceAction(action.id);
|
|
207
|
+
expect(storedAction?.status).to.equal('in_progress');
|
|
208
|
+
const storedIntent = await context.tracker.getRebalanceIntent(action.intentId);
|
|
209
|
+
expect(storedIntent?.status).to.equal('in_progress');
|
|
210
|
+
}
|
|
211
|
+
it('double counts an out-of-band delivered rebalance that is not denylisted', async function () {
|
|
212
|
+
const context = await buildContext('WEIGHTED_IMBALANCED');
|
|
213
|
+
const action = await rebalanceAndDeliverOutOfBand(context);
|
|
214
|
+
await runCycle(context);
|
|
215
|
+
await expectDoubleCounted(context, action);
|
|
216
|
+
await expectStillInProgress(context, action);
|
|
217
|
+
});
|
|
218
|
+
it('stops counting a rebalance once its message is denylisted', async function () {
|
|
219
|
+
const context = await buildContext('WEIGHTED_IMBALANCED');
|
|
220
|
+
const action = await rebalanceAndDeliverOutOfBand(context);
|
|
221
|
+
writeDenylist([getMessageId(action)]);
|
|
222
|
+
await runCycle(context);
|
|
223
|
+
expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
|
|
224
|
+
const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
225
|
+
expect(actions.length).to.equal(1);
|
|
226
|
+
expect(actions[0].id).to.equal(action.id);
|
|
227
|
+
await expectStillInProgress(context, action);
|
|
228
|
+
});
|
|
229
|
+
it('stops counting a denylisted rebalance once the refresh interval passes', async function () {
|
|
230
|
+
const context = await buildContext('WEIGHTED_IMBALANCED', [], POSITIVE_REFRESH_INTERVAL_SECS);
|
|
231
|
+
const action = await rebalanceAndDeliverOutOfBand(context);
|
|
232
|
+
writeDenylist([getMessageId(action)]);
|
|
233
|
+
const ruleWrittenAt = Date.now();
|
|
234
|
+
await context.tracker.syncRebalanceActions(await context.getConfirmedBlockTags());
|
|
235
|
+
expect((await context.tracker.getActiveRebalanceIntents()).map((i) => i.id)).to.deep.equal([action.intentId]);
|
|
236
|
+
// The rule was not loaded above, so the last load predates it.
|
|
237
|
+
await sleep(ruleWrittenAt +
|
|
238
|
+
POSITIVE_REFRESH_INTERVAL_SECS * 1_000 +
|
|
239
|
+
REFRESH_WAIT_MARGIN_MS -
|
|
240
|
+
Date.now());
|
|
241
|
+
await runCycle(context);
|
|
242
|
+
expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
|
|
243
|
+
const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
244
|
+
expect(actions.length).to.equal(1);
|
|
245
|
+
expect(actions[0].id).to.equal(action.id);
|
|
246
|
+
await expectStillInProgress(context, action);
|
|
247
|
+
});
|
|
248
|
+
it('counts the rebalance again once its deny rule is removed', async function () {
|
|
249
|
+
const context = await buildContext('WEIGHTED_IMBALANCED');
|
|
250
|
+
const action = await rebalanceAndDeliverOutOfBand(context);
|
|
251
|
+
writeDenylist([getMessageId(action)]);
|
|
252
|
+
await runCycle(context);
|
|
253
|
+
expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
|
|
254
|
+
expect((await context.tracker.getActionsByType(REBALANCE_MESSAGE)).length).to.equal(1);
|
|
255
|
+
writeDenylist([]);
|
|
256
|
+
await runCycle(context);
|
|
257
|
+
await expectDoubleCounted(context, action);
|
|
258
|
+
await expectStillInProgress(context, action);
|
|
259
|
+
});
|
|
260
|
+
it('recovers and counts a non-denylisted rebalance after a restart', async function () {
|
|
261
|
+
const context = await buildContext('WEIGHTED_IMBALANCED');
|
|
262
|
+
const action = await rebalanceAndDeliverOutOfBand(context);
|
|
263
|
+
const messageId = getMessageId(action);
|
|
264
|
+
const message = await getIndexedMessage(context, messageId);
|
|
265
|
+
const restarted = await buildContext(await getBalances(), [message]);
|
|
266
|
+
const recovered = await restarted.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
267
|
+
expect(recovered.length).to.equal(1);
|
|
268
|
+
expect(recovered[0].id).to.equal(messageId);
|
|
269
|
+
expect(recovered[0].status).to.equal('in_progress');
|
|
270
|
+
expect((await restarted.tracker.getActiveRebalanceIntents()).map((i) => i.id)).to.deep.equal([recovered[0].intentId]);
|
|
271
|
+
await runCycle(restarted);
|
|
272
|
+
await expectDoubleCounted(restarted, recovered[0]);
|
|
273
|
+
});
|
|
274
|
+
it('does not recover a denylisted rebalance after a restart', async function () {
|
|
275
|
+
const context = await buildContext('WEIGHTED_IMBALANCED');
|
|
276
|
+
const action = await rebalanceAndDeliverOutOfBand(context);
|
|
277
|
+
const messageId = getMessageId(action);
|
|
278
|
+
const message = await getIndexedMessage(context, messageId);
|
|
279
|
+
writeDenylist([messageId]);
|
|
280
|
+
const restarted = await buildContext(await getBalances(), [message]);
|
|
281
|
+
expect(await restarted.tracker.getActionsByType(REBALANCE_MESSAGE)).to.be
|
|
282
|
+
.empty;
|
|
283
|
+
expect(await restarted.tracker.getActiveRebalanceIntents()).to.be.empty;
|
|
284
|
+
await runCycle(restarted);
|
|
285
|
+
expect(await restarted.tracker.getActionsByType(REBALANCE_MESSAGE)).to.be
|
|
286
|
+
.empty;
|
|
287
|
+
expect(await restarted.tracker.getActiveRebalanceIntents()).to.be.empty;
|
|
288
|
+
});
|
|
289
|
+
it('completes a denylisted rebalance whose message is delivered', async function () {
|
|
290
|
+
const context = await buildContext('WEIGHTED_IMBALANCED');
|
|
291
|
+
await runCycle(context);
|
|
292
|
+
const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
293
|
+
expect(actions.length).to.equal(1);
|
|
294
|
+
const [action] = actions;
|
|
295
|
+
const messageId = getMessageId(action);
|
|
296
|
+
writeDenylist([messageId]);
|
|
297
|
+
await context.tracker.syncRebalanceActions(await context.getConfirmedBlockTags());
|
|
298
|
+
expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
|
|
299
|
+
const originProvider = localProviders.get('anvil1');
|
|
300
|
+
assert(originProvider, 'Missing provider for chain anvil1');
|
|
301
|
+
assert(action.txHash, `Missing tx hash on action ${action.id}`);
|
|
302
|
+
const relayResult = await tryRelayMessage(multiProvider, hyperlaneCore, {
|
|
303
|
+
dispatchTx: await originProvider.getTransactionReceipt(action.txHash),
|
|
304
|
+
messageId,
|
|
305
|
+
origin: 'anvil1',
|
|
306
|
+
destination: 'anvil3',
|
|
307
|
+
});
|
|
308
|
+
expect(relayResult.success, `Relay failed: ${relayResult.error}`).to.be
|
|
309
|
+
.true;
|
|
310
|
+
await context.tracker.syncRebalanceActions(await context.getConfirmedBlockTags());
|
|
311
|
+
const storedAction = await context.tracker.getRebalanceAction(action.id);
|
|
312
|
+
expect(storedAction?.status).to.equal('complete');
|
|
313
|
+
const storedIntent = await context.tracker.getRebalanceIntent(action.intentId);
|
|
314
|
+
expect(storedIntent?.status).to.equal('complete');
|
|
315
|
+
expect(await context.tracker.getInProgressActions()).to.be.empty;
|
|
316
|
+
expect(await context.tracker.getActiveRebalanceIntents()).to.be.empty;
|
|
317
|
+
expectBalances(await getBalances(), {
|
|
318
|
+
anvil1: 6000n * USDC,
|
|
319
|
+
anvil2: 2000n * USDC,
|
|
320
|
+
anvil3: 2000n * USDC,
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
const broadRuleCases = [
|
|
324
|
+
{
|
|
325
|
+
name: 'destination',
|
|
326
|
+
match: () => ({ destinationDomain: DOMAIN_IDS.anvil3 }),
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
name: 'route',
|
|
330
|
+
match: (message) => ({
|
|
331
|
+
originDomain: message.origin_domain_id,
|
|
332
|
+
senderAddress: message.sender,
|
|
333
|
+
destinationDomain: message.destination_domain_id,
|
|
334
|
+
recipientAddress: message.recipient,
|
|
335
|
+
}),
|
|
336
|
+
},
|
|
337
|
+
];
|
|
338
|
+
for (const c of broadRuleCases) {
|
|
339
|
+
it(`keeps counting an undelivered rebalance a ${c.name} rule denies`, async function () {
|
|
340
|
+
const context = await buildContext('WEIGHTED_IMBALANCED');
|
|
341
|
+
await runCycle(context);
|
|
342
|
+
const [action] = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
343
|
+
assert(action, 'Missing rebalance action from cycle 1');
|
|
344
|
+
const message = await getIndexedMessage(context, getMessageId(action));
|
|
345
|
+
writeDenylist([], [c.match(message)]);
|
|
346
|
+
await runCycle(context);
|
|
347
|
+
await runCycle(context);
|
|
348
|
+
const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
349
|
+
expect(actions.map((a) => a.id)).to.deep.equal([action.id]);
|
|
350
|
+
expect((await context.tracker.getActiveRebalanceIntents()).map((i) => i.id)).to.deep.equal([action.intentId]);
|
|
351
|
+
await expectStillInProgress(context, action);
|
|
352
|
+
expectBalances(await getBalances(), {
|
|
353
|
+
anvil1: 6000n * USDC,
|
|
354
|
+
anvil2: 2000n * USDC,
|
|
355
|
+
anvil3: 1000n * USDC,
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
it('keeps counting the rebalance that is not denylisted', async function () {
|
|
360
|
+
const context = await buildContext({
|
|
361
|
+
anvil1: BigNumber.from(8000n * USDC),
|
|
362
|
+
anvil2: BigNumber.from(1000n * USDC),
|
|
363
|
+
anvil3: BigNumber.from(1000n * USDC),
|
|
364
|
+
});
|
|
365
|
+
await runCycle(context);
|
|
366
|
+
const actions = await context.tracker.getActionsByType(REBALANCE_MESSAGE);
|
|
367
|
+
expect(actions.length).to.equal(2);
|
|
368
|
+
const toAnvil2 = findAction(actions, 'anvil2');
|
|
369
|
+
const toAnvil3 = findAction(actions, 'anvil3');
|
|
370
|
+
expect(toAnvil2.amount).to.equal(1000n * USDC);
|
|
371
|
+
expect(toAnvil3.amount).to.equal(1000n * USDC);
|
|
372
|
+
expect((await context.tracker.getActiveRebalanceIntents()).length).to.equal(2);
|
|
373
|
+
await deliverOutOfBand('anvil3', toAnvil3.amount);
|
|
374
|
+
writeDenylist([getMessageId(toAnvil3)]);
|
|
375
|
+
expectBalances(await getBalances(), {
|
|
376
|
+
anvil1: 6000n * USDC,
|
|
377
|
+
anvil2: 1000n * USDC,
|
|
378
|
+
anvil3: 2000n * USDC,
|
|
379
|
+
});
|
|
380
|
+
await runCycle(context);
|
|
381
|
+
const intents = await context.tracker.getActiveRebalanceIntents();
|
|
382
|
+
expect(intents.map((i) => i.id)).to.deep.equal([toAnvil2.intentId]);
|
|
383
|
+
expect((await context.tracker.getActionsByType(REBALANCE_MESSAGE)).length).to.equal(2);
|
|
384
|
+
await expectStillInProgress(context, toAnvil2);
|
|
385
|
+
await expectStillInProgress(context, toAnvil3);
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
//# sourceMappingURL=relayer-denylist.e2e-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayer-denylist.e2e-test.js","sourceRoot":"","sources":["../../src/e2e/relayer-denylist.e2e-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RebalancerContextFactory.d.ts","sourceRoot":"","sources":["../../src/factories/RebalancerContextFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAIL,qBAAqB,EACrB,aAAa,EACb,KAAK,KAAK,EACV,QAAQ,EACR,KAAK,cAAc,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"RebalancerContextFactory.d.ts","sourceRoot":"","sources":["../../src/factories/RebalancerContextFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { MultiProtocolCore, MultiProtocolProvider, WarpCore, } from '@humanode-hyperlane/sdk';
|
|
2
|
-
import { assert, ProtocolType, objMap,
|
|
3
|
-
import { LiFiBridge } from '../bridges/LiFiBridge.js';
|
|
2
|
+
import { assert, isEVMLike, ProtocolType, objMap, } from '@humanode-hyperlane/utils';
|
|
4
3
|
import { ExecutionType, ExternalBridgeType, getAllBridges, getInventoryChainNames, getInventoryOriginChainNames, getOverrideExecutionType, getStrategyChainConfig, getStrategyChainNames, } from '../config/types.js';
|
|
5
4
|
import { InventoryRebalancer, } from '../core/InventoryRebalancer.js';
|
|
6
5
|
import { Rebalancer } from '../core/Rebalancer.js';
|
|
@@ -11,8 +10,10 @@ import { Monitor } from '../monitor/Monitor.js';
|
|
|
11
10
|
import { StrategyFactory } from '../strategy/StrategyFactory.js';
|
|
12
11
|
import { ActionTracker, } from '../tracking/ActionTracker.js';
|
|
13
12
|
import { InflightContextAdapter } from '../tracking/InflightContextAdapter.js';
|
|
13
|
+
import { buildPendingTransferMiddlewares } from '../tracking/pendingTransferMiddlewares/buildPendingTransferMiddlewares.js';
|
|
14
14
|
import { InMemoryStore } from '../tracking/store/index.js';
|
|
15
15
|
import { ExplorerClient, } from '../utils/ExplorerClient.js';
|
|
16
|
+
import { normalizeConfiguredAmount, normalizeToCanonical, } from '../utils/balanceUtils.js';
|
|
16
17
|
import { isCollateralizedTokenEligibleForRebalancing } from '../utils/tokenUtils.js';
|
|
17
18
|
const DEFAULT_EXPLORER_URL = process.env.EXPLORER_API_URL || 'https://explorer4.hasura.app/v1/graphql';
|
|
18
19
|
export class RebalancerContextFactory {
|
|
@@ -73,7 +74,7 @@ export class RebalancerContextFactory {
|
|
|
73
74
|
...new Set(warpCoreConfig.tokens.map((t) => t.chainName)),
|
|
74
75
|
];
|
|
75
76
|
for (const chain of warpChains) {
|
|
76
|
-
if (multiProvider.getProtocol(chain)
|
|
77
|
+
if (!isEVMLike(multiProvider.getProtocol(chain))) {
|
|
77
78
|
logger.debug({ chain }, 'Skipping provider init for non-EVM chain');
|
|
78
79
|
continue;
|
|
79
80
|
}
|
|
@@ -123,8 +124,8 @@ export class RebalancerContextFactory {
|
|
|
123
124
|
const chainConfig = getStrategyChainConfig(this.config.strategyConfig, chainName);
|
|
124
125
|
if (chainConfig?.bridgeMinAcceptedAmount) {
|
|
125
126
|
const token = this.tokensByChainName[chainName];
|
|
126
|
-
|
|
127
|
-
minAmountsByChain[chainName] =
|
|
127
|
+
assert(token, `No token found for configured strategy chain ${chainName} in warp route ${this.config.warpRouteId}`);
|
|
128
|
+
minAmountsByChain[chainName] = normalizeConfiguredAmount(chainConfig.bridgeMinAcceptedAmount, token);
|
|
128
129
|
}
|
|
129
130
|
}
|
|
130
131
|
this.logger.debug({
|
|
@@ -142,7 +143,7 @@ export class RebalancerContextFactory {
|
|
|
142
143
|
const transferStore = new InMemoryStore();
|
|
143
144
|
const intentStore = new InMemoryStore();
|
|
144
145
|
const actionStore = new InMemoryStore();
|
|
145
|
-
const
|
|
146
|
+
const baseExplorerClient = typeof explorerUrlOrClient === 'string'
|
|
146
147
|
? new ExplorerClient(explorerUrlOrClient, (domain) => this.multiProvider.getProtocol(domain))
|
|
147
148
|
: explorerUrlOrClient;
|
|
148
149
|
// 3. Get MultiProtocolCore from registry (supports all VM types)
|
|
@@ -172,16 +173,28 @@ export class RebalancerContextFactory {
|
|
|
172
173
|
const domain = this.multiProvider.getDomainId(token.chainName);
|
|
173
174
|
routersByDomain[domain] = token.addressOrDenom;
|
|
174
175
|
}
|
|
176
|
+
const mailboxByDomain = {};
|
|
177
|
+
for (const [chain, addresses] of Object.entries(coreAddresses)) {
|
|
178
|
+
mailboxByDomain[this.multiProvider.getDomainId(chain)] =
|
|
179
|
+
addresses.mailbox;
|
|
180
|
+
}
|
|
181
|
+
const { client: explorerClient, isIgnoredTransfer, isIgnoredRebalanceAction, } = await buildPendingTransferMiddlewares(baseExplorerClient, this.config.pendingTransferMiddlewares ?? [], {
|
|
182
|
+
routersByDomain,
|
|
183
|
+
mailboxByDomain,
|
|
184
|
+
multiProvider: this.multiProvider,
|
|
185
|
+
logger: this.logger,
|
|
186
|
+
});
|
|
175
187
|
const trackerConfig = {
|
|
176
188
|
routersByDomain,
|
|
189
|
+
isIgnoredTransfer,
|
|
190
|
+
isIgnoredRebalanceAction,
|
|
177
191
|
bridges,
|
|
178
192
|
rebalancerAddress,
|
|
179
193
|
inventorySignerAddresses: this.config.inventorySigners
|
|
180
|
-
? Object.
|
|
181
|
-
.filter((
|
|
182
|
-
.map((
|
|
183
|
-
.
|
|
184
|
-
.filter(Boolean)
|
|
194
|
+
? Object.values(ProtocolType)
|
|
195
|
+
.filter((protocol) => isEVMLike(protocol))
|
|
196
|
+
.map((protocol) => this.config.inventorySigners?.[protocol]?.address)
|
|
197
|
+
.filter((address) => Boolean(address))
|
|
185
198
|
: undefined,
|
|
186
199
|
intentTTL: this.config.intentTTL,
|
|
187
200
|
};
|
|
@@ -225,6 +238,9 @@ export class RebalancerContextFactory {
|
|
|
225
238
|
this.logger.debug('No inventory chains configured');
|
|
226
239
|
return null;
|
|
227
240
|
}
|
|
241
|
+
for (const chain of allRelevantChains) {
|
|
242
|
+
assert(this.tokensByChainName[chain], `No token found for inventory-relevant chain ${chain} in warp route ${this.config.warpRouteId}`);
|
|
243
|
+
}
|
|
228
244
|
const requiredProtocols = new Set(allRelevantChains.map((chain) => {
|
|
229
245
|
const metadata = this.warpCore.multiProvider.getChainMetadata(chain);
|
|
230
246
|
assert(metadata?.protocol, `No protocol in chain metadata for ${chain}`);
|
|
@@ -233,11 +249,12 @@ export class RebalancerContextFactory {
|
|
|
233
249
|
const SUPPORTED_INVENTORY_PROTOCOLS = new Set([
|
|
234
250
|
ProtocolType.Ethereum,
|
|
235
251
|
ProtocolType.Sealevel,
|
|
252
|
+
ProtocolType.Tron,
|
|
236
253
|
]);
|
|
237
254
|
for (const protocol of requiredProtocols) {
|
|
238
255
|
const chainsForProtocol = allRelevantChains.filter((chain) => this.warpCore.multiProvider.getChainMetadata(chain).protocol ===
|
|
239
256
|
protocol);
|
|
240
|
-
assert(SUPPORTED_INVENTORY_PROTOCOLS.has(protocol), `Inventory rebalancing does not support protocol '${protocol}' (chains: ${chainsForProtocol.join(', ')}). Supported: ethereum, sealevel`);
|
|
257
|
+
assert(SUPPORTED_INVENTORY_PROTOCOLS.has(protocol), `Inventory rebalancing does not support protocol '${protocol}' (chains: ${chainsForProtocol.join(', ')}). Supported: ethereum, sealevel, tron`);
|
|
241
258
|
}
|
|
242
259
|
for (const protocol of requiredProtocols) {
|
|
243
260
|
const chainsForProtocol = allRelevantChains.filter((chain) => this.warpCore.multiProvider.getChainMetadata(chain).protocol ===
|
|
@@ -251,7 +268,8 @@ export class RebalancerContextFactory {
|
|
|
251
268
|
protocol);
|
|
252
269
|
assert(inventorySigners[protocol]?.address, `Missing inventory address for protocol ${protocol} (required by inventory chains: ${chainsForProtocol.join(', ')})`);
|
|
253
270
|
}
|
|
254
|
-
const externalBridgeRegistry = externalBridgeRegistryOverride ??
|
|
271
|
+
const externalBridgeRegistry = externalBridgeRegistryOverride ??
|
|
272
|
+
(await this.buildExternalBridgeRegistry());
|
|
255
273
|
if (Object.keys(externalBridgeRegistry).length === 0) {
|
|
256
274
|
if (externalBridgeRegistryOverride !== undefined) {
|
|
257
275
|
this.logger.debug('No external bridges in override registry, skipping inventory components');
|
|
@@ -259,21 +277,26 @@ export class RebalancerContextFactory {
|
|
|
259
277
|
else {
|
|
260
278
|
this.logger.debug('No external bridges configured, skipping inventory components');
|
|
261
279
|
}
|
|
262
|
-
const inventoryAddresses =
|
|
263
|
-
|
|
264
|
-
cfg
|
|
265
|
-
|
|
280
|
+
const inventoryAddresses = {};
|
|
281
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
282
|
+
const cfg = inventorySigners[protocol];
|
|
283
|
+
if (!cfg)
|
|
284
|
+
continue;
|
|
285
|
+
inventoryAddresses[protocol] = cfg.address;
|
|
286
|
+
}
|
|
266
287
|
const inventoryConfig = {
|
|
267
288
|
inventoryAddresses,
|
|
268
289
|
chains: allRelevantChains,
|
|
269
290
|
};
|
|
270
291
|
// Merge config addresses with runtime keys
|
|
271
292
|
const mergedSigners = {};
|
|
272
|
-
for (const
|
|
273
|
-
const
|
|
274
|
-
|
|
293
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
294
|
+
const cfg = inventorySigners[protocol];
|
|
295
|
+
if (!cfg)
|
|
296
|
+
continue;
|
|
297
|
+
mergedSigners[protocol] = {
|
|
275
298
|
address: cfg.address,
|
|
276
|
-
key: cfg.key ?? this.inventorySignerKeysByProtocol?.[
|
|
299
|
+
key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocol],
|
|
277
300
|
};
|
|
278
301
|
}
|
|
279
302
|
const inventoryRebalancer = new InventoryRebalancer({
|
|
@@ -287,10 +310,13 @@ export class RebalancerContextFactory {
|
|
|
287
310
|
};
|
|
288
311
|
}
|
|
289
312
|
// 3. Build inventory config
|
|
290
|
-
const inventoryAddresses =
|
|
291
|
-
|
|
292
|
-
cfg
|
|
293
|
-
|
|
313
|
+
const inventoryAddresses = {};
|
|
314
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
315
|
+
const cfg = inventorySigners[protocol];
|
|
316
|
+
if (!cfg)
|
|
317
|
+
continue;
|
|
318
|
+
inventoryAddresses[protocol] = cfg.address;
|
|
319
|
+
}
|
|
294
320
|
const inventoryConfig = {
|
|
295
321
|
inventoryAddresses,
|
|
296
322
|
chains: allRelevantChains,
|
|
@@ -298,11 +324,13 @@ export class RebalancerContextFactory {
|
|
|
298
324
|
// 4. Create InventoryRebalancer
|
|
299
325
|
// Merge config addresses with runtime keys
|
|
300
326
|
const mergedSigners = {};
|
|
301
|
-
for (const
|
|
302
|
-
const
|
|
303
|
-
|
|
327
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
328
|
+
const cfg = inventorySigners[protocol];
|
|
329
|
+
if (!cfg)
|
|
330
|
+
continue;
|
|
331
|
+
mergedSigners[protocol] = {
|
|
304
332
|
address: cfg.address,
|
|
305
|
-
key: cfg.key ?? this.inventorySignerKeysByProtocol?.[
|
|
333
|
+
key: cfg.key ?? this.inventorySignerKeysByProtocol?.[protocol],
|
|
306
334
|
};
|
|
307
335
|
}
|
|
308
336
|
const inventoryRebalancer = new InventoryRebalancer({
|
|
@@ -315,7 +343,7 @@ export class RebalancerContextFactory {
|
|
|
315
343
|
}, 'Inventory components created successfully');
|
|
316
344
|
return { inventoryRebalancer, externalBridgeRegistry, inventoryConfig };
|
|
317
345
|
}
|
|
318
|
-
buildExternalBridgeRegistry() {
|
|
346
|
+
async buildExternalBridgeRegistry() {
|
|
319
347
|
const { externalBridges } = this.config;
|
|
320
348
|
const registry = {};
|
|
321
349
|
for (const bridgeType of Object.values(ExternalBridgeType)) {
|
|
@@ -323,6 +351,7 @@ export class RebalancerContextFactory {
|
|
|
323
351
|
case ExternalBridgeType.LiFi: {
|
|
324
352
|
const lifiConfig = externalBridges?.lifi;
|
|
325
353
|
if (lifiConfig?.integrator) {
|
|
354
|
+
const { LiFiBridge } = await import('../bridges/LiFiBridge.js');
|
|
326
355
|
registry[ExternalBridgeType.LiFi] = new LiFiBridge({
|
|
327
356
|
integrator: lifiConfig.integrator,
|
|
328
357
|
defaultSlippage: lifiConfig.defaultSlippage,
|
|
@@ -411,7 +440,8 @@ export class RebalancerContextFactory {
|
|
|
411
440
|
chainNames.has(token.chainName)) {
|
|
412
441
|
const adapter = token.getHypAdapter(this.warpCore.multiProvider);
|
|
413
442
|
const bridgedSupply = await adapter.getBridgedSupply();
|
|
414
|
-
|
|
443
|
+
assert(bridgedSupply !== undefined, `Missing bridged supply for ${token.chainName} while computing initial total collateral for warp route ${this.config.warpRouteId}`);
|
|
444
|
+
initialTotalCollateral += normalizeToCanonical(bridgedSupply, token);
|
|
415
445
|
}
|
|
416
446
|
}));
|
|
417
447
|
return initialTotalCollateral;
|