@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,554 @@
|
|
|
1
|
+
import chai, { expect } from 'chai';
|
|
2
|
+
import chaiAsPromised from 'chai-as-promised';
|
|
3
|
+
import { type Logger, pino } from 'pino';
|
|
4
|
+
import Sinon from 'sinon';
|
|
5
|
+
|
|
6
|
+
import { assert } from '@humanode-hyperlane/utils';
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
ExplorerMessage,
|
|
10
|
+
IExplorerClient,
|
|
11
|
+
RebalanceActionQueryParams,
|
|
12
|
+
UserTransferQueryParams,
|
|
13
|
+
} from '../../utils/ExplorerClient.js';
|
|
14
|
+
import {
|
|
15
|
+
ID_A,
|
|
16
|
+
ID_B,
|
|
17
|
+
ID_C,
|
|
18
|
+
PARAMS,
|
|
19
|
+
REBALANCE_PARAMS,
|
|
20
|
+
StubExplorerClient,
|
|
21
|
+
buildMessage,
|
|
22
|
+
} from '../../test/pendingTransferMiddlewareMocks.js';
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
ExplorerRowLimitError,
|
|
26
|
+
MAX_EXPLORER_QUERY_LIMIT,
|
|
27
|
+
PENDING_TRANSFER_MIDDLEWARE_FAILED_MESSAGE,
|
|
28
|
+
PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE,
|
|
29
|
+
PendingTransferMiddleware,
|
|
30
|
+
} from './PendingTransferMiddleware.js';
|
|
31
|
+
|
|
32
|
+
chai.use(chaiAsPromised);
|
|
33
|
+
|
|
34
|
+
/** Returns the first `limit` messages, newest first, like the Explorer. */
|
|
35
|
+
class PagedExplorerClient implements IExplorerClient {
|
|
36
|
+
readonly limits: number[] = [];
|
|
37
|
+
|
|
38
|
+
constructor(public newestFirst: ExplorerMessage[]) {}
|
|
39
|
+
|
|
40
|
+
async getInflightUserTransfers(
|
|
41
|
+
params: UserTransferQueryParams,
|
|
42
|
+
_logger: Logger,
|
|
43
|
+
): Promise<ExplorerMessage[]> {
|
|
44
|
+
assert(params.limit !== undefined, 'Expected an explicit limit');
|
|
45
|
+
this.limits.push(params.limit);
|
|
46
|
+
|
|
47
|
+
return this.newestFirst.slice(0, params.limit);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async getInflightRebalanceActions(
|
|
51
|
+
_params: RebalanceActionQueryParams,
|
|
52
|
+
_logger: Logger,
|
|
53
|
+
): Promise<ExplorerMessage[]> {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function messageId(index: number): string {
|
|
59
|
+
return `0x${index.toString(16).padStart(64, '0')}`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Ignores a fixed set of ids and records what it was shown. */
|
|
63
|
+
class StaticMiddleware extends PendingTransferMiddleware {
|
|
64
|
+
readonly seen: string[][] = [];
|
|
65
|
+
|
|
66
|
+
constructor(
|
|
67
|
+
inner: IExplorerClient,
|
|
68
|
+
name: string,
|
|
69
|
+
public ignoredIds: string[],
|
|
70
|
+
) {
|
|
71
|
+
super(inner, name);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
protected async findIgnored(
|
|
75
|
+
messages: ExplorerMessage[],
|
|
76
|
+
): Promise<Map<string, string>> {
|
|
77
|
+
this.seen.push(messages.map((msg) => msg.msg_id));
|
|
78
|
+
const ignoredIds = new Set(this.ignoredIds);
|
|
79
|
+
|
|
80
|
+
return new Map(
|
|
81
|
+
messages
|
|
82
|
+
.filter((msg) => ignoredIds.has(msg.msg_id))
|
|
83
|
+
.map((msg) => [msg.msg_id, `${this.name} reason`]),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
class ThrowingMiddleware extends PendingTransferMiddleware {
|
|
89
|
+
constructor(inner: IExplorerClient) {
|
|
90
|
+
super(inner, 'throwing');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
protected async findIgnored(): Promise<Map<string, string>> {
|
|
94
|
+
throw new Error('boom');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
describe('PendingTransferMiddleware', () => {
|
|
99
|
+
let logger: Logger;
|
|
100
|
+
let info: Sinon.SinonSpy;
|
|
101
|
+
let warn: Sinon.SinonSpy;
|
|
102
|
+
let inner: StubExplorerClient;
|
|
103
|
+
|
|
104
|
+
beforeEach(() => {
|
|
105
|
+
logger = pino({ level: 'silent' });
|
|
106
|
+
info = Sinon.spy(logger, 'info');
|
|
107
|
+
warn = Sinon.spy(logger, 'warn');
|
|
108
|
+
inner = new StubExplorerClient([
|
|
109
|
+
buildMessage(ID_A),
|
|
110
|
+
buildMessage(ID_B),
|
|
111
|
+
buildMessage(ID_C),
|
|
112
|
+
]);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('chains middlewares so later ones only see what earlier ones kept', async () => {
|
|
116
|
+
const innerLayer = new StaticMiddleware(inner, 'first', [ID_A]);
|
|
117
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'second', [ID_B]);
|
|
118
|
+
|
|
119
|
+
const result = await outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
120
|
+
|
|
121
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_C]);
|
|
122
|
+
expect(innerLayer.seen).to.deep.equal([[ID_A, ID_B, ID_C]]);
|
|
123
|
+
expect(outerLayer.seen).to.deep.equal([[ID_B, ID_C]]);
|
|
124
|
+
expect(innerLayer.isIgnored(ID_A)).to.be.true;
|
|
125
|
+
expect(innerLayer.isIgnored(ID_B)).to.be.false;
|
|
126
|
+
expect(outerLayer.isIgnored(ID_B.toUpperCase().replace('0X', '0x'))).to.be
|
|
127
|
+
.true;
|
|
128
|
+
expect(outerLayer.isIgnored(ID_A)).to.be.true;
|
|
129
|
+
expect(outerLayer.isIgnored(ID_C)).to.be.false;
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('reports ids an inner middleware ignored through an outer one that ignores nothing', async () => {
|
|
133
|
+
const innerLayer = new StaticMiddleware(inner, 'first', [ID_A]);
|
|
134
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'second', []);
|
|
135
|
+
|
|
136
|
+
const result = await outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
137
|
+
|
|
138
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_B, ID_C]);
|
|
139
|
+
expect(outerLayer.isIgnored(ID_A)).to.be.true;
|
|
140
|
+
expect(outerLayer.isIgnored(ID_B)).to.be.false;
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('passes rebalance action queries through', async () => {
|
|
144
|
+
const client = new StaticMiddleware(inner, 'all', [ID_C]);
|
|
145
|
+
|
|
146
|
+
const result = await client.getInflightRebalanceActions(
|
|
147
|
+
{
|
|
148
|
+
bridges: [],
|
|
149
|
+
routersByDomain: PARAMS.routersByDomain,
|
|
150
|
+
rebalancerAddress: '0x995a921d333029512aa166885856c8af760e9381',
|
|
151
|
+
},
|
|
152
|
+
logger,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
expect(result).to.equal(inner.rebalanceActions);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('keeps every message and warns when the middleware throws', async () => {
|
|
159
|
+
const client = new ThrowingMiddleware(inner);
|
|
160
|
+
|
|
161
|
+
const result = await client.getInflightUserTransfers(PARAMS, logger);
|
|
162
|
+
|
|
163
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_A, ID_B, ID_C]);
|
|
164
|
+
expect(warn.callCount).to.equal(1);
|
|
165
|
+
expect(warn.firstCall.args).to.deep.equal([
|
|
166
|
+
{ middleware: 'throwing', error: 'boom' },
|
|
167
|
+
PENDING_TRANSFER_MIDDLEWARE_FAILED_MESSAGE,
|
|
168
|
+
]);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('raises the limit it passes down by what each layer dropped', async () => {
|
|
172
|
+
const innerLayer = new StaticMiddleware(inner, 'first', [ID_A]);
|
|
173
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'second', [ID_B]);
|
|
174
|
+
|
|
175
|
+
await outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
176
|
+
await outerLayer.getInflightUserTransfers(
|
|
177
|
+
{
|
|
178
|
+
routersByDomain: PARAMS.routersByDomain,
|
|
179
|
+
excludeTxSenders: PARAMS.excludeTxSenders,
|
|
180
|
+
limit: 10,
|
|
181
|
+
},
|
|
182
|
+
logger,
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
expect(
|
|
186
|
+
inner.userTransferParams.map((params) => params.limit),
|
|
187
|
+
).to.deep.equal([100, 12]);
|
|
188
|
+
expect(inner.userTransferParams[1].excludeTxSenders).to.deep.equal(
|
|
189
|
+
PARAMS.excludeTxSenders,
|
|
190
|
+
);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('logs each ignored message once until it stops being ignored', async () => {
|
|
194
|
+
const client = new StaticMiddleware(inner, 'first', [ID_A]);
|
|
195
|
+
|
|
196
|
+
await client.getInflightUserTransfers(PARAMS, logger);
|
|
197
|
+
await client.getInflightUserTransfers(PARAMS, logger);
|
|
198
|
+
|
|
199
|
+
expect(info.callCount).to.equal(1);
|
|
200
|
+
expect(info.firstCall.args).to.deep.equal([
|
|
201
|
+
{
|
|
202
|
+
msgId: ID_A,
|
|
203
|
+
origin: 42161,
|
|
204
|
+
destination: 1,
|
|
205
|
+
amount: '100',
|
|
206
|
+
middleware: 'first',
|
|
207
|
+
reason: 'first reason',
|
|
208
|
+
},
|
|
209
|
+
'Ignoring pending transfer',
|
|
210
|
+
]);
|
|
211
|
+
|
|
212
|
+
client.ignoredIds = [];
|
|
213
|
+
const result = await client.getInflightUserTransfers(PARAMS, logger);
|
|
214
|
+
|
|
215
|
+
expect(result).to.have.lengthOf(3);
|
|
216
|
+
expect(client.isIgnored(ID_A)).to.be.false;
|
|
217
|
+
expect(info.callCount).to.equal(2);
|
|
218
|
+
expect(info.secondCall.args[1]).to.equal(
|
|
219
|
+
'Pending transfer no longer ignored',
|
|
220
|
+
);
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe('PendingTransferMiddleware Explorer paging', () => {
|
|
225
|
+
let logger: Logger;
|
|
226
|
+
let warn: Sinon.SinonSpy;
|
|
227
|
+
|
|
228
|
+
beforeEach(() => {
|
|
229
|
+
logger = pino({ level: 'silent' });
|
|
230
|
+
warn = Sinon.spy(logger, 'warn');
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
function ignoredIds(count: number): string[] {
|
|
234
|
+
return Array.from({ length: count }, (_, index) => messageId(index + 1));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
it('re-queries with doubling limits until it keeps a transfer behind many ignored messages', async () => {
|
|
238
|
+
const ignored = ignoredIds(1_000);
|
|
239
|
+
const realTransfer = buildMessage(ID_A);
|
|
240
|
+
const inner = new PagedExplorerClient([
|
|
241
|
+
...ignored.map(buildMessage),
|
|
242
|
+
realTransfer,
|
|
243
|
+
]);
|
|
244
|
+
const middleware = new StaticMiddleware(inner, 'paging', ignored);
|
|
245
|
+
|
|
246
|
+
const result = await middleware.getInflightUserTransfers(PARAMS, logger);
|
|
247
|
+
|
|
248
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_A]);
|
|
249
|
+
expect(inner.limits).to.deep.equal([100, 200, 400, 800, 1_600]);
|
|
250
|
+
expect(middleware.isIgnored(messageId(1_000))).to.be.true;
|
|
251
|
+
expect(warn.called).to.be.false;
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
it('stops once the Explorer returns fewer rows than asked', async () => {
|
|
255
|
+
const ignored = ignoredIds(5);
|
|
256
|
+
const inner = new PagedExplorerClient([
|
|
257
|
+
...ignored.map(buildMessage),
|
|
258
|
+
buildMessage(ID_A),
|
|
259
|
+
]);
|
|
260
|
+
const middleware = new StaticMiddleware(inner, 'paging', ignored);
|
|
261
|
+
|
|
262
|
+
const result = await middleware.getInflightUserTransfers(
|
|
263
|
+
{
|
|
264
|
+
routersByDomain: PARAMS.routersByDomain,
|
|
265
|
+
excludeTxSenders: PARAMS.excludeTxSenders,
|
|
266
|
+
limit: 3,
|
|
267
|
+
},
|
|
268
|
+
logger,
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_A]);
|
|
272
|
+
expect(inner.limits).to.deep.equal([3, 6, 12]);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it('throws instead of returning a partial page past the row limit', async () => {
|
|
276
|
+
const ignored = ignoredIds(MAX_EXPLORER_QUERY_LIMIT + 100);
|
|
277
|
+
const inner = new PagedExplorerClient([
|
|
278
|
+
...ignored.map(buildMessage),
|
|
279
|
+
buildMessage(ID_A),
|
|
280
|
+
]);
|
|
281
|
+
const middleware = new StaticMiddleware(inner, 'paging', ignored);
|
|
282
|
+
|
|
283
|
+
const result = middleware.getInflightUserTransfers(PARAMS, logger);
|
|
284
|
+
|
|
285
|
+
await expect(result).to.be.rejectedWith(
|
|
286
|
+
`${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware paging, requested 100, kept 0 of 25600 rows, limit 25600)`,
|
|
287
|
+
);
|
|
288
|
+
expect(inner.limits).to.deep.equal([
|
|
289
|
+
100, 200, 400, 800, 1_600, 3_200, 6_400, 12_800, 25_600,
|
|
290
|
+
]);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
describe('after a query that ignored 13,000 transfers', () => {
|
|
294
|
+
let inner: PagedExplorerClient;
|
|
295
|
+
let middleware: StaticMiddleware;
|
|
296
|
+
|
|
297
|
+
beforeEach(async () => {
|
|
298
|
+
const ignored = ignoredIds(13_000);
|
|
299
|
+
inner = new PagedExplorerClient([
|
|
300
|
+
...ignored.map(buildMessage),
|
|
301
|
+
buildMessage(ID_A),
|
|
302
|
+
]);
|
|
303
|
+
middleware = new StaticMiddleware(inner, 'paging', ignored);
|
|
304
|
+
await middleware.getInflightUserTransfers(PARAMS, logger);
|
|
305
|
+
inner.limits.length = 0;
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it('raises the limit to the row cap rather than throwing', async () => {
|
|
309
|
+
const ignored = ignoredIds(13_050);
|
|
310
|
+
const realTransfers = Array.from({ length: 100 }, (_, index) =>
|
|
311
|
+
messageId(1_000_000 + index),
|
|
312
|
+
);
|
|
313
|
+
inner.newestFirst = [
|
|
314
|
+
...ignored.map(buildMessage),
|
|
315
|
+
...realTransfers.map(buildMessage),
|
|
316
|
+
];
|
|
317
|
+
middleware.ignoredIds = ignored;
|
|
318
|
+
|
|
319
|
+
const result = await middleware.getInflightUserTransfers(PARAMS, logger);
|
|
320
|
+
|
|
321
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal(realTransfers);
|
|
322
|
+
expect(inner.limits).to.deep.equal([13_100, 25_600]);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it('throws only after a full page at the row cap', async () => {
|
|
326
|
+
const ignored = ignoredIds(MAX_EXPLORER_QUERY_LIMIT);
|
|
327
|
+
inner.newestFirst = [...ignored.map(buildMessage), buildMessage(ID_A)];
|
|
328
|
+
middleware.ignoredIds = ignored;
|
|
329
|
+
|
|
330
|
+
const result = middleware.getInflightUserTransfers(PARAMS, logger);
|
|
331
|
+
|
|
332
|
+
await expect(result).to.be.rejectedWith(
|
|
333
|
+
`${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware paging, requested 100, kept 0 of 25600 rows, limit 25600)`,
|
|
334
|
+
);
|
|
335
|
+
expect(inner.limits).to.deep.equal([13_100, 25_600]);
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
describe('through stacked middlewares', () => {
|
|
340
|
+
function idRange(start: number, count: number): string[] {
|
|
341
|
+
return Array.from({ length: count }, (_, index) =>
|
|
342
|
+
messageId(start + index),
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const innerIdsStart = 1;
|
|
347
|
+
const outerIdsStart = 100_001;
|
|
348
|
+
const realIdsStart = 200_001;
|
|
349
|
+
|
|
350
|
+
interface Case {
|
|
351
|
+
outerDrops: number;
|
|
352
|
+
innerDrops: number;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const cases: Case[] = [
|
|
356
|
+
{ outerDrops: 12_750, innerDrops: 100 },
|
|
357
|
+
{ outerDrops: 13_000, innerDrops: 500 },
|
|
358
|
+
{ outerDrops: 24_000, innerDrops: 1_000 },
|
|
359
|
+
];
|
|
360
|
+
|
|
361
|
+
for (const c of cases) {
|
|
362
|
+
it(`keeps transfers when the outer layer drops ${c.outerDrops} and the inner layer drops ${c.innerDrops}`, async () => {
|
|
363
|
+
const innerIds = idRange(innerIdsStart, c.innerDrops);
|
|
364
|
+
const outerIds = idRange(outerIdsStart, c.outerDrops);
|
|
365
|
+
const realIds = idRange(realIdsStart, 30_000);
|
|
366
|
+
const explorer = new PagedExplorerClient(
|
|
367
|
+
[...innerIds, ...outerIds, ...realIds].map(buildMessage),
|
|
368
|
+
);
|
|
369
|
+
const innerLayer = new StaticMiddleware(explorer, 'inner', innerIds);
|
|
370
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
|
|
371
|
+
|
|
372
|
+
const result = await outerLayer.getInflightUserTransfers(
|
|
373
|
+
PARAMS,
|
|
374
|
+
logger,
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
expect(result).to.not.be.empty;
|
|
378
|
+
expect(result[0].msg_id).to.equal(realIds[0]);
|
|
379
|
+
expect(outerLayer.isIgnored(outerIds[0])).to.be.true;
|
|
380
|
+
expect(outerLayer.isIgnored(innerIds[0])).to.be.true;
|
|
381
|
+
expect(outerLayer.isIgnored(realIds[0])).to.be.false;
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
it('recovers when a policy refresh leaves the outer layer with a stale hint', async () => {
|
|
386
|
+
const outerIds = idRange(outerIdsStart, 25_000);
|
|
387
|
+
const innerIds = idRange(innerIdsStart, 1_000);
|
|
388
|
+
const realIds = idRange(realIdsStart, 30_000);
|
|
389
|
+
const explorer = new PagedExplorerClient(
|
|
390
|
+
[...outerIds, ...realIds].map(buildMessage),
|
|
391
|
+
);
|
|
392
|
+
const innerLayer = new StaticMiddleware(explorer, 'inner', []);
|
|
393
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
|
|
394
|
+
|
|
395
|
+
const firstCycle = await outerLayer.getInflightUserTransfers(
|
|
396
|
+
PARAMS,
|
|
397
|
+
logger,
|
|
398
|
+
);
|
|
399
|
+
expect(firstCycle[0].msg_id).to.equal(realIds[0]);
|
|
400
|
+
|
|
401
|
+
explorer.newestFirst = [...innerIds, ...realIds].map(buildMessage);
|
|
402
|
+
innerLayer.ignoredIds = innerIds;
|
|
403
|
+
outerLayer.ignoredIds = [];
|
|
404
|
+
explorer.limits.length = 0;
|
|
405
|
+
|
|
406
|
+
const secondCycle = await outerLayer.getInflightUserTransfers(
|
|
407
|
+
PARAMS,
|
|
408
|
+
logger,
|
|
409
|
+
);
|
|
410
|
+
expect(secondCycle[0].msg_id).to.equal(realIds[0]);
|
|
411
|
+
expect(explorer.limits).to.deep.equal([25_100, 25_600]);
|
|
412
|
+
expect(outerLayer.isIgnored(innerIds[0])).to.be.true;
|
|
413
|
+
expect(outerLayer.isIgnored(outerIds[0])).to.be.false;
|
|
414
|
+
|
|
415
|
+
explorer.limits.length = 0;
|
|
416
|
+
|
|
417
|
+
const thirdCycle = await outerLayer.getInflightUserTransfers(
|
|
418
|
+
PARAMS,
|
|
419
|
+
logger,
|
|
420
|
+
);
|
|
421
|
+
expect(thirdCycle[0].msg_id).to.equal(realIds[0]);
|
|
422
|
+
expect(explorer.limits).to.deep.equal([1_100]);
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
it('stops reporting an id the inner layer no longer ignores once its capped page is used', async () => {
|
|
426
|
+
const outerIds = idRange(outerIdsStart, 25_000);
|
|
427
|
+
const innerIds = idRange(innerIdsStart, 1_000);
|
|
428
|
+
const realIds = idRange(realIdsStart, 30_000);
|
|
429
|
+
const explorer = new PagedExplorerClient(
|
|
430
|
+
[ID_A, ...outerIds, ...realIds].map(buildMessage),
|
|
431
|
+
);
|
|
432
|
+
const innerLayer = new StaticMiddleware(explorer, 'inner', [ID_A]);
|
|
433
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
|
|
434
|
+
|
|
435
|
+
await outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
436
|
+
expect(outerLayer.isIgnored(ID_A)).to.be.true;
|
|
437
|
+
|
|
438
|
+
explorer.newestFirst = [...innerIds, ID_A, ...realIds].map(buildMessage);
|
|
439
|
+
innerLayer.ignoredIds = innerIds;
|
|
440
|
+
outerLayer.ignoredIds = [];
|
|
441
|
+
explorer.limits.length = 0;
|
|
442
|
+
|
|
443
|
+
const result = await outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
444
|
+
|
|
445
|
+
expect(explorer.limits).to.deep.equal([25_101, 25_600]);
|
|
446
|
+
expect(result[0].msg_id).to.equal(ID_A);
|
|
447
|
+
expect(outerLayer.isIgnored(ID_A)).to.be.false;
|
|
448
|
+
expect(outerLayer.isIgnored(innerIds[0])).to.be.true;
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
it('throws with the outer layer name when the inner capped page keeps too few', async () => {
|
|
452
|
+
const innerIds = idRange(innerIdsStart, 1_000);
|
|
453
|
+
const outerIds = idRange(outerIdsStart, 25_000);
|
|
454
|
+
const explorer = new PagedExplorerClient(
|
|
455
|
+
[...innerIds, ...outerIds, ID_A].map(buildMessage),
|
|
456
|
+
);
|
|
457
|
+
const innerLayer = new StaticMiddleware(explorer, 'inner', innerIds);
|
|
458
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'outer', outerIds);
|
|
459
|
+
|
|
460
|
+
const result = outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
461
|
+
|
|
462
|
+
await expect(result).to.be.rejectedWith(
|
|
463
|
+
ExplorerRowLimitError,
|
|
464
|
+
`${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware outer, requested 100, kept 0 of 24600 rows, limit 25600)`,
|
|
465
|
+
);
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
it('throws without raising its own limit when a capped inner page arrives below the row cap', async () => {
|
|
469
|
+
const hintIds = idRange(outerIdsStart, 1_000);
|
|
470
|
+
const explorer = new PagedExplorerClient(
|
|
471
|
+
[...hintIds, ...idRange(realIdsStart, 1_000)].map(buildMessage),
|
|
472
|
+
);
|
|
473
|
+
const innerLayer = new StaticMiddleware(explorer, 'inner', []);
|
|
474
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'outer', hintIds);
|
|
475
|
+
await outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
476
|
+
|
|
477
|
+
const innerIds = idRange(innerIdsStart, 25_000);
|
|
478
|
+
const outerIds = idRange(outerIdsStart, 550);
|
|
479
|
+
explorer.newestFirst = [
|
|
480
|
+
...innerIds,
|
|
481
|
+
...outerIds,
|
|
482
|
+
...idRange(realIdsStart, 1_000),
|
|
483
|
+
].map(buildMessage);
|
|
484
|
+
innerLayer.ignoredIds = innerIds;
|
|
485
|
+
outerLayer.ignoredIds = outerIds;
|
|
486
|
+
explorer.limits.length = 0;
|
|
487
|
+
|
|
488
|
+
const result = outerLayer.getInflightUserTransfers(PARAMS, logger);
|
|
489
|
+
|
|
490
|
+
await expect(result).to.be.rejectedWith(
|
|
491
|
+
ExplorerRowLimitError,
|
|
492
|
+
`${PENDING_TRANSFER_MIDDLEWARE_QUERY_LIMIT_MESSAGE} (middleware outer, requested 100, kept 50 of 600 rows, limit 25600)`,
|
|
493
|
+
);
|
|
494
|
+
expect(explorer.limits).to.deep.equal([
|
|
495
|
+
1_100, 2_200, 4_400, 8_800, 17_600, 25_600,
|
|
496
|
+
]);
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
/** Also ignores a fixed set of rebalance message ids. */
|
|
502
|
+
class RebalanceIgnoringMiddleware extends StaticMiddleware {
|
|
503
|
+
constructor(
|
|
504
|
+
inner: IExplorerClient,
|
|
505
|
+
public ignoredRebalanceIds: string[],
|
|
506
|
+
) {
|
|
507
|
+
super(inner, 'rebalance', []);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
override isIgnoredRebalanceAction(messageId: string): boolean {
|
|
511
|
+
return (
|
|
512
|
+
this.ignoredRebalanceIds.includes(messageId) ||
|
|
513
|
+
super.isIgnoredRebalanceAction(messageId)
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
describe('PendingTransferMiddleware rebalance action queries', () => {
|
|
519
|
+
let logger: Logger;
|
|
520
|
+
let inner: StubExplorerClient;
|
|
521
|
+
|
|
522
|
+
beforeEach(() => {
|
|
523
|
+
logger = pino({ level: 'silent' });
|
|
524
|
+
inner = new StubExplorerClient([buildMessage(ID_A)]);
|
|
525
|
+
inner.rebalanceActions = [buildMessage(ID_B), buildMessage(ID_C)];
|
|
526
|
+
});
|
|
527
|
+
|
|
528
|
+
it('passes rebalance messages through without evaluating them', async () => {
|
|
529
|
+
const client = new StaticMiddleware(inner, 'static', [ID_B]);
|
|
530
|
+
|
|
531
|
+
const result = await client.getInflightRebalanceActions(
|
|
532
|
+
REBALANCE_PARAMS,
|
|
533
|
+
logger,
|
|
534
|
+
);
|
|
535
|
+
|
|
536
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_B, ID_C]);
|
|
537
|
+
expect(client.seen).to.deep.equal([]);
|
|
538
|
+
expect(client.isIgnoredRebalanceAction(ID_B)).to.be.false;
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
it('reports rebalance messages an inner middleware ignores through an outer one', async () => {
|
|
542
|
+
const innerLayer = new RebalanceIgnoringMiddleware(inner, [ID_B]);
|
|
543
|
+
const outerLayer = new StaticMiddleware(innerLayer, 'other', [ID_C]);
|
|
544
|
+
|
|
545
|
+
const result = await outerLayer.getInflightRebalanceActions(
|
|
546
|
+
REBALANCE_PARAMS,
|
|
547
|
+
logger,
|
|
548
|
+
);
|
|
549
|
+
|
|
550
|
+
expect(result.map((msg) => msg.msg_id)).to.deep.equal([ID_B, ID_C]);
|
|
551
|
+
expect(outerLayer.isIgnoredRebalanceAction(ID_B)).to.be.true;
|
|
552
|
+
expect(outerLayer.isIgnoredRebalanceAction(ID_C)).to.be.false;
|
|
553
|
+
});
|
|
554
|
+
});
|