@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
package/src/service.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import 'zod/compile';
|
|
3
|
+
|
|
2
4
|
/**
|
|
3
5
|
* Hyperlane Rebalancer Service Entry Point
|
|
4
6
|
*
|
|
@@ -33,6 +35,7 @@ import { MultiProvider } from '@humanode-hyperlane/sdk';
|
|
|
33
35
|
import {
|
|
34
36
|
applyRpcUrlOverridesFromEnv,
|
|
35
37
|
createServiceLogger,
|
|
38
|
+
isEVMLike,
|
|
36
39
|
ProtocolType,
|
|
37
40
|
rootLogger,
|
|
38
41
|
} from '@humanode-hyperlane/utils';
|
|
@@ -151,12 +154,15 @@ async function main(): Promise<void> {
|
|
|
151
154
|
Record<ProtocolType, InventorySignerConfig>
|
|
152
155
|
> = {};
|
|
153
156
|
|
|
154
|
-
for (const
|
|
157
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
158
|
+
const privateKey = inventoryPrivateKeys[protocol];
|
|
155
159
|
if (!privateKey) continue;
|
|
156
160
|
|
|
157
161
|
let derivedAddress: string;
|
|
158
162
|
|
|
159
|
-
if (protocol
|
|
163
|
+
if (isEVMLike(protocol)) {
|
|
164
|
+
// Tron uses same hex private key format as Ethereum.
|
|
165
|
+
// Derive 0x-prefixed hex address via ethers Wallet (TronWallet extends Wallet).
|
|
160
166
|
derivedAddress = new Wallet(privateKey).address;
|
|
161
167
|
} else if (protocol === ProtocolType.Sealevel) {
|
|
162
168
|
const keyBytes = parseSolanaPrivateKey(privateKey);
|
|
@@ -172,12 +178,11 @@ async function main(): Promise<void> {
|
|
|
172
178
|
|
|
173
179
|
// Validate against config if present
|
|
174
180
|
const configuredAddress =
|
|
175
|
-
rebalancerConfig.inventorySigners?.[protocol
|
|
181
|
+
rebalancerConfig.inventorySigners?.[protocol]?.address;
|
|
176
182
|
if (configuredAddress) {
|
|
177
|
-
const mismatch =
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
: configuredAddress !== derivedAddress;
|
|
183
|
+
const mismatch = isEVMLike(protocol)
|
|
184
|
+
? configuredAddress.toLowerCase() !== derivedAddress.toLowerCase()
|
|
185
|
+
: configuredAddress !== derivedAddress;
|
|
181
186
|
if (mismatch) {
|
|
182
187
|
throw new Error(
|
|
183
188
|
`inventorySigners.${protocol} mismatch: config has ${configuredAddress} but HYP_INVENTORY_KEY_${protocol.toUpperCase()} derives to ${derivedAddress}`,
|
|
@@ -185,7 +190,7 @@ async function main(): Promise<void> {
|
|
|
185
190
|
}
|
|
186
191
|
}
|
|
187
192
|
|
|
188
|
-
inventorySigners[protocol
|
|
193
|
+
inventorySigners[protocol] = {
|
|
189
194
|
address: derivedAddress,
|
|
190
195
|
key: privateKey,
|
|
191
196
|
};
|
|
@@ -242,6 +247,7 @@ async function main(): Promise<void> {
|
|
|
242
247
|
rebalancerConfig.intentTTL,
|
|
243
248
|
mergedInventorySigners,
|
|
244
249
|
rebalancerConfig.externalBridges,
|
|
250
|
+
rebalancerConfig.pendingTransferMiddlewares,
|
|
245
251
|
)
|
|
246
252
|
: rebalancerConfig;
|
|
247
253
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type Logger } from 'pino';
|
|
2
2
|
|
|
3
3
|
import type { ChainMap, ChainName, Token } from '@humanode-hyperlane/sdk';
|
|
4
|
-
import { toWei } from '@humanode-hyperlane/utils';
|
|
5
4
|
|
|
6
5
|
import type {
|
|
7
6
|
IStrategy,
|
|
@@ -18,6 +17,7 @@ import {
|
|
|
18
17
|
createStrategyRoute,
|
|
19
18
|
getBridgeConfig,
|
|
20
19
|
} from '../utils/bridgeUtils.js';
|
|
20
|
+
import { normalizeConfiguredAmount } from '../utils/balanceUtils.js';
|
|
21
21
|
|
|
22
22
|
export type Delta = { chain: ChainName; amount: bigint };
|
|
23
23
|
|
|
@@ -528,21 +528,24 @@ export abstract class BaseStrategy implements IStrategy {
|
|
|
528
528
|
route.origin,
|
|
529
529
|
route.destination,
|
|
530
530
|
);
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
this.logger.info(
|
|
536
|
-
{
|
|
537
|
-
context: this.constructor.name,
|
|
538
|
-
origin: route.origin,
|
|
539
|
-
destination: route.destination,
|
|
540
|
-
amount: route.amount.toString(),
|
|
541
|
-
minAmount: minAmount.toString(),
|
|
542
|
-
},
|
|
543
|
-
'Dropping route below bridgeMinAcceptedAmount',
|
|
531
|
+
if (bridgeConfig.bridgeMinAcceptedAmount != null) {
|
|
532
|
+
const minAmount = normalizeConfiguredAmount(
|
|
533
|
+
bridgeConfig.bridgeMinAcceptedAmount,
|
|
534
|
+
token,
|
|
544
535
|
);
|
|
545
|
-
|
|
536
|
+
if (route.amount < minAmount) {
|
|
537
|
+
this.logger.info(
|
|
538
|
+
{
|
|
539
|
+
context: this.constructor.name,
|
|
540
|
+
origin: route.origin,
|
|
541
|
+
destination: route.destination,
|
|
542
|
+
amount: route.amount.toString(),
|
|
543
|
+
minAmount: minAmount.toString(),
|
|
544
|
+
},
|
|
545
|
+
'Dropping route below bridgeMinAcceptedAmount',
|
|
546
|
+
);
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
546
549
|
}
|
|
547
550
|
}
|
|
548
551
|
}
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
type ChainName,
|
|
6
6
|
type Token,
|
|
7
7
|
} from '@humanode-hyperlane/sdk';
|
|
8
|
-
import { toWei } from '@humanode-hyperlane/utils';
|
|
9
8
|
|
|
10
9
|
import {
|
|
11
10
|
type CollateralDeficitStrategyConfig,
|
|
@@ -24,6 +23,7 @@ import {
|
|
|
24
23
|
isInventoryConfig,
|
|
25
24
|
isMovableCollateralConfig,
|
|
26
25
|
} from '../utils/bridgeUtils.js';
|
|
26
|
+
import { normalizeConfiguredAmount } from '../utils/balanceUtils.js';
|
|
27
27
|
|
|
28
28
|
import { BaseStrategy, type Delta } from './BaseStrategy.js';
|
|
29
29
|
|
|
@@ -106,8 +106,9 @@ export class CollateralDeficitStrategy extends BaseStrategy {
|
|
|
106
106
|
for (const chain of this.chains) {
|
|
107
107
|
const balance = simulatedBalances[chain];
|
|
108
108
|
const token = this.getTokenByChainName(chain);
|
|
109
|
-
const bufferWei =
|
|
110
|
-
|
|
109
|
+
const bufferWei = normalizeConfiguredAmount(
|
|
110
|
+
this.config[chain].buffer,
|
|
111
|
+
token,
|
|
111
112
|
);
|
|
112
113
|
|
|
113
114
|
if (balance < 0n) {
|
|
@@ -10,8 +10,10 @@ import {
|
|
|
10
10
|
} from '@humanode-hyperlane/sdk';
|
|
11
11
|
|
|
12
12
|
import { RebalancerMinAmountType } from '../config/types.js';
|
|
13
|
+
import { type MonitorEvent } from '../interfaces/IMonitor.js';
|
|
13
14
|
import type { RawBalances } from '../interfaces/IStrategy.js';
|
|
14
15
|
import { extractBridgeConfigs } from '../test/helpers.js';
|
|
16
|
+
import { getRawBalances } from '../utils/balanceUtils.js';
|
|
15
17
|
|
|
16
18
|
import { MinAmountStrategy } from './MinAmountStrategy.js';
|
|
17
19
|
|
|
@@ -64,7 +66,6 @@ describe('MinAmountStrategy', () => {
|
|
|
64
66
|
).to.throw('At least two chains must be configured');
|
|
65
67
|
});
|
|
66
68
|
|
|
67
|
-
// eslint-disable-next-line jest/expect-expect -- testing constructor doesn't throw
|
|
68
69
|
it('should create a strategy with minAmount and target using absolute values', () => {
|
|
69
70
|
new MinAmountStrategy(
|
|
70
71
|
{
|
|
@@ -94,7 +95,6 @@ describe('MinAmountStrategy', () => {
|
|
|
94
95
|
);
|
|
95
96
|
});
|
|
96
97
|
|
|
97
|
-
// eslint-disable-next-line jest/expect-expect -- testing constructor doesn't throw
|
|
98
98
|
it('should create a strategy with minAmount and target using relative values', () => {
|
|
99
99
|
new MinAmountStrategy(
|
|
100
100
|
{
|
|
@@ -415,6 +415,146 @@ describe('MinAmountStrategy', () => {
|
|
|
415
415
|
]);
|
|
416
416
|
});
|
|
417
417
|
|
|
418
|
+
it('should normalize absolute thresholds for mixed-decimal routes', () => {
|
|
419
|
+
const mixedTokensByChainName: ChainMap<Token> = {
|
|
420
|
+
[chain1]: new Token({
|
|
421
|
+
...tokenArgs,
|
|
422
|
+
chainName: chain1,
|
|
423
|
+
decimals: 18,
|
|
424
|
+
scale: { numerator: 1, denominator: 1_000_000_000_000 },
|
|
425
|
+
}),
|
|
426
|
+
[chain2]: new Token({
|
|
427
|
+
...tokenArgs,
|
|
428
|
+
chainName: chain2,
|
|
429
|
+
decimals: 6,
|
|
430
|
+
}),
|
|
431
|
+
};
|
|
432
|
+
const config = {
|
|
433
|
+
[chain1]: {
|
|
434
|
+
minAmount: {
|
|
435
|
+
min: '100',
|
|
436
|
+
target: '120',
|
|
437
|
+
type: RebalancerMinAmountType.Absolute,
|
|
438
|
+
},
|
|
439
|
+
bridge: AddressZero,
|
|
440
|
+
bridgeLockTime: 1,
|
|
441
|
+
},
|
|
442
|
+
[chain2]: {
|
|
443
|
+
minAmount: {
|
|
444
|
+
min: '100',
|
|
445
|
+
target: '120',
|
|
446
|
+
type: RebalancerMinAmountType.Absolute,
|
|
447
|
+
},
|
|
448
|
+
bridge: AddressZero,
|
|
449
|
+
bridgeLockTime: 1,
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
const strategy = new MinAmountStrategy(
|
|
454
|
+
config,
|
|
455
|
+
mixedTokensByChainName,
|
|
456
|
+
250_000_000n,
|
|
457
|
+
testLogger,
|
|
458
|
+
extractBridgeConfigs(config),
|
|
459
|
+
);
|
|
460
|
+
|
|
461
|
+
const routes = strategy.getRebalancingRoutes({
|
|
462
|
+
[chain1]: 50_000_000n,
|
|
463
|
+
[chain2]: 200_000_000n,
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
expect(routes).to.deep.equal([
|
|
467
|
+
{
|
|
468
|
+
origin: chain2,
|
|
469
|
+
destination: chain1,
|
|
470
|
+
amount: 70_000_000n,
|
|
471
|
+
bridge: AddressZero,
|
|
472
|
+
executionType: 'movableCollateral',
|
|
473
|
+
},
|
|
474
|
+
]);
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
it('normalizes mixed-decimal local balances before routing', () => {
|
|
478
|
+
const mixedTokensByChainName: ChainMap<Token> = {
|
|
479
|
+
[chain1]: new Token({
|
|
480
|
+
...tokenArgs,
|
|
481
|
+
chainName: chain1,
|
|
482
|
+
standard: TokenStandard.EvmHypCollateral,
|
|
483
|
+
decimals: 18,
|
|
484
|
+
scale: { numerator: 1, denominator: 1_000_000_000_000 },
|
|
485
|
+
}),
|
|
486
|
+
[chain2]: new Token({
|
|
487
|
+
...tokenArgs,
|
|
488
|
+
chainName: chain2,
|
|
489
|
+
standard: TokenStandard.EvmHypCollateral,
|
|
490
|
+
decimals: 6,
|
|
491
|
+
}),
|
|
492
|
+
};
|
|
493
|
+
const config = {
|
|
494
|
+
[chain1]: {
|
|
495
|
+
minAmount: {
|
|
496
|
+
min: '100',
|
|
497
|
+
target: '120',
|
|
498
|
+
type: RebalancerMinAmountType.Absolute,
|
|
499
|
+
},
|
|
500
|
+
bridge: AddressZero,
|
|
501
|
+
bridgeLockTime: 1,
|
|
502
|
+
},
|
|
503
|
+
[chain2]: {
|
|
504
|
+
minAmount: {
|
|
505
|
+
min: '100',
|
|
506
|
+
target: '120',
|
|
507
|
+
type: RebalancerMinAmountType.Absolute,
|
|
508
|
+
},
|
|
509
|
+
bridge: AddressZero,
|
|
510
|
+
bridgeLockTime: 1,
|
|
511
|
+
},
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
const strategy = new MinAmountStrategy(
|
|
515
|
+
config,
|
|
516
|
+
mixedTokensByChainName,
|
|
517
|
+
250_000_000n,
|
|
518
|
+
testLogger,
|
|
519
|
+
extractBridgeConfigs(config),
|
|
520
|
+
);
|
|
521
|
+
|
|
522
|
+
const event: MonitorEvent = {
|
|
523
|
+
tokensInfo: [
|
|
524
|
+
{
|
|
525
|
+
token: mixedTokensByChainName[chain1],
|
|
526
|
+
bridgedSupply: 50_000_000_000_000_000_000n,
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
token: mixedTokensByChainName[chain2],
|
|
530
|
+
bridgedSupply: 200_000_000n,
|
|
531
|
+
},
|
|
532
|
+
],
|
|
533
|
+
confirmedBlockTags: {
|
|
534
|
+
[chain1]: 1,
|
|
535
|
+
[chain2]: 1,
|
|
536
|
+
},
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
const rawBalances = getRawBalances([chain1, chain2], event, testLogger);
|
|
540
|
+
expect(rawBalances).to.deep.equal({
|
|
541
|
+
[chain1]: 50_000_000n,
|
|
542
|
+
[chain2]: 200_000_000n,
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
const routes = strategy.getRebalancingRoutes(rawBalances);
|
|
546
|
+
|
|
547
|
+
expect(routes).to.deep.equal([
|
|
548
|
+
{
|
|
549
|
+
origin: chain2,
|
|
550
|
+
destination: chain1,
|
|
551
|
+
amount: 70_000_000n,
|
|
552
|
+
bridge: AddressZero,
|
|
553
|
+
executionType: 'movableCollateral',
|
|
554
|
+
},
|
|
555
|
+
]);
|
|
556
|
+
});
|
|
557
|
+
|
|
418
558
|
it('should return multiple routes for multiple chains below minimum amount', () => {
|
|
419
559
|
const config = {
|
|
420
560
|
[chain1]: {
|
|
@@ -514,6 +654,102 @@ describe('MinAmountStrategy', () => {
|
|
|
514
654
|
);
|
|
515
655
|
});
|
|
516
656
|
|
|
657
|
+
it('should keep minAmount validation errors human-readable for mixed-decimal routes', () => {
|
|
658
|
+
const mixedTokensByChainName: ChainMap<Token> = {
|
|
659
|
+
[chain1]: new Token({
|
|
660
|
+
...tokenArgs,
|
|
661
|
+
chainName: chain1,
|
|
662
|
+
decimals: 18,
|
|
663
|
+
scale: { numerator: 1, denominator: 1_000_000_000_000 },
|
|
664
|
+
}),
|
|
665
|
+
[chain2]: new Token({
|
|
666
|
+
...tokenArgs,
|
|
667
|
+
chainName: chain2,
|
|
668
|
+
decimals: 6,
|
|
669
|
+
}),
|
|
670
|
+
};
|
|
671
|
+
|
|
672
|
+
expect(
|
|
673
|
+
() =>
|
|
674
|
+
new MinAmountStrategy(
|
|
675
|
+
{
|
|
676
|
+
[chain1]: {
|
|
677
|
+
minAmount: {
|
|
678
|
+
min: '100',
|
|
679
|
+
target: '120',
|
|
680
|
+
type: RebalancerMinAmountType.Absolute,
|
|
681
|
+
},
|
|
682
|
+
bridge: AddressZero,
|
|
683
|
+
bridgeLockTime: 1,
|
|
684
|
+
},
|
|
685
|
+
[chain2]: {
|
|
686
|
+
minAmount: {
|
|
687
|
+
min: '100',
|
|
688
|
+
target: '120',
|
|
689
|
+
type: RebalancerMinAmountType.Absolute,
|
|
690
|
+
},
|
|
691
|
+
bridge: AddressZero,
|
|
692
|
+
bridgeLockTime: 1,
|
|
693
|
+
},
|
|
694
|
+
},
|
|
695
|
+
mixedTokensByChainName,
|
|
696
|
+
230_000_000n,
|
|
697
|
+
testLogger,
|
|
698
|
+
{},
|
|
699
|
+
),
|
|
700
|
+
).to.throw(
|
|
701
|
+
`Consider reducing the targets as the sum (240) is greater than sum of collaterals (230)`,
|
|
702
|
+
);
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
it('should keep fractional minAmount validation errors human-readable across heterogeneous decimals', () => {
|
|
706
|
+
const mixedTokensByChainName: ChainMap<Token> = {
|
|
707
|
+
[chain1]: new Token({
|
|
708
|
+
...tokenArgs,
|
|
709
|
+
chainName: chain1,
|
|
710
|
+
decimals: 6,
|
|
711
|
+
}),
|
|
712
|
+
[chain2]: new Token({
|
|
713
|
+
...tokenArgs,
|
|
714
|
+
chainName: chain2,
|
|
715
|
+
decimals: 18,
|
|
716
|
+
scale: { numerator: 1, denominator: 1_000_000_000_000 },
|
|
717
|
+
}),
|
|
718
|
+
};
|
|
719
|
+
|
|
720
|
+
expect(
|
|
721
|
+
() =>
|
|
722
|
+
new MinAmountStrategy(
|
|
723
|
+
{
|
|
724
|
+
[chain1]: {
|
|
725
|
+
minAmount: {
|
|
726
|
+
min: '100',
|
|
727
|
+
target: '120.25',
|
|
728
|
+
type: RebalancerMinAmountType.Absolute,
|
|
729
|
+
},
|
|
730
|
+
bridge: AddressZero,
|
|
731
|
+
bridgeLockTime: 1,
|
|
732
|
+
},
|
|
733
|
+
[chain2]: {
|
|
734
|
+
minAmount: {
|
|
735
|
+
min: '100',
|
|
736
|
+
target: '120.25',
|
|
737
|
+
type: RebalancerMinAmountType.Absolute,
|
|
738
|
+
},
|
|
739
|
+
bridge: AddressZero,
|
|
740
|
+
bridgeLockTime: 1,
|
|
741
|
+
},
|
|
742
|
+
},
|
|
743
|
+
mixedTokensByChainName,
|
|
744
|
+
230_500_000n,
|
|
745
|
+
testLogger,
|
|
746
|
+
{},
|
|
747
|
+
),
|
|
748
|
+
).to.throw(
|
|
749
|
+
`Consider reducing the targets as the sum (240.5) is greater than sum of collaterals (230.5)`,
|
|
750
|
+
);
|
|
751
|
+
});
|
|
752
|
+
|
|
517
753
|
it('should handle case where there is not enough surplus to meet all minimum requirements by scaling down deficits', () => {
|
|
518
754
|
const config = {
|
|
519
755
|
[chain1]: {
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { BigNumber } from 'bignumber.js';
|
|
2
2
|
import { type Logger } from 'pino';
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
localAmountFromMessage,
|
|
6
|
+
type ChainMap,
|
|
7
|
+
type Token,
|
|
8
|
+
} from '@humanode-hyperlane/sdk';
|
|
9
|
+
import { fromWei } from '@humanode-hyperlane/utils';
|
|
6
10
|
|
|
7
11
|
import {
|
|
8
12
|
type MinAmountStrategyConfig,
|
|
@@ -16,6 +20,7 @@ import type {
|
|
|
16
20
|
} from '../interfaces/IStrategy.js';
|
|
17
21
|
import { type Metrics } from '../metrics/Metrics.js';
|
|
18
22
|
import type { BridgeConfigWithOverride } from '../utils/bridgeUtils.js';
|
|
23
|
+
import { normalizeConfiguredAmount } from '../utils/balanceUtils.js';
|
|
19
24
|
|
|
20
25
|
import { BaseStrategy, type Delta } from './BaseStrategy.js';
|
|
21
26
|
|
|
@@ -116,9 +121,13 @@ export class MinAmountStrategy extends BaseStrategy {
|
|
|
116
121
|
if (chainConfig.minAmount.type === RebalancerMinAmountType.Absolute) {
|
|
117
122
|
const token = this.getTokenByChainName(chain);
|
|
118
123
|
|
|
119
|
-
minAmount =
|
|
120
|
-
|
|
121
|
-
|
|
124
|
+
minAmount = normalizeConfiguredAmount(
|
|
125
|
+
chainConfig.minAmount.min,
|
|
126
|
+
token,
|
|
127
|
+
);
|
|
128
|
+
targetAmount = normalizeConfiguredAmount(
|
|
129
|
+
chainConfig.minAmount.target,
|
|
130
|
+
token,
|
|
122
131
|
);
|
|
123
132
|
} else {
|
|
124
133
|
minAmount = BigInt(
|
|
@@ -172,29 +181,32 @@ export class MinAmountStrategy extends BaseStrategy {
|
|
|
172
181
|
|
|
173
182
|
if (minAmountType === RebalancerMinAmountType.Absolute) {
|
|
174
183
|
let totalTargets = 0n;
|
|
175
|
-
|
|
184
|
+
const displayToken = this.getTokenByChainName(this.chains[0]);
|
|
176
185
|
|
|
177
186
|
for (const chainName of this.chains) {
|
|
178
187
|
const token = this.getTokenByChainName(chainName);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
totalTargets += BigInt(
|
|
183
|
-
toWei(config[chainName].minAmount.target, token.decimals),
|
|
188
|
+
totalTargets += normalizeConfiguredAmount(
|
|
189
|
+
config[chainName].minAmount.target,
|
|
190
|
+
token,
|
|
184
191
|
);
|
|
185
192
|
}
|
|
186
193
|
|
|
187
194
|
if (totalTargets > totalCollateral) {
|
|
188
195
|
throw new Error(
|
|
189
|
-
`Consider reducing the targets as the sum (${
|
|
190
|
-
totalTargets
|
|
191
|
-
|
|
192
|
-
)}) is greater than sum of collaterals (${
|
|
193
|
-
totalCollateral
|
|
194
|
-
|
|
196
|
+
`Consider reducing the targets as the sum (${this.formatCanonicalAmount(
|
|
197
|
+
totalTargets,
|
|
198
|
+
displayToken,
|
|
199
|
+
)}) is greater than sum of collaterals (${this.formatCanonicalAmount(
|
|
200
|
+
totalCollateral,
|
|
201
|
+
displayToken,
|
|
195
202
|
)})`,
|
|
196
203
|
);
|
|
197
204
|
}
|
|
198
205
|
}
|
|
199
206
|
}
|
|
207
|
+
|
|
208
|
+
private formatCanonicalAmount(amount: bigint, token: Token): string {
|
|
209
|
+
const localAmount = localAmountFromMessage(amount, token.scale);
|
|
210
|
+
return fromWei(localAmount.toString(), token.decimals);
|
|
211
|
+
}
|
|
200
212
|
}
|
package/src/test/helpers.ts
CHANGED
|
@@ -6,10 +6,11 @@ import {
|
|
|
6
6
|
type ChainMetadata,
|
|
7
7
|
type ChainName,
|
|
8
8
|
EvmMovableCollateralAdapter,
|
|
9
|
+
type IToken,
|
|
9
10
|
type InterchainGasQuote,
|
|
10
11
|
type MultiProvider,
|
|
11
12
|
type Token,
|
|
12
|
-
|
|
13
|
+
TokenAmount,
|
|
13
14
|
type WarpCore,
|
|
14
15
|
} from '@humanode-hyperlane/sdk';
|
|
15
16
|
|
|
@@ -115,17 +116,14 @@ export function buildTestPreparedTransaction(
|
|
|
115
116
|
|
|
116
117
|
// === Mock Factories ===
|
|
117
118
|
|
|
118
|
-
export function createMockTokenAmount(amount: bigint): TokenAmount {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
},
|
|
127
|
-
getDecimalFormattedAmount: () => ethers.utils.formatEther(amount),
|
|
128
|
-
} as unknown as TokenAmount;
|
|
119
|
+
export function createMockTokenAmount(amount: bigint): TokenAmount<IToken> {
|
|
120
|
+
const token = {
|
|
121
|
+
name: 'TestToken',
|
|
122
|
+
symbol: 'TEST',
|
|
123
|
+
decimals: 18,
|
|
124
|
+
addressOrDenom: TEST_ADDRESSES.token,
|
|
125
|
+
} as IToken;
|
|
126
|
+
return new TokenAmount(amount, token);
|
|
129
127
|
}
|
|
130
128
|
|
|
131
129
|
export interface MockAdapterConfig {
|
|
@@ -173,6 +171,7 @@ export interface MockTokenConfig {
|
|
|
173
171
|
name?: string;
|
|
174
172
|
decimals?: number;
|
|
175
173
|
addressOrDenom?: string;
|
|
174
|
+
scale?: Token['scale'];
|
|
176
175
|
adapter?: ReturnType<typeof createMockAdapter>;
|
|
177
176
|
}
|
|
178
177
|
|
|
@@ -181,6 +180,7 @@ export function createMockToken(config: MockTokenConfig = {}) {
|
|
|
181
180
|
name = 'TestToken',
|
|
182
181
|
decimals = 18,
|
|
183
182
|
addressOrDenom = TEST_ADDRESSES.token,
|
|
183
|
+
scale,
|
|
184
184
|
adapter = createMockAdapter(),
|
|
185
185
|
} = config;
|
|
186
186
|
|
|
@@ -188,6 +188,7 @@ export function createMockToken(config: MockTokenConfig = {}) {
|
|
|
188
188
|
name,
|
|
189
189
|
decimals,
|
|
190
190
|
addressOrDenom,
|
|
191
|
+
scale,
|
|
191
192
|
amount: (amt: bigint) => createMockTokenAmount(amt),
|
|
192
193
|
getHypAdapter: Sinon.stub().returns(adapter),
|
|
193
194
|
};
|
package/src/test/lifiMocks.ts
CHANGED
|
@@ -128,15 +128,18 @@ export function createMockBridgeQuote(
|
|
|
128
128
|
const route = overrides?.route as
|
|
129
129
|
| { action?: { fromChainId?: number; toChainId?: number } }
|
|
130
130
|
| undefined;
|
|
131
|
+
const usesReverseQuote = overrides?.requestParams?.toAmount !== undefined;
|
|
131
132
|
|
|
132
133
|
const defaultRequestParams: BridgeQuoteParams = {
|
|
133
134
|
fromChain: 42161,
|
|
134
135
|
toChain: 1399811149,
|
|
135
136
|
fromToken: '0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
|
|
136
137
|
toToken: '0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
|
|
137
|
-
fromAddress: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
138
138
|
toAddress: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
139
|
-
|
|
139
|
+
fromAddress: '0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
|
|
140
|
+
...(usesReverseQuote
|
|
141
|
+
? { toAmount: 9950000000n }
|
|
142
|
+
: { fromAmount: 10000000000n }),
|
|
140
143
|
};
|
|
141
144
|
const requestParams: BridgeQuoteParams = {
|
|
142
145
|
...defaultRequestParams,
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Logger } from 'pino';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
ExplorerMessage,
|
|
5
|
+
IExplorerClient,
|
|
6
|
+
RebalanceActionQueryParams,
|
|
7
|
+
UserTransferQueryParams,
|
|
8
|
+
} from '../utils/ExplorerClient.js';
|
|
9
|
+
|
|
10
|
+
export const ID_A =
|
|
11
|
+
'0x8960c5e41eb0d91973140ebc196892f5f07f512dd86047e8536e71424462c5d3';
|
|
12
|
+
export const ID_B =
|
|
13
|
+
'0xdae65a8dd678bf8ea03faed7d53b99e52f5bdbae7c95834eff009cc37a18103c';
|
|
14
|
+
export const ID_C =
|
|
15
|
+
'0x1c3b5f0e2d4a6c8e0f1a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f70';
|
|
16
|
+
|
|
17
|
+
export const PARAMS: UserTransferQueryParams = {
|
|
18
|
+
routersByDomain: { 1: '0x67899664446ccfadf75e0d3f5668be262acd1069' },
|
|
19
|
+
excludeTxSenders: ['0x995a921d333029512aa166885856c8af760e9381'],
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const REBALANCE_PARAMS: RebalanceActionQueryParams = {
|
|
23
|
+
bridges: ['0x867a19a5b257bcb99e1840de2ef852268efd5e46'],
|
|
24
|
+
routersByDomain: PARAMS.routersByDomain,
|
|
25
|
+
rebalancerAddress: '0x995a921d333029512aa166885856c8af760e9381',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export function buildMessage(msgId: string): ExplorerMessage {
|
|
29
|
+
return {
|
|
30
|
+
msg_id: msgId,
|
|
31
|
+
origin_domain_id: 42161,
|
|
32
|
+
destination_domain_id: 1,
|
|
33
|
+
sender: '0x867a19a5b257bcb99e1840de2ef852268efd5e46',
|
|
34
|
+
recipient: '0x67899664446ccfadf75e0d3f5668be262acd1069',
|
|
35
|
+
origin_tx_hash:
|
|
36
|
+
'0x5e3c1f6a3c1a7f86e0f2d5e9c9c1b8d1e1e7e2b6c4d8a9f0e1d2c3b4a5968778',
|
|
37
|
+
origin_tx_sender: '0x995a921d333029512aa166885856c8af760e9381',
|
|
38
|
+
origin_tx_recipient: '0x867a19a5b257bcb99e1840de2ef852268efd5e46',
|
|
39
|
+
is_delivered: false,
|
|
40
|
+
message_body: `0x${'00'.repeat(63)}64`,
|
|
41
|
+
send_occurred_at: null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class StubExplorerClient implements IExplorerClient {
|
|
46
|
+
readonly userTransferParams: UserTransferQueryParams[] = [];
|
|
47
|
+
rebalanceActions: ExplorerMessage[] = [buildMessage(ID_C)];
|
|
48
|
+
|
|
49
|
+
constructor(public userTransfers: ExplorerMessage[]) {}
|
|
50
|
+
|
|
51
|
+
async getInflightUserTransfers(
|
|
52
|
+
params: UserTransferQueryParams,
|
|
53
|
+
_logger: Logger,
|
|
54
|
+
): Promise<ExplorerMessage[]> {
|
|
55
|
+
this.userTransferParams.push(params);
|
|
56
|
+
return this.userTransfers;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async getInflightRebalanceActions(
|
|
60
|
+
_params: RebalanceActionQueryParams,
|
|
61
|
+
_logger: Logger,
|
|
62
|
+
): Promise<ExplorerMessage[]> {
|
|
63
|
+
return this.rebalanceActions;
|
|
64
|
+
}
|
|
65
|
+
}
|