@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,203 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { BigNumber } from 'ethers';
|
|
3
|
+
import { HyperlaneCore, snapshot, } from '@humanode-hyperlane/sdk';
|
|
4
|
+
import { RebalancerMinAmountType, RebalancerStrategyOptions, } from '../config/types.js';
|
|
5
|
+
import { DOMAIN_IDS, TEST_CHAINS, } from './fixtures/routes.js';
|
|
6
|
+
import { getAllCollateralBalances } from './harness/BridgeSetup.js';
|
|
7
|
+
import { Erc20LocalDeploymentManager } from './harness/Erc20LocalDeploymentManager.js';
|
|
8
|
+
import { resetSnapshotsAndRefreshProviders } from './harness/SnapshotHelper.js';
|
|
9
|
+
import { getFirstMonitorEvent } from './harness/TestHelpers.js';
|
|
10
|
+
import { TestRebalancer } from './harness/TestRebalancer.js';
|
|
11
|
+
import { tryRelayMessage } from './harness/TransferHelper.js';
|
|
12
|
+
describe('MinAmountStrategy E2E', function () {
|
|
13
|
+
this.timeout(300_000);
|
|
14
|
+
let deploymentManager;
|
|
15
|
+
let multiProvider;
|
|
16
|
+
let localProviders;
|
|
17
|
+
let snapshotIds;
|
|
18
|
+
let hyperlaneCore;
|
|
19
|
+
let deployedAddresses;
|
|
20
|
+
let minAmountStrategyConfig;
|
|
21
|
+
before(async function () {
|
|
22
|
+
deploymentManager = new Erc20LocalDeploymentManager();
|
|
23
|
+
const ctx = await deploymentManager.start();
|
|
24
|
+
multiProvider = ctx.multiProvider;
|
|
25
|
+
localProviders = ctx.providers;
|
|
26
|
+
deployedAddresses = ctx.deployedAddresses;
|
|
27
|
+
const coreAddresses = {};
|
|
28
|
+
for (const chain of TEST_CHAINS) {
|
|
29
|
+
coreAddresses[chain] = {
|
|
30
|
+
mailbox: deployedAddresses.chains[chain].mailbox,
|
|
31
|
+
interchainSecurityModule: deployedAddresses.chains[chain].ism,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
hyperlaneCore = HyperlaneCore.fromAddressesMap(coreAddresses, multiProvider);
|
|
35
|
+
minAmountStrategyConfig = [
|
|
36
|
+
{
|
|
37
|
+
rebalanceStrategy: RebalancerStrategyOptions.MinAmount,
|
|
38
|
+
chains: {
|
|
39
|
+
anvil1: {
|
|
40
|
+
minAmount: {
|
|
41
|
+
min: '100',
|
|
42
|
+
target: '120',
|
|
43
|
+
type: RebalancerMinAmountType.Absolute,
|
|
44
|
+
},
|
|
45
|
+
bridge: deployedAddresses.bridgeRoute1.anvil1,
|
|
46
|
+
},
|
|
47
|
+
anvil2: {
|
|
48
|
+
minAmount: {
|
|
49
|
+
min: '100',
|
|
50
|
+
target: '120',
|
|
51
|
+
type: RebalancerMinAmountType.Absolute,
|
|
52
|
+
},
|
|
53
|
+
bridge: deployedAddresses.bridgeRoute1.anvil2,
|
|
54
|
+
},
|
|
55
|
+
anvil3: {
|
|
56
|
+
minAmount: {
|
|
57
|
+
min: '100',
|
|
58
|
+
target: '120',
|
|
59
|
+
type: RebalancerMinAmountType.Absolute,
|
|
60
|
+
},
|
|
61
|
+
bridge: deployedAddresses.bridgeRoute1.anvil3,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
snapshotIds = new Map();
|
|
67
|
+
for (const [chain, provider] of localProviders) {
|
|
68
|
+
snapshotIds.set(chain, await snapshot(provider));
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
afterEach(async function () {
|
|
72
|
+
await resetSnapshotsAndRefreshProviders({
|
|
73
|
+
localProviders,
|
|
74
|
+
multiProvider,
|
|
75
|
+
snapshotIds,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
after(async function () {
|
|
79
|
+
if (deploymentManager) {
|
|
80
|
+
await deploymentManager.stop();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
it('should propose rebalance routes when chain is below minimum', async function () {
|
|
84
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
85
|
+
.withStrategy(minAmountStrategyConfig)
|
|
86
|
+
.withBalances('BELOW_MIN_ARB')
|
|
87
|
+
.withExecutionMode('execute')
|
|
88
|
+
.build();
|
|
89
|
+
const monitor = context.createMonitor(0);
|
|
90
|
+
const event = await getFirstMonitorEvent(monitor);
|
|
91
|
+
await context.orchestrator.executeCycle(event);
|
|
92
|
+
// Assert: ethereum→arbitrum, amount=70 USDC to reach 120 target from 50
|
|
93
|
+
const activeIntents = await context.tracker.getActiveRebalanceIntents();
|
|
94
|
+
expect(activeIntents.length).to.equal(1);
|
|
95
|
+
expect(activeIntents[0].origin).to.equal(DOMAIN_IDS.anvil1);
|
|
96
|
+
expect(activeIntents[0].destination).to.equal(DOMAIN_IDS.anvil2);
|
|
97
|
+
expect(activeIntents[0].amount).to.equal(70000000n);
|
|
98
|
+
});
|
|
99
|
+
it('should not propose routes when all chains at or above minimum', async function () {
|
|
100
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
101
|
+
.withStrategy(minAmountStrategyConfig)
|
|
102
|
+
.withBalances('BALANCED')
|
|
103
|
+
.withExecutionMode('execute')
|
|
104
|
+
.build();
|
|
105
|
+
const monitor = context.createMonitor(0);
|
|
106
|
+
const event = await getFirstMonitorEvent(monitor);
|
|
107
|
+
await context.orchestrator.executeCycle(event);
|
|
108
|
+
// Assert: No routes - all chains have 5000 USDC, well above 100 min
|
|
109
|
+
const activeIntents = await context.tracker.getActiveRebalanceIntents();
|
|
110
|
+
expect(activeIntents.length).to.equal(0);
|
|
111
|
+
});
|
|
112
|
+
it('should execute full rebalance cycle with actual transfers', async function () {
|
|
113
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
114
|
+
.withStrategy(minAmountStrategyConfig)
|
|
115
|
+
.withBalances('BELOW_MIN_ARB')
|
|
116
|
+
.withExecutionMode('execute')
|
|
117
|
+
.build();
|
|
118
|
+
const initialCollateralBalances = await getAllCollateralBalances(localProviders, TEST_CHAINS, deployedAddresses.monitoredRoute, deployedAddresses.tokens);
|
|
119
|
+
const monitor = context.createMonitor(0);
|
|
120
|
+
const event = await getFirstMonitorEvent(monitor);
|
|
121
|
+
await context.orchestrator.executeCycle(event);
|
|
122
|
+
// Assert: Rebalance intent was created with correct fields
|
|
123
|
+
const activeIntents = await context.tracker.getActiveRebalanceIntents();
|
|
124
|
+
expect(activeIntents.length).to.equal(1);
|
|
125
|
+
expect(activeIntents[0].destination).to.equal(DOMAIN_IDS.anvil2);
|
|
126
|
+
expect(activeIntents[0].amount).to.equal(70000000n);
|
|
127
|
+
// Assert: Rebalance action was created
|
|
128
|
+
const inProgressActions = await context.tracker.getInProgressActions();
|
|
129
|
+
expect(inProgressActions.length).to.equal(1);
|
|
130
|
+
const actionToArbitrum = inProgressActions[0];
|
|
131
|
+
expect(actionToArbitrum.destination).to.equal(DOMAIN_IDS.anvil2);
|
|
132
|
+
expect(actionToArbitrum.amount).to.equal(70000000n);
|
|
133
|
+
// Assert: Monitored route collateral on origin DECREASED (sent to bridge)
|
|
134
|
+
const balancesAfterRebalance = await getAllCollateralBalances(localProviders, TEST_CHAINS, deployedAddresses.monitoredRoute, deployedAddresses.tokens);
|
|
135
|
+
// Assert: ethereum balance decreased by 70 USDC
|
|
136
|
+
const expectedDecrease = BigNumber.from(70000000);
|
|
137
|
+
expect(initialCollateralBalances.anvil1.sub(expectedDecrease).toString()).to.equal(balancesAfterRebalance.anvil1.toString());
|
|
138
|
+
// Relay the rebalance message to destination
|
|
139
|
+
const ethProvider = localProviders.get('anvil1');
|
|
140
|
+
const rebalanceTxReceipt = await ethProvider.getTransactionReceipt(actionToArbitrum.txHash);
|
|
141
|
+
const rebalanceRelayResult = await tryRelayMessage(multiProvider, hyperlaneCore, {
|
|
142
|
+
dispatchTx: rebalanceTxReceipt,
|
|
143
|
+
messageId: actionToArbitrum.messageId,
|
|
144
|
+
origin: 'anvil1',
|
|
145
|
+
destination: 'anvil2',
|
|
146
|
+
});
|
|
147
|
+
expect(rebalanceRelayResult.success, `Rebalance relay should succeed: ${rebalanceRelayResult.error}`).to.be.true;
|
|
148
|
+
// Sync actions to detect delivery and mark complete
|
|
149
|
+
const blockTags = await context.getConfirmedBlockTags();
|
|
150
|
+
await context.tracker.syncRebalanceActions(blockTags);
|
|
151
|
+
// Assert: Action is now complete
|
|
152
|
+
const completedAction = await context.tracker.getRebalanceAction(actionToArbitrum.id);
|
|
153
|
+
expect(completedAction.status).to.equal('complete');
|
|
154
|
+
// Assert: Intent is now complete
|
|
155
|
+
const completedIntent = await context.tracker.getRebalanceIntent(activeIntents[0].id);
|
|
156
|
+
expect(completedIntent.status).to.equal('complete');
|
|
157
|
+
});
|
|
158
|
+
it('should handle stuck transfer and propose routes to destination', async function () {
|
|
159
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
160
|
+
.withStrategy(minAmountStrategyConfig)
|
|
161
|
+
.withBalances('BELOW_MIN_ARB')
|
|
162
|
+
.withExecutionMode('execute')
|
|
163
|
+
.build();
|
|
164
|
+
// ===== CYCLE 1: Execute to create inflight eth→arb =====
|
|
165
|
+
// Initial: eth=6000, arb=50 (below 100 min), base=4000
|
|
166
|
+
// MinAmount will trigger: arb needs 100, so propose ~70 USDC from eth
|
|
167
|
+
const monitor1 = context.createMonitor(0);
|
|
168
|
+
const event1 = await getFirstMonitorEvent(monitor1);
|
|
169
|
+
await context.orchestrator.executeCycle(event1);
|
|
170
|
+
const blockTags1 = await context.getConfirmedBlockTags();
|
|
171
|
+
await context.tracker.syncRebalanceActions(blockTags1);
|
|
172
|
+
const inProgress = await context.tracker.getInProgressActions();
|
|
173
|
+
expect(inProgress.length, 'Cycle 1 should create inflight action').to.be.greaterThan(0);
|
|
174
|
+
const inflightToArb = inProgress.find((a) => a.destination === DOMAIN_IDS.anvil2 && a.origin === DOMAIN_IDS.anvil1);
|
|
175
|
+
expect(inflightToArb, 'Should have inflight action eth→arb').to.exist;
|
|
176
|
+
// ===== CYCLE 2: Execute again - should account for inflight =====
|
|
177
|
+
// Strategy sees: arb effective = 50 + inflight ≈ 120 (target)
|
|
178
|
+
// Should propose reduced amount or nothing to arb (within tolerance)
|
|
179
|
+
const monitor2 = context.createMonitor(0);
|
|
180
|
+
const event2 = await getFirstMonitorEvent(monitor2);
|
|
181
|
+
await context.orchestrator.executeCycle(event2);
|
|
182
|
+
const blockTags = await context.getConfirmedBlockTags();
|
|
183
|
+
await context.tracker.syncRebalanceActions(blockTags);
|
|
184
|
+
// Check if new routes to arb were proposed
|
|
185
|
+
const inProgressAfterCycle2 = await context.tracker.getInProgressActions();
|
|
186
|
+
const newActionsToArb = inProgressAfterCycle2.filter((a) => a.destination === DOMAIN_IDS.anvil2 &&
|
|
187
|
+
a.id !== inflightToArb.id &&
|
|
188
|
+
a.status === 'in_progress');
|
|
189
|
+
if (newActionsToArb.length > 0) {
|
|
190
|
+
// If route was proposed, should be much smaller than original ~70 USDC
|
|
191
|
+
const proposedAmount = BigNumber.from(newActionsToArb[0].amount).toBigInt();
|
|
192
|
+
expect(proposedAmount < 50000000n, `Amount to arb (${proposedAmount}) should be reduced accounting for inflight`).to.be.true;
|
|
193
|
+
}
|
|
194
|
+
// If no new route to arb, that's valid (within tolerance after inflight)
|
|
195
|
+
// Verify inflight still exists and action tracking is working
|
|
196
|
+
const finalInProgress = await context.tracker.getInProgressActions();
|
|
197
|
+
const inflightStillActive = finalInProgress.find((a) => a.id === inflightToArb.id);
|
|
198
|
+
expect(inflightStillActive, 'Inflight action should still be tracked').to
|
|
199
|
+
.exist;
|
|
200
|
+
expect(inflightStillActive.status).to.equal('in_progress');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=minAmount.e2e-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minAmount.e2e-test.js","sourceRoot":"","sources":["../../src/e2e/minAmount.e2e-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixed-weighted.e2e-test.d.ts","sourceRoot":"","sources":["../../src/e2e/mixed-weighted.e2e-test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { BigNumber, Wallet } from 'ethers';
|
|
3
|
+
import { HyperlaneCore, revertToSnapshot, snapshot, } from '@humanode-hyperlane/sdk';
|
|
4
|
+
import { ExecutionType, ExternalBridgeType, RebalancerConfigSchema, RebalancerStrategyOptions, } from '../config/types.js';
|
|
5
|
+
import { ANVIL_USER_PRIVATE_KEY, TEST_CHAINS, } from './fixtures/routes.js';
|
|
6
|
+
import { MIXED_INVENTORY_CHAIN, MIXED_INVENTORY_OVERRIDE, MIXED_MOVABLE_CHAINS, MixedLocalDeploymentManager, } from './harness/MixedLocalDeploymentManager.js';
|
|
7
|
+
import { MockExternalBridge } from './harness/MockExternalBridge.js';
|
|
8
|
+
import { getFirstMonitorEvent } from './harness/TestHelpers.js';
|
|
9
|
+
import { TestRebalancerBuilder, } from './harness/TestRebalancer.js';
|
|
10
|
+
function buildMixedWeightedStrategyConfig(addresses) {
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
rebalanceStrategy: RebalancerStrategyOptions.Weighted,
|
|
14
|
+
chains: {
|
|
15
|
+
anvil1: {
|
|
16
|
+
weighted: { weight: 60n, tolerance: 5n },
|
|
17
|
+
bridge: addresses.bridgeRoute.anvil1,
|
|
18
|
+
executionType: ExecutionType.MovableCollateral,
|
|
19
|
+
override: {
|
|
20
|
+
[MIXED_INVENTORY_CHAIN]: {
|
|
21
|
+
...MIXED_INVENTORY_OVERRIDE,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
anvil2: {
|
|
26
|
+
weighted: { weight: 20n, tolerance: 5n },
|
|
27
|
+
bridge: addresses.bridgeRoute.anvil2,
|
|
28
|
+
executionType: ExecutionType.MovableCollateral,
|
|
29
|
+
override: {
|
|
30
|
+
[MIXED_INVENTORY_CHAIN]: {
|
|
31
|
+
...MIXED_INVENTORY_OVERRIDE,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
anvil3: {
|
|
36
|
+
weighted: { weight: 20n, tolerance: 5n },
|
|
37
|
+
bridge: addresses.bridgeRoute.anvil3,
|
|
38
|
+
executionType: ExecutionType.MovableCollateral,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
describe('Mixed WeightedStrategy E2E', function () {
|
|
45
|
+
this.timeout(300_000);
|
|
46
|
+
let deploymentManager;
|
|
47
|
+
let multiProvider;
|
|
48
|
+
let localProviders;
|
|
49
|
+
let snapshotIds;
|
|
50
|
+
let hyperlaneCore;
|
|
51
|
+
let deployedAddresses;
|
|
52
|
+
let mixedStrategyConfig;
|
|
53
|
+
let mockBridge;
|
|
54
|
+
const inventorySignerAddress = new Wallet(ANVIL_USER_PRIVATE_KEY).address;
|
|
55
|
+
async function buildContext(inventoryBalances) {
|
|
56
|
+
return new TestRebalancerBuilder(deploymentManager, multiProvider)
|
|
57
|
+
.withStrategy(mixedStrategyConfig)
|
|
58
|
+
.withExecutionMode('execute')
|
|
59
|
+
.withErc20InventoryConfig({
|
|
60
|
+
inventorySignerKey: ANVIL_USER_PRIVATE_KEY,
|
|
61
|
+
erc20DeployedAddresses: deployedAddresses,
|
|
62
|
+
})
|
|
63
|
+
.withMockExternalBridge(mockBridge)
|
|
64
|
+
.withBalances(inventoryBalances)
|
|
65
|
+
.build();
|
|
66
|
+
}
|
|
67
|
+
before(async function () {
|
|
68
|
+
deploymentManager = new MixedLocalDeploymentManager(inventorySignerAddress);
|
|
69
|
+
const ctx = await deploymentManager.start();
|
|
70
|
+
multiProvider = ctx.multiProvider;
|
|
71
|
+
localProviders = ctx.providers;
|
|
72
|
+
deployedAddresses = ctx.deployedAddresses;
|
|
73
|
+
const coreAddresses = {};
|
|
74
|
+
for (const chain of TEST_CHAINS) {
|
|
75
|
+
coreAddresses[chain] = {
|
|
76
|
+
mailbox: deployedAddresses.chains[chain].mailbox,
|
|
77
|
+
interchainSecurityModule: deployedAddresses.chains[chain].ism,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
hyperlaneCore = HyperlaneCore.fromAddressesMap(coreAddresses, multiProvider);
|
|
81
|
+
mixedStrategyConfig = buildMixedWeightedStrategyConfig(deployedAddresses);
|
|
82
|
+
mockBridge = new MockExternalBridge(deployedAddresses, multiProvider, hyperlaneCore, 'erc20');
|
|
83
|
+
snapshotIds = new Map();
|
|
84
|
+
for (const [chain, provider] of localProviders) {
|
|
85
|
+
snapshotIds.set(chain, await snapshot(provider));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
afterEach(async function () {
|
|
89
|
+
mockBridge.reset();
|
|
90
|
+
for (const [chain, provider] of localProviders) {
|
|
91
|
+
const id = snapshotIds.get(chain);
|
|
92
|
+
await revertToSnapshot(provider, id);
|
|
93
|
+
snapshotIds.set(chain, await snapshot(provider));
|
|
94
|
+
Reflect.set(provider, '_maxInternalBlockNumber', -1);
|
|
95
|
+
Reflect.set(provider, '_internalBlockNumber', null);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
after(async function () {
|
|
99
|
+
if (deploymentManager) {
|
|
100
|
+
await deploymentManager.stop();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
it('accepts mixed movable + inventory override config in schema', function () {
|
|
104
|
+
const configResult = RebalancerConfigSchema.safeParse({
|
|
105
|
+
warpRouteId: 'USDC/test-mixed-weighted',
|
|
106
|
+
strategy: [
|
|
107
|
+
{
|
|
108
|
+
rebalanceStrategy: RebalancerStrategyOptions.Weighted,
|
|
109
|
+
chains: {
|
|
110
|
+
anvil1: {
|
|
111
|
+
weighted: { weight: 60, tolerance: 5 },
|
|
112
|
+
bridge: deployedAddresses.bridgeRoute.anvil1,
|
|
113
|
+
executionType: ExecutionType.MovableCollateral,
|
|
114
|
+
override: {
|
|
115
|
+
[MIXED_INVENTORY_CHAIN]: {
|
|
116
|
+
...MIXED_INVENTORY_OVERRIDE,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
anvil2: {
|
|
121
|
+
weighted: { weight: 20, tolerance: 5 },
|
|
122
|
+
bridge: deployedAddresses.bridgeRoute.anvil2,
|
|
123
|
+
executionType: ExecutionType.MovableCollateral,
|
|
124
|
+
override: {
|
|
125
|
+
[MIXED_INVENTORY_CHAIN]: {
|
|
126
|
+
...MIXED_INVENTORY_OVERRIDE,
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
anvil3: {
|
|
131
|
+
weighted: { weight: 20, tolerance: 5 },
|
|
132
|
+
bridge: deployedAddresses.bridgeRoute.anvil3,
|
|
133
|
+
executionType: ExecutionType.MovableCollateral,
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
inventorySigners: {
|
|
139
|
+
ethereum: inventorySignerAddress,
|
|
140
|
+
},
|
|
141
|
+
externalBridges: {
|
|
142
|
+
lifi: {
|
|
143
|
+
integrator: 'test',
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
expect(configResult.success).to.equal(true);
|
|
148
|
+
});
|
|
149
|
+
it('includes override-only inventory chain and creates both rebalancers', async function () {
|
|
150
|
+
const context = await buildContext('ERC20_INVENTORY_BALANCED');
|
|
151
|
+
const { rebalancers, inventoryConfig } = await context.contextFactory.createRebalancers(context.tracker, undefined, {
|
|
152
|
+
[ExternalBridgeType.LiFi]: mockBridge,
|
|
153
|
+
});
|
|
154
|
+
expect(inventoryConfig).to.exist;
|
|
155
|
+
expect(inventoryConfig.chains).to.have.members([
|
|
156
|
+
MIXED_INVENTORY_CHAIN,
|
|
157
|
+
...MIXED_MOVABLE_CHAINS,
|
|
158
|
+
]);
|
|
159
|
+
expect(rebalancers.map((r) => r.rebalancerType).sort()).to.deep.equal([
|
|
160
|
+
'inventory',
|
|
161
|
+
'movableCollateral',
|
|
162
|
+
]);
|
|
163
|
+
});
|
|
164
|
+
it('routes inventory destination through inventory and movable destination through movable collateral', async function () {
|
|
165
|
+
const context = await buildContext({
|
|
166
|
+
anvil1: BigNumber.from('10000000000'),
|
|
167
|
+
anvil2: BigNumber.from('0'),
|
|
168
|
+
anvil3: BigNumber.from('0'),
|
|
169
|
+
});
|
|
170
|
+
const monitor = context.createMonitor(0);
|
|
171
|
+
const event = await getFirstMonitorEvent(monitor);
|
|
172
|
+
const cycleResult = await context.orchestrator.executeCycle(event);
|
|
173
|
+
const routeToInventory = cycleResult.proposedRoutes.find((route) => route.destination === MIXED_INVENTORY_CHAIN);
|
|
174
|
+
expect(routeToInventory).to.exist;
|
|
175
|
+
expect(routeToInventory.executionType).to.equal(ExecutionType.Inventory);
|
|
176
|
+
const movableDestination = MIXED_MOVABLE_CHAINS.find((chain) => chain !== 'anvil1');
|
|
177
|
+
const routeToMovable = cycleResult.proposedRoutes.find((route) => route.destination === movableDestination);
|
|
178
|
+
expect(routeToMovable).to.exist;
|
|
179
|
+
expect(routeToMovable.executionType).to.equal(ExecutionType.MovableCollateral);
|
|
180
|
+
const inProgressActions = await context.tracker.getInProgressActions();
|
|
181
|
+
const hasInventoryExecution = inProgressActions.some((action) => action.type === 'inventory_deposit' &&
|
|
182
|
+
multiProvider.getChainName(action.origin) === MIXED_INVENTORY_CHAIN);
|
|
183
|
+
const hasMovableExecution = inProgressActions.some((action) => action.type === 'rebalance_message' &&
|
|
184
|
+
multiProvider.getChainName(action.destination) === movableDestination);
|
|
185
|
+
expect(hasInventoryExecution).to.equal(true);
|
|
186
|
+
expect(hasMovableExecution).to.equal(true);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=mixed-weighted.e2e-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixed-weighted.e2e-test.js","sourceRoot":"","sources":["../../src/e2e/mixed-weighted.e2e-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weighted.e2e-test.d.ts","sourceRoot":"","sources":["../../src/e2e/weighted.e2e-test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { BigNumber } from 'ethers';
|
|
3
|
+
import { HyperlaneCore, snapshot, } from '@humanode-hyperlane/sdk';
|
|
4
|
+
import { RebalancerStrategyOptions, } from '../config/types.js';
|
|
5
|
+
import { DOMAIN_IDS, TEST_CHAINS, } from './fixtures/routes.js';
|
|
6
|
+
import { getAllCollateralBalances } from './harness/BridgeSetup.js';
|
|
7
|
+
import { Erc20LocalDeploymentManager } from './harness/Erc20LocalDeploymentManager.js';
|
|
8
|
+
import { resetSnapshotsAndRefreshProviders } from './harness/SnapshotHelper.js';
|
|
9
|
+
import { getFirstMonitorEvent } from './harness/TestHelpers.js';
|
|
10
|
+
import { TestRebalancer } from './harness/TestRebalancer.js';
|
|
11
|
+
import { tryRelayMessage } from './harness/TransferHelper.js';
|
|
12
|
+
describe('WeightedStrategy E2E', function () {
|
|
13
|
+
this.timeout(300_000);
|
|
14
|
+
let deploymentManager;
|
|
15
|
+
let multiProvider;
|
|
16
|
+
let localProviders;
|
|
17
|
+
let snapshotIds;
|
|
18
|
+
let hyperlaneCore;
|
|
19
|
+
let deployedAddresses;
|
|
20
|
+
let weightedStrategyConfig;
|
|
21
|
+
before(async function () {
|
|
22
|
+
deploymentManager = new Erc20LocalDeploymentManager();
|
|
23
|
+
const ctx = await deploymentManager.start();
|
|
24
|
+
multiProvider = ctx.multiProvider;
|
|
25
|
+
localProviders = ctx.providers;
|
|
26
|
+
deployedAddresses = ctx.deployedAddresses;
|
|
27
|
+
const coreAddresses = {};
|
|
28
|
+
for (const chain of TEST_CHAINS) {
|
|
29
|
+
coreAddresses[chain] = {
|
|
30
|
+
mailbox: deployedAddresses.chains[chain].mailbox,
|
|
31
|
+
interchainSecurityModule: deployedAddresses.chains[chain].ism,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
hyperlaneCore = HyperlaneCore.fromAddressesMap(coreAddresses, multiProvider);
|
|
35
|
+
weightedStrategyConfig = [
|
|
36
|
+
{
|
|
37
|
+
rebalanceStrategy: RebalancerStrategyOptions.Weighted,
|
|
38
|
+
chains: {
|
|
39
|
+
anvil1: {
|
|
40
|
+
weighted: { weight: 60n, tolerance: 5n },
|
|
41
|
+
bridge: deployedAddresses.bridgeRoute1.anvil1,
|
|
42
|
+
},
|
|
43
|
+
anvil2: {
|
|
44
|
+
weighted: { weight: 20n, tolerance: 5n },
|
|
45
|
+
bridge: deployedAddresses.bridgeRoute1.anvil2,
|
|
46
|
+
},
|
|
47
|
+
anvil3: {
|
|
48
|
+
weighted: { weight: 20n, tolerance: 5n },
|
|
49
|
+
bridge: deployedAddresses.bridgeRoute1.anvil3,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
snapshotIds = new Map();
|
|
55
|
+
for (const [chain, provider] of localProviders) {
|
|
56
|
+
snapshotIds.set(chain, await snapshot(provider));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
afterEach(async function () {
|
|
60
|
+
await resetSnapshotsAndRefreshProviders({
|
|
61
|
+
localProviders,
|
|
62
|
+
multiProvider,
|
|
63
|
+
snapshotIds,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
after(async function () {
|
|
67
|
+
if (deploymentManager) {
|
|
68
|
+
await deploymentManager.stop();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
it('should propose rebalance routes when weights are unbalanced', async function () {
|
|
72
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
73
|
+
.withStrategy(weightedStrategyConfig)
|
|
74
|
+
.withBalances('WEIGHTED_IMBALANCED')
|
|
75
|
+
.withExecutionMode('execute')
|
|
76
|
+
.build();
|
|
77
|
+
const monitor = context.createMonitor(0);
|
|
78
|
+
const event = await getFirstMonitorEvent(monitor);
|
|
79
|
+
await context.orchestrator.executeCycle(event);
|
|
80
|
+
// Assert: Strategy created rebalance intent for the imbalanced chain
|
|
81
|
+
const activeIntents = await context.tracker.getActiveRebalanceIntents();
|
|
82
|
+
expect(activeIntents.length).to.equal(1);
|
|
83
|
+
expect(activeIntents[0].origin).to.equal(DOMAIN_IDS.anvil1);
|
|
84
|
+
expect(activeIntents[0].destination).to.equal(DOMAIN_IDS.anvil3);
|
|
85
|
+
expect(activeIntents[0].amount).to.equal(1000000000n);
|
|
86
|
+
});
|
|
87
|
+
it('should not propose routes when within tolerance', async function () {
|
|
88
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
89
|
+
.withStrategy(weightedStrategyConfig)
|
|
90
|
+
.withBalances('WEIGHTED_WITHIN_TOLERANCE')
|
|
91
|
+
.withExecutionMode('execute')
|
|
92
|
+
.build();
|
|
93
|
+
const monitor = context.createMonitor(0);
|
|
94
|
+
const event = await getFirstMonitorEvent(monitor);
|
|
95
|
+
await context.orchestrator.executeCycle(event);
|
|
96
|
+
// Assert: No intents created when within tolerance
|
|
97
|
+
const activeIntents = await context.tracker.getActiveRebalanceIntents();
|
|
98
|
+
expect(activeIntents.length).to.equal(0);
|
|
99
|
+
});
|
|
100
|
+
it('should execute full rebalance cycle with actual transfers', async function () {
|
|
101
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
102
|
+
.withStrategy(weightedStrategyConfig)
|
|
103
|
+
.withBalances('WEIGHTED_IMBALANCED')
|
|
104
|
+
.withExecutionMode('execute')
|
|
105
|
+
.build();
|
|
106
|
+
const monitor = context.createMonitor(0);
|
|
107
|
+
const event = await getFirstMonitorEvent(monitor);
|
|
108
|
+
await context.orchestrator.executeCycle(event);
|
|
109
|
+
// Assert: Rebalance intent was created with correct fields
|
|
110
|
+
const activeIntents = await context.tracker.getActiveRebalanceIntents();
|
|
111
|
+
expect(activeIntents.length).to.equal(1);
|
|
112
|
+
expect(activeIntents[0].destination).to.equal(DOMAIN_IDS.anvil3);
|
|
113
|
+
expect(activeIntents[0].amount).to.equal(1000000000n);
|
|
114
|
+
expect(activeIntents[0].status).to.equal('in_progress');
|
|
115
|
+
// Assert: Rebalance action was created
|
|
116
|
+
const inProgressActions = await context.tracker.getInProgressActions();
|
|
117
|
+
expect(inProgressActions.length).to.equal(1);
|
|
118
|
+
expect(inProgressActions[0].intentId).to.equal(activeIntents[0].id);
|
|
119
|
+
// Assert: Ethereum balance decreased by 1000 USDC (rebalance amount)
|
|
120
|
+
const balancesAfterRebalance = await getAllCollateralBalances(localProviders, TEST_CHAINS, deployedAddresses.monitoredRoute, deployedAddresses.tokens);
|
|
121
|
+
// Initial: 7000 USDC - Rebalance: 1000 USDC = 6000 USDC
|
|
122
|
+
expect(balancesAfterRebalance.anvil1.toString(), 'anvil1 collateral should be 6000 USDC after rebalance').to.equal('6000000000');
|
|
123
|
+
// Capture action details for relay
|
|
124
|
+
const actionToBase = inProgressActions[0];
|
|
125
|
+
const ethProvider = localProviders.get('anvil1');
|
|
126
|
+
// Relay the rebalance message to destination
|
|
127
|
+
expect(actionToBase.txHash, 'Action should have txHash').to.exist;
|
|
128
|
+
const rebalanceTxReceipt = await ethProvider.getTransactionReceipt(actionToBase.txHash);
|
|
129
|
+
const rebalanceRelayResult = await tryRelayMessage(multiProvider, hyperlaneCore, {
|
|
130
|
+
dispatchTx: rebalanceTxReceipt,
|
|
131
|
+
messageId: actionToBase.messageId,
|
|
132
|
+
origin: 'anvil1',
|
|
133
|
+
destination: 'anvil3',
|
|
134
|
+
});
|
|
135
|
+
expect(rebalanceRelayResult.success, `Rebalance relay should succeed: ${rebalanceRelayResult.error}`).to.be.true;
|
|
136
|
+
const blockTags = await context.getConfirmedBlockTags();
|
|
137
|
+
await context.tracker.syncRebalanceActions(blockTags);
|
|
138
|
+
// Assert: Action is now complete
|
|
139
|
+
const completedAction = await context.tracker.getRebalanceAction(actionToBase.id);
|
|
140
|
+
expect(completedAction.status).to.equal('complete');
|
|
141
|
+
// Assert: Intent is now complete
|
|
142
|
+
const completedIntent = await context.tracker.getRebalanceIntent(activeIntents[0].id);
|
|
143
|
+
expect(completedIntent.status).to.equal('complete');
|
|
144
|
+
// Assert: No more in-progress actions
|
|
145
|
+
const remainingActions = await context.tracker.getInProgressActions();
|
|
146
|
+
expect(remainingActions.length).to.equal(0);
|
|
147
|
+
});
|
|
148
|
+
it('should handle stuck transfer and propose routes to destination', async function () {
|
|
149
|
+
// Build context with Weighted strategy
|
|
150
|
+
// Initial: eth=7000, arb=2000, base=1000 (total=10000)
|
|
151
|
+
// Target: eth=60% (6000), arb=20% (2000), base=20% (2000)
|
|
152
|
+
// Cycle 1 will create inflight eth→base for ~1000 USDC
|
|
153
|
+
const context = await TestRebalancer.builder(deploymentManager, multiProvider)
|
|
154
|
+
.withStrategy(weightedStrategyConfig)
|
|
155
|
+
.withBalances('WEIGHTED_IMBALANCED')
|
|
156
|
+
.withExecutionMode('execute')
|
|
157
|
+
.build();
|
|
158
|
+
// ===== CYCLE 1: Execute rebalance to create inflight eth→base =====
|
|
159
|
+
const monitor1 = context.createMonitor(0);
|
|
160
|
+
const event1 = await getFirstMonitorEvent(monitor1);
|
|
161
|
+
await context.orchestrator.executeCycle(event1);
|
|
162
|
+
const blockTags1 = await context.getConfirmedBlockTags();
|
|
163
|
+
await context.tracker.syncRebalanceActions(blockTags1);
|
|
164
|
+
const inflightAfterCycle1 = await context.tracker.getInProgressActions();
|
|
165
|
+
expect(inflightAfterCycle1.length, 'Cycle 1 should create inflight action').to.be.greaterThan(0);
|
|
166
|
+
const inflightToBase = inflightAfterCycle1.find((a) => a.destination === DOMAIN_IDS.anvil3 && a.origin === DOMAIN_IDS.anvil1);
|
|
167
|
+
expect(inflightToBase, 'Should have inflight action eth→base').to.exist;
|
|
168
|
+
const inflightAmount = BigNumber.from(inflightToBase.amount);
|
|
169
|
+
expect(inflightAmount.gt(0), 'Inflight amount should be positive').to.be
|
|
170
|
+
.true;
|
|
171
|
+
// ===== CYCLE 2: Execute again - should account for inflight =====
|
|
172
|
+
// Weighted now sees: base effective = current + inflight ≈ 2000 (target)
|
|
173
|
+
// Should create reduced amount or nothing to base
|
|
174
|
+
const monitor2 = context.createMonitor(0);
|
|
175
|
+
const event2 = await getFirstMonitorEvent(monitor2);
|
|
176
|
+
await context.orchestrator.executeCycle(event2);
|
|
177
|
+
const blockTags2 = await context.getConfirmedBlockTags();
|
|
178
|
+
await context.tracker.syncRebalanceActions(blockTags2);
|
|
179
|
+
// Check if new actions to base were created
|
|
180
|
+
const inProgressAfterCycle2 = await context.tracker.getInProgressActions();
|
|
181
|
+
const newActionsToBase = inProgressAfterCycle2.filter((a) => a.destination === DOMAIN_IDS.anvil3 &&
|
|
182
|
+
a.id !== inflightToBase.id &&
|
|
183
|
+
a.status === 'in_progress');
|
|
184
|
+
if (newActionsToBase.length > 0) {
|
|
185
|
+
// If action was created, should be much smaller than original 1000 USDC
|
|
186
|
+
const proposedAmount = BigNumber.from(newActionsToBase[0].amount).toBigInt();
|
|
187
|
+
expect(proposedAmount < 500000000n, `Amount to base (${proposedAmount}) should be reduced accounting for inflight`).to.be.true;
|
|
188
|
+
}
|
|
189
|
+
// If no new action to base, that's valid (within tolerance after inflight)
|
|
190
|
+
// Verify inflight still exists and action tracking is working
|
|
191
|
+
const finalInProgress = await context.tracker.getInProgressActions();
|
|
192
|
+
const inflightStillActive = finalInProgress.find((a) => a.id === inflightToBase.id);
|
|
193
|
+
expect(inflightStillActive, 'Inflight action should still be tracked').to
|
|
194
|
+
.exist;
|
|
195
|
+
expect(inflightStillActive.status).to.equal('in_progress');
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=weighted.e2e-test.js.map
|