@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,213 @@
|
|
|
1
|
+
import type { Address, Domain } from '@humanode-hyperlane/utils';
|
|
2
|
+
|
|
3
|
+
import type { ExternalBridgeType } from '../config/types.js';
|
|
4
|
+
import type { ExternalBridgeRegistry } from '../interfaces/IExternalBridge.js';
|
|
5
|
+
import type { ConfirmedBlockTags } from '../interfaces/IMonitor.js';
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
ActionType,
|
|
9
|
+
ExecutionMethod,
|
|
10
|
+
PartialInventoryIntent,
|
|
11
|
+
RebalanceAction,
|
|
12
|
+
RebalanceIntent,
|
|
13
|
+
Transfer,
|
|
14
|
+
} from './types.js';
|
|
15
|
+
|
|
16
|
+
export interface CreateRebalanceIntentParams {
|
|
17
|
+
origin: Domain;
|
|
18
|
+
destination: Domain;
|
|
19
|
+
amount: bigint;
|
|
20
|
+
bridge?: Address;
|
|
21
|
+
priority?: number;
|
|
22
|
+
strategyType?: string;
|
|
23
|
+
executionMethod?: ExecutionMethod;
|
|
24
|
+
externalBridge?: ExternalBridgeType;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface CreateRebalanceActionParams {
|
|
28
|
+
intentId: string;
|
|
29
|
+
origin: Domain;
|
|
30
|
+
destination: Domain;
|
|
31
|
+
amount: bigint;
|
|
32
|
+
type: ActionType; // Required - type of action being created
|
|
33
|
+
messageId?: string; // Optional - not needed for inventory_movement
|
|
34
|
+
txHash?: string;
|
|
35
|
+
externalBridgeTransferId?: string; // Optional - for inventory_movement (external transfer bridge ID)
|
|
36
|
+
externalBridgeId?: ExternalBridgeType; // Optional - for inventory_movement (e.g., 'lifi')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* ActionTracker manages the lifecycle of tracked entities:
|
|
41
|
+
* - Transfers: Inflight user warp transfers
|
|
42
|
+
* - RebalanceIntents: Intents to move collateral
|
|
43
|
+
* - RebalanceActions: On-chain actions to fulfill intents
|
|
44
|
+
*/
|
|
45
|
+
export interface IActionTracker {
|
|
46
|
+
// === Lifecycle ===
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Initialize the tracker by loading state from Explorer and on-chain data.
|
|
50
|
+
* Called once on startup.
|
|
51
|
+
*/
|
|
52
|
+
initialize(): Promise<void>;
|
|
53
|
+
|
|
54
|
+
// === Sync Operations ===
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Sync inflight user transfers from Explorer and verify delivery status.
|
|
58
|
+
* @param confirmedBlockTags Optional block tags from Monitor for consistent state queries
|
|
59
|
+
*/
|
|
60
|
+
syncTransfers(confirmedBlockTags?: ConfirmedBlockTags): Promise<void>;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Sync rebalance intents by checking fulfillment status.
|
|
64
|
+
*/
|
|
65
|
+
syncRebalanceIntents(): Promise<void>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Sync rebalance actions by verifying on-chain message delivery.
|
|
69
|
+
* @param confirmedBlockTags Optional block tags from Monitor for consistent state queries
|
|
70
|
+
*/
|
|
71
|
+
syncRebalanceActions(confirmedBlockTags?: ConfirmedBlockTags): Promise<void>;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Sync inventory_movement actions by checking their status via external bridge API.
|
|
75
|
+
* This is separate from syncRebalanceActions because inventory_movement actions
|
|
76
|
+
* don't use Hyperlane messages and need to query the bridge's status API.
|
|
77
|
+
*
|
|
78
|
+
* @param externalBridgeRegistry - Bridge registry to query for status
|
|
79
|
+
* @returns Count of completed and failed actions
|
|
80
|
+
*/
|
|
81
|
+
syncInventoryMovementActions(
|
|
82
|
+
externalBridgeRegistry: Partial<ExternalBridgeRegistry>,
|
|
83
|
+
): Promise<{ completed: number; failed: number }>;
|
|
84
|
+
|
|
85
|
+
// === Transfer Queries ===
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get a single transfer by ID.
|
|
89
|
+
*/
|
|
90
|
+
getTransfer(id: string): Promise<Transfer | undefined>;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Get all transfers currently in progress.
|
|
94
|
+
*/
|
|
95
|
+
getInProgressTransfers(): Promise<Transfer[]>;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get all transfers destined for a specific domain.
|
|
99
|
+
*/
|
|
100
|
+
getTransfersByDestination(destination: Domain): Promise<Transfer[]>;
|
|
101
|
+
|
|
102
|
+
// === RebalanceIntent Queries ===
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Get a single rebalance intent by ID.
|
|
106
|
+
*/
|
|
107
|
+
getRebalanceIntent(id: string): Promise<RebalanceIntent | undefined>;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Get all active rebalance intents (not_started + in_progress).
|
|
111
|
+
*/
|
|
112
|
+
getActiveRebalanceIntents(): Promise<RebalanceIntent[]>;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Get all rebalance intents destined for a specific domain.
|
|
116
|
+
*/
|
|
117
|
+
getRebalanceIntentsByDestination(
|
|
118
|
+
destination: Domain,
|
|
119
|
+
): Promise<RebalanceIntent[]>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Returns inventory intents that have remaining work.
|
|
123
|
+
* Intents with in-flight deposits are included but marked via hasInflightDeposit —
|
|
124
|
+
* callers must check before continuing.
|
|
125
|
+
* Returns enriched data with computed values derived from action states.
|
|
126
|
+
*/
|
|
127
|
+
getPartiallyFulfilledInventoryIntents(): Promise<PartialInventoryIntent[]>;
|
|
128
|
+
|
|
129
|
+
// === RebalanceIntent Management ===
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Create a new rebalance intent.
|
|
133
|
+
* Initial status: 'not_started'
|
|
134
|
+
*/
|
|
135
|
+
createRebalanceIntent(
|
|
136
|
+
params: CreateRebalanceIntentParams,
|
|
137
|
+
): Promise<RebalanceIntent>;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Mark a rebalance intent as complete.
|
|
141
|
+
*/
|
|
142
|
+
completeRebalanceIntent(id: string): Promise<void>;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Cancel a rebalance intent.
|
|
146
|
+
* Used for deliberate stops (e.g., stale fulfillment).
|
|
147
|
+
*/
|
|
148
|
+
cancelRebalanceIntent(id: string): Promise<void>;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Mark a rebalance intent as failed.
|
|
152
|
+
* Used when tx execution was attempted but failed.
|
|
153
|
+
*/
|
|
154
|
+
failRebalanceIntent(id: string): Promise<void>;
|
|
155
|
+
|
|
156
|
+
// === RebalanceAction Queries ===
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Get actions filtered by type.
|
|
160
|
+
* @param type - Action type to filter by
|
|
161
|
+
*/
|
|
162
|
+
getActionsByType(type: ActionType): Promise<RebalanceAction[]>;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Get all actions associated with a specific intent.
|
|
166
|
+
* @param intentId - ID of the intent
|
|
167
|
+
*/
|
|
168
|
+
getActionsForIntent(intentId: string): Promise<RebalanceAction[]>;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Get total inflight inventory movement amount from a specific chain.
|
|
172
|
+
* Returns the sum of amounts for all in_progress inventory_movement actions
|
|
173
|
+
* that originate from the specified domain.
|
|
174
|
+
*
|
|
175
|
+
* @param origin - Domain ID of the origin chain
|
|
176
|
+
* @returns Total amount being moved out via inventory movements
|
|
177
|
+
*/
|
|
178
|
+
getInflightInventoryMovements(origin: Domain): Promise<bigint>;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Get a single rebalance action by ID.
|
|
182
|
+
*/
|
|
183
|
+
getRebalanceAction(id: string): Promise<RebalanceAction | undefined>;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Get all rebalance actions currently in progress.
|
|
187
|
+
*/
|
|
188
|
+
getInProgressActions(): Promise<RebalanceAction[]>;
|
|
189
|
+
|
|
190
|
+
// === RebalanceAction Management ===
|
|
191
|
+
|
|
192
|
+
createRebalanceAction(
|
|
193
|
+
params: CreateRebalanceActionParams,
|
|
194
|
+
): Promise<RebalanceAction>;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Mark a rebalance action as complete.
|
|
198
|
+
* Checks if parent intent is now fully fulfilled and marks it complete if so.
|
|
199
|
+
*/
|
|
200
|
+
completeRebalanceAction(id: string): Promise<void>;
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Mark a rebalance action as failed.
|
|
204
|
+
*/
|
|
205
|
+
failRebalanceAction(id: string): Promise<void>;
|
|
206
|
+
|
|
207
|
+
// === Debug ===
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Log the contents of all stores for debugging purposes.
|
|
211
|
+
*/
|
|
212
|
+
logStoreContents(): Promise<void>;
|
|
213
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import Sinon from 'sinon';
|
|
3
|
+
|
|
4
|
+
import type { MultiProvider } from '@humanode-hyperlane/sdk';
|
|
5
|
+
|
|
6
|
+
import type { IActionTracker } from './IActionTracker.js';
|
|
7
|
+
import { InflightContextAdapter } from './InflightContextAdapter.js';
|
|
8
|
+
import type { RebalanceIntent, Transfer } from './types.js';
|
|
9
|
+
|
|
10
|
+
describe('InflightContextAdapter', () => {
|
|
11
|
+
let actionTracker: Sinon.SinonStubbedInstance<IActionTracker>;
|
|
12
|
+
let multiProvider: Sinon.SinonStubbedInstance<MultiProvider>;
|
|
13
|
+
let adapter: InflightContextAdapter;
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
actionTracker = {
|
|
17
|
+
getActiveRebalanceIntents: Sinon.stub(),
|
|
18
|
+
getInProgressTransfers: Sinon.stub(),
|
|
19
|
+
getActionsForIntent: Sinon.stub(),
|
|
20
|
+
} as any;
|
|
21
|
+
|
|
22
|
+
multiProvider = {
|
|
23
|
+
getChainName: Sinon.stub(),
|
|
24
|
+
} as any;
|
|
25
|
+
|
|
26
|
+
adapter = new InflightContextAdapter(
|
|
27
|
+
actionTracker as any,
|
|
28
|
+
multiProvider as any,
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
Sinon.restore();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('getInflightContext', () => {
|
|
37
|
+
it('should return both pendingRebalances and pendingTransfers', async () => {
|
|
38
|
+
const mockIntents: RebalanceIntent[] = [
|
|
39
|
+
{
|
|
40
|
+
id: 'intent1',
|
|
41
|
+
origin: 1,
|
|
42
|
+
destination: 2,
|
|
43
|
+
amount: 1000n,
|
|
44
|
+
status: 'not_started',
|
|
45
|
+
createdAt: Date.now(),
|
|
46
|
+
updatedAt: Date.now(),
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
const mockTransfers: Transfer[] = [
|
|
51
|
+
{
|
|
52
|
+
id: 'transfer1',
|
|
53
|
+
origin: 1,
|
|
54
|
+
destination: 2,
|
|
55
|
+
amount: 500n,
|
|
56
|
+
messageId: '0x123',
|
|
57
|
+
sender: '0xabc' as any,
|
|
58
|
+
recipient: '0xdef' as any,
|
|
59
|
+
status: 'in_progress',
|
|
60
|
+
createdAt: Date.now(),
|
|
61
|
+
updatedAt: Date.now(),
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
actionTracker.getActiveRebalanceIntents.resolves(mockIntents);
|
|
66
|
+
actionTracker.getInProgressTransfers.resolves(mockTransfers);
|
|
67
|
+
actionTracker.getActionsForIntent.resolves([]); // No actions
|
|
68
|
+
multiProvider.getChainName.withArgs(1).returns('ethereum');
|
|
69
|
+
multiProvider.getChainName.withArgs(2).returns('arbitrum');
|
|
70
|
+
|
|
71
|
+
const result = await adapter.getInflightContext();
|
|
72
|
+
|
|
73
|
+
expect(result.pendingRebalances).to.have.lengthOf(1);
|
|
74
|
+
expect(result.pendingRebalances[0]).to.deep.equal({
|
|
75
|
+
origin: 'ethereum',
|
|
76
|
+
destination: 'arbitrum',
|
|
77
|
+
amount: 1000n,
|
|
78
|
+
deliveredAmount: 0n,
|
|
79
|
+
awaitingDeliveryAmount: 0n,
|
|
80
|
+
executionMethod: undefined,
|
|
81
|
+
bridge: undefined,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
expect(result.pendingTransfers).to.have.lengthOf(1);
|
|
85
|
+
expect(result.pendingTransfers[0]).to.deep.equal({
|
|
86
|
+
origin: 'ethereum',
|
|
87
|
+
destination: 'arbitrum',
|
|
88
|
+
amount: 500n,
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('should handle empty arrays', async () => {
|
|
93
|
+
actionTracker.getActiveRebalanceIntents.resolves([]);
|
|
94
|
+
actionTracker.getInProgressTransfers.resolves([]);
|
|
95
|
+
|
|
96
|
+
const result = await adapter.getInflightContext();
|
|
97
|
+
|
|
98
|
+
expect(result.pendingRebalances).to.be.an('array').that.is.empty;
|
|
99
|
+
expect(result.pendingTransfers).to.be.an('array').that.is.empty;
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('should correctly convert domain IDs to chain names', async () => {
|
|
103
|
+
const mockIntents: RebalanceIntent[] = [
|
|
104
|
+
{
|
|
105
|
+
id: 'intent1',
|
|
106
|
+
origin: 137,
|
|
107
|
+
destination: 10,
|
|
108
|
+
amount: 2000n,
|
|
109
|
+
status: 'not_started',
|
|
110
|
+
createdAt: Date.now(),
|
|
111
|
+
updatedAt: Date.now(),
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
const mockTransfers: Transfer[] = [
|
|
116
|
+
{
|
|
117
|
+
id: 'transfer1',
|
|
118
|
+
origin: 137,
|
|
119
|
+
destination: 10,
|
|
120
|
+
amount: 300n,
|
|
121
|
+
messageId: '0x456',
|
|
122
|
+
sender: '0x111' as any,
|
|
123
|
+
recipient: '0x222' as any,
|
|
124
|
+
status: 'in_progress',
|
|
125
|
+
createdAt: Date.now(),
|
|
126
|
+
updatedAt: Date.now(),
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
actionTracker.getActiveRebalanceIntents.resolves(mockIntents);
|
|
131
|
+
actionTracker.getInProgressTransfers.resolves(mockTransfers);
|
|
132
|
+
actionTracker.getActionsForIntent.resolves([]);
|
|
133
|
+
multiProvider.getChainName.withArgs(137).returns('polygon');
|
|
134
|
+
multiProvider.getChainName.withArgs(10).returns('optimism');
|
|
135
|
+
|
|
136
|
+
const result = await adapter.getInflightContext();
|
|
137
|
+
|
|
138
|
+
expect(result.pendingRebalances[0].origin).to.equal('polygon');
|
|
139
|
+
expect(result.pendingRebalances[0].destination).to.equal('optimism');
|
|
140
|
+
expect(result.pendingTransfers[0].origin).to.equal('polygon');
|
|
141
|
+
expect(result.pendingTransfers[0].destination).to.equal('optimism');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should handle multiple intents and transfers', async () => {
|
|
145
|
+
const mockIntents: RebalanceIntent[] = [
|
|
146
|
+
{
|
|
147
|
+
id: 'intent1',
|
|
148
|
+
origin: 1,
|
|
149
|
+
destination: 2,
|
|
150
|
+
amount: 1000n,
|
|
151
|
+
status: 'not_started',
|
|
152
|
+
createdAt: Date.now(),
|
|
153
|
+
updatedAt: Date.now(),
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
id: 'intent2',
|
|
157
|
+
origin: 2,
|
|
158
|
+
destination: 3,
|
|
159
|
+
amount: 1500n,
|
|
160
|
+
status: 'in_progress',
|
|
161
|
+
createdAt: Date.now(),
|
|
162
|
+
updatedAt: Date.now(),
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
|
|
166
|
+
const mockTransfers: Transfer[] = [
|
|
167
|
+
{
|
|
168
|
+
id: 'transfer1',
|
|
169
|
+
origin: 1,
|
|
170
|
+
destination: 2,
|
|
171
|
+
amount: 500n,
|
|
172
|
+
messageId: '0x123',
|
|
173
|
+
sender: '0xabc' as any,
|
|
174
|
+
recipient: '0xdef' as any,
|
|
175
|
+
status: 'in_progress',
|
|
176
|
+
createdAt: Date.now(),
|
|
177
|
+
updatedAt: Date.now(),
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
id: 'transfer2',
|
|
181
|
+
origin: 3,
|
|
182
|
+
destination: 1,
|
|
183
|
+
amount: 750n,
|
|
184
|
+
messageId: '0x789',
|
|
185
|
+
sender: '0x333' as any,
|
|
186
|
+
recipient: '0x444' as any,
|
|
187
|
+
status: 'in_progress',
|
|
188
|
+
createdAt: Date.now(),
|
|
189
|
+
updatedAt: Date.now(),
|
|
190
|
+
},
|
|
191
|
+
];
|
|
192
|
+
|
|
193
|
+
actionTracker.getActiveRebalanceIntents.resolves(mockIntents);
|
|
194
|
+
actionTracker.getInProgressTransfers.resolves(mockTransfers);
|
|
195
|
+
actionTracker.getActionsForIntent.resolves([]);
|
|
196
|
+
multiProvider.getChainName.withArgs(1).returns('ethereum');
|
|
197
|
+
multiProvider.getChainName.withArgs(2).returns('arbitrum');
|
|
198
|
+
multiProvider.getChainName.withArgs(3).returns('optimism');
|
|
199
|
+
|
|
200
|
+
const result = await adapter.getInflightContext();
|
|
201
|
+
|
|
202
|
+
expect(result.pendingRebalances).to.have.lengthOf(2);
|
|
203
|
+
expect(result.pendingTransfers).to.have.lengthOf(2);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { MultiProvider } from '@humanode-hyperlane/sdk';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
InflightContext,
|
|
5
|
+
RouteWithContext,
|
|
6
|
+
} from '../interfaces/IStrategy.js';
|
|
7
|
+
|
|
8
|
+
import type { IActionTracker } from './IActionTracker.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Adapter that converts ActionTracker data to strategy-consumable InflightContext.
|
|
12
|
+
* Handles conversion from Domain IDs (used by ActionTracker) to ChainNames (used by Strategy).
|
|
13
|
+
*/
|
|
14
|
+
export class InflightContextAdapter {
|
|
15
|
+
constructor(
|
|
16
|
+
private readonly actionTracker: IActionTracker,
|
|
17
|
+
private readonly multiProvider: MultiProvider,
|
|
18
|
+
) {}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get inflight context for strategy decision-making.
|
|
22
|
+
* Includes active rebalance intents and in-progress user transfers.
|
|
23
|
+
*/
|
|
24
|
+
async getInflightContext(): Promise<InflightContext> {
|
|
25
|
+
const intents = await this.actionTracker.getActiveRebalanceIntents();
|
|
26
|
+
const transfers = await this.actionTracker.getInProgressTransfers();
|
|
27
|
+
|
|
28
|
+
const pendingRebalances: RouteWithContext[] = await Promise.all(
|
|
29
|
+
intents.map(async (intent) => {
|
|
30
|
+
let deliveredAmount = 0n;
|
|
31
|
+
let awaitingDeliveryAmount = 0n;
|
|
32
|
+
|
|
33
|
+
// For inventory intents, compute delivered and awaiting amounts from actions
|
|
34
|
+
if (intent.executionMethod === 'inventory') {
|
|
35
|
+
const actions = await this.actionTracker.getActionsForIntent(
|
|
36
|
+
intent.id,
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
// Sum of complete inventory_deposit actions (message delivered)
|
|
40
|
+
deliveredAmount = actions
|
|
41
|
+
.filter(
|
|
42
|
+
(a) => a.type === 'inventory_deposit' && a.status === 'complete',
|
|
43
|
+
)
|
|
44
|
+
.reduce((sum, a) => sum + a.amount, 0n);
|
|
45
|
+
|
|
46
|
+
// Sum of in_progress inventory_deposit actions (tx confirmed, message pending)
|
|
47
|
+
awaitingDeliveryAmount = actions
|
|
48
|
+
.filter(
|
|
49
|
+
(a) =>
|
|
50
|
+
a.type === 'inventory_deposit' && a.status === 'in_progress',
|
|
51
|
+
)
|
|
52
|
+
.reduce((sum, a) => sum + a.amount, 0n);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
origin: this.multiProvider.getChainName(intent.origin),
|
|
57
|
+
destination: this.multiProvider.getChainName(intent.destination),
|
|
58
|
+
amount: intent.amount,
|
|
59
|
+
deliveredAmount,
|
|
60
|
+
awaitingDeliveryAmount,
|
|
61
|
+
executionMethod: intent.executionMethod,
|
|
62
|
+
bridge: intent.bridge,
|
|
63
|
+
};
|
|
64
|
+
}),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const pendingTransfers = transfers.map((transfer) => ({
|
|
68
|
+
origin: this.multiProvider.getChainName(transfer.origin),
|
|
69
|
+
destination: this.multiProvider.getChainName(transfer.destination),
|
|
70
|
+
amount: transfer.amount,
|
|
71
|
+
}));
|
|
72
|
+
|
|
73
|
+
return { pendingRebalances, pendingTransfers };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Domain } from '@humanode-hyperlane/utils';
|
|
2
|
+
|
|
3
|
+
import type { TrackedActionBase } from '../types.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Generic store interface for tracking entities.
|
|
7
|
+
* Provides CRUD operations and query methods for any tracked entity type.
|
|
8
|
+
*
|
|
9
|
+
* @template T - The entity type extending TrackedActionBase
|
|
10
|
+
* @template Status - The status enum type for this entity
|
|
11
|
+
*/
|
|
12
|
+
export interface IStore<T extends TrackedActionBase, Status extends string> {
|
|
13
|
+
/**
|
|
14
|
+
* Save a new entity or update an existing one.
|
|
15
|
+
*/
|
|
16
|
+
save(entity: T): Promise<void>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Retrieve an entity by ID.
|
|
20
|
+
*/
|
|
21
|
+
get(id: string): Promise<T | undefined>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Retrieve all entities.
|
|
25
|
+
*/
|
|
26
|
+
getAll(): Promise<T[]>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Update an entity with partial data.
|
|
30
|
+
* Automatically updates the `updatedAt` timestamp.
|
|
31
|
+
*/
|
|
32
|
+
update(id: string, updates: Partial<T>): Promise<void>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Delete an entity by ID.
|
|
36
|
+
*/
|
|
37
|
+
delete(id: string): Promise<void>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Query entities by status.
|
|
41
|
+
*/
|
|
42
|
+
getByStatus(status: Status): Promise<T[]>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Query entities by destination domain.
|
|
46
|
+
*/
|
|
47
|
+
getByDestination(destination: Domain): Promise<T[]>;
|
|
48
|
+
}
|