@humanode-hyperlane/rebalancer 0.0.0-stage → 27.2.2-humanode.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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,63 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import { fromZodError } from 'zod-validation-error';
|
|
3
|
+
|
|
4
|
+
import type { ProtocolType } from '@humanode-hyperlane/utils';
|
|
5
|
+
import { readYamlOrJson } from '@humanode-hyperlane/utils/fs';
|
|
6
|
+
|
|
7
|
+
import type { InventorySignerConfig } from '../core/InventoryRebalancer.js';
|
|
8
|
+
import {
|
|
9
|
+
type ExternalBridgesConfigSchema,
|
|
10
|
+
type RebalancerConfigFileInput,
|
|
11
|
+
RebalancerConfigSchema,
|
|
12
|
+
type StrategyConfig,
|
|
13
|
+
getStrategyChainNames,
|
|
14
|
+
} from './types.js';
|
|
15
|
+
|
|
16
|
+
type ExternalBridgesConfig = z.infer<typeof ExternalBridgesConfigSchema>;
|
|
17
|
+
|
|
18
|
+
export class RebalancerConfig {
|
|
19
|
+
constructor(
|
|
20
|
+
public readonly warpRouteId: string,
|
|
21
|
+
public readonly strategyConfig: StrategyConfig[],
|
|
22
|
+
public readonly intentTTL: number,
|
|
23
|
+
public readonly inventorySigners?: Partial<
|
|
24
|
+
Record<ProtocolType, InventorySignerConfig>
|
|
25
|
+
>,
|
|
26
|
+
public readonly externalBridges?: ExternalBridgesConfig,
|
|
27
|
+
) {}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Loads config from a file
|
|
31
|
+
* @param configFilePath Path to the config file
|
|
32
|
+
*/
|
|
33
|
+
static load(configFilePath: string) {
|
|
34
|
+
const config: RebalancerConfigFileInput = readYamlOrJson(configFilePath);
|
|
35
|
+
|
|
36
|
+
const validationResult = RebalancerConfigSchema.safeParse(config);
|
|
37
|
+
|
|
38
|
+
if (!validationResult.success) {
|
|
39
|
+
throw new Error(fromZodError(validationResult.error).message);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const {
|
|
43
|
+
warpRouteId,
|
|
44
|
+
strategy,
|
|
45
|
+
intentTTL,
|
|
46
|
+
inventorySigners,
|
|
47
|
+
externalBridges,
|
|
48
|
+
} = validationResult.data;
|
|
49
|
+
|
|
50
|
+
const chainNames = getStrategyChainNames(strategy);
|
|
51
|
+
if (chainNames.length === 0) {
|
|
52
|
+
throw new Error('No chains configured');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return new RebalancerConfig(
|
|
56
|
+
warpRouteId,
|
|
57
|
+
strategy,
|
|
58
|
+
intentTTL,
|
|
59
|
+
inventorySigners,
|
|
60
|
+
externalBridges,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ProtocolType, isAddressEvm } from '@humanode-hyperlane/utils';
|
|
3
|
+
|
|
4
|
+
export enum RebalancerStrategyOptions {
|
|
5
|
+
Weighted = 'weighted',
|
|
6
|
+
MinAmount = 'minAmount',
|
|
7
|
+
CollateralDeficit = 'collateralDeficit',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Weighted strategy config schema
|
|
11
|
+
export const RebalancerWeightedChainConfigSchema = z.object({
|
|
12
|
+
weight: z
|
|
13
|
+
.string()
|
|
14
|
+
.or(z.number())
|
|
15
|
+
.transform((val) => BigInt(val)),
|
|
16
|
+
tolerance: z
|
|
17
|
+
.string()
|
|
18
|
+
.or(z.number())
|
|
19
|
+
.transform((val) => BigInt(val)),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export enum RebalancerMinAmountType {
|
|
23
|
+
Absolute = 'absolute',
|
|
24
|
+
Relative = 'relative',
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Execution type for rebalancing on a chain:
|
|
29
|
+
* - `movableCollateral`: Uses MovableCollateralRouter.rebalance() on-chain (requires bridge address)
|
|
30
|
+
* - `inventory`: Uses external bridges (LiFi) + transferRemote (no bridge address needed)
|
|
31
|
+
*/
|
|
32
|
+
export enum ExecutionType {
|
|
33
|
+
MovableCollateral = 'movableCollateral',
|
|
34
|
+
Inventory = 'inventory',
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export enum ExternalBridgeType {
|
|
38
|
+
LiFi = 'lifi',
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const RebalancerMinAmountConfigSchema = z.object({
|
|
42
|
+
min: z.string().or(z.number()),
|
|
43
|
+
target: z.string().or(z.number()),
|
|
44
|
+
type: z.nativeEnum(RebalancerMinAmountType),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const RebalancerBridgeConfigSchema = z.object({
|
|
48
|
+
bridge: z
|
|
49
|
+
.string()
|
|
50
|
+
.regex(/0x[a-fA-F0-9]{40}/)
|
|
51
|
+
.optional(),
|
|
52
|
+
executionType: z.nativeEnum(ExecutionType).optional(),
|
|
53
|
+
externalBridge: z.nativeEnum(ExternalBridgeType).optional(),
|
|
54
|
+
bridgeMinAcceptedAmount: z.string().or(z.number()).optional(),
|
|
55
|
+
bridgeLockTime: z
|
|
56
|
+
.number()
|
|
57
|
+
.positive()
|
|
58
|
+
.transform((val) => val * 1_000)
|
|
59
|
+
.optional(),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
export const RebalancerBaseChainConfigSchema =
|
|
63
|
+
RebalancerBridgeConfigSchema.extend({
|
|
64
|
+
override: z
|
|
65
|
+
.record(z.string(), RebalancerBridgeConfigSchema.partial().passthrough())
|
|
66
|
+
.optional(),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Schemas for strategy-specific chain configs
|
|
70
|
+
const WeightedChainConfigSchema = RebalancerBaseChainConfigSchema.extend({
|
|
71
|
+
weighted: RebalancerWeightedChainConfigSchema,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const MinAmountChainConfigSchema = RebalancerBaseChainConfigSchema.extend({
|
|
75
|
+
minAmount: RebalancerMinAmountConfigSchema,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const CollateralDeficitChainConfigSchema =
|
|
79
|
+
RebalancerBaseChainConfigSchema.extend({
|
|
80
|
+
buffer: z.string().or(z.number()),
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const WeightedStrategySchema = z.object({
|
|
84
|
+
rebalanceStrategy: z.literal(RebalancerStrategyOptions.Weighted),
|
|
85
|
+
chains: z.record(z.string(), WeightedChainConfigSchema),
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const MinAmountStrategySchema = z.object({
|
|
89
|
+
rebalanceStrategy: z.literal(RebalancerStrategyOptions.MinAmount),
|
|
90
|
+
chains: z.record(z.string(), MinAmountChainConfigSchema),
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
const CollateralDeficitStrategySchema = z.object({
|
|
94
|
+
rebalanceStrategy: z.literal(RebalancerStrategyOptions.CollateralDeficit),
|
|
95
|
+
chains: z.record(z.string(), CollateralDeficitChainConfigSchema),
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
export type WeightedStrategy = z.infer<typeof WeightedStrategySchema>;
|
|
99
|
+
export type MinAmountStrategy = z.infer<typeof MinAmountStrategySchema>;
|
|
100
|
+
export type CollateralDeficitStrategy = z.infer<
|
|
101
|
+
typeof CollateralDeficitStrategySchema
|
|
102
|
+
>;
|
|
103
|
+
|
|
104
|
+
export type WeightedStrategyConfig = WeightedStrategy['chains'];
|
|
105
|
+
export type MinAmountStrategyConfig = MinAmountStrategy['chains'];
|
|
106
|
+
export type CollateralDeficitStrategyConfig =
|
|
107
|
+
CollateralDeficitStrategy['chains'];
|
|
108
|
+
|
|
109
|
+
export const StrategyConfigSchema = z.discriminatedUnion('rebalanceStrategy', [
|
|
110
|
+
WeightedStrategySchema,
|
|
111
|
+
MinAmountStrategySchema,
|
|
112
|
+
CollateralDeficitStrategySchema,
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
export const RebalancerStrategySchema = z
|
|
116
|
+
.union([StrategyConfigSchema, z.array(StrategyConfigSchema).min(1)])
|
|
117
|
+
.transform((val) => (Array.isArray(val) ? val : [val]));
|
|
118
|
+
|
|
119
|
+
export const DEFAULT_INTENT_TTL_S = 604800; // 7 days
|
|
120
|
+
export const DEFAULT_INTENT_TTL_MS = DEFAULT_INTENT_TTL_S * 1_000;
|
|
121
|
+
|
|
122
|
+
export const DEFAULT_MOVEMENT_STALENESS_MS = 30 * 60 * 1_000; // 30 minutes
|
|
123
|
+
|
|
124
|
+
export const LiFiBridgeConfigSchema = z.object({
|
|
125
|
+
integrator: z.string(),
|
|
126
|
+
defaultSlippage: z.number().optional(),
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
export const ExternalBridgesConfigSchema = z.object({
|
|
130
|
+
lifi: LiFiBridgeConfigSchema.optional(),
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
export const RebalancerConfigSchema = z
|
|
134
|
+
.object({
|
|
135
|
+
warpRouteId: z.string(),
|
|
136
|
+
strategy: RebalancerStrategySchema,
|
|
137
|
+
inventorySigners: z
|
|
138
|
+
.record(
|
|
139
|
+
z.nativeEnum(ProtocolType),
|
|
140
|
+
z.union([
|
|
141
|
+
z.object({ address: z.string(), key: z.string().optional() }),
|
|
142
|
+
z.string().transform((address) => ({ address })),
|
|
143
|
+
]),
|
|
144
|
+
)
|
|
145
|
+
.optional(),
|
|
146
|
+
externalBridges: ExternalBridgesConfigSchema.optional(),
|
|
147
|
+
intentTTL: z
|
|
148
|
+
.number()
|
|
149
|
+
.positive()
|
|
150
|
+
.default(DEFAULT_INTENT_TTL_S)
|
|
151
|
+
.describe(
|
|
152
|
+
'Max age in seconds before in-progress intent is expired. Default 7 days.',
|
|
153
|
+
)
|
|
154
|
+
.transform((val) => val * 1_000),
|
|
155
|
+
})
|
|
156
|
+
.superRefine((config, ctx) => {
|
|
157
|
+
// CollateralDeficitStrategy must be first in composite if it is used
|
|
158
|
+
if (config.strategy.length > 1) {
|
|
159
|
+
const hasCollateralDeficit = config.strategy.some(
|
|
160
|
+
(s) =>
|
|
161
|
+
s.rebalanceStrategy === RebalancerStrategyOptions.CollateralDeficit,
|
|
162
|
+
);
|
|
163
|
+
const collateralDeficitFirst =
|
|
164
|
+
config.strategy[0].rebalanceStrategy ===
|
|
165
|
+
RebalancerStrategyOptions.CollateralDeficit;
|
|
166
|
+
|
|
167
|
+
if (hasCollateralDeficit && !collateralDeficitFirst) {
|
|
168
|
+
ctx.addIssue({
|
|
169
|
+
code: z.ZodIssueCode.custom,
|
|
170
|
+
message:
|
|
171
|
+
'CollateralDeficitStrategy must be first when used in composite strategy',
|
|
172
|
+
path: ['strategy'],
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Validate each strategy in the array
|
|
178
|
+
for (
|
|
179
|
+
let strategyIndex = 0;
|
|
180
|
+
strategyIndex < config.strategy.length;
|
|
181
|
+
strategyIndex++
|
|
182
|
+
) {
|
|
183
|
+
const strategy = config.strategy[strategyIndex];
|
|
184
|
+
const chainNames = new Set(Object.keys(strategy.chains));
|
|
185
|
+
|
|
186
|
+
// Check each chain's overrides
|
|
187
|
+
for (const [chainName, chainConfig] of Object.entries(strategy.chains)) {
|
|
188
|
+
if ('override' in chainConfig && chainConfig.override) {
|
|
189
|
+
for (const overrideChainName of Object.keys(chainConfig.override)) {
|
|
190
|
+
// Each override key must reference a valid chain
|
|
191
|
+
if (!chainNames.has(overrideChainName)) {
|
|
192
|
+
ctx.addIssue({
|
|
193
|
+
code: z.ZodIssueCode.custom,
|
|
194
|
+
message: `Chain '${chainName}' has an override for '${overrideChainName}', but '${overrideChainName}' is not defined in the config`,
|
|
195
|
+
path: [
|
|
196
|
+
'strategy',
|
|
197
|
+
strategyIndex,
|
|
198
|
+
'chains',
|
|
199
|
+
chainName,
|
|
200
|
+
'override',
|
|
201
|
+
overrideChainName,
|
|
202
|
+
],
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Override shouldn't be self-referencing
|
|
207
|
+
if (chainName === overrideChainName) {
|
|
208
|
+
ctx.addIssue({
|
|
209
|
+
code: z.ZodIssueCode.custom,
|
|
210
|
+
message: `Chain '${chainName}' has an override for '${chainName}', but '${chainName}' is self-referencing`,
|
|
211
|
+
path: [
|
|
212
|
+
'strategy',
|
|
213
|
+
strategyIndex,
|
|
214
|
+
'chains',
|
|
215
|
+
chainName,
|
|
216
|
+
'override',
|
|
217
|
+
overrideChainName,
|
|
218
|
+
],
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (strategy.rebalanceStrategy === RebalancerStrategyOptions.MinAmount) {
|
|
226
|
+
const minAmountChainsTypes = Object.values(strategy.chains).map(
|
|
227
|
+
(c) => c.minAmount.type,
|
|
228
|
+
);
|
|
229
|
+
if (new Set(minAmountChainsTypes).size > 1) {
|
|
230
|
+
ctx.addIssue({
|
|
231
|
+
code: z.ZodIssueCode.custom,
|
|
232
|
+
message: `All chains must use the same minAmount type.`,
|
|
233
|
+
path: ['strategy', strategyIndex, 'chains'],
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Validate bridge requirement based on executionType
|
|
239
|
+
for (const [chainName, chainConfig] of Object.entries(strategy.chains)) {
|
|
240
|
+
const executionType =
|
|
241
|
+
chainConfig.executionType ?? ExecutionType.MovableCollateral;
|
|
242
|
+
|
|
243
|
+
// bridge is required for movableCollateral execution type
|
|
244
|
+
if (
|
|
245
|
+
executionType === ExecutionType.MovableCollateral &&
|
|
246
|
+
!chainConfig.bridge
|
|
247
|
+
) {
|
|
248
|
+
ctx.addIssue({
|
|
249
|
+
code: z.ZodIssueCode.custom,
|
|
250
|
+
message: `Chain '${chainName}' uses movableCollateral execution but has no 'bridge' address`,
|
|
251
|
+
path: ['strategy', strategyIndex, 'chains', chainName, 'bridge'],
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// externalBridge is required for inventory execution type
|
|
256
|
+
if (
|
|
257
|
+
executionType === ExecutionType.Inventory &&
|
|
258
|
+
!chainConfig.externalBridge
|
|
259
|
+
) {
|
|
260
|
+
ctx.addIssue({
|
|
261
|
+
code: z.ZodIssueCode.custom,
|
|
262
|
+
message: `Chain '${chainName}' uses inventory execution but has no 'externalBridge' configured`,
|
|
263
|
+
path: [
|
|
264
|
+
'strategy',
|
|
265
|
+
strategyIndex,
|
|
266
|
+
'chains',
|
|
267
|
+
chainName,
|
|
268
|
+
'externalBridge',
|
|
269
|
+
],
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Validate override content by merging override onto base config.
|
|
274
|
+
if ('override' in chainConfig && chainConfig.override) {
|
|
275
|
+
for (const [destination, destinationOverride] of Object.entries(
|
|
276
|
+
chainConfig.override,
|
|
277
|
+
)) {
|
|
278
|
+
const mergedConfig = {
|
|
279
|
+
...chainConfig,
|
|
280
|
+
...(destinationOverride as Record<string, unknown>),
|
|
281
|
+
};
|
|
282
|
+
const mergedExecutionType =
|
|
283
|
+
(mergedConfig.executionType as ExecutionType | undefined) ??
|
|
284
|
+
ExecutionType.MovableCollateral;
|
|
285
|
+
|
|
286
|
+
if (
|
|
287
|
+
mergedExecutionType === ExecutionType.MovableCollateral &&
|
|
288
|
+
!mergedConfig.bridge
|
|
289
|
+
) {
|
|
290
|
+
ctx.addIssue({
|
|
291
|
+
code: z.ZodIssueCode.custom,
|
|
292
|
+
message: `Chain '${chainName}' override for '${destination}' uses movableCollateral execution but has no 'bridge' address`,
|
|
293
|
+
path: [
|
|
294
|
+
'strategy',
|
|
295
|
+
strategyIndex,
|
|
296
|
+
'chains',
|
|
297
|
+
chainName,
|
|
298
|
+
'override',
|
|
299
|
+
destination,
|
|
300
|
+
'bridge',
|
|
301
|
+
],
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (
|
|
306
|
+
mergedExecutionType === ExecutionType.Inventory &&
|
|
307
|
+
!mergedConfig.externalBridge
|
|
308
|
+
) {
|
|
309
|
+
ctx.addIssue({
|
|
310
|
+
code: z.ZodIssueCode.custom,
|
|
311
|
+
message: `Chain '${chainName}' override for '${destination}' uses inventory execution but has no 'externalBridge' configured`,
|
|
312
|
+
path: [
|
|
313
|
+
'strategy',
|
|
314
|
+
strategyIndex,
|
|
315
|
+
'chains',
|
|
316
|
+
chainName,
|
|
317
|
+
'override',
|
|
318
|
+
destination,
|
|
319
|
+
'externalBridge',
|
|
320
|
+
],
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const hasInventory = hasInventoryChains(config.strategy);
|
|
329
|
+
|
|
330
|
+
if (hasInventory) {
|
|
331
|
+
if (
|
|
332
|
+
!config.inventorySigners ||
|
|
333
|
+
!Object.keys(config.inventorySigners).length
|
|
334
|
+
) {
|
|
335
|
+
ctx.addIssue({
|
|
336
|
+
code: z.ZodIssueCode.custom,
|
|
337
|
+
message:
|
|
338
|
+
'inventorySigners is required when any chain uses inventory execution type',
|
|
339
|
+
path: ['inventorySigners'],
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Validate address format per protocol
|
|
344
|
+
if (config.inventorySigners) {
|
|
345
|
+
for (const [protocol, signerConfig] of Object.entries(
|
|
346
|
+
config.inventorySigners,
|
|
347
|
+
)) {
|
|
348
|
+
if (protocol === ProtocolType.Ethereum) {
|
|
349
|
+
if (!isAddressEvm(signerConfig.address)) {
|
|
350
|
+
ctx.addIssue({
|
|
351
|
+
code: z.ZodIssueCode.custom,
|
|
352
|
+
message: `inventorySigners.${protocol} must be a valid EVM address, got: ${signerConfig.address}`,
|
|
353
|
+
path: ['inventorySigners', protocol],
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
} else if (protocol === ProtocolType.Sealevel) {
|
|
357
|
+
if (!/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(signerConfig.address)) {
|
|
358
|
+
ctx.addIssue({
|
|
359
|
+
code: z.ZodIssueCode.custom,
|
|
360
|
+
message: `inventorySigners.${protocol} must be a valid Solana base58 address (32-44 chars), got: ${signerConfig.address}`,
|
|
361
|
+
path: ['inventorySigners', protocol],
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Other protocols: accept any non-empty string (future-proof)
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (!config.externalBridges?.lifi?.integrator) {
|
|
370
|
+
ctx.addIssue({
|
|
371
|
+
code: z.ZodIssueCode.custom,
|
|
372
|
+
message:
|
|
373
|
+
'externalBridges.lifi is required when using inventory execution',
|
|
374
|
+
path: ['externalBridges', 'lifi'],
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
for (
|
|
380
|
+
let strategyIndex = 0;
|
|
381
|
+
strategyIndex < config.strategy.length;
|
|
382
|
+
strategyIndex++
|
|
383
|
+
) {
|
|
384
|
+
const strategy = config.strategy[strategyIndex];
|
|
385
|
+
for (const [chainName, chainConfig] of Object.entries(strategy.chains)) {
|
|
386
|
+
const checkLifiBridge = (
|
|
387
|
+
externalBridge: ExternalBridgeType | undefined,
|
|
388
|
+
path: (string | number)[],
|
|
389
|
+
) => {
|
|
390
|
+
if (
|
|
391
|
+
externalBridge === ExternalBridgeType.LiFi &&
|
|
392
|
+
!config.externalBridges?.lifi?.integrator
|
|
393
|
+
) {
|
|
394
|
+
ctx.addIssue({
|
|
395
|
+
code: z.ZodIssueCode.custom,
|
|
396
|
+
message: `Chain '${chainName}' uses externalBridge: 'lifi' but externalBridges.lifi is not configured`,
|
|
397
|
+
path,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
checkLifiBridge(chainConfig.externalBridge, [
|
|
403
|
+
'externalBridges',
|
|
404
|
+
'lifi',
|
|
405
|
+
]);
|
|
406
|
+
|
|
407
|
+
if (chainConfig.override) {
|
|
408
|
+
for (const [destination, overrideConfig] of Object.entries(
|
|
409
|
+
chainConfig.override,
|
|
410
|
+
)) {
|
|
411
|
+
const merged = {
|
|
412
|
+
...chainConfig,
|
|
413
|
+
...(overrideConfig as Record<string, unknown>),
|
|
414
|
+
};
|
|
415
|
+
checkLifiBridge(
|
|
416
|
+
merged.externalBridge as ExternalBridgeType | undefined,
|
|
417
|
+
[
|
|
418
|
+
'strategy',
|
|
419
|
+
strategyIndex,
|
|
420
|
+
'chains',
|
|
421
|
+
chainName,
|
|
422
|
+
'override',
|
|
423
|
+
destination,
|
|
424
|
+
'externalBridge',
|
|
425
|
+
],
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
// Define separate types for each strategy config
|
|
434
|
+
export type RebalancerWeightedChainConfig = z.infer<
|
|
435
|
+
typeof RebalancerWeightedChainConfigSchema
|
|
436
|
+
>;
|
|
437
|
+
export type RebalancerMinAmountChainConfig = z.infer<
|
|
438
|
+
typeof RebalancerMinAmountConfigSchema
|
|
439
|
+
>;
|
|
440
|
+
export type CollateralDeficitChainConfig = z.infer<
|
|
441
|
+
typeof CollateralDeficitChainConfigSchema
|
|
442
|
+
>;
|
|
443
|
+
|
|
444
|
+
export type StrategyConfig = z.infer<typeof StrategyConfigSchema>;
|
|
445
|
+
|
|
446
|
+
export type RebalancerConfig = z.infer<typeof RebalancerConfigSchema>;
|
|
447
|
+
export type RebalancerConfigFileInput = z.input<typeof RebalancerConfigSchema>;
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Get all unique chain names from strategy config array.
|
|
451
|
+
*/
|
|
452
|
+
export function getStrategyChainNames(strategies: StrategyConfig[]): string[] {
|
|
453
|
+
const chainSet = new Set<string>();
|
|
454
|
+
for (const strategy of strategies) {
|
|
455
|
+
Object.keys(strategy.chains).forEach((chain) => chainSet.add(chain));
|
|
456
|
+
}
|
|
457
|
+
return Array.from(chainSet);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Get chain config from the first strategy that has it.
|
|
462
|
+
* Returns undefined if no strategy has the chain.
|
|
463
|
+
*/
|
|
464
|
+
export function getStrategyChainConfig(
|
|
465
|
+
strategies: StrategyConfig[],
|
|
466
|
+
chainName: string,
|
|
467
|
+
): StrategyConfig['chains'][string] | undefined {
|
|
468
|
+
for (const strategy of strategies) {
|
|
469
|
+
if (chainName in strategy.chains) {
|
|
470
|
+
return strategy.chains[chainName];
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
return undefined;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Get all unique bridge addresses from all strategies and their overrides.
|
|
478
|
+
* This is used by ActionTracker to detect inflight rebalances across all configured bridges.
|
|
479
|
+
*/
|
|
480
|
+
export function getAllBridges(strategies: StrategyConfig[]): string[] {
|
|
481
|
+
const bridges = new Set<string>();
|
|
482
|
+
|
|
483
|
+
for (const strategy of strategies) {
|
|
484
|
+
for (const chainConfig of Object.values(strategy.chains)) {
|
|
485
|
+
if (chainConfig.bridge) {
|
|
486
|
+
bridges.add(chainConfig.bridge);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (chainConfig.override) {
|
|
490
|
+
for (const overrideConfig of Object.values(chainConfig.override)) {
|
|
491
|
+
const override = overrideConfig as { bridge?: string };
|
|
492
|
+
if (override.bridge) {
|
|
493
|
+
bridges.add(override.bridge);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
return Array.from(bridges);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Get the execution type for a chain.
|
|
505
|
+
* Returns the executionType from chain config, or MovableCollateral as default.
|
|
506
|
+
*/
|
|
507
|
+
export function getChainExecutionType(
|
|
508
|
+
strategies: StrategyConfig[],
|
|
509
|
+
chainName: string,
|
|
510
|
+
): ExecutionType {
|
|
511
|
+
const chainConfig = getStrategyChainConfig(strategies, chainName);
|
|
512
|
+
return chainConfig?.executionType ?? ExecutionType.MovableCollateral;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Extract the executionType from an override config object.
|
|
517
|
+
* Returns undefined if the override config doesn't have an executionType field.
|
|
518
|
+
*/
|
|
519
|
+
export function getOverrideExecutionType(
|
|
520
|
+
overrideConfig: unknown,
|
|
521
|
+
): ExecutionType | undefined {
|
|
522
|
+
return typeof overrideConfig === 'object' &&
|
|
523
|
+
overrideConfig !== null &&
|
|
524
|
+
'executionType' in overrideConfig
|
|
525
|
+
? (overrideConfig as { executionType?: ExecutionType }).executionType
|
|
526
|
+
: undefined;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Get the names of all chains that use inventory execution type.
|
|
531
|
+
* Includes both top-level inventory chains and override destination chains
|
|
532
|
+
* where the override sets executionType to inventory.
|
|
533
|
+
*/
|
|
534
|
+
export function getInventoryChainNames(strategies: StrategyConfig[]): string[] {
|
|
535
|
+
return Array.from(
|
|
536
|
+
new Set(
|
|
537
|
+
strategies.flatMap((strategy) => {
|
|
538
|
+
const chainEntries = Object.entries(strategy.chains);
|
|
539
|
+
const topLevelInventoryChains = chainEntries
|
|
540
|
+
.filter(
|
|
541
|
+
([, chainConfig]) =>
|
|
542
|
+
chainConfig.executionType === ExecutionType.Inventory,
|
|
543
|
+
)
|
|
544
|
+
.map(([chainName]) => chainName);
|
|
545
|
+
|
|
546
|
+
const overrideInventoryChains = chainEntries.flatMap(
|
|
547
|
+
([, chainConfig]) => {
|
|
548
|
+
if (!chainConfig.override) {
|
|
549
|
+
return [];
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
const overrideEntries = Object.entries(chainConfig.override);
|
|
553
|
+
|
|
554
|
+
return overrideEntries
|
|
555
|
+
.filter(([, overrideConfig]) => {
|
|
556
|
+
const overrideExecutionType =
|
|
557
|
+
getOverrideExecutionType(overrideConfig);
|
|
558
|
+
|
|
559
|
+
return (
|
|
560
|
+
(overrideExecutionType ??
|
|
561
|
+
chainConfig.executionType ??
|
|
562
|
+
ExecutionType.MovableCollateral) === ExecutionType.Inventory
|
|
563
|
+
);
|
|
564
|
+
})
|
|
565
|
+
.map(([destinationChain]) => destinationChain);
|
|
566
|
+
},
|
|
567
|
+
);
|
|
568
|
+
|
|
569
|
+
return [...topLevelInventoryChains, ...overrideInventoryChains];
|
|
570
|
+
}),
|
|
571
|
+
),
|
|
572
|
+
);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
export function getInventoryOriginChainNames(
|
|
576
|
+
strategies: StrategyConfig[],
|
|
577
|
+
): string[] {
|
|
578
|
+
return Array.from(
|
|
579
|
+
new Set(
|
|
580
|
+
strategies.flatMap((strategy) => {
|
|
581
|
+
return Object.entries(strategy.chains).flatMap(
|
|
582
|
+
([originChainName, chainConfig]) => {
|
|
583
|
+
if (!chainConfig.override) {
|
|
584
|
+
return [];
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
const hasInventoryOverride = Object.values(
|
|
588
|
+
chainConfig.override,
|
|
589
|
+
).some((overrideConfig) => {
|
|
590
|
+
const overrideExecutionType =
|
|
591
|
+
getOverrideExecutionType(overrideConfig);
|
|
592
|
+
|
|
593
|
+
return (
|
|
594
|
+
(overrideExecutionType ??
|
|
595
|
+
chainConfig.executionType ??
|
|
596
|
+
ExecutionType.MovableCollateral) === ExecutionType.Inventory
|
|
597
|
+
);
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
return hasInventoryOverride ? [originChainName] : [];
|
|
601
|
+
},
|
|
602
|
+
);
|
|
603
|
+
}),
|
|
604
|
+
),
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/**
|
|
609
|
+
* Check if any chain in the strategies uses inventory execution type.
|
|
610
|
+
*/
|
|
611
|
+
export function hasInventoryChains(strategies: StrategyConfig[]): boolean {
|
|
612
|
+
return getInventoryChainNames(strategies).length > 0;
|
|
613
|
+
}
|