@humanode-hyperlane/rebalancer 27.2.2 → 1029.1.1
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
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import chai, { expect } from 'chai';
|
|
2
2
|
import chaiAsPromised from 'chai-as-promised';
|
|
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';
|
|
3
7
|
import { pino } from 'pino';
|
|
4
8
|
import Sinon from 'sinon';
|
|
5
9
|
import { EthJsonRpcBlockParameterTag } from '@humanode-hyperlane/sdk';
|
|
10
|
+
import { ProtocolType, assert } from '@humanode-hyperlane/utils';
|
|
6
11
|
import { DEFAULT_INTENT_TTL_MS, DEFAULT_MOVEMENT_STALENESS_MS, ExternalBridgeType, } from '../config/types.js';
|
|
7
|
-
import {
|
|
12
|
+
import { ID_A, ID_B, ID_C, buildMessage, } from '../test/pendingTransferMiddlewareMocks.js';
|
|
13
|
+
import { ExplorerClient, } from '../utils/ExplorerClient.js';
|
|
14
|
+
import { ActionTracker, TRANSFER_SYNC_ROW_LIMIT_MESSAGE, } from './ActionTracker.js';
|
|
15
|
+
import { ExplorerRowLimitError } from './pendingTransferMiddlewares/PendingTransferMiddleware.js';
|
|
16
|
+
import { RelayerDenylistMiddleware } from './pendingTransferMiddlewares/RelayerDenylistMiddleware.js';
|
|
8
17
|
import { InMemoryStore } from './store/InMemoryStore.js';
|
|
9
18
|
chai.use(chaiAsPromised);
|
|
10
19
|
const testLogger = pino({ level: 'silent' });
|
|
@@ -270,6 +279,29 @@ describe('ActionTracker', () => {
|
|
|
270
279
|
const transfers = await transferStore.getAll();
|
|
271
280
|
expect(transfers).to.have.lengthOf(1);
|
|
272
281
|
});
|
|
282
|
+
const syncFailures = [
|
|
283
|
+
{
|
|
284
|
+
name: 'logs an Explorer row limit failure as an error and rethrows it',
|
|
285
|
+
error: new ExplorerRowLimitError('row limit', []),
|
|
286
|
+
loggedAsError: true,
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
name: 'rethrows other Explorer failures without an error log',
|
|
290
|
+
error: new Error('explorer down'),
|
|
291
|
+
loggedAsError: false,
|
|
292
|
+
},
|
|
293
|
+
];
|
|
294
|
+
for (const c of syncFailures) {
|
|
295
|
+
it(c.name, async () => {
|
|
296
|
+
const logger = pino({ level: 'silent' });
|
|
297
|
+
const error = Sinon.spy(logger, 'error');
|
|
298
|
+
explorerClient.getInflightUserTransfers.rejects(c.error);
|
|
299
|
+
const tracker = new ActionTracker(transferStore, rebalanceIntentStore, rebalanceActionStore, explorerClient, core, config, logger);
|
|
300
|
+
await expect(tracker.syncTransfers()).to.be.rejectedWith(c.error);
|
|
301
|
+
expect(error.calledWith(Sinon.match({ error: c.error.message }), TRANSFER_SYNC_ROW_LIMIT_MESSAGE)).to.equal(c.loggedAsError);
|
|
302
|
+
expect(error.callCount).to.equal(c.loggedAsError ? 1 : 0);
|
|
303
|
+
});
|
|
304
|
+
}
|
|
273
305
|
it('should mark transfers as complete when delivered', async () => {
|
|
274
306
|
// Pre-create transfer
|
|
275
307
|
await transferStore.save({
|
|
@@ -290,6 +322,88 @@ describe('ActionTracker', () => {
|
|
|
290
322
|
const transfer = await transferStore.get('0xmsg1');
|
|
291
323
|
expect(transfer?.status).to.equal('complete');
|
|
292
324
|
});
|
|
325
|
+
describe('with an ignored-transfer predicate', () => {
|
|
326
|
+
const trackedTransfer = {
|
|
327
|
+
id: '0xmsg1',
|
|
328
|
+
status: 'in_progress',
|
|
329
|
+
messageId: '0xmsg1',
|
|
330
|
+
origin: 1,
|
|
331
|
+
destination: 2,
|
|
332
|
+
amount: 100n,
|
|
333
|
+
sender: '0xuser1',
|
|
334
|
+
recipient: '0xuser2',
|
|
335
|
+
createdAt: 1_000,
|
|
336
|
+
updatedAt: 1_000,
|
|
337
|
+
};
|
|
338
|
+
function createTracker(isIgnoredTransfer, logger = testLogger) {
|
|
339
|
+
return new ActionTracker(transferStore, rebalanceIntentStore, rebalanceActionStore, explorerClient, core, {
|
|
340
|
+
routersByDomain: config.routersByDomain,
|
|
341
|
+
isIgnoredTransfer,
|
|
342
|
+
bridges: config.bridges,
|
|
343
|
+
rebalancerAddress: config.rebalancerAddress,
|
|
344
|
+
intentTTL: config.intentTTL,
|
|
345
|
+
}, logger);
|
|
346
|
+
}
|
|
347
|
+
it('keeps an ignored tracked transfer stored but excludes it from in-progress transfers without checking delivery', async () => {
|
|
348
|
+
await transferStore.save(trackedTransfer);
|
|
349
|
+
const tracker = createTracker((id) => id === '0xmsg1');
|
|
350
|
+
await tracker.syncTransfers();
|
|
351
|
+
const transfer = await tracker.getTransfer('0xmsg1');
|
|
352
|
+
expect(transfer?.status).to.equal('in_progress');
|
|
353
|
+
expect(await tracker.getInProgressTransfers()).to.deep.equal([]);
|
|
354
|
+
expect(mailboxStub.isDelivered.called).to.be.false;
|
|
355
|
+
});
|
|
356
|
+
it('reserves an ignored transfer again once it is no longer ignored, even when absent from the Explorer result', async () => {
|
|
357
|
+
await transferStore.save(trackedTransfer);
|
|
358
|
+
let ignored = true;
|
|
359
|
+
const tracker = createTracker((id) => ignored && id === '0xmsg1');
|
|
360
|
+
explorerClient.getInflightUserTransfers.resolves([]);
|
|
361
|
+
await tracker.syncTransfers();
|
|
362
|
+
expect(await tracker.getInProgressTransfers()).to.deep.equal([]);
|
|
363
|
+
ignored = false;
|
|
364
|
+
await tracker.syncTransfers();
|
|
365
|
+
const inProgress = await tracker.getInProgressTransfers();
|
|
366
|
+
expect(inProgress.map((t) => [t.id, t.amount])).to.deep.equal([
|
|
367
|
+
['0xmsg1', 100n],
|
|
368
|
+
]);
|
|
369
|
+
});
|
|
370
|
+
it('completes an ignored transfer on the first sync after it is no longer ignored once delivered', async () => {
|
|
371
|
+
await transferStore.save(trackedTransfer);
|
|
372
|
+
let ignored = true;
|
|
373
|
+
const tracker = createTracker((id) => ignored && id === '0xmsg1');
|
|
374
|
+
mailboxStub.isDelivered.resolves(true);
|
|
375
|
+
await tracker.syncTransfers();
|
|
376
|
+
expect(mailboxStub.isDelivered.called).to.be.false;
|
|
377
|
+
expect((await tracker.getTransfer('0xmsg1'))?.status).to.equal('in_progress');
|
|
378
|
+
ignored = false;
|
|
379
|
+
await tracker.syncTransfers();
|
|
380
|
+
expect(mailboxStub.isDelivered.calledOnce).to.be.true;
|
|
381
|
+
expect((await tracker.getTransfer('0xmsg1'))?.status).to.equal('complete');
|
|
382
|
+
});
|
|
383
|
+
it('keeps a tracked transfer the predicate does not ignore', async () => {
|
|
384
|
+
await transferStore.save(trackedTransfer);
|
|
385
|
+
await createTracker((id) => id === '0xother').syncTransfers();
|
|
386
|
+
const transfer = await transferStore.get('0xmsg1');
|
|
387
|
+
expect(transfer?.status).to.equal('in_progress');
|
|
388
|
+
expect(mailboxStub.isDelivered.calledOnce).to.be.true;
|
|
389
|
+
});
|
|
390
|
+
it('counts an ignored transfer on every sync while it stays ignored', async () => {
|
|
391
|
+
await transferStore.save(trackedTransfer);
|
|
392
|
+
const logger = pino({ level: 'silent' });
|
|
393
|
+
const info = Sinon.spy(logger, 'info');
|
|
394
|
+
const tracker = createTracker((id) => id === '0xmsg1', logger);
|
|
395
|
+
await tracker.syncTransfers();
|
|
396
|
+
await tracker.syncTransfers();
|
|
397
|
+
const syncedCounts = info
|
|
398
|
+
.getCalls()
|
|
399
|
+
.filter((call) => call.args.includes('Transfers synced'))
|
|
400
|
+
.map((call) => call.args[0]);
|
|
401
|
+
expect(syncedCounts).to.deep.equal([
|
|
402
|
+
{ newTransfers: 0, completed: 0, ignored: 1, inProgress: 0 },
|
|
403
|
+
{ newTransfers: 0, completed: 0, ignored: 1, inProgress: 0 },
|
|
404
|
+
]);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
293
407
|
});
|
|
294
408
|
describe('syncRebalanceIntents', () => {
|
|
295
409
|
it('should mark intents as complete when fully fulfilled', async () => {
|
|
@@ -450,6 +564,168 @@ describe('ActionTracker', () => {
|
|
|
450
564
|
expect(updatedAction?.status).to.equal('in_progress');
|
|
451
565
|
});
|
|
452
566
|
});
|
|
567
|
+
describe('with a relayer denylist middleware', () => {
|
|
568
|
+
let dir;
|
|
569
|
+
let denylistPath;
|
|
570
|
+
beforeEach(() => {
|
|
571
|
+
dir = mkdtempSync(join(tmpdir(), 'action-tracker-denylist-'));
|
|
572
|
+
denylistPath = join(dir, 'denylist.json');
|
|
573
|
+
writeDenylist([]);
|
|
574
|
+
explorerClient.getInflightRebalanceActions.resolves([
|
|
575
|
+
buildMessage(ID_A),
|
|
576
|
+
buildMessage(ID_B),
|
|
577
|
+
buildMessage(ID_C),
|
|
578
|
+
]);
|
|
579
|
+
});
|
|
580
|
+
afterEach(() => {
|
|
581
|
+
rmSync(dir, { recursive: true, force: true });
|
|
582
|
+
});
|
|
583
|
+
function writeDenylist(messageIds, matches = []) {
|
|
584
|
+
writeFileSync(denylistPath, JSON.stringify({
|
|
585
|
+
rules: [
|
|
586
|
+
...messageIds.map((messageId) => ({ messageId })),
|
|
587
|
+
...matches,
|
|
588
|
+
].map((match) => ({ reason: 'settled', addedBy: 'tester', match })),
|
|
589
|
+
}));
|
|
590
|
+
}
|
|
591
|
+
async function createDenylistTracker() {
|
|
592
|
+
const middleware = await RelayerDenylistMiddleware.create(explorerClient, { url: pathToFileURL(denylistPath).href, refreshIntervalMs: 0 }, testLogger);
|
|
593
|
+
return new ActionTracker(transferStore, rebalanceIntentStore, rebalanceActionStore, middleware, core, {
|
|
594
|
+
routersByDomain: config.routersByDomain,
|
|
595
|
+
isIgnoredTransfer: (id) => middleware.isIgnored(id),
|
|
596
|
+
isIgnoredRebalanceAction: (id) => middleware.isIgnoredRebalanceAction(id),
|
|
597
|
+
bridges: config.bridges,
|
|
598
|
+
rebalancerAddress: config.rebalancerAddress,
|
|
599
|
+
intentTTL: config.intentTTL,
|
|
600
|
+
}, testLogger);
|
|
601
|
+
}
|
|
602
|
+
async function activeIntentMessageIds(tracker) {
|
|
603
|
+
const actions = await rebalanceActionStore.getAll();
|
|
604
|
+
const intents = await tracker.getActiveRebalanceIntents();
|
|
605
|
+
return intents.map((intent) => {
|
|
606
|
+
const action = actions.find((a) => a.intentId === intent.id);
|
|
607
|
+
assert(action?.messageId, `Missing action for intent ${intent.id}`);
|
|
608
|
+
return action.messageId;
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
it('does not recover denylisted rebalance messages at startup', async () => {
|
|
612
|
+
writeDenylist([ID_A, ID_B]);
|
|
613
|
+
const tracker = await createDenylistTracker();
|
|
614
|
+
await tracker.initialize();
|
|
615
|
+
const actions = await rebalanceActionStore.getAll();
|
|
616
|
+
expect(actions.map((a) => a.id)).to.deep.equal([ID_C]);
|
|
617
|
+
const intents = await rebalanceIntentStore.getAll();
|
|
618
|
+
expect(intents.map((i) => [i.status, i.amount])).to.deep.equal([
|
|
619
|
+
['in_progress', 100n],
|
|
620
|
+
]);
|
|
621
|
+
expect(await activeIntentMessageIds(tracker)).to.deep.equal([ID_C]);
|
|
622
|
+
});
|
|
623
|
+
it('stops counting a tracked rebalance message once it is denylisted without changing its status', async () => {
|
|
624
|
+
const tracker = await createDenylistTracker();
|
|
625
|
+
await tracker.initialize();
|
|
626
|
+
expect(await activeIntentMessageIds(tracker)).to.have.members([
|
|
627
|
+
ID_A,
|
|
628
|
+
ID_B,
|
|
629
|
+
ID_C,
|
|
630
|
+
]);
|
|
631
|
+
writeDenylist([ID_A]);
|
|
632
|
+
mailboxStub.isDelivered.resetHistory();
|
|
633
|
+
await tracker.syncRebalanceActions();
|
|
634
|
+
expect(await activeIntentMessageIds(tracker)).to.have.members([
|
|
635
|
+
ID_B,
|
|
636
|
+
ID_C,
|
|
637
|
+
]);
|
|
638
|
+
const ignoredAction = await rebalanceActionStore.get(ID_A);
|
|
639
|
+
assert(ignoredAction, 'Expected the ignored action to stay stored');
|
|
640
|
+
expect(ignoredAction.status).to.equal('in_progress');
|
|
641
|
+
expect((await rebalanceIntentStore.get(ignoredAction.intentId))?.status).to.equal('in_progress');
|
|
642
|
+
expect(mailboxStub.isDelivered.calledWith(ID_A)).to.be.true;
|
|
643
|
+
});
|
|
644
|
+
it('completes a denylisted rebalance message the relayer still delivers', async () => {
|
|
645
|
+
const tracker = await createDenylistTracker();
|
|
646
|
+
await tracker.initialize();
|
|
647
|
+
writeDenylist([ID_A]);
|
|
648
|
+
mailboxStub.isDelivered.callsFake(async (id) => id === ID_A);
|
|
649
|
+
await tracker.syncRebalanceActions();
|
|
650
|
+
const action = await rebalanceActionStore.get(ID_A);
|
|
651
|
+
assert(action, 'Expected the delivered action to stay stored');
|
|
652
|
+
expect(action.status).to.equal('complete');
|
|
653
|
+
expect((await rebalanceIntentStore.get(action.intentId))?.status).to.equal('complete');
|
|
654
|
+
});
|
|
655
|
+
it('still fails a denylisted rebalance message past the intent TTL', async () => {
|
|
656
|
+
await rebalanceIntentStore.save({
|
|
657
|
+
id: 'expired-intent',
|
|
658
|
+
status: 'in_progress',
|
|
659
|
+
origin: 42161,
|
|
660
|
+
destination: 1,
|
|
661
|
+
amount: 100n,
|
|
662
|
+
createdAt: 0,
|
|
663
|
+
updatedAt: 0,
|
|
664
|
+
});
|
|
665
|
+
await rebalanceActionStore.save({
|
|
666
|
+
id: ID_A,
|
|
667
|
+
type: 'rebalance_message',
|
|
668
|
+
status: 'in_progress',
|
|
669
|
+
intentId: 'expired-intent',
|
|
670
|
+
messageId: ID_A,
|
|
671
|
+
origin: 42161,
|
|
672
|
+
destination: 1,
|
|
673
|
+
amount: 100n,
|
|
674
|
+
createdAt: 0,
|
|
675
|
+
updatedAt: 0,
|
|
676
|
+
});
|
|
677
|
+
writeDenylist([ID_A]);
|
|
678
|
+
const tracker = await createDenylistTracker();
|
|
679
|
+
await tracker.syncRebalanceActions();
|
|
680
|
+
expect(await activeIntentMessageIds(tracker)).to.have.members([
|
|
681
|
+
ID_B,
|
|
682
|
+
ID_C,
|
|
683
|
+
]);
|
|
684
|
+
await tracker.syncRebalanceIntents();
|
|
685
|
+
expect((await rebalanceActionStore.get(ID_A))?.status).to.equal('failed');
|
|
686
|
+
expect((await rebalanceIntentStore.get('expired-intent'))?.status).to.equal('failed');
|
|
687
|
+
});
|
|
688
|
+
it('keeps ignoring a denylisted rebalance message pushed off the Explorer page', async () => {
|
|
689
|
+
const tracker = await createDenylistTracker();
|
|
690
|
+
await tracker.initialize();
|
|
691
|
+
writeDenylist([ID_A]);
|
|
692
|
+
await tracker.syncRebalanceActions();
|
|
693
|
+
expect(await activeIntentMessageIds(tracker)).to.not.include(ID_A);
|
|
694
|
+
const newerIds = Array.from({ length: 100 }, (_, i) => `0x${(i + 1).toString(16).padStart(64, '0')}`);
|
|
695
|
+
explorerClient.getInflightRebalanceActions.resolves(newerIds.map((id) => buildMessage(id)));
|
|
696
|
+
await tracker.syncRebalanceActions();
|
|
697
|
+
const countedIds = await activeIntentMessageIds(tracker);
|
|
698
|
+
expect(countedIds).to.not.include(ID_A);
|
|
699
|
+
expect(countedIds).to.include.members([ID_B, ID_C, ...newerIds]);
|
|
700
|
+
writeDenylist([]);
|
|
701
|
+
await tracker.syncRebalanceActions();
|
|
702
|
+
expect(await activeIntentMessageIds(tracker)).to.include(ID_A);
|
|
703
|
+
});
|
|
704
|
+
it('keeps recovering and counting rebalance messages a broad rule denies', async () => {
|
|
705
|
+
writeDenylist([], [{ destinationDomain: 1 }, { originDomain: 42161 }]);
|
|
706
|
+
const tracker = await createDenylistTracker();
|
|
707
|
+
await tracker.initialize();
|
|
708
|
+
await tracker.syncRebalanceActions();
|
|
709
|
+
expect(await activeIntentMessageIds(tracker)).to.have.members([
|
|
710
|
+
ID_A,
|
|
711
|
+
ID_B,
|
|
712
|
+
ID_C,
|
|
713
|
+
]);
|
|
714
|
+
});
|
|
715
|
+
it('counts a rebalance message again once its rule is removed', async () => {
|
|
716
|
+
writeDenylist([ID_A, ID_B]);
|
|
717
|
+
const tracker = await createDenylistTracker();
|
|
718
|
+
await tracker.initialize();
|
|
719
|
+
expect(await activeIntentMessageIds(tracker)).to.deep.equal([ID_C]);
|
|
720
|
+
writeDenylist([]);
|
|
721
|
+
await tracker.syncRebalanceActions();
|
|
722
|
+
expect(await activeIntentMessageIds(tracker)).to.have.members([
|
|
723
|
+
ID_A,
|
|
724
|
+
ID_B,
|
|
725
|
+
ID_C,
|
|
726
|
+
]);
|
|
727
|
+
});
|
|
728
|
+
});
|
|
453
729
|
describe('syncInventoryMovementActions', () => {
|
|
454
730
|
it('stores pending status on in-progress movement', async () => {
|
|
455
731
|
await rebalanceActionStore.save({
|
|
@@ -611,6 +887,67 @@ describe('ActionTracker', () => {
|
|
|
611
887
|
expect(result).to.have.lengthOf(1);
|
|
612
888
|
expect(result[0].id).to.equal('intent-2');
|
|
613
889
|
});
|
|
890
|
+
describe('with an ignored-rebalance-action predicate', () => {
|
|
891
|
+
const ignoredIds = new Set(['0xignored1', '0xignored2']);
|
|
892
|
+
function createTracker(isIgnoredRebalanceAction) {
|
|
893
|
+
return new ActionTracker(transferStore, rebalanceIntentStore, rebalanceActionStore, explorerClient, core, {
|
|
894
|
+
routersByDomain: config.routersByDomain,
|
|
895
|
+
isIgnoredRebalanceAction,
|
|
896
|
+
bridges: config.bridges,
|
|
897
|
+
rebalancerAddress: config.rebalancerAddress,
|
|
898
|
+
intentTTL: config.intentTTL,
|
|
899
|
+
}, testLogger);
|
|
900
|
+
}
|
|
901
|
+
async function saveIntent(id, executionMethod) {
|
|
902
|
+
await rebalanceIntentStore.save({
|
|
903
|
+
id,
|
|
904
|
+
status: 'in_progress',
|
|
905
|
+
origin: 1,
|
|
906
|
+
destination: 2,
|
|
907
|
+
amount: 300n,
|
|
908
|
+
executionMethod,
|
|
909
|
+
createdAt: Date.now(),
|
|
910
|
+
updatedAt: Date.now(),
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
async function saveAction(id, intentId, type, status) {
|
|
914
|
+
await rebalanceActionStore.save({
|
|
915
|
+
id,
|
|
916
|
+
type,
|
|
917
|
+
status,
|
|
918
|
+
intentId,
|
|
919
|
+
messageId: id,
|
|
920
|
+
origin: 1,
|
|
921
|
+
destination: 2,
|
|
922
|
+
amount: 100n,
|
|
923
|
+
createdAt: Date.now(),
|
|
924
|
+
updatedAt: Date.now(),
|
|
925
|
+
});
|
|
926
|
+
}
|
|
927
|
+
it('drops only intents whose in-progress messages are all ignored', async () => {
|
|
928
|
+
await saveIntent('all-ignored', 'movable_collateral');
|
|
929
|
+
await saveAction('0xignored1', 'all-ignored', 'rebalance_message', 'in_progress');
|
|
930
|
+
await saveAction('0xdone', 'all-ignored', 'rebalance_message', 'complete');
|
|
931
|
+
await saveIntent('mixed');
|
|
932
|
+
await saveAction('0xignored2', 'mixed', 'rebalance_message', 'in_progress');
|
|
933
|
+
await saveAction('0xkept', 'mixed', 'rebalance_message', 'in_progress');
|
|
934
|
+
await saveIntent('no-actions', 'movable_collateral');
|
|
935
|
+
const result = await createTracker((id) => ignoredIds.has(id)).getActiveRebalanceIntents();
|
|
936
|
+
expect(result.map((i) => [i.id, i.amount])).to.have.deep.members([
|
|
937
|
+
['mixed', 300n],
|
|
938
|
+
['no-actions', 300n],
|
|
939
|
+
]);
|
|
940
|
+
});
|
|
941
|
+
it('leaves inventory intents and their retry state untouched', async () => {
|
|
942
|
+
await saveIntent('inventory', 'inventory');
|
|
943
|
+
await saveAction('0xignored1', 'inventory', 'inventory_deposit', 'in_progress');
|
|
944
|
+
const withoutPredicate = createTracker();
|
|
945
|
+
const withPredicate = createTracker((id) => ignoredIds.has(id));
|
|
946
|
+
expect((await withPredicate.getActiveRebalanceIntents()).map((i) => i.id)).to.deep.equal(['inventory']);
|
|
947
|
+
expect(await withPredicate.getPartiallyFulfilledInventoryIntents()).to.deep.equal(await withoutPredicate.getPartiallyFulfilledInventoryIntents());
|
|
948
|
+
expect(await withPredicate.getPartiallyFulfilledInventoryIntents()).to.have.lengthOf(1);
|
|
949
|
+
});
|
|
950
|
+
});
|
|
614
951
|
});
|
|
615
952
|
describe('getPartiallyFulfilledInventoryIntents', () => {
|
|
616
953
|
it('returns not_started inventory intents', async () => {
|
|
@@ -662,6 +999,45 @@ describe('ActionTracker', () => {
|
|
|
662
999
|
expect(partialIntents[0].completedAmount).to.equal(400000000000000000n);
|
|
663
1000
|
expect(partialIntents[0].remaining).to.equal(600000000000000000n); // 0.6 ETH remaining
|
|
664
1001
|
});
|
|
1002
|
+
it('ignores inventory_movement amounts when computing remaining', async () => {
|
|
1003
|
+
await rebalanceIntentStore.save({
|
|
1004
|
+
id: 'partial-intent-with-movement',
|
|
1005
|
+
status: 'in_progress',
|
|
1006
|
+
origin: 1,
|
|
1007
|
+
destination: 2,
|
|
1008
|
+
amount: 1000000000000000000n,
|
|
1009
|
+
executionMethod: 'inventory',
|
|
1010
|
+
createdAt: Date.now(),
|
|
1011
|
+
updatedAt: Date.now(),
|
|
1012
|
+
});
|
|
1013
|
+
await rebalanceActionStore.save({
|
|
1014
|
+
id: 'action-deposit',
|
|
1015
|
+
type: 'inventory_deposit',
|
|
1016
|
+
status: 'complete',
|
|
1017
|
+
intentId: 'partial-intent-with-movement',
|
|
1018
|
+
origin: 1,
|
|
1019
|
+
destination: 2,
|
|
1020
|
+
amount: 400000000000000000n,
|
|
1021
|
+
createdAt: Date.now(),
|
|
1022
|
+
updatedAt: Date.now(),
|
|
1023
|
+
});
|
|
1024
|
+
await rebalanceActionStore.save({
|
|
1025
|
+
id: 'action-movement',
|
|
1026
|
+
type: 'inventory_movement',
|
|
1027
|
+
status: 'complete',
|
|
1028
|
+
intentId: 'partial-intent-with-movement',
|
|
1029
|
+
origin: 3,
|
|
1030
|
+
destination: 2,
|
|
1031
|
+
amount: 9000000000000000000n,
|
|
1032
|
+
createdAt: Date.now(),
|
|
1033
|
+
updatedAt: Date.now(),
|
|
1034
|
+
});
|
|
1035
|
+
const partialIntents = await tracker.getPartiallyFulfilledInventoryIntents();
|
|
1036
|
+
expect(partialIntents).to.have.lengthOf(1);
|
|
1037
|
+
expect(partialIntents[0].intent.id).to.equal('partial-intent-with-movement');
|
|
1038
|
+
expect(partialIntents[0].completedAmount).to.equal(400000000000000000n);
|
|
1039
|
+
expect(partialIntents[0].remaining).to.equal(600000000000000000n);
|
|
1040
|
+
});
|
|
665
1041
|
it('does not return non-inventory intents', async () => {
|
|
666
1042
|
// Create a not_started intent without executionMethod: 'inventory'
|
|
667
1043
|
await rebalanceIntentStore.save({
|
|
@@ -1230,6 +1606,47 @@ describe('ActionTracker', () => {
|
|
|
1230
1606
|
const updatedAction = await rebalanceActionStore.get('action-1');
|
|
1231
1607
|
expect(updatedAction?.status).to.equal('complete');
|
|
1232
1608
|
});
|
|
1609
|
+
it('checks tracked delivery with the real Explorer client and no bridges', async () => {
|
|
1610
|
+
const intent = {
|
|
1611
|
+
id: 'intent-1',
|
|
1612
|
+
status: 'in_progress',
|
|
1613
|
+
origin: 1,
|
|
1614
|
+
destination: 2,
|
|
1615
|
+
amount: 100n,
|
|
1616
|
+
createdAt: Date.now(),
|
|
1617
|
+
updatedAt: Date.now(),
|
|
1618
|
+
};
|
|
1619
|
+
const action = {
|
|
1620
|
+
id: 'action-1',
|
|
1621
|
+
type: 'inventory_deposit',
|
|
1622
|
+
status: 'in_progress',
|
|
1623
|
+
intentId: 'intent-1',
|
|
1624
|
+
messageId: '0xmsg1',
|
|
1625
|
+
origin: 1,
|
|
1626
|
+
destination: 2,
|
|
1627
|
+
amount: 100n,
|
|
1628
|
+
createdAt: Date.now(),
|
|
1629
|
+
updatedAt: Date.now(),
|
|
1630
|
+
};
|
|
1631
|
+
await rebalanceIntentStore.save(intent);
|
|
1632
|
+
await rebalanceActionStore.save(action);
|
|
1633
|
+
config.bridges = [];
|
|
1634
|
+
const fetchStub = Sinon.stub(globalThis, 'fetch').rejects(new Error('unexpected HTTP'));
|
|
1635
|
+
tracker = new ActionTracker(transferStore, rebalanceIntentStore, rebalanceActionStore, new ExplorerClient('https://explorer.test', () => ProtocolType.Ethereum), core, config, testLogger);
|
|
1636
|
+
mailboxStub.isDelivered.resolves(true);
|
|
1637
|
+
try {
|
|
1638
|
+
await tracker.syncRebalanceActions();
|
|
1639
|
+
expect(fetchStub.called).to.be.false;
|
|
1640
|
+
}
|
|
1641
|
+
finally {
|
|
1642
|
+
fetchStub.restore();
|
|
1643
|
+
}
|
|
1644
|
+
expect(mailboxStub.isDelivered.calledOnce).to.be.true;
|
|
1645
|
+
const call = mailboxStub.isDelivered.firstCall;
|
|
1646
|
+
expect(call.args[0]).to.equal('0xmsg1');
|
|
1647
|
+
const updatedAction = await rebalanceActionStore.get('action-1');
|
|
1648
|
+
expect(updatedAction?.status).to.equal('complete');
|
|
1649
|
+
});
|
|
1233
1650
|
it('should keep transfer in_progress when not delivered', async () => {
|
|
1234
1651
|
await transferStore.save({
|
|
1235
1652
|
id: '0xmsg1',
|