@humanode-hyperlane/rebalancer 0.0.0-stage → 27.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +193 -0
- package/README.md +297 -2
- package/dist/bridges/LiFiBridge.d.ts +93 -0
- package/dist/bridges/LiFiBridge.d.ts.map +1 -0
- package/dist/bridges/LiFiBridge.js +527 -0
- package/dist/bridges/LiFiBridge.js.map +1 -0
- package/dist/bridges/LiFiBridge.test.d.ts +2 -0
- package/dist/bridges/LiFiBridge.test.d.ts.map +1 -0
- package/dist/bridges/LiFiBridge.test.js +504 -0
- package/dist/bridges/LiFiBridge.test.js.map +1 -0
- package/dist/config/RebalancerConfig.d.ts +20 -0
- package/dist/config/RebalancerConfig.d.ts.map +1 -0
- package/dist/config/RebalancerConfig.js +35 -0
- package/dist/config/RebalancerConfig.js.map +1 -0
- package/dist/config/RebalancerConfig.test.d.ts +2 -0
- package/dist/config/RebalancerConfig.test.d.ts.map +1 -0
- package/dist/config/RebalancerConfig.test.js +798 -0
- package/dist/config/RebalancerConfig.test.js.map +1 -0
- package/dist/config/types.d.ts +3008 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +451 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/InventoryRebalancer.d.ts +201 -0
- package/dist/core/InventoryRebalancer.d.ts.map +1 -0
- package/dist/core/InventoryRebalancer.js +994 -0
- package/dist/core/InventoryRebalancer.js.map +1 -0
- package/dist/core/InventoryRebalancer.test.d.ts +2 -0
- package/dist/core/InventoryRebalancer.test.d.ts.map +1 -0
- package/dist/core/InventoryRebalancer.test.js +1511 -0
- package/dist/core/InventoryRebalancer.test.js.map +1 -0
- package/dist/core/Rebalancer.d.ts +37 -0
- package/dist/core/Rebalancer.d.ts.map +1 -0
- package/dist/core/Rebalancer.js +433 -0
- package/dist/core/Rebalancer.js.map +1 -0
- package/dist/core/Rebalancer.test.d.ts +2 -0
- package/dist/core/Rebalancer.test.d.ts.map +1 -0
- package/dist/core/Rebalancer.test.js +424 -0
- package/dist/core/Rebalancer.test.js.map +1 -0
- package/dist/core/RebalancerOrchestrator.d.ts +56 -0
- package/dist/core/RebalancerOrchestrator.d.ts.map +1 -0
- package/dist/core/RebalancerOrchestrator.js +154 -0
- package/dist/core/RebalancerOrchestrator.js.map +1 -0
- package/dist/core/RebalancerOrchestrator.test.d.ts +2 -0
- package/dist/core/RebalancerOrchestrator.test.d.ts.map +1 -0
- package/dist/core/RebalancerOrchestrator.test.js +721 -0
- package/dist/core/RebalancerOrchestrator.test.js.map +1 -0
- package/dist/core/RebalancerService.d.ts +127 -0
- package/dist/core/RebalancerService.d.ts.map +1 -0
- package/dist/core/RebalancerService.js +270 -0
- package/dist/core/RebalancerService.js.map +1 -0
- package/dist/core/RebalancerService.test.d.ts +2 -0
- package/dist/core/RebalancerService.test.d.ts.map +1 -0
- package/dist/core/RebalancerService.test.js +777 -0
- package/dist/core/RebalancerService.test.js.map +1 -0
- package/dist/e2e/collateral-deficit.e2e-test.d.ts +2 -0
- package/dist/e2e/collateral-deficit.e2e-test.d.ts.map +1 -0
- package/dist/e2e/collateral-deficit.e2e-test.js +227 -0
- package/dist/e2e/collateral-deficit.e2e-test.js.map +1 -0
- package/dist/e2e/composite.e2e-test.d.ts +2 -0
- package/dist/e2e/composite.e2e-test.d.ts.map +1 -0
- package/dist/e2e/composite.e2e-test.js +666 -0
- package/dist/e2e/composite.e2e-test.js.map +1 -0
- package/dist/e2e/fixtures/routes.d.ts +89 -0
- package/dist/e2e/fixtures/routes.d.ts.map +1 -0
- package/dist/e2e/fixtures/routes.js +420 -0
- package/dist/e2e/fixtures/routes.js.map +1 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts +38 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.js +144 -0
- package/dist/e2e/harness/BaseLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/BridgeSetup.d.ts +11 -0
- package/dist/e2e/harness/BridgeSetup.d.ts.map +1 -0
- package/dist/e2e/harness/BridgeSetup.js +50 -0
- package/dist/e2e/harness/BridgeSetup.js.map +1 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts +13 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js +105 -0
- package/dist/e2e/harness/Erc20InventoryLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts +11 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.js +105 -0
- package/dist/e2e/harness/Erc20LocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/ForkIndexer.d.ts +23 -0
- package/dist/e2e/harness/ForkIndexer.d.ts.map +1 -0
- package/dist/e2e/harness/ForkIndexer.js +127 -0
- package/dist/e2e/harness/ForkIndexer.js.map +1 -0
- package/dist/e2e/harness/ForkIndexer.test.d.ts +2 -0
- package/dist/e2e/harness/ForkIndexer.test.d.ts.map +1 -0
- package/dist/e2e/harness/ForkIndexer.test.js +257 -0
- package/dist/e2e/harness/ForkIndexer.test.js.map +1 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts +21 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.js +115 -0
- package/dist/e2e/harness/MixedLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/MockExplorerClient.d.ts +23 -0
- package/dist/e2e/harness/MockExplorerClient.d.ts.map +1 -0
- package/dist/e2e/harness/MockExplorerClient.js +57 -0
- package/dist/e2e/harness/MockExplorerClient.js.map +1 -0
- package/dist/e2e/harness/MockExternalBridge.d.ts +32 -0
- package/dist/e2e/harness/MockExternalBridge.d.ts.map +1 -0
- package/dist/e2e/harness/MockExternalBridge.js +247 -0
- package/dist/e2e/harness/MockExternalBridge.js.map +1 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts +13 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.d.ts.map +1 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.js +91 -0
- package/dist/e2e/harness/NativeLocalDeploymentManager.js.map +1 -0
- package/dist/e2e/harness/SnapshotHelper.d.ts +13 -0
- package/dist/e2e/harness/SnapshotHelper.d.ts.map +1 -0
- package/dist/e2e/harness/SnapshotHelper.js +36 -0
- package/dist/e2e/harness/SnapshotHelper.js.map +1 -0
- package/dist/e2e/harness/TestHelpers.d.ts +25 -0
- package/dist/e2e/harness/TestHelpers.d.ts.map +1 -0
- package/dist/e2e/harness/TestHelpers.js +103 -0
- package/dist/e2e/harness/TestHelpers.js.map +1 -0
- package/dist/e2e/harness/TestRebalancer.d.ts +85 -0
- package/dist/e2e/harness/TestRebalancer.d.ts.map +1 -0
- package/dist/e2e/harness/TestRebalancer.js +427 -0
- package/dist/e2e/harness/TestRebalancer.js.map +1 -0
- package/dist/e2e/harness/TransferHelper.d.ts +34 -0
- package/dist/e2e/harness/TransferHelper.d.ts.map +1 -0
- package/dist/e2e/harness/TransferHelper.js +93 -0
- package/dist/e2e/harness/TransferHelper.js.map +1 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.js +411 -0
- package/dist/e2e/inventory-erc20-minAmount.e2e-test.js.map +1 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.js +408 -0
- package/dist/e2e/inventory-erc20-weighted.e2e-test.js.map +1 -0
- package/dist/e2e/inventory-minAmount.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-minAmount.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-minAmount.e2e-test.js +411 -0
- package/dist/e2e/inventory-minAmount.e2e-test.js.map +1 -0
- package/dist/e2e/inventory-weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/inventory-weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/inventory-weighted.e2e-test.js +409 -0
- package/dist/e2e/inventory-weighted.e2e-test.js.map +1 -0
- package/dist/e2e/minAmount.e2e-test.d.ts +2 -0
- package/dist/e2e/minAmount.e2e-test.d.ts.map +1 -0
- package/dist/e2e/minAmount.e2e-test.js +203 -0
- package/dist/e2e/minAmount.e2e-test.js.map +1 -0
- package/dist/e2e/mixed-weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/mixed-weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/mixed-weighted.e2e-test.js +189 -0
- package/dist/e2e/mixed-weighted.e2e-test.js.map +1 -0
- package/dist/e2e/weighted.e2e-test.d.ts +2 -0
- package/dist/e2e/weighted.e2e-test.d.ts.map +1 -0
- package/dist/e2e/weighted.e2e-test.js +198 -0
- package/dist/e2e/weighted.e2e-test.js.map +1 -0
- package/dist/factories/RebalancerContextFactory.d.ts +89 -0
- package/dist/factories/RebalancerContextFactory.d.ts.map +1 -0
- package/dist/factories/RebalancerContextFactory.js +420 -0
- package/dist/factories/RebalancerContextFactory.js.map +1 -0
- package/dist/factories/RebalancerContextFactory.test.d.ts +2 -0
- package/dist/factories/RebalancerContextFactory.test.d.ts.map +1 -0
- package/dist/factories/RebalancerContextFactory.test.js +270 -0
- package/dist/factories/RebalancerContextFactory.test.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IExternalBridge.d.ts +103 -0
- package/dist/interfaces/IExternalBridge.d.ts.map +1 -0
- package/dist/interfaces/IExternalBridge.js +2 -0
- package/dist/interfaces/IExternalBridge.js.map +1 -0
- package/dist/interfaces/IMetrics.d.ts +5 -0
- package/dist/interfaces/IMetrics.d.ts.map +1 -0
- package/dist/interfaces/IMetrics.js +2 -0
- package/dist/interfaces/IMetrics.js.map +1 -0
- package/dist/interfaces/IMonitor.d.ts +50 -0
- package/dist/interfaces/IMonitor.d.ts.map +1 -0
- package/dist/interfaces/IMonitor.js +14 -0
- package/dist/interfaces/IMonitor.js.map +1 -0
- package/dist/interfaces/IRebalancer.d.ts +31 -0
- package/dist/interfaces/IRebalancer.d.ts.map +1 -0
- package/dist/interfaces/IRebalancer.js +2 -0
- package/dist/interfaces/IRebalancer.js.map +1 -0
- package/dist/interfaces/IStrategy.d.ts +60 -0
- package/dist/interfaces/IStrategy.d.ts.map +1 -0
- package/dist/interfaces/IStrategy.js +13 -0
- package/dist/interfaces/IStrategy.js.map +1 -0
- package/dist/metrics/Metrics.d.ts +25 -0
- package/dist/metrics/Metrics.d.ts.map +1 -0
- package/dist/metrics/Metrics.js +164 -0
- package/dist/metrics/Metrics.js.map +1 -0
- package/dist/metrics/PriceGetter.d.ts +10 -0
- package/dist/metrics/PriceGetter.d.ts.map +1 -0
- package/dist/metrics/PriceGetter.js +41 -0
- package/dist/metrics/PriceGetter.js.map +1 -0
- package/dist/metrics/scripts/metrics.d.ts +28 -0
- package/dist/metrics/scripts/metrics.d.ts.map +1 -0
- package/dist/metrics/scripts/metrics.js +61 -0
- package/dist/metrics/scripts/metrics.js.map +1 -0
- package/dist/monitor/Monitor.d.ts +40 -0
- package/dist/monitor/Monitor.d.ts.map +1 -0
- package/dist/monitor/Monitor.js +211 -0
- package/dist/monitor/Monitor.js.map +1 -0
- package/dist/service.d.ts +3 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +205 -0
- package/dist/service.js.map +1 -0
- package/dist/strategy/BaseStrategy.d.ts +86 -0
- package/dist/strategy/BaseStrategy.d.ts.map +1 -0
- package/dist/strategy/BaseStrategy.js +342 -0
- package/dist/strategy/BaseStrategy.js.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.d.ts +65 -0
- package/dist/strategy/CollateralDeficitStrategy.d.ts.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.js +253 -0
- package/dist/strategy/CollateralDeficitStrategy.js.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.test.d.ts +2 -0
- package/dist/strategy/CollateralDeficitStrategy.test.d.ts.map +1 -0
- package/dist/strategy/CollateralDeficitStrategy.test.js +497 -0
- package/dist/strategy/CollateralDeficitStrategy.test.js.map +1 -0
- package/dist/strategy/CompositeStrategy.d.ts +18 -0
- package/dist/strategy/CompositeStrategy.d.ts.map +1 -0
- package/dist/strategy/CompositeStrategy.js +63 -0
- package/dist/strategy/CompositeStrategy.js.map +1 -0
- package/dist/strategy/CompositeStrategy.test.d.ts +2 -0
- package/dist/strategy/CompositeStrategy.test.d.ts.map +1 -0
- package/dist/strategy/CompositeStrategy.test.js +278 -0
- package/dist/strategy/CompositeStrategy.test.js.map +1 -0
- package/dist/strategy/MinAmountStrategy.d.ts +35 -0
- package/dist/strategy/MinAmountStrategy.d.ts.map +1 -0
- package/dist/strategy/MinAmountStrategy.js +112 -0
- package/dist/strategy/MinAmountStrategy.js.map +1 -0
- package/dist/strategy/MinAmountStrategy.test.d.ts +2 -0
- package/dist/strategy/MinAmountStrategy.test.d.ts.map +1 -0
- package/dist/strategy/MinAmountStrategy.test.js +547 -0
- package/dist/strategy/MinAmountStrategy.test.js.map +1 -0
- package/dist/strategy/StrategyFactory.d.ts +27 -0
- package/dist/strategy/StrategyFactory.d.ts.map +1 -0
- package/dist/strategy/StrategyFactory.js +79 -0
- package/dist/strategy/StrategyFactory.js.map +1 -0
- package/dist/strategy/StrategyFactory.test.d.ts +2 -0
- package/dist/strategy/StrategyFactory.test.d.ts.map +1 -0
- package/dist/strategy/StrategyFactory.test.js +81 -0
- package/dist/strategy/StrategyFactory.test.js.map +1 -0
- package/dist/strategy/WeightedStrategy.d.ts +32 -0
- package/dist/strategy/WeightedStrategy.d.ts.map +1 -0
- package/dist/strategy/WeightedStrategy.js +73 -0
- package/dist/strategy/WeightedStrategy.js.map +1 -0
- package/dist/strategy/WeightedStrategy.test.d.ts +2 -0
- package/dist/strategy/WeightedStrategy.test.d.ts.map +1 -0
- package/dist/strategy/WeightedStrategy.test.js +403 -0
- package/dist/strategy/WeightedStrategy.test.js.map +1 -0
- package/dist/strategy/index.d.ts +7 -0
- package/dist/strategy/index.d.ts.map +1 -0
- package/dist/strategy/index.js +7 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/test/helpers.d.ts +99 -0
- package/dist/test/helpers.d.ts.map +1 -0
- package/dist/test/helpers.js +311 -0
- package/dist/test/helpers.js.map +1 -0
- package/dist/test/lifiMocks.d.ts +52 -0
- package/dist/test/lifiMocks.d.ts.map +1 -0
- package/dist/test/lifiMocks.js +160 -0
- package/dist/test/lifiMocks.js.map +1 -0
- package/dist/tracking/ActionTracker.d.ts +90 -0
- package/dist/tracking/ActionTracker.d.ts.map +1 -0
- package/dist/tracking/ActionTracker.js +678 -0
- package/dist/tracking/ActionTracker.js.map +1 -0
- package/dist/tracking/ActionTracker.test.d.ts +2 -0
- package/dist/tracking/ActionTracker.test.d.ts.map +1 -0
- package/dist/tracking/ActionTracker.test.js +1351 -0
- package/dist/tracking/ActionTracker.test.js.map +1 -0
- package/dist/tracking/IActionTracker.d.ts +157 -0
- package/dist/tracking/IActionTracker.d.ts.map +1 -0
- package/dist/tracking/IActionTracker.js +2 -0
- package/dist/tracking/IActionTracker.js.map +1 -0
- package/dist/tracking/InflightContextAdapter.d.ts +18 -0
- package/dist/tracking/InflightContextAdapter.d.ts.map +1 -0
- package/dist/tracking/InflightContextAdapter.js +52 -0
- package/dist/tracking/InflightContextAdapter.js.map +1 -0
- package/dist/tracking/InflightContextAdapter.test.d.ts +2 -0
- package/dist/tracking/InflightContextAdapter.test.d.ts.map +1 -0
- package/dist/tracking/InflightContextAdapter.test.js +175 -0
- package/dist/tracking/InflightContextAdapter.test.js.map +1 -0
- package/dist/tracking/store/IStore.d.ts +41 -0
- package/dist/tracking/store/IStore.d.ts.map +1 -0
- package/dist/tracking/store/IStore.js +2 -0
- package/dist/tracking/store/IStore.js.map +1 -0
- package/dist/tracking/store/InMemoryStore.d.ts +21 -0
- package/dist/tracking/store/InMemoryStore.d.ts.map +1 -0
- package/dist/tracking/store/InMemoryStore.js +40 -0
- package/dist/tracking/store/InMemoryStore.js.map +1 -0
- package/dist/tracking/store/InMemoryStore.test.d.ts +2 -0
- package/dist/tracking/store/InMemoryStore.test.d.ts.map +1 -0
- package/dist/tracking/store/InMemoryStore.test.js +290 -0
- package/dist/tracking/store/InMemoryStore.test.js.map +1 -0
- package/dist/tracking/store/index.d.ts +3 -0
- package/dist/tracking/store/index.d.ts.map +1 -0
- package/dist/tracking/store/index.js +2 -0
- package/dist/tracking/store/index.js.map +1 -0
- package/dist/tracking/types.d.ts +77 -0
- package/dist/tracking/types.d.ts.map +1 -0
- package/dist/tracking/types.js +2 -0
- package/dist/tracking/types.js.map +1 -0
- package/dist/utils/ExplorerClient.d.ts +68 -0
- package/dist/utils/ExplorerClient.d.ts.map +1 -0
- package/dist/utils/ExplorerClient.js +324 -0
- package/dist/utils/ExplorerClient.js.map +1 -0
- package/dist/utils/ExplorerClient.test.d.ts +2 -0
- package/dist/utils/ExplorerClient.test.d.ts.map +1 -0
- package/dist/utils/ExplorerClient.test.js +261 -0
- package/dist/utils/ExplorerClient.test.js.map +1 -0
- package/dist/utils/balanceUtils.d.ts +12 -0
- package/dist/utils/balanceUtils.d.ts.map +1 -0
- package/dist/utils/balanceUtils.js +40 -0
- package/dist/utils/balanceUtils.js.map +1 -0
- package/dist/utils/balanceUtils.test.d.ts +2 -0
- package/dist/utils/balanceUtils.test.d.ts.map +1 -0
- package/dist/utils/balanceUtils.test.js +55 -0
- package/dist/utils/balanceUtils.test.js.map +1 -0
- package/dist/utils/blockTag.d.ts +14 -0
- package/dist/utils/blockTag.d.ts.map +1 -0
- package/dist/utils/blockTag.js +46 -0
- package/dist/utils/blockTag.js.map +1 -0
- package/dist/utils/bridgeUtils.d.ts +40 -0
- package/dist/utils/bridgeUtils.d.ts.map +1 -0
- package/dist/utils/bridgeUtils.js +54 -0
- package/dist/utils/bridgeUtils.js.map +1 -0
- package/dist/utils/bridgeUtils.test.d.ts +2 -0
- package/dist/utils/bridgeUtils.test.d.ts.map +1 -0
- package/dist/utils/bridgeUtils.test.js +163 -0
- package/dist/utils/bridgeUtils.test.js.map +1 -0
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +6 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gasEstimation.d.ts +65 -0
- package/dist/utils/gasEstimation.d.ts.map +1 -0
- package/dist/utils/gasEstimation.js +206 -0
- package/dist/utils/gasEstimation.js.map +1 -0
- package/dist/utils/solanaKeyParser.d.ts +10 -0
- package/dist/utils/solanaKeyParser.d.ts.map +1 -0
- package/dist/utils/solanaKeyParser.js +87 -0
- package/dist/utils/solanaKeyParser.js.map +1 -0
- package/dist/utils/solanaKeyParser.test.d.ts +2 -0
- package/dist/utils/solanaKeyParser.test.d.ts.map +1 -0
- package/dist/utils/solanaKeyParser.test.js +71 -0
- package/dist/utils/solanaKeyParser.test.js.map +1 -0
- package/dist/utils/tokenUtils.d.ts +38 -0
- package/dist/utils/tokenUtils.d.ts.map +1 -0
- package/dist/utils/tokenUtils.js +65 -0
- package/dist/utils/tokenUtils.js.map +1 -0
- package/dist/utils/transactionUtils.d.ts +22 -0
- package/dist/utils/transactionUtils.d.ts.map +1 -0
- package/dist/utils/transactionUtils.js +26 -0
- package/dist/utils/transactionUtils.js.map +1 -0
- package/package.json +87 -3
- package/src/bridges/LiFiBridge.test.ts +615 -0
- package/src/bridges/LiFiBridge.ts +731 -0
- package/src/config/RebalancerConfig.test.ts +921 -0
- package/src/config/RebalancerConfig.ts +63 -0
- package/src/config/types.ts +613 -0
- package/src/core/InventoryRebalancer.test.ts +1858 -0
- package/src/core/InventoryRebalancer.ts +1455 -0
- package/src/core/Rebalancer.test.ts +686 -0
- package/src/core/Rebalancer.ts +686 -0
- package/src/core/RebalancerOrchestrator.test.ts +871 -0
- package/src/core/RebalancerOrchestrator.ts +273 -0
- package/src/core/RebalancerService.test.ts +1094 -0
- package/src/core/RebalancerService.ts +412 -0
- package/src/e2e/E2E_TEST_CONVENTIONS.md +222 -0
- package/src/e2e/collateral-deficit.e2e-test.ts +403 -0
- package/src/e2e/composite.e2e-test.ts +1008 -0
- package/src/e2e/fixtures/routes.ts +532 -0
- package/src/e2e/harness/BaseLocalDeploymentManager.ts +246 -0
- package/src/e2e/harness/BridgeSetup.ts +95 -0
- package/src/e2e/harness/Erc20InventoryLocalDeploymentManager.ts +183 -0
- package/src/e2e/harness/Erc20LocalDeploymentManager.ts +190 -0
- package/src/e2e/harness/ForkIndexer.test.ts +448 -0
- package/src/e2e/harness/ForkIndexer.ts +183 -0
- package/src/e2e/harness/MixedLocalDeploymentManager.ts +196 -0
- package/src/e2e/harness/MockExplorerClient.ts +94 -0
- package/src/e2e/harness/MockExternalBridge.ts +411 -0
- package/src/e2e/harness/NativeLocalDeploymentManager.ts +138 -0
- package/src/e2e/harness/SnapshotHelper.ts +56 -0
- package/src/e2e/harness/TestHelpers.ts +169 -0
- package/src/e2e/harness/TestRebalancer.ts +758 -0
- package/src/e2e/harness/TransferHelper.ts +188 -0
- package/src/e2e/inventory-erc20-minAmount.e2e-test.ts +735 -0
- package/src/e2e/inventory-erc20-weighted.e2e-test.ts +733 -0
- package/src/e2e/inventory-minAmount.e2e-test.ts +734 -0
- package/src/e2e/inventory-weighted.e2e-test.ts +734 -0
- package/src/e2e/minAmount.e2e-test.ts +313 -0
- package/src/e2e/mixed-weighted.e2e-test.ts +267 -0
- package/src/e2e/weighted.e2e-test.ts +304 -0
- package/src/factories/RebalancerContextFactory.test.ts +394 -0
- package/src/factories/RebalancerContextFactory.ts +771 -0
- package/src/index.ts +125 -0
- package/src/interfaces/IExternalBridge.ts +117 -0
- package/src/interfaces/IMetrics.ts +5 -0
- package/src/interfaces/IMonitor.ts +71 -0
- package/src/interfaces/IRebalancer.ts +57 -0
- package/src/interfaces/IStrategy.ts +81 -0
- package/src/metrics/Metrics.ts +335 -0
- package/src/metrics/PriceGetter.ts +74 -0
- package/src/metrics/scripts/metrics.ts +139 -0
- package/src/monitor/Monitor.ts +324 -0
- package/src/service.ts +285 -0
- package/src/strategy/BaseStrategy.ts +553 -0
- package/src/strategy/CollateralDeficitStrategy.test.ts +728 -0
- package/src/strategy/CollateralDeficitStrategy.ts +421 -0
- package/src/strategy/CompositeStrategy.test.ts +418 -0
- package/src/strategy/CompositeStrategy.ts +102 -0
- package/src/strategy/MinAmountStrategy.test.ts +732 -0
- package/src/strategy/MinAmountStrategy.ts +200 -0
- package/src/strategy/StrategyFactory.test.ts +108 -0
- package/src/strategy/StrategyFactory.ts +157 -0
- package/src/strategy/WeightedStrategy.test.ts +529 -0
- package/src/strategy/WeightedStrategy.ts +126 -0
- package/src/strategy/index.ts +6 -0
- package/src/test/helpers.ts +477 -0
- package/src/test/lifiMocks.ts +211 -0
- package/src/tracking/ActionTracker.test.ts +1625 -0
- package/src/tracking/ActionTracker.ts +1019 -0
- package/src/tracking/IActionTracker.ts +213 -0
- package/src/tracking/InflightContextAdapter.test.ts +206 -0
- package/src/tracking/InflightContextAdapter.ts +75 -0
- package/src/tracking/store/IStore.ts +48 -0
- package/src/tracking/store/InMemoryStore.test.ts +338 -0
- package/src/tracking/store/InMemoryStore.ts +59 -0
- package/src/tracking/store/index.ts +2 -0
- package/src/tracking/types.ts +118 -0
- package/src/utils/ExplorerClient.test.ts +386 -0
- package/src/utils/ExplorerClient.ts +439 -0
- package/src/utils/balanceUtils.test.ts +79 -0
- package/src/utils/balanceUtils.ts +65 -0
- package/src/utils/blockTag.ts +68 -0
- package/src/utils/bridgeUtils.test.ts +193 -0
- package/src/utils/bridgeUtils.ts +101 -0
- package/src/utils/errors.ts +5 -0
- package/src/utils/gasEstimation.ts +306 -0
- package/src/utils/solanaKeyParser.test.ts +103 -0
- package/src/utils/solanaKeyParser.ts +117 -0
- package/src/utils/tokenUtils.ts +89 -0
- package/src/utils/transactionUtils.ts +41 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { ethers, providers } from 'ethers';
|
|
2
|
+
import { type Logger, pino } from 'pino';
|
|
3
|
+
import {
|
|
4
|
+
GenericContainer,
|
|
5
|
+
type StartedTestContainer,
|
|
6
|
+
Wait,
|
|
7
|
+
} from 'testcontainers';
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
Mailbox__factory,
|
|
11
|
+
MerkleTreeHook__factory,
|
|
12
|
+
TrustedRelayerIsm__factory,
|
|
13
|
+
} from '@humanode-hyperlane/core';
|
|
14
|
+
import { type IRegistry, PartialRegistry } from '@humanode-hyperlane/registry';
|
|
15
|
+
import {
|
|
16
|
+
type ChainMetadata,
|
|
17
|
+
type ChainName,
|
|
18
|
+
MultiProvider,
|
|
19
|
+
} from '@humanode-hyperlane/sdk';
|
|
20
|
+
import { ProtocolType, retryAsync } from '@humanode-hyperlane/utils';
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
ANVIL_TEST_PRIVATE_KEY,
|
|
24
|
+
TEST_CHAIN_CONFIGS,
|
|
25
|
+
} from '../fixtures/routes.js';
|
|
26
|
+
|
|
27
|
+
export interface LocalDeploymentContext<
|
|
28
|
+
TDeployedAddresses extends {
|
|
29
|
+
chains: Record<string, { mailbox: string; ism: string }>;
|
|
30
|
+
},
|
|
31
|
+
> {
|
|
32
|
+
providers: Map<string, providers.JsonRpcProvider>;
|
|
33
|
+
registry: IRegistry;
|
|
34
|
+
multiProvider: MultiProvider;
|
|
35
|
+
deployedAddresses: TDeployedAddresses;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const ANVIL_DEPLOYER_BALANCE_HEX = '0x56BC75E2D63100000';
|
|
39
|
+
|
|
40
|
+
export abstract class BaseLocalDeploymentManager<
|
|
41
|
+
TDeployedAddresses extends {
|
|
42
|
+
chains: Record<string, { mailbox: string; ism: string }>;
|
|
43
|
+
},
|
|
44
|
+
> {
|
|
45
|
+
private context?: LocalDeploymentContext<TDeployedAddresses>;
|
|
46
|
+
private containers: Map<string, StartedTestContainer> = new Map();
|
|
47
|
+
private readonly logger: Logger;
|
|
48
|
+
|
|
49
|
+
constructor() {
|
|
50
|
+
this.logger = pino({ level: 'debug' }).child({
|
|
51
|
+
module: 'BaseLocalDeploymentManager',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async start(): Promise<LocalDeploymentContext<TDeployedAddresses>> {
|
|
56
|
+
if (this.context) {
|
|
57
|
+
throw new Error('LocalDeploymentManager already started');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const providersByChain = new Map<string, providers.JsonRpcProvider>();
|
|
61
|
+
const deployerWallet = new ethers.Wallet(ANVIL_TEST_PRIVATE_KEY);
|
|
62
|
+
const deployerAddress = deployerWallet.address;
|
|
63
|
+
const chainInfra: Record<
|
|
64
|
+
string,
|
|
65
|
+
{ mailbox: string; ism: string; merkleHook: string; endpoint: string }
|
|
66
|
+
> = {};
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
for (let i = 0; i < TEST_CHAIN_CONFIGS.length; i++) {
|
|
70
|
+
const config = TEST_CHAIN_CONFIGS[i];
|
|
71
|
+
|
|
72
|
+
const container = await retryAsync(
|
|
73
|
+
() =>
|
|
74
|
+
new GenericContainer('ghcr.io/foundry-rs/foundry:latest')
|
|
75
|
+
.withEntrypoint([
|
|
76
|
+
'anvil',
|
|
77
|
+
'--host',
|
|
78
|
+
'0.0.0.0',
|
|
79
|
+
'-p',
|
|
80
|
+
'8545',
|
|
81
|
+
'--chain-id',
|
|
82
|
+
config.chainId.toString(),
|
|
83
|
+
])
|
|
84
|
+
.withExposedPorts(8545)
|
|
85
|
+
.withWaitStrategy(
|
|
86
|
+
Wait.forAll([
|
|
87
|
+
Wait.forListeningPorts(),
|
|
88
|
+
Wait.forLogMessage(/Listening on/),
|
|
89
|
+
]),
|
|
90
|
+
)
|
|
91
|
+
.start(),
|
|
92
|
+
3,
|
|
93
|
+
5000,
|
|
94
|
+
);
|
|
95
|
+
this.containers.set(config.name, container);
|
|
96
|
+
const endpoint = `http://${container.getHost()}:${container.getMappedPort(8545)}`;
|
|
97
|
+
const provider = new providers.JsonRpcProvider(endpoint);
|
|
98
|
+
providersByChain.set(config.name, provider);
|
|
99
|
+
|
|
100
|
+
await provider.send('anvil_setBalance', [
|
|
101
|
+
deployerAddress,
|
|
102
|
+
ANVIL_DEPLOYER_BALANCE_HEX,
|
|
103
|
+
]);
|
|
104
|
+
|
|
105
|
+
const deployer = deployerWallet.connect(provider);
|
|
106
|
+
|
|
107
|
+
const mailbox = await new Mailbox__factory(deployer).deploy(
|
|
108
|
+
config.domainId,
|
|
109
|
+
);
|
|
110
|
+
await mailbox.deployed();
|
|
111
|
+
|
|
112
|
+
const ism = await new TrustedRelayerIsm__factory(deployer).deploy(
|
|
113
|
+
mailbox.address,
|
|
114
|
+
deployerAddress,
|
|
115
|
+
);
|
|
116
|
+
await ism.deployed();
|
|
117
|
+
|
|
118
|
+
const merkleHook = await new MerkleTreeHook__factory(deployer).deploy(
|
|
119
|
+
mailbox.address,
|
|
120
|
+
);
|
|
121
|
+
await merkleHook.deployed();
|
|
122
|
+
|
|
123
|
+
await mailbox.initialize(
|
|
124
|
+
deployerAddress,
|
|
125
|
+
ism.address,
|
|
126
|
+
merkleHook.address,
|
|
127
|
+
merkleHook.address,
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
chainInfra[config.name] = {
|
|
131
|
+
mailbox: mailbox.address,
|
|
132
|
+
ism: ism.address,
|
|
133
|
+
merkleHook: merkleHook.address,
|
|
134
|
+
endpoint,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const deployedAddresses = await this.deployRoutes(
|
|
139
|
+
deployerWallet,
|
|
140
|
+
providersByChain,
|
|
141
|
+
chainInfra,
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
const chainMetadata: Record<string, Partial<ChainMetadata>> = {};
|
|
145
|
+
const chainAddresses: Record<string, Record<string, string>> = {};
|
|
146
|
+
|
|
147
|
+
for (const config of TEST_CHAIN_CONFIGS) {
|
|
148
|
+
chainMetadata[config.name] = {
|
|
149
|
+
name: config.name,
|
|
150
|
+
chainId: config.chainId,
|
|
151
|
+
domainId: config.domainId,
|
|
152
|
+
protocol: ProtocolType.Ethereum,
|
|
153
|
+
rpcUrls: [{ http: chainInfra[config.name].endpoint }],
|
|
154
|
+
blocks: { confirmations: 0, reorgPeriod: 0 },
|
|
155
|
+
nativeToken: { name: 'Ether', symbol: 'ETH', decimals: 18 },
|
|
156
|
+
isTestnet: true,
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
chainAddresses[config.name] = {
|
|
160
|
+
mailbox: chainInfra[config.name].mailbox,
|
|
161
|
+
interchainSecurityModule: chainInfra[config.name].ism,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const registry = new PartialRegistry({
|
|
166
|
+
chainMetadata,
|
|
167
|
+
chainAddresses,
|
|
168
|
+
});
|
|
169
|
+
const multiProvider = new MultiProvider(
|
|
170
|
+
chainMetadata as Record<ChainName, ChainMetadata>,
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const signerWallet = new ethers.Wallet(ANVIL_TEST_PRIVATE_KEY);
|
|
174
|
+
for (const config of TEST_CHAIN_CONFIGS) {
|
|
175
|
+
const provider = providersByChain.get(config.name)!;
|
|
176
|
+
multiProvider.setProvider(config.name, provider);
|
|
177
|
+
multiProvider.setSigner(config.name, signerWallet.connect(provider));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
this.context = {
|
|
181
|
+
providers: providersByChain,
|
|
182
|
+
registry,
|
|
183
|
+
multiProvider,
|
|
184
|
+
deployedAddresses,
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
return this.context;
|
|
188
|
+
} catch (error) {
|
|
189
|
+
await this.stopContainers();
|
|
190
|
+
this.containers.clear();
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async stop(): Promise<void> {
|
|
196
|
+
if (!this.context && this.containers.size === 0) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
await this.stopContainers();
|
|
201
|
+
this.containers.clear();
|
|
202
|
+
this.context = undefined;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
getContext(): LocalDeploymentContext<TDeployedAddresses> {
|
|
206
|
+
if (!this.context) {
|
|
207
|
+
throw new Error('LocalDeploymentManager not started');
|
|
208
|
+
}
|
|
209
|
+
return this.context;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
getProvider(chain: string): providers.JsonRpcProvider | undefined {
|
|
213
|
+
return this.getContext().providers.get(chain);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
getMultiProvider(): MultiProvider {
|
|
217
|
+
return this.getContext().multiProvider;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
getRegistry(): IRegistry {
|
|
221
|
+
return this.getContext().registry;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
protected abstract deployRoutes(
|
|
225
|
+
deployerWallet: ethers.Wallet,
|
|
226
|
+
providersByChain: Map<string, providers.JsonRpcProvider>,
|
|
227
|
+
chainInfra: Record<
|
|
228
|
+
string,
|
|
229
|
+
{ mailbox: string; ism: string; merkleHook: string }
|
|
230
|
+
>,
|
|
231
|
+
): Promise<TDeployedAddresses>;
|
|
232
|
+
|
|
233
|
+
private async stopContainers(): Promise<void> {
|
|
234
|
+
const stopPromises = Array.from(this.containers.entries()).map(
|
|
235
|
+
([chain, container]) =>
|
|
236
|
+
container.stop().catch((err: unknown) => {
|
|
237
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
238
|
+
this.logger.debug(
|
|
239
|
+
{ chain, error: message },
|
|
240
|
+
'Container stop failed (may already be dead)',
|
|
241
|
+
);
|
|
242
|
+
}),
|
|
243
|
+
);
|
|
244
|
+
await Promise.all(stopPromises);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { BigNumber, ethers, providers } from 'ethers';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ERC20__factory,
|
|
5
|
+
MovableCollateralRouter__factory,
|
|
6
|
+
} from '@humanode-hyperlane/core';
|
|
7
|
+
|
|
8
|
+
export async function setupCollateralBalances(
|
|
9
|
+
providers: Map<string, providers.JsonRpcProvider>,
|
|
10
|
+
balancesByChain: Record<string, BigNumber>,
|
|
11
|
+
routersByChain: Record<string, string>,
|
|
12
|
+
tokensByChain: Record<string, string>,
|
|
13
|
+
deployerKey: string,
|
|
14
|
+
): Promise<void> {
|
|
15
|
+
for (const [chain, targetBalance] of Object.entries(balancesByChain)) {
|
|
16
|
+
const provider = providers.get(chain);
|
|
17
|
+
if (!provider) throw new Error(`No provider for chain ${chain}`);
|
|
18
|
+
|
|
19
|
+
const deployer = new ethers.Wallet(deployerKey, provider);
|
|
20
|
+
const token = ERC20__factory.connect(tokensByChain[chain], deployer);
|
|
21
|
+
|
|
22
|
+
// First check current balance of the router
|
|
23
|
+
const currentBalance = await token.balanceOf(routersByChain[chain]);
|
|
24
|
+
|
|
25
|
+
// Transfer the target amount to the router (deployer has plenty from initial supply)
|
|
26
|
+
// We need to set the exact balance, so transfer (targetBalance - currentBalance) if needed
|
|
27
|
+
if (targetBalance.gt(currentBalance)) {
|
|
28
|
+
const diff = targetBalance.sub(currentBalance);
|
|
29
|
+
const tx = await token.transfer(routersByChain[chain], diff);
|
|
30
|
+
await tx.wait();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Verify
|
|
34
|
+
const verifyBalance = await token.balanceOf(routersByChain[chain]);
|
|
35
|
+
if (!verifyBalance.eq(targetBalance)) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
`Balance verification failed for ${chain}: expected ${targetBalance.toString()}, got ${verifyBalance.toString()}`,
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function getCollateralBalance(
|
|
44
|
+
provider: providers.JsonRpcProvider,
|
|
45
|
+
routerAddress: string,
|
|
46
|
+
tokenAddress: string,
|
|
47
|
+
): Promise<BigNumber> {
|
|
48
|
+
const token = ERC20__factory.connect(tokenAddress, provider);
|
|
49
|
+
return token.balanceOf(routerAddress);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function getAllCollateralBalances(
|
|
53
|
+
providers: Map<string, providers.JsonRpcProvider>,
|
|
54
|
+
chains: readonly string[],
|
|
55
|
+
routersByChain: Record<string, string>,
|
|
56
|
+
tokensByChain: Record<string, string>,
|
|
57
|
+
): Promise<Record<string, BigNumber>> {
|
|
58
|
+
const balances: Record<string, BigNumber> = {};
|
|
59
|
+
for (const chain of chains) {
|
|
60
|
+
const provider = providers.get(chain);
|
|
61
|
+
if (!provider) {
|
|
62
|
+
throw new Error(`No provider for chain ${chain}`);
|
|
63
|
+
}
|
|
64
|
+
balances[chain] = await getCollateralBalance(
|
|
65
|
+
provider,
|
|
66
|
+
routersByChain[chain],
|
|
67
|
+
tokensByChain[chain],
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return balances;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface AllowedBridgeConfig {
|
|
74
|
+
monitoredRouterAddress: string;
|
|
75
|
+
bridgeAddress: string;
|
|
76
|
+
destinationDomain: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function configureAllowedBridges(
|
|
80
|
+
provider: providers.JsonRpcProvider,
|
|
81
|
+
configs: AllowedBridgeConfig[],
|
|
82
|
+
deployerKey: string,
|
|
83
|
+
): Promise<void> {
|
|
84
|
+
if (configs.length === 0) return;
|
|
85
|
+
|
|
86
|
+
const deployer = new ethers.Wallet(deployerKey, provider);
|
|
87
|
+
const router = MovableCollateralRouter__factory.connect(
|
|
88
|
+
configs[0].monitoredRouterAddress,
|
|
89
|
+
deployer,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
for (const config of configs) {
|
|
93
|
+
await router.addBridge(config.destinationDomain, config.bridgeAddress);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { ethers, providers } from 'ethers';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ERC20Test__factory,
|
|
5
|
+
HypERC20Collateral__factory,
|
|
6
|
+
} from '@humanode-hyperlane/core';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
type Erc20InventoryChainDeployment,
|
|
10
|
+
type Erc20InventoryDeployedAddresses,
|
|
11
|
+
TEST_CHAIN_CONFIGS,
|
|
12
|
+
type TestChain,
|
|
13
|
+
} from '../fixtures/routes.js';
|
|
14
|
+
|
|
15
|
+
import { BaseLocalDeploymentManager } from './BaseLocalDeploymentManager.js';
|
|
16
|
+
|
|
17
|
+
const TOKEN_SCALE = ethers.BigNumber.from(1);
|
|
18
|
+
const USDC_INITIAL_SUPPLY = '100000000000000';
|
|
19
|
+
const USDC_DECIMALS = 6;
|
|
20
|
+
const INVENTORY_INITIAL_ETH_BALANCE = '20000000000000000000'; // 20 ETH for gas/IGP
|
|
21
|
+
const INVENTORY_INITIAL_ERC20_BALANCE = '20000000000'; // 20,000 USDC for signer
|
|
22
|
+
const INVENTORY_ERC20_BRIDGE_SEED = '10000000000'; // 10,000 USDC bridge seed
|
|
23
|
+
|
|
24
|
+
export class Erc20InventoryLocalDeploymentManager extends BaseLocalDeploymentManager<Erc20InventoryDeployedAddresses> {
|
|
25
|
+
constructor(private readonly inventorySignerAddress: string) {
|
|
26
|
+
super();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
protected async deployRoutes(
|
|
30
|
+
deployerWallet: ethers.Wallet,
|
|
31
|
+
providersByChain: Map<string, providers.JsonRpcProvider>,
|
|
32
|
+
chainInfra: Record<
|
|
33
|
+
string,
|
|
34
|
+
{ mailbox: string; ism: string; merkleHook: string }
|
|
35
|
+
>,
|
|
36
|
+
): Promise<Erc20InventoryDeployedAddresses> {
|
|
37
|
+
const deployerAddress = deployerWallet.address;
|
|
38
|
+
const chainDeployments = {} as Record<
|
|
39
|
+
TestChain,
|
|
40
|
+
Erc20InventoryChainDeployment
|
|
41
|
+
>;
|
|
42
|
+
const monitoredRouters = {} as Record<TestChain, ethers.Contract>;
|
|
43
|
+
const bridgeRouters = {} as Record<TestChain, ethers.Contract>;
|
|
44
|
+
const tokens = {} as Record<TestChain, ethers.Contract>;
|
|
45
|
+
|
|
46
|
+
for (const config of TEST_CHAIN_CONFIGS) {
|
|
47
|
+
const provider = providersByChain.get(config.name)!;
|
|
48
|
+
await provider.send('anvil_setBalance', [
|
|
49
|
+
this.inventorySignerAddress,
|
|
50
|
+
ethers.utils.hexValue(
|
|
51
|
+
ethers.BigNumber.from(INVENTORY_INITIAL_ETH_BALANCE),
|
|
52
|
+
),
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
const deployer = deployerWallet.connect(provider);
|
|
56
|
+
|
|
57
|
+
const token = await new ERC20Test__factory(deployer).deploy(
|
|
58
|
+
'USDC',
|
|
59
|
+
'USDC',
|
|
60
|
+
USDC_INITIAL_SUPPLY,
|
|
61
|
+
USDC_DECIMALS,
|
|
62
|
+
);
|
|
63
|
+
await token.deployed();
|
|
64
|
+
|
|
65
|
+
const monitoredRoute = await new HypERC20Collateral__factory(
|
|
66
|
+
deployer,
|
|
67
|
+
).deploy(
|
|
68
|
+
token.address,
|
|
69
|
+
TOKEN_SCALE,
|
|
70
|
+
TOKEN_SCALE,
|
|
71
|
+
chainInfra[config.name].mailbox,
|
|
72
|
+
);
|
|
73
|
+
await monitoredRoute.deployed();
|
|
74
|
+
await monitoredRoute.initialize(
|
|
75
|
+
ethers.constants.AddressZero,
|
|
76
|
+
chainInfra[config.name].ism,
|
|
77
|
+
deployerAddress,
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const bridgeRoute = await new HypERC20Collateral__factory(
|
|
81
|
+
deployer,
|
|
82
|
+
).deploy(
|
|
83
|
+
token.address,
|
|
84
|
+
TOKEN_SCALE,
|
|
85
|
+
TOKEN_SCALE,
|
|
86
|
+
chainInfra[config.name].mailbox,
|
|
87
|
+
);
|
|
88
|
+
await bridgeRoute.deployed();
|
|
89
|
+
await bridgeRoute.initialize(
|
|
90
|
+
ethers.constants.AddressZero,
|
|
91
|
+
chainInfra[config.name].ism,
|
|
92
|
+
deployerAddress,
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
chainDeployments[config.name] = {
|
|
96
|
+
mailbox: chainInfra[config.name].mailbox,
|
|
97
|
+
ism: chainInfra[config.name].ism,
|
|
98
|
+
monitoredRouter: monitoredRoute.address,
|
|
99
|
+
bridgeRouter: bridgeRoute.address,
|
|
100
|
+
token: token.address,
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
tokens[config.name] = token;
|
|
104
|
+
monitoredRouters[config.name] = monitoredRoute;
|
|
105
|
+
bridgeRouters[config.name] = bridgeRoute;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const routeGroups = [monitoredRouters, bridgeRouters];
|
|
109
|
+
for (const routeMap of routeGroups) {
|
|
110
|
+
for (const chain of TEST_CHAIN_CONFIGS) {
|
|
111
|
+
const localRoute = routeMap[chain.name];
|
|
112
|
+
const remoteDomains: number[] = [];
|
|
113
|
+
const remoteRouters: string[] = [];
|
|
114
|
+
|
|
115
|
+
for (const remote of TEST_CHAIN_CONFIGS) {
|
|
116
|
+
if (remote.name === chain.name) continue;
|
|
117
|
+
remoteDomains.push(remote.domainId);
|
|
118
|
+
remoteRouters.push(
|
|
119
|
+
ethers.utils.hexZeroPad(routeMap[remote.name].address, 32),
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
await localRoute.enrollRemoteRouters(remoteDomains, remoteRouters);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
for (const chain of TEST_CHAIN_CONFIGS) {
|
|
128
|
+
const monitoredRoute = monitoredRouters[chain.name];
|
|
129
|
+
await monitoredRoute.addRebalancer(deployerAddress);
|
|
130
|
+
await monitoredRoute.addRebalancer(this.inventorySignerAddress);
|
|
131
|
+
|
|
132
|
+
for (const destination of TEST_CHAIN_CONFIGS) {
|
|
133
|
+
if (destination.name === chain.name) continue;
|
|
134
|
+
await monitoredRoute.addBridge(
|
|
135
|
+
destination.domainId,
|
|
136
|
+
bridgeRouters[chain.name].address,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const bridgeSeedAmount = ethers.BigNumber.from(INVENTORY_ERC20_BRIDGE_SEED);
|
|
142
|
+
const signerErc20Amount = ethers.BigNumber.from(
|
|
143
|
+
INVENTORY_INITIAL_ERC20_BALANCE,
|
|
144
|
+
);
|
|
145
|
+
for (const chain of TEST_CHAIN_CONFIGS) {
|
|
146
|
+
const provider = providersByChain.get(chain.name)!;
|
|
147
|
+
const deployer = deployerWallet.connect(provider);
|
|
148
|
+
const token = ERC20Test__factory.connect(
|
|
149
|
+
tokens[chain.name].address,
|
|
150
|
+
deployer,
|
|
151
|
+
);
|
|
152
|
+
const tx1 = await token.transfer(
|
|
153
|
+
bridgeRouters[chain.name].address,
|
|
154
|
+
bridgeSeedAmount,
|
|
155
|
+
);
|
|
156
|
+
await tx1.wait();
|
|
157
|
+
const tx2 = await token.transfer(
|
|
158
|
+
this.inventorySignerAddress,
|
|
159
|
+
signerErc20Amount,
|
|
160
|
+
);
|
|
161
|
+
await tx2.wait();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
chains: chainDeployments,
|
|
166
|
+
monitoredRoute: {
|
|
167
|
+
anvil1: monitoredRouters.anvil1.address,
|
|
168
|
+
anvil2: monitoredRouters.anvil2.address,
|
|
169
|
+
anvil3: monitoredRouters.anvil3.address,
|
|
170
|
+
},
|
|
171
|
+
bridgeRoute: {
|
|
172
|
+
anvil1: bridgeRouters.anvil1.address,
|
|
173
|
+
anvil2: bridgeRouters.anvil2.address,
|
|
174
|
+
anvil3: bridgeRouters.anvil3.address,
|
|
175
|
+
},
|
|
176
|
+
tokens: {
|
|
177
|
+
anvil1: tokens.anvil1.address,
|
|
178
|
+
anvil2: tokens.anvil2.address,
|
|
179
|
+
anvil3: tokens.anvil3.address,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { ethers, providers } from 'ethers';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ERC20Test__factory,
|
|
5
|
+
HypERC20Collateral__factory,
|
|
6
|
+
} from '@humanode-hyperlane/core';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
type ChainDeployment,
|
|
10
|
+
type DeployedAddresses,
|
|
11
|
+
TEST_CHAIN_CONFIGS,
|
|
12
|
+
type TestChain,
|
|
13
|
+
} from '../fixtures/routes.js';
|
|
14
|
+
|
|
15
|
+
import { BaseLocalDeploymentManager } from './BaseLocalDeploymentManager.js';
|
|
16
|
+
|
|
17
|
+
const USDC_INITIAL_SUPPLY = '100000000000000';
|
|
18
|
+
const USDC_DECIMALS = 6;
|
|
19
|
+
const TOKEN_SCALE_NUMERATOR = ethers.BigNumber.from(1);
|
|
20
|
+
const TOKEN_SCALE_DENOMINATOR = ethers.BigNumber.from(1);
|
|
21
|
+
|
|
22
|
+
export class Erc20LocalDeploymentManager extends BaseLocalDeploymentManager<DeployedAddresses> {
|
|
23
|
+
protected async deployRoutes(
|
|
24
|
+
deployerWallet: ethers.Wallet,
|
|
25
|
+
providersByChain: Map<string, providers.JsonRpcProvider>,
|
|
26
|
+
chainInfra: Record<
|
|
27
|
+
string,
|
|
28
|
+
{ mailbox: string; ism: string; merkleHook: string }
|
|
29
|
+
>,
|
|
30
|
+
): Promise<DeployedAddresses> {
|
|
31
|
+
const deployerAddress = deployerWallet.address;
|
|
32
|
+
const chainDeployments = {} as Record<TestChain, ChainDeployment>;
|
|
33
|
+
const monitoredRouters = {} as Record<TestChain, ethers.Contract>;
|
|
34
|
+
const bridgeRouters1 = {} as Record<TestChain, ethers.Contract>;
|
|
35
|
+
const bridgeRouters2 = {} as Record<TestChain, ethers.Contract>;
|
|
36
|
+
const tokens = {} as Record<TestChain, ethers.Contract>;
|
|
37
|
+
|
|
38
|
+
for (let i = 0; i < TEST_CHAIN_CONFIGS.length; i++) {
|
|
39
|
+
const config = TEST_CHAIN_CONFIGS[i];
|
|
40
|
+
const provider = providersByChain.get(config.name)!;
|
|
41
|
+
const deployer = deployerWallet.connect(provider);
|
|
42
|
+
|
|
43
|
+
const token = await new ERC20Test__factory(deployer).deploy(
|
|
44
|
+
'USDC',
|
|
45
|
+
'USDC',
|
|
46
|
+
USDC_INITIAL_SUPPLY,
|
|
47
|
+
USDC_DECIMALS,
|
|
48
|
+
);
|
|
49
|
+
await token.deployed();
|
|
50
|
+
|
|
51
|
+
const monitoredRoute = await new HypERC20Collateral__factory(
|
|
52
|
+
deployer,
|
|
53
|
+
).deploy(
|
|
54
|
+
token.address,
|
|
55
|
+
TOKEN_SCALE_NUMERATOR,
|
|
56
|
+
TOKEN_SCALE_DENOMINATOR,
|
|
57
|
+
chainInfra[config.name].mailbox,
|
|
58
|
+
);
|
|
59
|
+
await monitoredRoute.deployed();
|
|
60
|
+
await monitoredRoute.initialize(
|
|
61
|
+
ethers.constants.AddressZero,
|
|
62
|
+
chainInfra[config.name].ism,
|
|
63
|
+
deployerAddress,
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const bridgeRoute1 = await new HypERC20Collateral__factory(
|
|
67
|
+
deployer,
|
|
68
|
+
).deploy(
|
|
69
|
+
token.address,
|
|
70
|
+
TOKEN_SCALE_NUMERATOR,
|
|
71
|
+
TOKEN_SCALE_DENOMINATOR,
|
|
72
|
+
chainInfra[config.name].mailbox,
|
|
73
|
+
);
|
|
74
|
+
await bridgeRoute1.deployed();
|
|
75
|
+
await bridgeRoute1.initialize(
|
|
76
|
+
ethers.constants.AddressZero,
|
|
77
|
+
chainInfra[config.name].ism,
|
|
78
|
+
deployerAddress,
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const bridgeRoute2 = await new HypERC20Collateral__factory(
|
|
82
|
+
deployer,
|
|
83
|
+
).deploy(
|
|
84
|
+
token.address,
|
|
85
|
+
TOKEN_SCALE_NUMERATOR,
|
|
86
|
+
TOKEN_SCALE_DENOMINATOR,
|
|
87
|
+
chainInfra[config.name].mailbox,
|
|
88
|
+
);
|
|
89
|
+
await bridgeRoute2.deployed();
|
|
90
|
+
await bridgeRoute2.initialize(
|
|
91
|
+
ethers.constants.AddressZero,
|
|
92
|
+
chainInfra[config.name].ism,
|
|
93
|
+
deployerAddress,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
chainDeployments[config.name] = {
|
|
97
|
+
mailbox: chainInfra[config.name].mailbox,
|
|
98
|
+
ism: chainInfra[config.name].ism,
|
|
99
|
+
token: token.address,
|
|
100
|
+
monitoredRouter: monitoredRoute.address,
|
|
101
|
+
bridgeRouter1: bridgeRoute1.address,
|
|
102
|
+
bridgeRouter2: bridgeRoute2.address,
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
tokens[config.name] = token;
|
|
106
|
+
monitoredRouters[config.name] = monitoredRoute;
|
|
107
|
+
bridgeRouters1[config.name] = bridgeRoute1;
|
|
108
|
+
bridgeRouters2[config.name] = bridgeRoute2;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const routeGroups = [monitoredRouters, bridgeRouters1, bridgeRouters2];
|
|
112
|
+
for (const routeMap of routeGroups) {
|
|
113
|
+
for (const chain of TEST_CHAIN_CONFIGS) {
|
|
114
|
+
const localRoute = routeMap[chain.name];
|
|
115
|
+
const remoteDomains: number[] = [];
|
|
116
|
+
const remoteRouters: string[] = [];
|
|
117
|
+
|
|
118
|
+
for (const remote of TEST_CHAIN_CONFIGS) {
|
|
119
|
+
if (remote.name === chain.name) continue;
|
|
120
|
+
remoteDomains.push(remote.domainId);
|
|
121
|
+
remoteRouters.push(
|
|
122
|
+
ethers.utils.hexZeroPad(routeMap[remote.name].address, 32),
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
await localRoute.enrollRemoteRouters(remoteDomains, remoteRouters);
|
|
127
|
+
await localRoute.addRebalancer(deployerAddress);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
for (const chain of TEST_CHAIN_CONFIGS) {
|
|
132
|
+
const monitoredRoute = monitoredRouters[chain.name];
|
|
133
|
+
for (const destination of TEST_CHAIN_CONFIGS) {
|
|
134
|
+
if (destination.name === chain.name) continue;
|
|
135
|
+
await monitoredRoute.addBridge(
|
|
136
|
+
destination.domainId,
|
|
137
|
+
bridgeRouters1[chain.name].address,
|
|
138
|
+
);
|
|
139
|
+
await monitoredRoute.addBridge(
|
|
140
|
+
destination.domainId,
|
|
141
|
+
bridgeRouters2[chain.name].address,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const bridgeSeedAmount = ethers.BigNumber.from(USDC_INITIAL_SUPPLY).div(10);
|
|
147
|
+
for (const chain of TEST_CHAIN_CONFIGS) {
|
|
148
|
+
const provider = providersByChain.get(chain.name)!;
|
|
149
|
+
const deployer = deployerWallet.connect(provider);
|
|
150
|
+
const token = ERC20Test__factory.connect(
|
|
151
|
+
tokens[chain.name].address,
|
|
152
|
+
deployer,
|
|
153
|
+
);
|
|
154
|
+
const tx1 = await token.transfer(
|
|
155
|
+
bridgeRouters1[chain.name].address,
|
|
156
|
+
bridgeSeedAmount,
|
|
157
|
+
);
|
|
158
|
+
await tx1.wait();
|
|
159
|
+
const tx2 = await token.transfer(
|
|
160
|
+
bridgeRouters2[chain.name].address,
|
|
161
|
+
bridgeSeedAmount,
|
|
162
|
+
);
|
|
163
|
+
await tx2.wait();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
chains: chainDeployments,
|
|
168
|
+
monitoredRoute: {
|
|
169
|
+
anvil1: monitoredRouters.anvil1.address,
|
|
170
|
+
anvil2: monitoredRouters.anvil2.address,
|
|
171
|
+
anvil3: monitoredRouters.anvil3.address,
|
|
172
|
+
},
|
|
173
|
+
bridgeRoute1: {
|
|
174
|
+
anvil1: bridgeRouters1.anvil1.address,
|
|
175
|
+
anvil2: bridgeRouters1.anvil2.address,
|
|
176
|
+
anvil3: bridgeRouters1.anvil3.address,
|
|
177
|
+
},
|
|
178
|
+
bridgeRoute2: {
|
|
179
|
+
anvil1: bridgeRouters2.anvil1.address,
|
|
180
|
+
anvil2: bridgeRouters2.anvil2.address,
|
|
181
|
+
anvil3: bridgeRouters2.anvil3.address,
|
|
182
|
+
},
|
|
183
|
+
tokens: {
|
|
184
|
+
anvil1: tokens.anvil1.address,
|
|
185
|
+
anvil2: tokens.anvil2.address,
|
|
186
|
+
anvil3: tokens.anvil3.address,
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|