@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,211 @@
|
|
|
1
|
+
import { sleep } from '@humanode-hyperlane/utils';
|
|
2
|
+
import { MonitorEventType, MonitorPollingError, MonitorStartError, } from '../interfaces/IMonitor.js';
|
|
3
|
+
import { getConfirmedBlockTag } from '../utils/blockTag.js';
|
|
4
|
+
/**
|
|
5
|
+
* Simple monitor implementation that polls warp route collateral balances and emits them as MonitorEvent.
|
|
6
|
+
* Awaits the TokenInfo handler before starting the next cycle to prevent race conditions.
|
|
7
|
+
*/
|
|
8
|
+
export class Monitor {
|
|
9
|
+
checkFrequency;
|
|
10
|
+
warpCore;
|
|
11
|
+
logger;
|
|
12
|
+
inventoryConfig;
|
|
13
|
+
tokenInfoHandler;
|
|
14
|
+
errorHandler;
|
|
15
|
+
startHandler;
|
|
16
|
+
isMonitorRunning = false;
|
|
17
|
+
resolveStop = null;
|
|
18
|
+
stopPromise = null;
|
|
19
|
+
/**
|
|
20
|
+
* @param checkFrequency - The frequency to poll balances in ms.
|
|
21
|
+
*/
|
|
22
|
+
constructor(checkFrequency, warpCore, logger, inventoryConfig) {
|
|
23
|
+
this.checkFrequency = checkFrequency;
|
|
24
|
+
this.warpCore = warpCore;
|
|
25
|
+
this.logger = logger;
|
|
26
|
+
this.inventoryConfig = inventoryConfig;
|
|
27
|
+
}
|
|
28
|
+
async computeConfirmedBlockTags() {
|
|
29
|
+
const blockTags = {};
|
|
30
|
+
const chains = new Set(this.warpCore.tokens.map((t) => t.chainName));
|
|
31
|
+
for (const chain of chains) {
|
|
32
|
+
blockTags[chain] = await getConfirmedBlockTag(this.warpCore.multiProvider, chain, this.logger);
|
|
33
|
+
}
|
|
34
|
+
return blockTags;
|
|
35
|
+
}
|
|
36
|
+
on(eventName, fn) {
|
|
37
|
+
switch (eventName) {
|
|
38
|
+
case MonitorEventType.TokenInfo:
|
|
39
|
+
this.tokenInfoHandler = fn;
|
|
40
|
+
break;
|
|
41
|
+
case MonitorEventType.Error:
|
|
42
|
+
this.errorHandler = fn;
|
|
43
|
+
break;
|
|
44
|
+
case MonitorEventType.Start:
|
|
45
|
+
this.startHandler = fn;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
async start() {
|
|
51
|
+
if (this.isMonitorRunning) {
|
|
52
|
+
// Cannot start the same monitor multiple times
|
|
53
|
+
this.errorHandler?.(new MonitorStartError('Monitor already running'));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
this.isMonitorRunning = true;
|
|
58
|
+
this.logger.debug({ checkFrequency: this.checkFrequency }, 'Monitor started');
|
|
59
|
+
this.startHandler?.();
|
|
60
|
+
while (this.isMonitorRunning) {
|
|
61
|
+
const cycleStart = Date.now();
|
|
62
|
+
try {
|
|
63
|
+
this.logger.debug('Polling cycle started');
|
|
64
|
+
const confirmedBlockTags = await this.computeConfirmedBlockTags();
|
|
65
|
+
const event = {
|
|
66
|
+
tokensInfo: [],
|
|
67
|
+
confirmedBlockTags,
|
|
68
|
+
};
|
|
69
|
+
for (const token of this.warpCore.tokens) {
|
|
70
|
+
this.logger.debug({
|
|
71
|
+
chain: token.chainName,
|
|
72
|
+
tokenSymbol: token.symbol,
|
|
73
|
+
tokenAddress: token.addressOrDenom,
|
|
74
|
+
}, 'Checking token');
|
|
75
|
+
const blockTag = confirmedBlockTags[token.chainName];
|
|
76
|
+
const bridgedSupply = await this.getTokenBridgedSupply(token, blockTag);
|
|
77
|
+
event.tokensInfo.push({
|
|
78
|
+
token,
|
|
79
|
+
bridgedSupply,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const inventoryBalances = await this.fetchInventoryBalances();
|
|
83
|
+
if (Object.keys(inventoryBalances).length > 0) {
|
|
84
|
+
event.inventoryBalances = inventoryBalances;
|
|
85
|
+
this.logger.info({
|
|
86
|
+
chainsMonitored: Object.keys(inventoryBalances).length,
|
|
87
|
+
balances: Object.entries(inventoryBalances).map(([chain, balance]) => ({
|
|
88
|
+
chain,
|
|
89
|
+
balance: balance.toString(),
|
|
90
|
+
balanceEth: (Number(balance) / 1e18).toFixed(6),
|
|
91
|
+
})),
|
|
92
|
+
}, 'Inventory balances fetched');
|
|
93
|
+
}
|
|
94
|
+
if (this.tokenInfoHandler) {
|
|
95
|
+
await this.tokenInfoHandler(event);
|
|
96
|
+
}
|
|
97
|
+
this.logger.debug('Polling cycle completed');
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
this.errorHandler?.(new MonitorPollingError(`Error during monitor execution cycle: ${error.message}`, error));
|
|
101
|
+
}
|
|
102
|
+
// Smart sleep: only wait for remaining time after cycle completes
|
|
103
|
+
const elapsed = Date.now() - cycleStart;
|
|
104
|
+
const remaining = this.checkFrequency - elapsed;
|
|
105
|
+
if (remaining > 0) {
|
|
106
|
+
await sleep(remaining);
|
|
107
|
+
}
|
|
108
|
+
// If elapsed >= checkFrequency, start next cycle immediately
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
this.errorHandler?.(new MonitorStartError(`Error starting monitor: ${error.message}`, error));
|
|
113
|
+
}
|
|
114
|
+
// After the loop has been gracefully terminated, we can clean up.
|
|
115
|
+
this.tokenInfoHandler = undefined;
|
|
116
|
+
this.errorHandler = undefined;
|
|
117
|
+
this.startHandler = undefined;
|
|
118
|
+
this.logger.info('Monitor stopped');
|
|
119
|
+
// If stop() was called, resolve the promise to signal that we're done.
|
|
120
|
+
if (this.resolveStop) {
|
|
121
|
+
this.resolveStop();
|
|
122
|
+
this.resolveStop = null;
|
|
123
|
+
this.stopPromise = null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async getTokenBridgedSupply(token, blockTag) {
|
|
127
|
+
if (!token.isHypToken()) {
|
|
128
|
+
this.logger.warn({
|
|
129
|
+
chain: token.chainName,
|
|
130
|
+
tokenSymbol: token.symbol,
|
|
131
|
+
tokenAddress: token.addressOrDenom,
|
|
132
|
+
}, 'Cannot get bridged balance for a non-Hyperlane token');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const adapter = token.getHypAdapter(this.warpCore.multiProvider);
|
|
136
|
+
let bridgedSupply;
|
|
137
|
+
try {
|
|
138
|
+
bridgedSupply = await adapter.getBridgedSupply({ blockTag });
|
|
139
|
+
this.logger.debug({ chain: token.chainName, blockTag }, 'Queried confirmed balance');
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
this.logger.warn({
|
|
143
|
+
chain: token.chainName,
|
|
144
|
+
blockTag,
|
|
145
|
+
error: error.message,
|
|
146
|
+
}, 'Historical block query failed, falling back to latest');
|
|
147
|
+
bridgedSupply = await adapter.getBridgedSupply();
|
|
148
|
+
}
|
|
149
|
+
if (bridgedSupply === undefined) {
|
|
150
|
+
this.logger.warn({
|
|
151
|
+
chain: token.chainName,
|
|
152
|
+
tokenSymbol: token.symbol,
|
|
153
|
+
tokenAddress: token.addressOrDenom,
|
|
154
|
+
}, 'Bridged supply not found for token');
|
|
155
|
+
}
|
|
156
|
+
return bridgedSupply;
|
|
157
|
+
}
|
|
158
|
+
async fetchInventoryBalances() {
|
|
159
|
+
if (!this.inventoryConfig)
|
|
160
|
+
return {};
|
|
161
|
+
const balances = {};
|
|
162
|
+
const readPromises = this.inventoryConfig.chains.map(async (chainName) => {
|
|
163
|
+
const token = this.warpCore.tokens.find((t) => t.chainName === chainName);
|
|
164
|
+
if (!token) {
|
|
165
|
+
this.logger.warn({ chain: chainName }, 'No token found for inventory chain');
|
|
166
|
+
return { chainName, balance: 0n };
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const address = this.inventoryConfig.inventoryAddresses[token.protocol];
|
|
170
|
+
if (!address) {
|
|
171
|
+
this.logger.warn({ chain: chainName, protocol: token.protocol }, 'No inventory address for chain protocol, skipping');
|
|
172
|
+
return { chainName, balance: 0n };
|
|
173
|
+
}
|
|
174
|
+
const adapter = token.getAdapter(this.warpCore.multiProvider);
|
|
175
|
+
const balance = await adapter.getBalance(address);
|
|
176
|
+
this.logger.debug({
|
|
177
|
+
chain: chainName,
|
|
178
|
+
token: token.addressOrDenom,
|
|
179
|
+
balance: balance.toString(),
|
|
180
|
+
}, 'Read inventory balance');
|
|
181
|
+
return { chainName, balance };
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
this.logger.error({ chain: chainName, error: error.message }, 'Failed to read inventory balance');
|
|
185
|
+
return { chainName, balance: 0n };
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
const results = await Promise.all(readPromises);
|
|
189
|
+
for (const { chainName, balance } of results) {
|
|
190
|
+
balances[chainName] = balance;
|
|
191
|
+
}
|
|
192
|
+
return balances;
|
|
193
|
+
}
|
|
194
|
+
stop() {
|
|
195
|
+
if (!this.isMonitorRunning)
|
|
196
|
+
return Promise.resolve();
|
|
197
|
+
// If stop is already in progress, return the existing promise
|
|
198
|
+
if (this.stopPromise)
|
|
199
|
+
return this.stopPromise;
|
|
200
|
+
this.logger.info('Stopping monitor...');
|
|
201
|
+
// Signal the while loop to terminate after its current iteration
|
|
202
|
+
this.isMonitorRunning = false;
|
|
203
|
+
// Create a promise that will be resolved by the start() method
|
|
204
|
+
// once the loop and cleanup are complete.
|
|
205
|
+
this.stopPromise = new Promise((resolve) => {
|
|
206
|
+
this.resolveStop = resolve;
|
|
207
|
+
});
|
|
208
|
+
return this.stopPromise;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=Monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Monitor.js","sourceRoot":"","sources":["../../src/monitor/Monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":""}
|
package/dist/service.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hyperlane Rebalancer Service Entry Point
|
|
4
|
+
*
|
|
5
|
+
* This is the main entry point for running the rebalancer as a standalone service
|
|
6
|
+
* in Kubernetes or other container environments. It reads configuration from
|
|
7
|
+
* environment variables and files, then starts the rebalancer in daemon mode.
|
|
8
|
+
*
|
|
9
|
+
* Environment Variables:
|
|
10
|
+
* - REBALANCER_CONFIG_FILE: Path to the rebalancer configuration YAML file (required)
|
|
11
|
+
* - HYP_REBALANCER_KEY: Private key for movable collateral rebalancing operations (preferred)
|
|
12
|
+
* - HYP_KEY: Fallback private key for HYP_REBALANCER_KEY (optional)
|
|
13
|
+
* - HYP_INVENTORY_KEY_<PROTOCOL>: Private key for inventory operations per protocol (e.g., HYP_INVENTORY_KEY_ETHEREUM, HYP_INVENTORY_KEY_SEALEVEL)
|
|
14
|
+
* - COINGECKO_API_KEY: API key for CoinGecko price fetching (optional, for metrics)
|
|
15
|
+
* - HYP_INVENTORY_KEY: Backward-compatible fallback for Ethereum inventory signer (optional, use HYP_INVENTORY_KEY_ETHEREUM preferentially)
|
|
16
|
+
* - CHECK_FREQUENCY: Balance check frequency in ms (default: 60000)
|
|
17
|
+
* - WITH_METRICS: Enable Prometheus metrics (default: "true")
|
|
18
|
+
* - MONITOR_ONLY: Run in monitor-only mode without executing transactions (default: "false")
|
|
19
|
+
* - LOG_LEVEL: Logging level (default: "info") - supported by pino
|
|
20
|
+
* - REGISTRY_URI: Registry URI for chain metadata. Can include /tree/{commit} to pin version (default: GitHub registry)
|
|
21
|
+
* - RPC_URL_<CHAIN>: Override RPC URL for a specific chain (e.g., RPC_URL_ETHEREUM, RPC_URL_ARBITRUM)
|
|
22
|
+
*
|
|
23
|
+
* Usage:
|
|
24
|
+
* node dist/service.js
|
|
25
|
+
* REBALANCER_CONFIG_FILE=/config/rebalancer.yaml HYP_REBALANCER_KEY=0x... HYP_INVENTORY_KEY=0x... node dist/service.js
|
|
26
|
+
*/
|
|
27
|
+
import { Wallet } from 'ethers';
|
|
28
|
+
import { Keypair } from '@solana/web3.js';
|
|
29
|
+
import { DEFAULT_GITHUB_REGISTRY } from '@humanode-hyperlane/registry';
|
|
30
|
+
import { getRegistry } from '@humanode-hyperlane/registry/fs';
|
|
31
|
+
import { MultiProvider } from '@humanode-hyperlane/sdk';
|
|
32
|
+
import { applyRpcUrlOverridesFromEnv, createServiceLogger, ProtocolType, rootLogger, } from '@humanode-hyperlane/utils';
|
|
33
|
+
import { RebalancerConfig } from './config/RebalancerConfig.js';
|
|
34
|
+
import { RebalancerService } from './core/RebalancerService.js';
|
|
35
|
+
import { parseSolanaPrivateKey } from './utils/solanaKeyParser.js';
|
|
36
|
+
async function main() {
|
|
37
|
+
const VERSION = process.env.SERVICE_VERSION || 'dev';
|
|
38
|
+
// Validate required environment variables
|
|
39
|
+
const configFile = process.env.REBALANCER_CONFIG_FILE;
|
|
40
|
+
if (!configFile) {
|
|
41
|
+
rootLogger.error('REBALANCER_CONFIG_FILE environment variable is required');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const rebalancerPrivateKey = process.env.HYP_REBALANCER_KEY ?? process.env.HYP_KEY;
|
|
45
|
+
if (!rebalancerPrivateKey) {
|
|
46
|
+
rootLogger.error('HYP_REBALANCER_KEY (or HYP_KEY) environment variable is required');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
// Build per-protocol private key map from env vars.
|
|
50
|
+
// Naming: HYP_INVENTORY_KEY_<UPPERCASE_PROTOCOL> (e.g., HYP_INVENTORY_KEY_ETHEREUM).
|
|
51
|
+
// HYP_INVENTORY_KEY (no suffix) is kept as backward-compatible fallback for Ethereum only.
|
|
52
|
+
const inventoryPrivateKeys = {};
|
|
53
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
54
|
+
const envKey = `HYP_INVENTORY_KEY_${protocol.toUpperCase()}`;
|
|
55
|
+
const val = process.env[envKey];
|
|
56
|
+
if (val) {
|
|
57
|
+
inventoryPrivateKeys[protocol] = val;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Backward compat: HYP_INVENTORY_KEY (no suffix) as Ethereum fallback
|
|
61
|
+
if (!inventoryPrivateKeys[ProtocolType.Ethereum] &&
|
|
62
|
+
process.env.HYP_INVENTORY_KEY) {
|
|
63
|
+
inventoryPrivateKeys[ProtocolType.Ethereum] = process.env.HYP_INVENTORY_KEY;
|
|
64
|
+
}
|
|
65
|
+
// Parse optional environment variables
|
|
66
|
+
let checkFrequency = 60_000;
|
|
67
|
+
if (process.env.CHECK_FREQUENCY) {
|
|
68
|
+
const parsed = parseInt(process.env.CHECK_FREQUENCY, 10);
|
|
69
|
+
if (isNaN(parsed) || parsed <= 0) {
|
|
70
|
+
rootLogger.error('CHECK_FREQUENCY must be a positive number (milliseconds)');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
checkFrequency = parsed;
|
|
74
|
+
}
|
|
75
|
+
const withMetrics = process.env.WITH_METRICS !== 'false';
|
|
76
|
+
const monitorOnly = process.env.MONITOR_ONLY === 'true';
|
|
77
|
+
const coingeckoApiKey = process.env.COINGECKO_API_KEY;
|
|
78
|
+
// Create logger (uses LOG_LEVEL environment variable for level configuration)
|
|
79
|
+
const logger = await createServiceLogger({
|
|
80
|
+
service: 'rebalancer',
|
|
81
|
+
version: VERSION,
|
|
82
|
+
});
|
|
83
|
+
logger.info({
|
|
84
|
+
version: VERSION,
|
|
85
|
+
configFile,
|
|
86
|
+
checkFrequency,
|
|
87
|
+
withMetrics,
|
|
88
|
+
monitorOnly,
|
|
89
|
+
}, 'Starting Hyperlane Rebalancer Service');
|
|
90
|
+
try {
|
|
91
|
+
// Load rebalancer configuration
|
|
92
|
+
const rebalancerConfig = RebalancerConfig.load(configFile);
|
|
93
|
+
logger.info('✅ Loaded rebalancer configuration');
|
|
94
|
+
// Initialize registry (uses env var or defaults to GitHub registry)
|
|
95
|
+
// For GitHub registries, REGISTRY_URI can include /tree/{commit} to pin to a specific version
|
|
96
|
+
const registryUri = process.env.REGISTRY_URI || DEFAULT_GITHUB_REGISTRY;
|
|
97
|
+
const registry = getRegistry({
|
|
98
|
+
registryUris: [registryUri],
|
|
99
|
+
enableProxy: true,
|
|
100
|
+
logger: rootLogger,
|
|
101
|
+
});
|
|
102
|
+
logger.info({ registryUri }, '✅ Initialized registry');
|
|
103
|
+
// Get chain metadata from registry
|
|
104
|
+
const chainMetadata = await registry.getMetadata();
|
|
105
|
+
logger.info(`✅ Loaded metadata for ${Object.keys(chainMetadata).length} chains`);
|
|
106
|
+
// Apply RPC URL overrides from environment variables
|
|
107
|
+
applyRpcUrlOverridesFromEnv(chainMetadata);
|
|
108
|
+
// Create MultiProvider with signer
|
|
109
|
+
const multiProvider = new MultiProvider(chainMetadata);
|
|
110
|
+
const rebalancerSigner = new Wallet(rebalancerPrivateKey);
|
|
111
|
+
multiProvider.setSharedSigner(rebalancerSigner);
|
|
112
|
+
logger.info({ rebalancerAddress: rebalancerSigner.address }, '✅ Initialized MultiProvider with rebalancer signer');
|
|
113
|
+
// Build consolidated inventory signers with keys embedded
|
|
114
|
+
const inventorySigners = {};
|
|
115
|
+
for (const [protocol, privateKey] of Object.entries(inventoryPrivateKeys)) {
|
|
116
|
+
if (!privateKey)
|
|
117
|
+
continue;
|
|
118
|
+
let derivedAddress;
|
|
119
|
+
if (protocol === ProtocolType.Ethereum) {
|
|
120
|
+
derivedAddress = new Wallet(privateKey).address;
|
|
121
|
+
}
|
|
122
|
+
else if (protocol === ProtocolType.Sealevel) {
|
|
123
|
+
const keyBytes = parseSolanaPrivateKey(privateKey);
|
|
124
|
+
const keypair = Keypair.fromSecretKey(keyBytes);
|
|
125
|
+
derivedAddress = keypair.publicKey.toBase58();
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
logger.warn({ protocol }, `Unsupported protocol for inventory signer derivation, skipping`);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Validate against config if present
|
|
132
|
+
const configuredAddress = rebalancerConfig.inventorySigners?.[protocol]?.address;
|
|
133
|
+
if (configuredAddress) {
|
|
134
|
+
const mismatch = protocol === ProtocolType.Ethereum
|
|
135
|
+
? configuredAddress.toLowerCase() !== derivedAddress.toLowerCase()
|
|
136
|
+
: configuredAddress !== derivedAddress;
|
|
137
|
+
if (mismatch) {
|
|
138
|
+
throw new Error(`inventorySigners.${protocol} mismatch: config has ${configuredAddress} but HYP_INVENTORY_KEY_${protocol.toUpperCase()} derives to ${derivedAddress}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
inventorySigners[protocol] = {
|
|
142
|
+
address: derivedAddress,
|
|
143
|
+
key: privateKey,
|
|
144
|
+
};
|
|
145
|
+
logger.info({ protocol, address: derivedAddress }, `✅ ${protocol} inventory signer configured`);
|
|
146
|
+
}
|
|
147
|
+
// Fail fast if config references protocol-specific inventory signer but key is missing
|
|
148
|
+
if (!monitorOnly) {
|
|
149
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
150
|
+
if (rebalancerConfig.inventorySigners?.[protocol] &&
|
|
151
|
+
!inventoryPrivateKeys[protocol]) {
|
|
152
|
+
const envKey = `HYP_INVENTORY_KEY_${protocol.toUpperCase()}`;
|
|
153
|
+
const hint = protocol === ProtocolType.Ethereum
|
|
154
|
+
? `${envKey} (or fallback HYP_INVENTORY_KEY)`
|
|
155
|
+
: envKey;
|
|
156
|
+
logger.error({
|
|
157
|
+
inventorySigner: rebalancerConfig.inventorySigners[protocol]?.address,
|
|
158
|
+
}, `Config specifies inventorySigners.${protocol} but ${hint} is not set.`);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Merge runtime keys into config — start from YAML config as base, overlay runtime keys per-protocol.
|
|
164
|
+
// This preserves YAML-only signer addresses (e.g., monitor-only configs) while adding runtime keys.
|
|
165
|
+
const mergedInventorySigners = { ...rebalancerConfig.inventorySigners };
|
|
166
|
+
for (const protocol of Object.values(ProtocolType)) {
|
|
167
|
+
const runtimeSigner = inventorySigners[protocol];
|
|
168
|
+
if (runtimeSigner) {
|
|
169
|
+
mergedInventorySigners[protocol] = {
|
|
170
|
+
...mergedInventorySigners[protocol],
|
|
171
|
+
...runtimeSigner,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const mergedRebalancerConfig = Object.keys(mergedInventorySigners).length > 0
|
|
176
|
+
? new RebalancerConfig(rebalancerConfig.warpRouteId, rebalancerConfig.strategyConfig, rebalancerConfig.intentTTL, mergedInventorySigners, rebalancerConfig.externalBridges)
|
|
177
|
+
: rebalancerConfig;
|
|
178
|
+
// MultiProtocolProvider will be derived from multiProvider in factory
|
|
179
|
+
const multiProtocolProvider = undefined;
|
|
180
|
+
// Create the rebalancer service
|
|
181
|
+
const service = new RebalancerService(multiProvider, multiProtocolProvider, registry, mergedRebalancerConfig, {
|
|
182
|
+
mode: 'daemon',
|
|
183
|
+
checkFrequency,
|
|
184
|
+
monitorOnly,
|
|
185
|
+
withMetrics,
|
|
186
|
+
coingeckoApiKey,
|
|
187
|
+
logger,
|
|
188
|
+
version: VERSION,
|
|
189
|
+
});
|
|
190
|
+
// Start the service
|
|
191
|
+
await service.start();
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
const err = error;
|
|
195
|
+
logger.error({ error: err.message, stack: err.stack }, 'Failed to start rebalancer service');
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Run the service
|
|
200
|
+
main().catch((error) => {
|
|
201
|
+
const err = error;
|
|
202
|
+
rootLogger.error({ error: err.message, stack: err.stack }, 'Fatal error');
|
|
203
|
+
process.exit(1);
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { type Logger } from 'pino';
|
|
2
|
+
import type { ChainMap, ChainName, Token } from '@humanode-hyperlane/sdk';
|
|
3
|
+
import type { IStrategy, InflightContext, RawBalances, Route, RouteWithContext, StrategyRoute } from '../interfaces/IStrategy.js';
|
|
4
|
+
import { type Metrics } from '../metrics/Metrics.js';
|
|
5
|
+
import { type BridgeConfig, type BridgeConfigWithOverride } from '../utils/bridgeUtils.js';
|
|
6
|
+
export type Delta = {
|
|
7
|
+
chain: ChainName;
|
|
8
|
+
amount: bigint;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Base abstract class for rebalancing strategies
|
|
12
|
+
*/
|
|
13
|
+
export declare abstract class BaseStrategy implements IStrategy {
|
|
14
|
+
abstract readonly name: string;
|
|
15
|
+
protected readonly chains: ChainName[];
|
|
16
|
+
protected readonly metrics?: Metrics;
|
|
17
|
+
protected readonly logger: Logger;
|
|
18
|
+
protected readonly bridgeConfigs: ChainMap<BridgeConfigWithOverride>;
|
|
19
|
+
protected readonly tokensByChainName?: ChainMap<Token>;
|
|
20
|
+
constructor(chains: ChainName[], logger: Logger, bridgeConfigs: ChainMap<BridgeConfigWithOverride>, metrics?: Metrics, tokensByChainName?: ChainMap<Token>);
|
|
21
|
+
protected getBridgeConfigForRoute(origin: ChainName, destination: ChainName): BridgeConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Main method to get rebalancing routes
|
|
24
|
+
*/
|
|
25
|
+
getRebalancingRoutes(rawBalances: RawBalances, inflightContext?: InflightContext): StrategyRoute[];
|
|
26
|
+
/**
|
|
27
|
+
* Abstract method to get balances categorized by surplus and deficit
|
|
28
|
+
* Each specific strategy should implement its own logic
|
|
29
|
+
*
|
|
30
|
+
* @param balances - Effective balances (after collateral reservation)
|
|
31
|
+
* @param pendingRebalances - In-flight rebalances (origin tx confirmed, balance already deducted)
|
|
32
|
+
* @param proposedRebalances - Routes from earlier strategies in same cycle (not yet executed)
|
|
33
|
+
* @returns Categorized surpluses and deficits as Delta arrays
|
|
34
|
+
*/
|
|
35
|
+
protected abstract getCategorizedBalances(balances: RawBalances, pendingRebalances?: Route[], proposedRebalances?: StrategyRoute[]): {
|
|
36
|
+
surpluses: Delta[];
|
|
37
|
+
deficits: Delta[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Validates the raw balances against the chains configuration
|
|
41
|
+
*/
|
|
42
|
+
protected validateRawBalances(rawBalances: RawBalances): void;
|
|
43
|
+
/**
|
|
44
|
+
* Reserve collateral for pending user transfers.
|
|
45
|
+
* Subtracts pending transfer amounts from destination balances.
|
|
46
|
+
* This ensures we don't drain collateral needed for incoming transfers.
|
|
47
|
+
*
|
|
48
|
+
* @param rawBalances - Current on-chain balances
|
|
49
|
+
* @param pendingTransfers - Transfers that will need collateral on destination
|
|
50
|
+
* @returns Balances with reserved amounts subtracted
|
|
51
|
+
*/
|
|
52
|
+
protected reserveCollateral(rawBalances: RawBalances, pendingTransfers: Route[]): RawBalances;
|
|
53
|
+
/**
|
|
54
|
+
* Simulate pending rebalances based on execution method.
|
|
55
|
+
*
|
|
56
|
+
* For **movable_collateral** (default):
|
|
57
|
+
* - Add full amount to destination (origin already deducted on-chain)
|
|
58
|
+
*
|
|
59
|
+
* For **inventory**:
|
|
60
|
+
* - Simulate the eventual final state as if the entire intent will be fulfilled
|
|
61
|
+
* - Destination: add unfulfilled amount (total - delivered - awaiting)
|
|
62
|
+
* This is what's NOT yet reflected in on-chain balance
|
|
63
|
+
* - Origin: subtract pending amount (total - delivered)
|
|
64
|
+
* This is what WILL decrease when all messages deliver
|
|
65
|
+
*
|
|
66
|
+
* @param rawBalances - Current balances (may already have collateral reserved)
|
|
67
|
+
* @param pendingRebalances - In-flight rebalance operations (in_progress only)
|
|
68
|
+
* @returns Simulated future balances after rebalances complete
|
|
69
|
+
*/
|
|
70
|
+
protected simulatePendingRebalances(rawBalances: RawBalances, pendingRebalances: RouteWithContext[]): RawBalances;
|
|
71
|
+
/**
|
|
72
|
+
* Simulate proposed rebalances by subtracting from origin AND adding to destination.
|
|
73
|
+
*
|
|
74
|
+
* Unlike pendingRebalances, proposedRebalances are routes from earlier strategies
|
|
75
|
+
* in the same cycle that haven't been executed yet. Therefore:
|
|
76
|
+
* - Origin balance has NOT been deducted on-chain
|
|
77
|
+
* - We must simulate both sides to maintain accurate total balance
|
|
78
|
+
*
|
|
79
|
+
* @param rawBalances - Current balances (may already have pending rebalances simulated)
|
|
80
|
+
* @param proposedRebalances - Routes from earlier strategies (not yet executed)
|
|
81
|
+
* @returns Simulated balances after proposed rebalances complete
|
|
82
|
+
*/
|
|
83
|
+
protected simulateProposedRebalances(rawBalances: RawBalances, proposedRebalances: Route[]): RawBalances;
|
|
84
|
+
protected filterRoutes(routes: StrategyRoute[], actualBalances: RawBalances): StrategyRoute[];
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=BaseStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseStrategy.d.ts","sourceRoot":"","sources":["../../src/strategy/BaseStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAG1E,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,KAAK,EACL,gBAAgB,EAChB,aAAa,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,wBAAwB,EAG9B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,KAAK,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;GAEG;AACH,8BAAsB,YAAa,YAAW,SAAS;IACrD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IACvC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IACrE,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAGrD,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,QAAQ,CAAC,wBAAwB,CAAC,EACjD,OAAO,CAAC,EAAE,OAAO,EACjB,iBAAiB,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;IAarC,SAAS,CAAC,uBAAuB,CAC/B,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,SAAS,GACrB,YAAY;IAIf;;OAEG;IACH,oBAAoB,CAClB,WAAW,EAAE,WAAW,EACxB,eAAe,CAAC,EAAE,eAAe,GAChC,aAAa,EAAE;IAgMlB;;;;;;;;OAQG;IACH,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CACvC,QAAQ,EAAE,WAAW,EACrB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAC3B,kBAAkB,CAAC,EAAE,aAAa,EAAE,GACnC;QACD,SAAS,EAAE,KAAK,EAAE,CAAC;QACnB,QAAQ,EAAE,KAAK,EAAE,CAAC;KACnB;IAED;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAoB7D;;;;;;;;OAQG;IACH,SAAS,CAAC,iBAAiB,CACzB,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,KAAK,EAAE,GACxB,WAAW;IAqCd;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,yBAAyB,CACjC,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,gBAAgB,EAAE,GACpC,WAAW;IAgFd;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,0BAA0B,CAClC,WAAW,EAAE,WAAW,EACxB,kBAAkB,EAAE,KAAK,EAAE,GAC1B,WAAW;IAyCd,SAAS,CAAC,YAAY,CACpB,MAAM,EAAE,aAAa,EAAE,EACvB,cAAc,EAAE,WAAW,GAC1B,aAAa,EAAE;CA8CnB"}
|