@humanode-hyperlane/rebalancer 0.0.0-stage → 27.2.2
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/LICENSE.md +193 -0
- package/README.md +297 -2
- package/dist/bridges/LiFiBridge.d.ts +93 -0
- package/dist/bridges/LiFiBridge.d.ts.map +1 -0
- package/dist/bridges/LiFiBridge.js +527 -0
- package/dist/bridges/LiFiBridge.js.map +1 -0
- package/dist/bridges/LiFiBridge.test.d.ts +2 -0
- package/dist/bridges/LiFiBridge.test.d.ts.map +1 -0
- package/dist/bridges/LiFiBridge.test.js +504 -0
- package/dist/bridges/LiFiBridge.test.js.map +1 -0
- package/dist/config/RebalancerConfig.d.ts +20 -0
- package/dist/config/RebalancerConfig.d.ts.map +1 -0
- package/dist/config/RebalancerConfig.js +35 -0
- package/dist/config/RebalancerConfig.js.map +1 -0
- package/dist/config/RebalancerConfig.test.d.ts +2 -0
- package/dist/config/RebalancerConfig.test.d.ts.map +1 -0
- package/dist/config/RebalancerConfig.test.js +798 -0
- package/dist/config/RebalancerConfig.test.js.map +1 -0
- package/dist/config/types.d.ts +3008 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +451 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/InventoryRebalancer.d.ts +201 -0
- package/dist/core/InventoryRebalancer.d.ts.map +1 -0
- package/dist/core/InventoryRebalancer.js +994 -0
- package/dist/core/InventoryRebalancer.js.map +1 -0
- package/dist/core/InventoryRebalancer.test.d.ts +2 -0
- package/dist/core/InventoryRebalancer.test.d.ts.map +1 -0
- package/dist/core/InventoryRebalancer.test.js +1511 -0
- package/dist/core/InventoryRebalancer.test.js.map +1 -0
- package/dist/core/Rebalancer.d.ts +37 -0
- package/dist/core/Rebalancer.d.ts.map +1 -0
- package/dist/core/Rebalancer.js +433 -0
- package/dist/core/Rebalancer.js.map +1 -0
- package/dist/core/Rebalancer.test.d.ts +2 -0
- package/dist/core/Rebalancer.test.d.ts.map +1 -0
- package/dist/core/Rebalancer.test.js +424 -0
- package/dist/core/Rebalancer.test.js.map +1 -0
- package/dist/core/RebalancerOrchestrator.d.ts +56 -0
- package/dist/core/RebalancerOrchestrator.d.ts.map +1 -0
- package/dist/core/RebalancerOrchestrator.js +154 -0
- package/dist/core/RebalancerOrchestrator.js.map +1 -0
- package/dist/core/RebalancerOrchestrator.test.d.ts +2 -0
- package/dist/core/RebalancerOrchestrator.test.d.ts.map +1 -0
- package/dist/core/RebalancerOrchestrator.test.js +721 -0
- package/dist/core/RebalancerOrchestrator.test.js.map +1 -0
- package/dist/core/RebalancerService.d.ts +127 -0
- package/dist/core/RebalancerService.d.ts.map +1 -0
- package/dist/core/RebalancerService.js +270 -0
- package/dist/core/RebalancerService.js.map +1 -0
- package/dist/core/RebalancerService.test.d.ts +2 -0
- package/dist/core/RebalancerService.test.d.ts.map +1 -0
- package/dist/core/RebalancerService.test.js +777 -0
- package/dist/core/RebalancerService.test.js.map +1 -0
- package/dist/e2e/collateral-deficit.e2e-test.d.ts +2 -0
- package/dist/e2e/collateral-deficit.e2e-test.d.ts.map +1 -0
- package/dist/e2e/collateral-deficit.e2e-test.js +227 -0
- package/dist/e2e/collateral-deficit.e2e-test.js.map +1 -0
- package/dist/e2e/composite.e2e-test.d.ts +2 -0
- package/dist/e2e/composite.e2e-test.d.ts.map +1 -0
- package/dist/e2e/composite.e2e-test.js +666 -0
- package/dist/e2e/composite.e2e-test.js.map +1 -0
- package/dist/e2e/fixtures/routes.d.ts +89 -0
- package/dist/e2e/fixtures/routes.d.ts.map +1 -0
- package/dist/e2e/fixtures/routes.js +420 -0
- package/dist/e2e/fixtures/routes.js.map +1 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts +38 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.js +144 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/BridgeSetup.d.ts +11 -0
- package/dist/e2e/harness/BridgeSetup.d.ts.map +1 -0
- package/dist/e2e/harness/BridgeSetup.js +50 -0
- package/dist/e2e/harness/BridgeSetup.js.map +1 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts +13 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js +105 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts +11 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.js +105 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/ForkIndexer.d.ts +23 -0
- package/dist/e2e/harness/ForkIndexer.d.ts.map +1 -0
- package/dist/e2e/harness/ForkIndexer.js +127 -0
- package/dist/e2e/harness/ForkIndexer.js.map +1 -0
- package/dist/e2e/harness/ForkIndexer.test.d.ts +2 -0
- package/dist/e2e/harness/ForkIndexer.test.d.ts.map +1 -0
- package/dist/e2e/harness/ForkIndexer.test.js +257 -0
- package/dist/e2e/harness/ForkIndexer.test.js.map +1 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts +21 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.js +115 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/MockExplorerClient.d.ts +23 -0
- package/dist/e2e/harness/MockExplorerClient.d.ts.map +1 -0
- package/dist/e2e/harness/MockExplorerClient.js +57 -0
- package/dist/e2e/harness/MockExplorerClient.js.map +1 -0
- package/dist/e2e/harness/MockExternalBridge.d.ts +32 -0
- package/dist/e2e/harness/MockExternalBridge.d.ts.map +1 -0
- package/dist/e2e/harness/MockExternalBridge.js +247 -0
- package/dist/e2e/harness/MockExternalBridge.js.map +1 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts +13 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.js +91 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/SnapshotHelper.d.ts +13 -0
- package/dist/e2e/harness/SnapshotHelper.d.ts.map +1 -0
- package/dist/e2e/harness/SnapshotHelper.js +36 -0
- package/dist/e2e/harness/SnapshotHelper.js.map +1 -0
- package/dist/e2e/harness/TestHelpers.d.ts +25 -0
- package/dist/e2e/harness/TestHelpers.d.ts.map +1 -0
- package/dist/e2e/harness/TestHelpers.js +103 -0
- package/dist/e2e/harness/TestHelpers.js.map +1 -0
- package/dist/e2e/harness/TestRebalancer.d.ts +85 -0
- package/dist/e2e/harness/TestRebalancer.d.ts.map +1 -0
- package/dist/e2e/harness/TestRebalancer.js +427 -0
- package/dist/e2e/harness/TestRebalancer.js.map +1 -0
- package/dist/e2e/harness/TransferHelper.d.ts +34 -0
- package/dist/e2e/harness/TransferHelper.d.ts.map +1 -0
- package/dist/e2e/harness/TransferHelper.js +93 -0
- package/dist/e2e/harness/TransferHelper.js.map +1 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.js +411 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.js.map +1 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.js +408 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.js.map +1 -0
- package/dist/e2e/inventory-minAmount.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-minAmount.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-minAmount.e2e-test.js +411 -0
- package/dist/e2e/inventory-minAmount.e2e-test.js.map +1 -0
- package/dist/e2e/inventory-weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-weighted.e2e-test.js +409 -0
- package/dist/e2e/inventory-weighted.e2e-test.js.map +1 -0
- package/dist/e2e/minAmount.e2e-test.d.ts +2 -0
- package/dist/e2e/minAmount.e2e-test.d.ts.map +1 -0
- package/dist/e2e/minAmount.e2e-test.js +203 -0
- package/dist/e2e/minAmount.e2e-test.js.map +1 -0
- package/dist/e2e/mixed-weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/mixed-weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/mixed-weighted.e2e-test.js +189 -0
- package/dist/e2e/mixed-weighted.e2e-test.js.map +1 -0
- package/dist/e2e/weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/weighted.e2e-test.js +198 -0
- package/dist/e2e/weighted.e2e-test.js.map +1 -0
- package/dist/factories/RebalancerContextFactory.d.ts +89 -0
- package/dist/factories/RebalancerContextFactory.d.ts.map +1 -0
- package/dist/factories/RebalancerContextFactory.js +420 -0
- package/dist/factories/RebalancerContextFactory.js.map +1 -0
- package/dist/factories/RebalancerContextFactory.test.d.ts +2 -0
- package/dist/factories/RebalancerContextFactory.test.d.ts.map +1 -0
- package/dist/factories/RebalancerContextFactory.test.js +270 -0
- package/dist/factories/RebalancerContextFactory.test.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IExternalBridge.d.ts +103 -0
- package/dist/interfaces/IExternalBridge.d.ts.map +1 -0
- package/dist/interfaces/IExternalBridge.js +2 -0
- package/dist/interfaces/IExternalBridge.js.map +1 -0
- package/dist/interfaces/IMetrics.d.ts +5 -0
- package/dist/interfaces/IMetrics.d.ts.map +1 -0
- package/dist/interfaces/IMetrics.js +2 -0
- package/dist/interfaces/IMetrics.js.map +1 -0
- package/dist/interfaces/IMonitor.d.ts +50 -0
- package/dist/interfaces/IMonitor.d.ts.map +1 -0
- package/dist/interfaces/IMonitor.js +14 -0
- package/dist/interfaces/IMonitor.js.map +1 -0
- package/dist/interfaces/IRebalancer.d.ts +31 -0
- package/dist/interfaces/IRebalancer.d.ts.map +1 -0
- package/dist/interfaces/IRebalancer.js +2 -0
- package/dist/interfaces/IRebalancer.js.map +1 -0
- package/dist/interfaces/IStrategy.d.ts +60 -0
- package/dist/interfaces/IStrategy.d.ts.map +1 -0
- package/dist/interfaces/IStrategy.js +13 -0
- package/dist/interfaces/IStrategy.js.map +1 -0
- package/dist/metrics/Metrics.d.ts +25 -0
- package/dist/metrics/Metrics.d.ts.map +1 -0
- package/dist/metrics/Metrics.js +164 -0
- package/dist/metrics/Metrics.js.map +1 -0
- package/dist/metrics/PriceGetter.d.ts +10 -0
- package/dist/metrics/PriceGetter.d.ts.map +1 -0
- package/dist/metrics/PriceGetter.js +41 -0
- package/dist/metrics/PriceGetter.js.map +1 -0
- package/dist/metrics/scripts/metrics.d.ts +28 -0
- package/dist/metrics/scripts/metrics.d.ts.map +1 -0
- package/dist/metrics/scripts/metrics.js +61 -0
- package/dist/metrics/scripts/metrics.js.map +1 -0
- package/dist/monitor/Monitor.d.ts +40 -0
- package/dist/monitor/Monitor.d.ts.map +1 -0
- package/dist/monitor/Monitor.js +211 -0
- package/dist/monitor/Monitor.js.map +1 -0
- package/dist/service.d.ts +3 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +205 -0
- package/dist/service.js.map +1 -0
- package/dist/strategy/BaseStrategy.d.ts +86 -0
- package/dist/strategy/BaseStrategy.d.ts.map +1 -0
- package/dist/strategy/BaseStrategy.js +342 -0
- package/dist/strategy/BaseStrategy.js.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.d.ts +65 -0
- package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.js +253 -0
- package/dist/strategy/CollateralDeficitStrategy.js.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.test.d.ts +2 -0
- package/dist/strategy/CollateralDeficitStrategy.test.d.ts.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.test.js +497 -0
- package/dist/strategy/CollateralDeficitStrategy.test.js.map +1 -0
- package/dist/strategy/CompositeStrategy.d.ts +18 -0
- package/dist/strategy/CompositeStrategy.d.ts.map +1 -0
- package/dist/strategy/CompositeStrategy.js +63 -0
- package/dist/strategy/CompositeStrategy.js.map +1 -0
- package/dist/strategy/CompositeStrategy.test.d.ts +2 -0
- package/dist/strategy/CompositeStrategy.test.d.ts.map +1 -0
- package/dist/strategy/CompositeStrategy.test.js +278 -0
- package/dist/strategy/CompositeStrategy.test.js.map +1 -0
- package/dist/strategy/MinAmountStrategy.d.ts +35 -0
- package/dist/strategy/MinAmountStrategy.d.ts.map +1 -0
- package/dist/strategy/MinAmountStrategy.js +112 -0
- package/dist/strategy/MinAmountStrategy.js.map +1 -0
- package/dist/strategy/MinAmountStrategy.test.d.ts +2 -0
- package/dist/strategy/MinAmountStrategy.test.d.ts.map +1 -0
- package/dist/strategy/MinAmountStrategy.test.js +547 -0
- package/dist/strategy/MinAmountStrategy.test.js.map +1 -0
- package/dist/strategy/StrategyFactory.d.ts +27 -0
- package/dist/strategy/StrategyFactory.d.ts.map +1 -0
- package/dist/strategy/StrategyFactory.js +79 -0
- package/dist/strategy/StrategyFactory.js.map +1 -0
- package/dist/strategy/StrategyFactory.test.d.ts +2 -0
- package/dist/strategy/StrategyFactory.test.d.ts.map +1 -0
- package/dist/strategy/StrategyFactory.test.js +81 -0
- package/dist/strategy/StrategyFactory.test.js.map +1 -0
- package/dist/strategy/WeightedStrategy.d.ts +32 -0
- package/dist/strategy/WeightedStrategy.d.ts.map +1 -0
- package/dist/strategy/WeightedStrategy.js +73 -0
- package/dist/strategy/WeightedStrategy.js.map +1 -0
- package/dist/strategy/WeightedStrategy.test.d.ts +2 -0
- package/dist/strategy/WeightedStrategy.test.d.ts.map +1 -0
- package/dist/strategy/WeightedStrategy.test.js +403 -0
- package/dist/strategy/WeightedStrategy.test.js.map +1 -0
- package/dist/strategy/index.d.ts +7 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +7 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/test/helpers.d.ts +99 -0
- package/dist/test/helpers.d.ts.map +1 -0
- package/dist/test/helpers.js +311 -0
- package/dist/test/helpers.js.map +1 -0
- package/dist/test/lifiMocks.d.ts +52 -0
- package/dist/test/lifiMocks.d.ts.map +1 -0
- package/dist/test/lifiMocks.js +160 -0
- package/dist/test/lifiMocks.js.map +1 -0
- package/dist/tracking/ActionTracker.d.ts +90 -0
- package/dist/tracking/ActionTracker.d.ts.map +1 -0
- package/dist/tracking/ActionTracker.js +678 -0
- package/dist/tracking/ActionTracker.js.map +1 -0
- package/dist/tracking/ActionTracker.test.d.ts +2 -0
- package/dist/tracking/ActionTracker.test.d.ts.map +1 -0
- package/dist/tracking/ActionTracker.test.js +1351 -0
- package/dist/tracking/ActionTracker.test.js.map +1 -0
- package/dist/tracking/IActionTracker.d.ts +157 -0
- package/dist/tracking/IActionTracker.d.ts.map +1 -0
- package/dist/tracking/IActionTracker.js +2 -0
- package/dist/tracking/IActionTracker.js.map +1 -0
- package/dist/tracking/InflightContextAdapter.d.ts +18 -0
- package/dist/tracking/InflightContextAdapter.d.ts.map +1 -0
- package/dist/tracking/InflightContextAdapter.js +52 -0
- package/dist/tracking/InflightContextAdapter.js.map +1 -0
- package/dist/tracking/InflightContextAdapter.test.d.ts +2 -0
- package/dist/tracking/InflightContextAdapter.test.d.ts.map +1 -0
- package/dist/tracking/InflightContextAdapter.test.js +175 -0
- package/dist/tracking/InflightContextAdapter.test.js.map +1 -0
- package/dist/tracking/store/IStore.d.ts +41 -0
- package/dist/tracking/store/IStore.d.ts.map +1 -0
- package/dist/tracking/store/IStore.js +2 -0
- package/dist/tracking/store/IStore.js.map +1 -0
- package/dist/tracking/store/InMemoryStore.d.ts +21 -0
- package/dist/tracking/store/InMemoryStore.d.ts.map +1 -0
- package/dist/tracking/store/InMemoryStore.js +40 -0
- package/dist/tracking/store/InMemoryStore.js.map +1 -0
- package/dist/tracking/store/InMemoryStore.test.d.ts +2 -0
- package/dist/tracking/store/InMemoryStore.test.d.ts.map +1 -0
- package/dist/tracking/store/InMemoryStore.test.js +290 -0
- package/dist/tracking/store/InMemoryStore.test.js.map +1 -0
- package/dist/tracking/store/index.d.ts +3 -0
- package/dist/tracking/store/index.d.ts.map +1 -0
- package/dist/tracking/store/index.js +2 -0
- package/dist/tracking/store/index.js.map +1 -0
- package/dist/tracking/types.d.ts +77 -0
- package/dist/tracking/types.d.ts.map +1 -0
- package/dist/tracking/types.js +2 -0
- package/dist/tracking/types.js.map +1 -0
- package/dist/utils/ExplorerClient.d.ts +68 -0
- package/dist/utils/ExplorerClient.d.ts.map +1 -0
- package/dist/utils/ExplorerClient.js +324 -0
- package/dist/utils/ExplorerClient.js.map +1 -0
- package/dist/utils/ExplorerClient.test.d.ts +2 -0
- package/dist/utils/ExplorerClient.test.d.ts.map +1 -0
- package/dist/utils/ExplorerClient.test.js +261 -0
- package/dist/utils/ExplorerClient.test.js.map +1 -0
- package/dist/utils/balanceUtils.d.ts +12 -0
- package/dist/utils/balanceUtils.d.ts.map +1 -0
- package/dist/utils/balanceUtils.js +40 -0
- package/dist/utils/balanceUtils.js.map +1 -0
- package/dist/utils/balanceUtils.test.d.ts +2 -0
- package/dist/utils/balanceUtils.test.d.ts.map +1 -0
- package/dist/utils/balanceUtils.test.js +55 -0
- package/dist/utils/balanceUtils.test.js.map +1 -0
- package/dist/utils/blockTag.d.ts +14 -0
- package/dist/utils/blockTag.d.ts.map +1 -0
- package/dist/utils/blockTag.js +46 -0
- package/dist/utils/blockTag.js.map +1 -0
- package/dist/utils/bridgeUtils.d.ts +40 -0
- package/dist/utils/bridgeUtils.d.ts.map +1 -0
- package/dist/utils/bridgeUtils.js +54 -0
- package/dist/utils/bridgeUtils.js.map +1 -0
- package/dist/utils/bridgeUtils.test.d.ts +2 -0
- package/dist/utils/bridgeUtils.test.d.ts.map +1 -0
- package/dist/utils/bridgeUtils.test.js +163 -0
- package/dist/utils/bridgeUtils.test.js.map +1 -0
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +6 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gasEstimation.d.ts +65 -0
- package/dist/utils/gasEstimation.d.ts.map +1 -0
- package/dist/utils/gasEstimation.js +206 -0
- package/dist/utils/gasEstimation.js.map +1 -0
- package/dist/utils/solanaKeyParser.d.ts +10 -0
- package/dist/utils/solanaKeyParser.d.ts.map +1 -0
- package/dist/utils/solanaKeyParser.js +87 -0
- package/dist/utils/solanaKeyParser.js.map +1 -0
- package/dist/utils/solanaKeyParser.test.d.ts +2 -0
- package/dist/utils/solanaKeyParser.test.d.ts.map +1 -0
- package/dist/utils/solanaKeyParser.test.js +71 -0
- package/dist/utils/solanaKeyParser.test.js.map +1 -0
- package/dist/utils/tokenUtils.d.ts +38 -0
- package/dist/utils/tokenUtils.d.ts.map +1 -0
- package/dist/utils/tokenUtils.js +65 -0
- package/dist/utils/tokenUtils.js.map +1 -0
- package/dist/utils/transactionUtils.d.ts +22 -0
- package/dist/utils/transactionUtils.d.ts.map +1 -0
- package/dist/utils/transactionUtils.js +26 -0
- package/dist/utils/transactionUtils.js.map +1 -0
- package/package.json +87 -3
- package/src/bridges/LiFiBridge.test.ts +615 -0
- package/src/bridges/LiFiBridge.ts +731 -0
- package/src/config/RebalancerConfig.test.ts +921 -0
- package/src/config/RebalancerConfig.ts +63 -0
- package/src/config/types.ts +613 -0
- package/src/core/InventoryRebalancer.test.ts +1858 -0
- package/src/core/InventoryRebalancer.ts +1455 -0
- package/src/core/Rebalancer.test.ts +686 -0
- package/src/core/Rebalancer.ts +686 -0
- package/src/core/RebalancerOrchestrator.test.ts +871 -0
- package/src/core/RebalancerOrchestrator.ts +273 -0
- package/src/core/RebalancerService.test.ts +1094 -0
- package/src/core/RebalancerService.ts +412 -0
- package/src/e2e/E2E_TEST_CONVENTIONS.md +222 -0
- package/src/e2e/collateral-deficit.e2e-test.ts +403 -0
- package/src/e2e/composite.e2e-test.ts +1008 -0
- package/src/e2e/fixtures/routes.ts +532 -0
- package/src/e2e/harness/BaseLocalDeploymentManager.ts +246 -0
- package/src/e2e/harness/BridgeSetup.ts +95 -0
- package/src/e2e/harness/Erc20InventoryLocalDeploymentManager.ts +183 -0
- package/src/e2e/harness/Erc20LocalDeploymentManager.ts +190 -0
- package/src/e2e/harness/ForkIndexer.test.ts +448 -0
- package/src/e2e/harness/ForkIndexer.ts +183 -0
- package/src/e2e/harness/MixedLocalDeploymentManager.ts +196 -0
- package/src/e2e/harness/MockExplorerClient.ts +94 -0
- package/src/e2e/harness/MockExternalBridge.ts +411 -0
- package/src/e2e/harness/NativeLocalDeploymentManager.ts +138 -0
- package/src/e2e/harness/SnapshotHelper.ts +56 -0
- package/src/e2e/harness/TestHelpers.ts +169 -0
- package/src/e2e/harness/TestRebalancer.ts +758 -0
- package/src/e2e/harness/TransferHelper.ts +188 -0
- package/src/e2e/inventory-erc20-minAmount.e2e-test.ts +735 -0
- package/src/e2e/inventory-erc20-weighted.e2e-test.ts +733 -0
- package/src/e2e/inventory-minAmount.e2e-test.ts +734 -0
- package/src/e2e/inventory-weighted.e2e-test.ts +734 -0
- package/src/e2e/minAmount.e2e-test.ts +313 -0
- package/src/e2e/mixed-weighted.e2e-test.ts +267 -0
- package/src/e2e/weighted.e2e-test.ts +304 -0
- package/src/factories/RebalancerContextFactory.test.ts +394 -0
- package/src/factories/RebalancerContextFactory.ts +771 -0
- package/src/index.ts +125 -0
- package/src/interfaces/IExternalBridge.ts +117 -0
- package/src/interfaces/IMetrics.ts +5 -0
- package/src/interfaces/IMonitor.ts +71 -0
- package/src/interfaces/IRebalancer.ts +57 -0
- package/src/interfaces/IStrategy.ts +81 -0
- package/src/metrics/Metrics.ts +335 -0
- package/src/metrics/PriceGetter.ts +74 -0
- package/src/metrics/scripts/metrics.ts +139 -0
- package/src/monitor/Monitor.ts +324 -0
- package/src/service.ts +285 -0
- package/src/strategy/BaseStrategy.ts +553 -0
- package/src/strategy/CollateralDeficitStrategy.test.ts +728 -0
- package/src/strategy/CollateralDeficitStrategy.ts +421 -0
- package/src/strategy/CompositeStrategy.test.ts +418 -0
- package/src/strategy/CompositeStrategy.ts +102 -0
- package/src/strategy/MinAmountStrategy.test.ts +732 -0
- package/src/strategy/MinAmountStrategy.ts +200 -0
- package/src/strategy/StrategyFactory.test.ts +108 -0
- package/src/strategy/StrategyFactory.ts +157 -0
- package/src/strategy/WeightedStrategy.test.ts +529 -0
- package/src/strategy/WeightedStrategy.ts +126 -0
- package/src/strategy/index.ts +6 -0
- package/src/test/helpers.ts +477 -0
- package/src/test/lifiMocks.ts +211 -0
- package/src/tracking/ActionTracker.test.ts +1625 -0
- package/src/tracking/ActionTracker.ts +1019 -0
- package/src/tracking/IActionTracker.ts +213 -0
- package/src/tracking/InflightContextAdapter.test.ts +206 -0
- package/src/tracking/InflightContextAdapter.ts +75 -0
- package/src/tracking/store/IStore.ts +48 -0
- package/src/tracking/store/InMemoryStore.test.ts +338 -0
- package/src/tracking/store/InMemoryStore.ts +59 -0
- package/src/tracking/store/index.ts +2 -0
- package/src/tracking/types.ts +118 -0
- package/src/utils/ExplorerClient.test.ts +386 -0
- package/src/utils/ExplorerClient.ts +439 -0
- package/src/utils/balanceUtils.test.ts +79 -0
- package/src/utils/balanceUtils.ts +65 -0
- package/src/utils/blockTag.ts +68 -0
- package/src/utils/bridgeUtils.test.ts +193 -0
- package/src/utils/bridgeUtils.ts +101 -0
- package/src/utils/errors.ts +5 -0
- package/src/utils/gasEstimation.ts +306 -0
- package/src/utils/solanaKeyParser.test.ts +103 -0
- package/src/utils/solanaKeyParser.ts +117 -0
- package/src/utils/tokenUtils.ts +89 -0
- package/src/utils/transactionUtils.ts +41 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { assert } from '@humanode-hyperlane/utils';
|
|
2
|
+
import { ERC20Test__factory } from '@humanode-hyperlane/core';
|
|
3
|
+
import { expect } from 'chai';
|
|
4
|
+
import { MonitorEventType } from '../../interfaces/IMonitor.js';
|
|
5
|
+
import { tryRelayMessage } from './TransferHelper.js';
|
|
6
|
+
import { DOMAIN_IDS, TEST_CHAINS, } from '../fixtures/routes.js';
|
|
7
|
+
export async function getFirstMonitorEvent(monitor) {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
let settled = false;
|
|
10
|
+
async function finalize(cb, // eslint-disable-line @typescript-eslint/no-explicit-any -- accepts both resolve and reject
|
|
11
|
+
value, timer) {
|
|
12
|
+
if (settled)
|
|
13
|
+
return;
|
|
14
|
+
settled = true;
|
|
15
|
+
clearTimeout(timer);
|
|
16
|
+
cb(value);
|
|
17
|
+
try {
|
|
18
|
+
await monitor.stop();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// stop errors are non-fatal — the event/error has already been delivered
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const timeout = setTimeout(() => {
|
|
25
|
+
void finalize(reject, new Error('Monitor event timeout'), timeout);
|
|
26
|
+
}, 60_000);
|
|
27
|
+
monitor.on(MonitorEventType.TokenInfo, (event) => {
|
|
28
|
+
void finalize(resolve, event, timeout);
|
|
29
|
+
});
|
|
30
|
+
monitor.on(MonitorEventType.Error, (error) => {
|
|
31
|
+
void finalize(reject, error, timeout);
|
|
32
|
+
});
|
|
33
|
+
void monitor.start();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function chainFromDomain(domain) {
|
|
37
|
+
const found = Object.entries(DOMAIN_IDS).find(([, d]) => d === domain);
|
|
38
|
+
if (!found) {
|
|
39
|
+
throw new Error(`Unknown domain: ${domain}`);
|
|
40
|
+
}
|
|
41
|
+
return found[0];
|
|
42
|
+
}
|
|
43
|
+
export async function getRouterBalances(localProviders, addresses) {
|
|
44
|
+
const balances = {};
|
|
45
|
+
for (const chain of TEST_CHAINS) {
|
|
46
|
+
const provider = localProviders.get(chain);
|
|
47
|
+
assert(provider, `Missing provider for chain ${chain}`);
|
|
48
|
+
balances[chain] = await provider.getBalance(addresses.monitoredRoute[chain]);
|
|
49
|
+
}
|
|
50
|
+
return balances;
|
|
51
|
+
}
|
|
52
|
+
export async function getErc20RouterBalances(localProviders, addresses) {
|
|
53
|
+
const balances = {};
|
|
54
|
+
for (const chain of TEST_CHAINS) {
|
|
55
|
+
const provider = localProviders.get(chain);
|
|
56
|
+
assert(provider, `Missing provider for chain ${chain}`);
|
|
57
|
+
const token = ERC20Test__factory.connect(addresses.tokens[chain], provider);
|
|
58
|
+
balances[chain] = await token.balanceOf(addresses.monitoredRoute[chain]);
|
|
59
|
+
}
|
|
60
|
+
return balances;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Classify chains into deficit, surplus, and neutral based on a deposit action.
|
|
64
|
+
*
|
|
65
|
+
* For inventory deposits the execution direction is swapped: the action's
|
|
66
|
+
* destination is the surplus chain (where the router pays out on delivery).
|
|
67
|
+
*/
|
|
68
|
+
export function classifyChains(deficitChain, depositAction) {
|
|
69
|
+
const surplusChain = chainFromDomain(depositAction.destination);
|
|
70
|
+
const neutralChain = TEST_CHAINS.find((c) => c !== deficitChain && c !== surplusChain);
|
|
71
|
+
return { deficitChain, surplusChain, neutralChain };
|
|
72
|
+
}
|
|
73
|
+
export async function relayInProgressInventoryDeposits(context, localProviders, multiProvider, hyperlaneCore) {
|
|
74
|
+
const inProgressActions = await context.tracker.getInProgressActions();
|
|
75
|
+
const depositActions = inProgressActions.filter((a) => a.type === 'inventory_deposit' && a.txHash && a.messageId);
|
|
76
|
+
for (const action of depositActions) {
|
|
77
|
+
const origin = chainFromDomain(action.origin);
|
|
78
|
+
const destination = chainFromDomain(action.destination);
|
|
79
|
+
const provider = localProviders.get(origin);
|
|
80
|
+
assert(provider, `Missing provider for chain ${origin}`);
|
|
81
|
+
assert(action.txHash, `Missing txHash for action ${action.origin}->${action.destination}`);
|
|
82
|
+
const dispatchTx = await provider.getTransactionReceipt(action.txHash);
|
|
83
|
+
assert(action.messageId, `Missing messageId for action ${action.origin}->${action.destination}`);
|
|
84
|
+
const relayResult = await tryRelayMessage(multiProvider, hyperlaneCore, {
|
|
85
|
+
dispatchTx,
|
|
86
|
+
messageId: action.messageId,
|
|
87
|
+
origin,
|
|
88
|
+
destination,
|
|
89
|
+
});
|
|
90
|
+
expect(relayResult.success, `Inventory deposit relay should succeed: ${relayResult.error}`).to.be.true;
|
|
91
|
+
}
|
|
92
|
+
// Use provider.send to bypass ethers v5 _maxInternalBlockNumber cache
|
|
93
|
+
// which refuses to return lower block numbers after evm_revert.
|
|
94
|
+
const tags = {};
|
|
95
|
+
for (const chain of TEST_CHAINS) {
|
|
96
|
+
const p = localProviders.get(chain);
|
|
97
|
+
assert(p, `Missing provider for chain ${chain}`);
|
|
98
|
+
const hex = await p.send('eth_blockNumber', []);
|
|
99
|
+
tags[chain] = parseInt(hex, 16);
|
|
100
|
+
}
|
|
101
|
+
await context.tracker.syncRebalanceActions(tags);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=TestHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestHelpers.js","sourceRoot":"","sources":["../../../src/e2e/harness/TestHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BigNumber } from 'ethers';
|
|
2
|
+
import { type MultiProvider } from '@humanode-hyperlane/sdk';
|
|
3
|
+
import { RebalancerConfig } from '../../config/RebalancerConfig.js';
|
|
4
|
+
import { type StrategyConfig } from '../../config/types.js';
|
|
5
|
+
import { RebalancerOrchestrator } from '../../core/RebalancerOrchestrator.js';
|
|
6
|
+
import { RebalancerContextFactory } from '../../factories/RebalancerContextFactory.js';
|
|
7
|
+
import type { ConfirmedBlockTags } from '../../interfaces/IMonitor.js';
|
|
8
|
+
import type { IStrategy } from '../../interfaces/IStrategy.js';
|
|
9
|
+
import type { InventoryMonitorConfig, Monitor } from '../../monitor/Monitor.js';
|
|
10
|
+
import type { IActionTracker } from '../../tracking/IActionTracker.js';
|
|
11
|
+
import type { ExplorerMessage } from '../../utils/ExplorerClient.js';
|
|
12
|
+
import { BALANCE_PRESETS, type DeployedAddresses, type Erc20InventoryDeployedAddresses, INVENTORY_SIGNER_PRESETS, type NativeDeployedAddresses, type TestChain } from '../fixtures/routes.js';
|
|
13
|
+
import { BaseLocalDeploymentManager } from './BaseLocalDeploymentManager.js';
|
|
14
|
+
import { ForkIndexer } from './ForkIndexer.js';
|
|
15
|
+
import { MockExplorerClient } from './MockExplorerClient.js';
|
|
16
|
+
import { MockExternalBridge } from './MockExternalBridge.js';
|
|
17
|
+
export interface PendingTransferParams {
|
|
18
|
+
from: TestChain;
|
|
19
|
+
to: TestChain;
|
|
20
|
+
amount: BigNumber;
|
|
21
|
+
warpRecipient?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TestRebalancerContext {
|
|
24
|
+
orchestrator: RebalancerOrchestrator;
|
|
25
|
+
strategy: IStrategy;
|
|
26
|
+
tracker: IActionTracker;
|
|
27
|
+
mockExplorer: MockExplorerClient;
|
|
28
|
+
forkIndexer: ForkIndexer;
|
|
29
|
+
multiProvider: MultiProvider;
|
|
30
|
+
rebalancerConfig: RebalancerConfig;
|
|
31
|
+
contextFactory: RebalancerContextFactory;
|
|
32
|
+
inventoryConfig?: InventoryMonitorConfig;
|
|
33
|
+
createMonitor(checkFrequency: number): Monitor;
|
|
34
|
+
getConfirmedBlockTags(): Promise<ConfirmedBlockTags>;
|
|
35
|
+
}
|
|
36
|
+
type BalancePreset = keyof typeof BALANCE_PRESETS;
|
|
37
|
+
type ExecutionMode = 'propose' | 'execute';
|
|
38
|
+
type InventorySignerPreset = keyof typeof INVENTORY_SIGNER_PRESETS;
|
|
39
|
+
type InventorySignerBalanceConfig = InventorySignerPreset | Partial<Record<string, BigNumber>>;
|
|
40
|
+
type TestErc20InventoryConfig = {
|
|
41
|
+
inventorySignerKey: string;
|
|
42
|
+
erc20DeployedAddresses: Erc20InventoryDeployedAddresses;
|
|
43
|
+
};
|
|
44
|
+
export declare class TestRebalancerBuilder {
|
|
45
|
+
private readonly deploymentManager;
|
|
46
|
+
private readonly multiProvider;
|
|
47
|
+
private strategyConfig;
|
|
48
|
+
private balanceConfig;
|
|
49
|
+
private pendingTransfers;
|
|
50
|
+
private mockTransfers;
|
|
51
|
+
private executionMode;
|
|
52
|
+
private inventoryConfig;
|
|
53
|
+
private erc20InventoryConfig;
|
|
54
|
+
private mockExternalBridge;
|
|
55
|
+
private readonly logger;
|
|
56
|
+
private inventorySignerBalanceConfig;
|
|
57
|
+
constructor(deploymentManager: BaseLocalDeploymentManager<DeployedAddresses | NativeDeployedAddresses>, multiProvider: MultiProvider);
|
|
58
|
+
withStrategy(config: StrategyConfig[]): this;
|
|
59
|
+
withBalances(preset: BalancePreset | Record<string, BigNumber>): this;
|
|
60
|
+
withPendingTransfer(params: PendingTransferParams): this;
|
|
61
|
+
withMockTransfer(message: ExplorerMessage): this;
|
|
62
|
+
withExecutionMode(mode: ExecutionMode): this;
|
|
63
|
+
withInventoryConfig(config: {
|
|
64
|
+
inventorySignerKey: string;
|
|
65
|
+
nativeDeployedAddresses: NativeDeployedAddresses;
|
|
66
|
+
}): this;
|
|
67
|
+
withErc20InventoryConfig(config: TestErc20InventoryConfig): this;
|
|
68
|
+
withMockExternalBridge(bridge: MockExternalBridge): this;
|
|
69
|
+
withInventorySignerBalances(config: InventorySignerBalanceConfig): this;
|
|
70
|
+
private computeConfirmedBlockTags;
|
|
71
|
+
build(): Promise<TestRebalancerContext>;
|
|
72
|
+
private getBalanceChains;
|
|
73
|
+
private getBalances;
|
|
74
|
+
private setupBalances;
|
|
75
|
+
private getInventorySignerAddress;
|
|
76
|
+
private setupInventorySignerBalances;
|
|
77
|
+
private buildMockExplorerConfig;
|
|
78
|
+
private getMonitoredRouteAddresses;
|
|
79
|
+
private getWorkingMultiProvider;
|
|
80
|
+
}
|
|
81
|
+
export declare class TestRebalancer {
|
|
82
|
+
static builder(deploymentManager: BaseLocalDeploymentManager<DeployedAddresses | NativeDeployedAddresses>, multiProvider: MultiProvider): TestRebalancerBuilder;
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=TestRebalancer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestRebalancer.d.ts","sourceRoot":"","sources":["../../../src/e2e/harness/TestRebalancer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { BigNumber, ethers } from 'ethers';
|
|
2
|
+
import { pino } from 'pino';
|
|
3
|
+
import { ERC20Test__factory } from '@humanode-hyperlane/core';
|
|
4
|
+
import { HyperlaneCore, MultiProtocolProvider, } from '@humanode-hyperlane/sdk';
|
|
5
|
+
import { ProtocolType, addressToBytes32, assert, } from '@humanode-hyperlane/utils';
|
|
6
|
+
import { RebalancerConfig } from '../../config/RebalancerConfig.js';
|
|
7
|
+
import { DEFAULT_INTENT_TTL_MS, ExternalBridgeType, getStrategyChainNames, } from '../../config/types.js';
|
|
8
|
+
import { RebalancerOrchestrator, } from '../../core/RebalancerOrchestrator.js';
|
|
9
|
+
import { RebalancerContextFactory } from '../../factories/RebalancerContextFactory.js';
|
|
10
|
+
import { ANVIL_TEST_PRIVATE_KEY, BALANCE_PRESETS, DOMAIN_IDS, ERC20_INVENTORY_MONITORED_ROUTE_ID, INVENTORY_SIGNER_PRESETS, MONITORED_ROUTE_ID, NATIVE_MONITORED_ROUTE_ID, TEST_CHAINS, buildErc20InventoryWarpRouteConfig, buildNativeWarpRouteConfig, buildWarpRouteConfig, } from '../fixtures/routes.js';
|
|
11
|
+
import { setupCollateralBalances } from './BridgeSetup.js';
|
|
12
|
+
import { ForkIndexer } from './ForkIndexer.js';
|
|
13
|
+
import { MockExplorerClient, } from './MockExplorerClient.js';
|
|
14
|
+
function encodeWarpRouteMessageBody(recipient, amount) {
|
|
15
|
+
const recipientBytes32 = addressToBytes32(recipient);
|
|
16
|
+
const amountHex = ethers.utils.hexZeroPad(amount.toHexString(), 32);
|
|
17
|
+
return recipientBytes32 + amountHex.slice(2);
|
|
18
|
+
}
|
|
19
|
+
export class TestRebalancerBuilder {
|
|
20
|
+
deploymentManager;
|
|
21
|
+
multiProvider;
|
|
22
|
+
strategyConfig;
|
|
23
|
+
balanceConfig = 'BALANCED';
|
|
24
|
+
pendingTransfers = [];
|
|
25
|
+
mockTransfers = [];
|
|
26
|
+
executionMode = 'propose';
|
|
27
|
+
inventoryConfig;
|
|
28
|
+
erc20InventoryConfig;
|
|
29
|
+
mockExternalBridge;
|
|
30
|
+
logger;
|
|
31
|
+
inventorySignerBalanceConfig;
|
|
32
|
+
constructor(deploymentManager, multiProvider) {
|
|
33
|
+
this.deploymentManager = deploymentManager;
|
|
34
|
+
this.multiProvider = multiProvider;
|
|
35
|
+
this.logger = pino({ level: 'debug' }).child({ module: 'TestRebalancer' });
|
|
36
|
+
}
|
|
37
|
+
withStrategy(config) {
|
|
38
|
+
this.strategyConfig = config;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
withBalances(preset) {
|
|
42
|
+
this.balanceConfig = preset;
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
withPendingTransfer(params) {
|
|
46
|
+
this.pendingTransfers.push(params);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
withMockTransfer(message) {
|
|
50
|
+
this.mockTransfers.push(message);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
withExecutionMode(mode) {
|
|
54
|
+
this.executionMode = mode;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
withInventoryConfig(config) {
|
|
58
|
+
this.inventoryConfig = config;
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
withErc20InventoryConfig(config) {
|
|
62
|
+
this.erc20InventoryConfig = config;
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
withMockExternalBridge(bridge) {
|
|
66
|
+
this.mockExternalBridge = bridge;
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
withInventorySignerBalances(config) {
|
|
70
|
+
this.inventorySignerBalanceConfig = config;
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
async computeConfirmedBlockTags() {
|
|
74
|
+
const blockTags = {};
|
|
75
|
+
const localProviders = this.deploymentManager.getContext().providers;
|
|
76
|
+
for (const [chain, provider] of localProviders) {
|
|
77
|
+
try {
|
|
78
|
+
const blockNumber = await provider.send('eth_blockNumber', []);
|
|
79
|
+
blockTags[chain] = parseInt(blockNumber, 16);
|
|
80
|
+
this.logger.debug({ chain, blockNumber: blockTags[chain] }, 'Computed confirmed block tag');
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.logger.warn({
|
|
84
|
+
chain,
|
|
85
|
+
error: error instanceof Error ? error.message : String(error),
|
|
86
|
+
}, 'Failed to get block number, using undefined');
|
|
87
|
+
blockTags[chain] = undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return blockTags;
|
|
91
|
+
}
|
|
92
|
+
async build() {
|
|
93
|
+
if (!this.strategyConfig || this.strategyConfig.length === 0) {
|
|
94
|
+
throw new Error('Strategy config is required. Call withStrategy() before build().');
|
|
95
|
+
}
|
|
96
|
+
const strategyChains = getStrategyChainNames(this.strategyConfig);
|
|
97
|
+
const balanceChains = this.getBalanceChains();
|
|
98
|
+
const missingChains = strategyChains.filter((chain) => !balanceChains.includes(chain));
|
|
99
|
+
if (missingChains.length > 0) {
|
|
100
|
+
throw new Error(`Balance config missing chains required by strategy: ${missingChains.join(', ')}. ` +
|
|
101
|
+
`Strategy chains: ${strategyChains.join(', ')}, Balance chains: ${balanceChains.join(', ')}`);
|
|
102
|
+
}
|
|
103
|
+
assert(!(this.inventoryConfig && this.erc20InventoryConfig), 'Cannot set both inventoryConfig and erc20InventoryConfig — use one or the other');
|
|
104
|
+
if (this.inventoryConfig && !this.mockExternalBridge) {
|
|
105
|
+
throw new Error('Inventory mode requires .withMockExternalBridge() to prevent hitting real external bridges in tests');
|
|
106
|
+
}
|
|
107
|
+
await this.setupBalances();
|
|
108
|
+
const inventoryModeConfig = this.inventoryConfig;
|
|
109
|
+
const erc20InventoryModeConfig = this.erc20InventoryConfig;
|
|
110
|
+
const isInventoryMode = inventoryModeConfig !== undefined;
|
|
111
|
+
const isErc20InventoryMode = erc20InventoryModeConfig !== undefined;
|
|
112
|
+
const ctx = this.deploymentManager.getContext();
|
|
113
|
+
const { providers: localProviders } = ctx;
|
|
114
|
+
const deployedAddresses = ctx.deployedAddresses;
|
|
115
|
+
if (!isInventoryMode && !('tokens' in deployedAddresses)) {
|
|
116
|
+
throw new Error('Expected ERC20 deployed addresses with tokens field');
|
|
117
|
+
}
|
|
118
|
+
const coreAddresses = {};
|
|
119
|
+
for (const chain of TEST_CHAINS) {
|
|
120
|
+
const chainAddresses = isErc20InventoryMode
|
|
121
|
+
? erc20InventoryModeConfig.erc20DeployedAddresses.chains[chain]
|
|
122
|
+
: isInventoryMode
|
|
123
|
+
? inventoryModeConfig.nativeDeployedAddresses.chains[chain]
|
|
124
|
+
: deployedAddresses.chains[chain];
|
|
125
|
+
if (!chainAddresses) {
|
|
126
|
+
throw new Error(`Missing chain addresses for ${chain}`);
|
|
127
|
+
}
|
|
128
|
+
coreAddresses[chain] = {
|
|
129
|
+
mailbox: chainAddresses.mailbox,
|
|
130
|
+
interchainSecurityModule: chainAddresses.ism,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const hyperlaneCore = HyperlaneCore.fromAddressesMap(coreAddresses, this.multiProvider);
|
|
134
|
+
const deployerWallet = new ethers.Wallet(ANVIL_TEST_PRIVATE_KEY);
|
|
135
|
+
const rebalancerAddresses = [deployerWallet.address];
|
|
136
|
+
const workingMultiProvider = await this.getWorkingMultiProvider();
|
|
137
|
+
const forkIndexer = new ForkIndexer(localProviders, hyperlaneCore, rebalancerAddresses, this.logger);
|
|
138
|
+
const confirmedBlockTags = await this.computeConfirmedBlockTags();
|
|
139
|
+
await forkIndexer.initialize(confirmedBlockTags);
|
|
140
|
+
const mockExplorer = new MockExplorerClient(this.buildMockExplorerConfig(), forkIndexer, () => this.computeConfirmedBlockTags());
|
|
141
|
+
const registry = this.deploymentManager.getRegistry();
|
|
142
|
+
const mpp = MultiProtocolProvider.fromMultiProvider(workingMultiProvider);
|
|
143
|
+
let rebalancerConfig;
|
|
144
|
+
let warpCoreConfig;
|
|
145
|
+
if (isErc20InventoryMode) {
|
|
146
|
+
const inventorySignerAddress = new ethers.Wallet(erc20InventoryModeConfig.inventorySignerKey).address;
|
|
147
|
+
rebalancerAddresses.push(inventorySignerAddress);
|
|
148
|
+
rebalancerConfig = new RebalancerConfig(ERC20_INVENTORY_MONITORED_ROUTE_ID, this.strategyConfig, DEFAULT_INTENT_TTL_MS, {
|
|
149
|
+
[ProtocolType.Ethereum]: {
|
|
150
|
+
address: inventorySignerAddress,
|
|
151
|
+
key: erc20InventoryModeConfig.inventorySignerKey,
|
|
152
|
+
},
|
|
153
|
+
}, { lifi: { integrator: 'test' } });
|
|
154
|
+
warpCoreConfig = buildErc20InventoryWarpRouteConfig(erc20InventoryModeConfig.erc20DeployedAddresses);
|
|
155
|
+
}
|
|
156
|
+
else if (isInventoryMode) {
|
|
157
|
+
const inventorySignerAddress = new ethers.Wallet(inventoryModeConfig.inventorySignerKey).address;
|
|
158
|
+
rebalancerAddresses.push(inventorySignerAddress);
|
|
159
|
+
rebalancerConfig = new RebalancerConfig(NATIVE_MONITORED_ROUTE_ID, this.strategyConfig, DEFAULT_INTENT_TTL_MS, {
|
|
160
|
+
[ProtocolType.Ethereum]: {
|
|
161
|
+
address: inventorySignerAddress,
|
|
162
|
+
key: inventoryModeConfig.inventorySignerKey,
|
|
163
|
+
},
|
|
164
|
+
}, { lifi: { integrator: 'test' } });
|
|
165
|
+
warpCoreConfig = buildNativeWarpRouteConfig(inventoryModeConfig.nativeDeployedAddresses);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
if (!('tokens' in deployedAddresses)) {
|
|
169
|
+
throw new Error('Expected ERC20 deployed addresses with tokens field');
|
|
170
|
+
}
|
|
171
|
+
rebalancerConfig = new RebalancerConfig(MONITORED_ROUTE_ID, this.strategyConfig, DEFAULT_INTENT_TTL_MS);
|
|
172
|
+
warpCoreConfig = buildWarpRouteConfig(deployedAddresses);
|
|
173
|
+
}
|
|
174
|
+
const contextFactory = await RebalancerContextFactory.create(rebalancerConfig, workingMultiProvider, mpp, registry, this.logger, undefined, warpCoreConfig);
|
|
175
|
+
const strategy = await contextFactory.createStrategy();
|
|
176
|
+
const { tracker, adapter } = await contextFactory.createActionTracker(mockExplorer);
|
|
177
|
+
await tracker.initialize();
|
|
178
|
+
this.logger.info('ActionTracker initialized with mock explorer');
|
|
179
|
+
const isAnyInventoryMode = isInventoryMode || isErc20InventoryMode;
|
|
180
|
+
const externalBridgeRegistryOverride = isAnyInventoryMode && this.mockExternalBridge
|
|
181
|
+
? {
|
|
182
|
+
[ExternalBridgeType.LiFi]: this.mockExternalBridge,
|
|
183
|
+
}
|
|
184
|
+
: undefined;
|
|
185
|
+
const rebalancerComponents = this.executionMode === 'execute' || isAnyInventoryMode
|
|
186
|
+
? await contextFactory.createRebalancers(tracker, undefined, externalBridgeRegistryOverride)
|
|
187
|
+
: undefined;
|
|
188
|
+
const rebalancers = this.executionMode === 'execute'
|
|
189
|
+
? (rebalancerComponents?.rebalancers ?? [])
|
|
190
|
+
: [];
|
|
191
|
+
const inventoryConfig = rebalancerComponents?.inventoryConfig;
|
|
192
|
+
const externalBridgeRegistry = rebalancerComponents?.externalBridgeRegistry;
|
|
193
|
+
const orchestratorDeps = {
|
|
194
|
+
strategy,
|
|
195
|
+
rebalancers,
|
|
196
|
+
actionTracker: tracker,
|
|
197
|
+
inflightContextAdapter: adapter,
|
|
198
|
+
rebalancerConfig,
|
|
199
|
+
externalBridgeRegistry,
|
|
200
|
+
logger: this.logger,
|
|
201
|
+
};
|
|
202
|
+
const orchestrator = new RebalancerOrchestrator(orchestratorDeps);
|
|
203
|
+
return {
|
|
204
|
+
orchestrator,
|
|
205
|
+
strategy,
|
|
206
|
+
tracker,
|
|
207
|
+
mockExplorer,
|
|
208
|
+
forkIndexer,
|
|
209
|
+
multiProvider: workingMultiProvider,
|
|
210
|
+
rebalancerConfig,
|
|
211
|
+
contextFactory,
|
|
212
|
+
inventoryConfig,
|
|
213
|
+
createMonitor: (checkFrequency) => contextFactory.createMonitor(checkFrequency, inventoryConfig),
|
|
214
|
+
getConfirmedBlockTags: () => this.computeConfirmedBlockTags(),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
getBalanceChains() {
|
|
218
|
+
if (typeof this.balanceConfig === 'string') {
|
|
219
|
+
return Object.keys(BALANCE_PRESETS[this.balanceConfig]);
|
|
220
|
+
}
|
|
221
|
+
return Object.keys(this.balanceConfig);
|
|
222
|
+
}
|
|
223
|
+
getBalances() {
|
|
224
|
+
if (typeof this.balanceConfig === 'string') {
|
|
225
|
+
const preset = BALANCE_PRESETS[this.balanceConfig];
|
|
226
|
+
return Object.fromEntries(Object.entries(preset).map(([chain, value]) => [
|
|
227
|
+
chain,
|
|
228
|
+
BigNumber.from(value),
|
|
229
|
+
]));
|
|
230
|
+
}
|
|
231
|
+
return this.balanceConfig;
|
|
232
|
+
}
|
|
233
|
+
async setupBalances() {
|
|
234
|
+
const balances = this.getBalances();
|
|
235
|
+
const ctx = this.deploymentManager.getContext();
|
|
236
|
+
const { providers: localProviders } = ctx;
|
|
237
|
+
if (this.inventoryConfig) {
|
|
238
|
+
for (const [chain, balance] of Object.entries(balances)) {
|
|
239
|
+
const provider = localProviders.get(chain);
|
|
240
|
+
const monitoredRouteAddress = this.inventoryConfig.nativeDeployedAddresses.monitoredRoute[chain];
|
|
241
|
+
if (!provider) {
|
|
242
|
+
throw new Error(`Missing local provider for inventory chain ${chain}`);
|
|
243
|
+
}
|
|
244
|
+
if (!monitoredRouteAddress) {
|
|
245
|
+
throw new Error(`Missing monitored route address for inventory chain ${chain}`);
|
|
246
|
+
}
|
|
247
|
+
await provider.send('anvil_setBalance', [
|
|
248
|
+
monitoredRouteAddress,
|
|
249
|
+
ethers.utils.hexValue(balance),
|
|
250
|
+
]);
|
|
251
|
+
}
|
|
252
|
+
this.logger.info({
|
|
253
|
+
balances: Object.fromEntries(Object.entries(balances).map(([chain, balance]) => [
|
|
254
|
+
chain,
|
|
255
|
+
balance.toString(),
|
|
256
|
+
])),
|
|
257
|
+
}, 'Inventory balances configured on monitored routes');
|
|
258
|
+
await this.setupInventorySignerBalances(localProviders);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (this.erc20InventoryConfig) {
|
|
262
|
+
for (const [chain, balance] of Object.entries(balances)) {
|
|
263
|
+
const provider = localProviders.get(chain);
|
|
264
|
+
const tokenAddress = this.erc20InventoryConfig.erc20DeployedAddresses.tokens[chain];
|
|
265
|
+
const monitoredRouteAddress = this.erc20InventoryConfig.erc20DeployedAddresses.monitoredRoute[chain];
|
|
266
|
+
assert(provider, `setupBalances: missing provider for chain ${chain}`);
|
|
267
|
+
assert(tokenAddress, `setupBalances: missing token address for chain ${chain}`);
|
|
268
|
+
assert(monitoredRouteAddress, `setupBalances: missing monitored route address for chain ${chain}`);
|
|
269
|
+
const deployerSigner = new ethers.Wallet(ANVIL_TEST_PRIVATE_KEY, provider);
|
|
270
|
+
const token = ERC20Test__factory.connect(tokenAddress, deployerSigner);
|
|
271
|
+
const tx = await token.transfer(monitoredRouteAddress, balance);
|
|
272
|
+
await tx.wait();
|
|
273
|
+
}
|
|
274
|
+
this.logger.info({
|
|
275
|
+
balances: Object.fromEntries(Object.entries(balances).map(([chain, balance]) => [
|
|
276
|
+
chain,
|
|
277
|
+
balance.toString(),
|
|
278
|
+
])),
|
|
279
|
+
}, 'ERC20 inventory balances configured on monitored routes');
|
|
280
|
+
await this.setupInventorySignerBalances(localProviders);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const deployedAddresses = ctx.deployedAddresses;
|
|
284
|
+
if (!('tokens' in deployedAddresses)) {
|
|
285
|
+
throw new Error('Expected ERC20 deployed addresses with tokens field');
|
|
286
|
+
}
|
|
287
|
+
await setupCollateralBalances(localProviders, balances, deployedAddresses.monitoredRoute, deployedAddresses.tokens, ANVIL_TEST_PRIVATE_KEY);
|
|
288
|
+
this.logger.info({
|
|
289
|
+
balances: Object.fromEntries(Object.entries(balances).map(([chain, balance]) => [
|
|
290
|
+
chain,
|
|
291
|
+
balance.toString(),
|
|
292
|
+
])),
|
|
293
|
+
}, 'Collateral balances configured');
|
|
294
|
+
}
|
|
295
|
+
getInventorySignerAddress() {
|
|
296
|
+
const config = this.inventoryConfig ?? this.erc20InventoryConfig;
|
|
297
|
+
assert(config, 'Expected inventoryConfig or erc20InventoryConfig');
|
|
298
|
+
return new ethers.Wallet(config.inventorySignerKey).address;
|
|
299
|
+
}
|
|
300
|
+
async setupInventorySignerBalances(localProviders) {
|
|
301
|
+
if (!this.inventorySignerBalanceConfig ||
|
|
302
|
+
(!this.inventoryConfig && !this.erc20InventoryConfig)) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const signerAddress = this.getInventorySignerAddress();
|
|
306
|
+
let balances;
|
|
307
|
+
if (typeof this.inventorySignerBalanceConfig === 'string') {
|
|
308
|
+
balances = INVENTORY_SIGNER_PRESETS[this.inventorySignerBalanceConfig];
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
balances = Object.fromEntries(Object.entries(this.inventorySignerBalanceConfig)
|
|
312
|
+
.filter((entry) => entry[1] !== undefined)
|
|
313
|
+
.map(([chain, val]) => [chain, val.toString()]));
|
|
314
|
+
}
|
|
315
|
+
if (this.erc20InventoryConfig) {
|
|
316
|
+
const signerWallet = new ethers.Wallet(this.erc20InventoryConfig.inventorySignerKey);
|
|
317
|
+
const deployerKey = ANVIL_TEST_PRIVATE_KEY;
|
|
318
|
+
const tokens = this.erc20InventoryConfig.erc20DeployedAddresses.tokens;
|
|
319
|
+
for (const [chain, balance] of Object.entries(balances)) {
|
|
320
|
+
const provider = localProviders.get(chain);
|
|
321
|
+
assert(balance !== undefined, `setupInventorySignerBalances: missing balance for chain ${chain}`);
|
|
322
|
+
assert(provider, `setupInventorySignerBalances: missing provider for chain ${chain}`);
|
|
323
|
+
const tokenAddress = tokens[chain];
|
|
324
|
+
assert(tokenAddress, `setupInventorySignerBalances: missing token address for chain ${chain}`);
|
|
325
|
+
const connectedSigner = signerWallet.connect(provider);
|
|
326
|
+
const deployerSigner = new ethers.Wallet(deployerKey, provider);
|
|
327
|
+
const tokenAsSigner = ERC20Test__factory.connect(tokenAddress, connectedSigner);
|
|
328
|
+
const tokenAsDeployer = ERC20Test__factory.connect(tokenAddress, deployerSigner);
|
|
329
|
+
const current = await tokenAsSigner.balanceOf(signerAddress);
|
|
330
|
+
if (current.gt(0)) {
|
|
331
|
+
const tx1 = await tokenAsSigner.transfer(deployerSigner.address, current);
|
|
332
|
+
await tx1.wait();
|
|
333
|
+
}
|
|
334
|
+
if (BigNumber.from(balance).gt(0)) {
|
|
335
|
+
const tx2 = await tokenAsDeployer.transfer(signerAddress, BigNumber.from(balance));
|
|
336
|
+
await tx2.wait();
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
this.logger.info({ balances, signer: signerWallet.address }, 'ERC20 inventory signer balances configured');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
for (const [chain, balance] of Object.entries(balances)) {
|
|
343
|
+
const provider = localProviders.get(chain);
|
|
344
|
+
if (balance === undefined) {
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
if (!provider) {
|
|
348
|
+
throw new Error(`Missing local provider for inventory signer chain ${chain}`);
|
|
349
|
+
}
|
|
350
|
+
await provider.send('anvil_setBalance', [
|
|
351
|
+
signerAddress,
|
|
352
|
+
ethers.utils.hexValue(BigNumber.from(balance)),
|
|
353
|
+
]);
|
|
354
|
+
}
|
|
355
|
+
this.logger.info({ balances, signer: signerAddress }, 'Inventory signer balances configured');
|
|
356
|
+
}
|
|
357
|
+
buildMockExplorerConfig() {
|
|
358
|
+
const monitoredRoute = this.getMonitoredRouteAddresses();
|
|
359
|
+
const userTransfers = [...this.mockTransfers];
|
|
360
|
+
for (let i = 0; i < this.pendingTransfers.length; i++) {
|
|
361
|
+
const params = this.pendingTransfers[i];
|
|
362
|
+
const warpRecipient = params.warpRecipient ?? monitoredRoute[params.to];
|
|
363
|
+
const mockTransfer = {
|
|
364
|
+
msg_id: `0x${(1000 + i).toString(16).padStart(64, '0')}`,
|
|
365
|
+
origin_domain_id: DOMAIN_IDS[params.from],
|
|
366
|
+
destination_domain_id: DOMAIN_IDS[params.to],
|
|
367
|
+
sender: monitoredRoute[params.from],
|
|
368
|
+
recipient: monitoredRoute[params.to],
|
|
369
|
+
origin_tx_hash: `0x${(2000 + i).toString(16).padStart(64, '0')}`,
|
|
370
|
+
origin_tx_sender: `0x${(3000 + i).toString(16).padStart(40, '0')}`,
|
|
371
|
+
origin_tx_recipient: monitoredRoute[params.from],
|
|
372
|
+
is_delivered: false,
|
|
373
|
+
message_body: encodeWarpRouteMessageBody(warpRecipient, params.amount),
|
|
374
|
+
send_occurred_at: null,
|
|
375
|
+
};
|
|
376
|
+
userTransfers.push(mockTransfer);
|
|
377
|
+
this.logger.debug({
|
|
378
|
+
transfer: {
|
|
379
|
+
from: params.from,
|
|
380
|
+
to: params.to,
|
|
381
|
+
origin: mockTransfer.origin_domain_id,
|
|
382
|
+
destination: mockTransfer.destination_domain_id,
|
|
383
|
+
amount: params.amount.toString(),
|
|
384
|
+
},
|
|
385
|
+
}, 'Created mock pending transfer');
|
|
386
|
+
}
|
|
387
|
+
return {
|
|
388
|
+
userTransfers,
|
|
389
|
+
rebalanceActions: [],
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
getMonitoredRouteAddresses() {
|
|
393
|
+
if (this.erc20InventoryConfig) {
|
|
394
|
+
return this.erc20InventoryConfig.erc20DeployedAddresses.monitoredRoute;
|
|
395
|
+
}
|
|
396
|
+
if (this.inventoryConfig) {
|
|
397
|
+
return this.inventoryConfig.nativeDeployedAddresses.monitoredRoute;
|
|
398
|
+
}
|
|
399
|
+
const deployedAddresses = this.deploymentManager.getContext().deployedAddresses;
|
|
400
|
+
if (!('tokens' in deployedAddresses)) {
|
|
401
|
+
throw new Error('Expected ERC20 deployed addresses with tokens field');
|
|
402
|
+
}
|
|
403
|
+
return deployedAddresses.monitoredRoute;
|
|
404
|
+
}
|
|
405
|
+
async getWorkingMultiProvider() {
|
|
406
|
+
if (this.executionMode === 'propose') {
|
|
407
|
+
return this.multiProvider;
|
|
408
|
+
}
|
|
409
|
+
const ctx = this.deploymentManager.getContext();
|
|
410
|
+
const rebalancerMultiProvider = this.multiProvider.extendChainMetadata({});
|
|
411
|
+
const wallet = new ethers.Wallet(ANVIL_TEST_PRIVATE_KEY);
|
|
412
|
+
for (const chain of TEST_CHAINS) {
|
|
413
|
+
const provider = ctx.providers.get(chain);
|
|
414
|
+
if (provider) {
|
|
415
|
+
rebalancerMultiProvider.setSigner(chain, wallet.connect(provider));
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
this.logger.info('Created MultiProvider with deployer as rebalancer for execute mode');
|
|
419
|
+
return rebalancerMultiProvider;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
export class TestRebalancer {
|
|
423
|
+
static builder(deploymentManager, multiProvider) {
|
|
424
|
+
return new TestRebalancerBuilder(deploymentManager, multiProvider);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=TestRebalancer.js.map
|