olas-operate-middleware 0.6.3__tar.gz → 0.8.0__tar.gz

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.
Files changed (92) hide show
  1. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/PKG-INFO +1 -1
  2. olas_operate_middleware-0.6.3/operate/bridge/bridge.py → olas_operate_middleware-0.8.0/operate/bridge/bridge_manager.py +99 -62
  3. olas_operate_middleware-0.6.3/operate/bridge/providers/lifi_bridge_provider.py → olas_operate_middleware-0.8.0/operate/bridge/providers/lifi_provider.py +94 -81
  4. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/bridge/providers/native_bridge_provider.py +124 -115
  5. olas_operate_middleware-0.6.3/operate/bridge/providers/bridge_provider.py → olas_operate_middleware-0.8.0/operate/bridge/providers/provider.py +132 -150
  6. olas_operate_middleware-0.8.0/operate/bridge/providers/relay_provider.py +442 -0
  7. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/cli.py +140 -110
  8. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/constants.py +1 -0
  9. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/ledger/profiles.py +11 -1
  10. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/operate_types.py +10 -0
  11. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/claim_staking_rewards.py +1 -1
  12. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/reset_staking.py +1 -1
  13. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/run_service.py +34 -11
  14. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/terminate_on_chain_service.py +1 -1
  15. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/utils.py +0 -1
  16. olas_operate_middleware-0.8.0/operate/services/agent_runner.py +210 -0
  17. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/manage.py +126 -72
  18. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/pyproject.toml +1 -1
  19. olas_operate_middleware-0.6.3/operate/services/agent_runner.py +0 -133
  20. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/LICENSE +0 -0
  21. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/README.md +0 -0
  22. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/__init__.py +0 -0
  23. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/account/__init__.py +0 -0
  24. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/account/user.py +0 -0
  25. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/README.md +0 -0
  26. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/__init__.py +0 -0
  27. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/__init__.py +0 -0
  28. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/dual_staking_token/__init__.py +0 -0
  29. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/dual_staking_token/build/DualStakingToken.json +0 -0
  30. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/dual_staking_token/contract.py +0 -0
  31. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/dual_staking_token/contract.yaml +0 -0
  32. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/foreign_omnibridge/__init__.py +0 -0
  33. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/foreign_omnibridge/build/ForeignOmnibridge.json +0 -0
  34. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/foreign_omnibridge/contract.py +0 -0
  35. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/foreign_omnibridge/contract.yaml +0 -0
  36. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/home_omnibridge/__init__.py +0 -0
  37. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/home_omnibridge/build/HomeOmnibridge.json +0 -0
  38. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/home_omnibridge/contract.py +0 -0
  39. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/home_omnibridge/contract.yaml +0 -0
  40. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l1_standard_bridge/__init__.py +0 -0
  41. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l1_standard_bridge/build/L1StandardBridge.json +0 -0
  42. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l1_standard_bridge/contract.py +0 -0
  43. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l1_standard_bridge/contract.yaml +0 -0
  44. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l2_standard_bridge/__init__.py +0 -0
  45. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l2_standard_bridge/build/L2StandardBridge.json +0 -0
  46. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l2_standard_bridge/contract.py +0 -0
  47. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/l2_standard_bridge/contract.yaml +0 -0
  48. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/mech_activity/__init__.py +0 -0
  49. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/mech_activity/build/MechActivity.json +0 -0
  50. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/mech_activity/contract.py +0 -0
  51. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/mech_activity/contract.yaml +0 -0
  52. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/optimism_mintable_erc20/__init__.py +0 -0
  53. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/optimism_mintable_erc20/build/OptimismMintableERC20.json +0 -0
  54. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/optimism_mintable_erc20/contract.py +0 -0
  55. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/optimism_mintable_erc20/contract.yaml +0 -0
  56. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/requester_activity_checker/__init__.py +0 -0
  57. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/requester_activity_checker/build/RequesterActivityChecker.json +0 -0
  58. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/requester_activity_checker/contract.py +0 -0
  59. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/requester_activity_checker/contract.yaml +0 -0
  60. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/staking_token/__init__.py +0 -0
  61. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/staking_token/build/StakingToken.json +0 -0
  62. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/staking_token/contract.py +0 -0
  63. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/staking_token/contract.yaml +0 -0
  64. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/uniswap_v2_erc20/__init__.py +0 -0
  65. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/uniswap_v2_erc20/build/IUniswapV2ERC20.json +0 -0
  66. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/uniswap_v2_erc20/contract.py +0 -0
  67. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/uniswap_v2_erc20/contract.yaml +0 -0
  68. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/uniswap_v2_erc20/tests/__init__.py +0 -0
  69. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/data/contracts/uniswap_v2_erc20/tests/test_contract.py +0 -0
  70. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/keys.py +0 -0
  71. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/ledger/__init__.py +0 -0
  72. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/migration.py +0 -0
  73. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/operate_http/__init__.py +0 -0
  74. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/operate_http/exceptions.py +0 -0
  75. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/pearl.py +0 -0
  76. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/analyse_logs.py +0 -0
  77. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/reset_configs.py +0 -0
  78. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/reset_password.py +0 -0
  79. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/quickstart/stop_service.py +0 -0
  80. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/resource.py +0 -0
  81. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/__init__.py +0 -0
  82. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/deployment_runner.py +0 -0
  83. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/health_checker.py +0 -0
  84. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/protocol.py +0 -0
  85. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/service.py +0 -0
  86. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/utils/__init__.py +0 -0
  87. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/utils/mech.py +0 -0
  88. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/services/utils/tendermint.py +0 -0
  89. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/utils/__init__.py +0 -0
  90. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/utils/gnosis.py +0 -0
  91. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/wallet/__init__.py +0 -0
  92. {olas_operate_middleware-0.6.3 → olas_operate_middleware-0.8.0}/operate/wallet/master.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: olas-operate-middleware
3
- Version: 0.6.3
3
+ Version: 0.8.0
4
4
  Summary:
5
5
  Author: David Vilela
6
6
  Author-email: dvilelaf@gmail.com
@@ -31,15 +31,18 @@ from typing import cast
31
31
 
32
32
  from aea.helpers.logging import setup_logger
33
33
  from deepdiff import DeepDiff
34
+ from web3 import Web3
34
35
 
35
- from operate.bridge.providers.bridge_provider import BridgeProvider, BridgeRequest
36
- from operate.bridge.providers.lifi_bridge_provider import LiFiBridgeProvider
36
+ from operate.bridge.providers.lifi_provider import LiFiProvider
37
37
  from operate.bridge.providers.native_bridge_provider import (
38
38
  NativeBridgeProvider,
39
39
  OmnibridgeContractAdaptor,
40
40
  OptimismContractAdaptor,
41
41
  )
42
+ from operate.bridge.providers.provider import Provider, ProviderRequest
43
+ from operate.bridge.providers.relay_provider import RelayProvider
42
44
  from operate.constants import ZERO_ADDRESS
45
+ from operate.ledger.profiles import USDC
43
46
  from operate.operate_types import Chain
44
47
  from operate.resource import LocalResource
45
48
  from operate.services.manage import get_assets_balances
@@ -51,8 +54,10 @@ DEFAULT_BUNDLE_VALIDITY_PERIOD = 3 * 60
51
54
  EXECUTED_BUNDLES_PATH = "executed"
52
55
  BRIDGE_REQUEST_BUNDLE_PREFIX = "rb-"
53
56
 
57
+ LIFI_PROVIDER_ID = "lifi-provider"
58
+ RELAY_PROVIDER_ID = "relay-provider"
54
59
 
55
- NATIVE_BRIDGE_CONFIGS: t.Dict[str, t.Any] = {
60
+ NATIVE_BRIDGE_PROVIDER_CONFIGS: t.Dict[str, t.Any] = {
56
61
  "native-ethereum-to-base": {
57
62
  "from_chain": "ethereum",
58
63
  "from_bridge": "0x3154Cf16ccdb4C6d922629664174b904d80F2C35",
@@ -88,19 +93,36 @@ NATIVE_BRIDGE_CONFIGS: t.Dict[str, t.Any] = {
88
93
  }
89
94
 
90
95
 
96
+ ROUTES = {
97
+ (
98
+ Chain.ETHEREUM, # from_chain
99
+ USDC[Chain.ETHEREUM], # from_token
100
+ Chain.OPTIMISTIC, # to_chain
101
+ USDC[Chain.OPTIMISTIC], # to_token
102
+ ): LIFI_PROVIDER_ID,
103
+ (
104
+ Chain.ETHEREUM, # from_chain
105
+ USDC[Chain.ETHEREUM], # from_token
106
+ Chain.BASE, # to_chain
107
+ USDC[Chain.BASE], # to_token
108
+ ): LIFI_PROVIDER_ID,
109
+ (Chain.ETHEREUM, ZERO_ADDRESS, Chain.GNOSIS, ZERO_ADDRESS): RELAY_PROVIDER_ID,
110
+ }
111
+
112
+
91
113
  @dataclass
92
- class BridgeRequestBundle(LocalResource):
93
- """BridgeRequestBundle"""
114
+ class ProviderRequestBundle(LocalResource):
115
+ """ProviderRequestBundle"""
94
116
 
95
117
  requests_params: t.List[t.Dict]
96
- bridge_requests: t.List[BridgeRequest]
118
+ provider_requests: t.List[ProviderRequest]
97
119
  timestamp: int
98
120
  id: str
99
121
 
100
122
  def get_from_chains(self) -> set[Chain]:
101
123
  """Get 'from' chains."""
102
124
  return {
103
- Chain(request.params["from"]["chain"]) for request in self.bridge_requests
125
+ Chain(request.params["from"]["chain"]) for request in self.provider_requests
104
126
  }
105
127
 
106
128
  def get_from_addresses(self, chain: Chain) -> set[str]:
@@ -108,7 +130,7 @@ class BridgeRequestBundle(LocalResource):
108
130
  chain_str = chain.value
109
131
  return {
110
132
  request.params["from"]["address"]
111
- for request in self.bridge_requests
133
+ for request in self.provider_requests
112
134
  if request.params["from"]["chain"] == chain_str
113
135
  }
114
136
 
@@ -117,7 +139,7 @@ class BridgeRequestBundle(LocalResource):
117
139
  chain_str = chain.value
118
140
  return {
119
141
  request.params["from"]["token"]
120
- for request in self.bridge_requests
142
+ for request in self.provider_requests
121
143
  if request.params["from"]["chain"] == chain_str
122
144
  }
123
145
 
@@ -128,7 +150,7 @@ class BridgeManagerData(LocalResource):
128
150
 
129
151
  path: Path
130
152
  version: int = 1
131
- last_requested_bundle: t.Optional[BridgeRequestBundle] = None
153
+ last_requested_bundle: t.Optional[ProviderRequestBundle] = None
132
154
  last_executed_bundle_id: t.Optional[str] = None
133
155
 
134
156
  _file = "bridge.json"
@@ -178,14 +200,8 @@ class BridgeManager:
178
200
  self.data: BridgeManagerData = cast(
179
201
  BridgeManagerData, BridgeManagerData.load(path)
180
202
  )
181
- self._fallback_bridge_provider = LiFiBridgeProvider(
182
- provider_id="LiFiBridgeProvider",
183
- wallet_manager=wallet_manager,
184
- logger=logger,
185
- )
186
-
187
203
  self._native_bridge_providers = {
188
- bridge_id: NativeBridgeProvider(
204
+ provider_id: NativeBridgeProvider(
189
205
  config["bridge_contract_adaptor_class"](
190
206
  from_chain=config["from_chain"],
191
207
  to_chain=config["to_chain"],
@@ -193,20 +209,33 @@ class BridgeManager:
193
209
  to_bridge=config["to_bridge"],
194
210
  bridge_eta=config["bridge_eta"],
195
211
  ),
196
- bridge_id,
212
+ provider_id,
197
213
  wallet_manager,
198
214
  logger,
199
215
  )
200
- for bridge_id, config in NATIVE_BRIDGE_CONFIGS.items()
216
+ for provider_id, config in NATIVE_BRIDGE_PROVIDER_CONFIGS.items()
201
217
  }
202
218
 
219
+ self._providers: t.Dict[str, Provider] = {}
220
+ self._providers.update(self._native_bridge_providers)
221
+ self._providers[LIFI_PROVIDER_ID] = LiFiProvider(
222
+ provider_id=LIFI_PROVIDER_ID,
223
+ wallet_manager=wallet_manager,
224
+ logger=logger,
225
+ )
226
+ self._providers[RELAY_PROVIDER_ID] = RelayProvider(
227
+ provider_id=RELAY_PROVIDER_ID,
228
+ wallet_manager=wallet_manager,
229
+ logger=logger,
230
+ )
231
+
203
232
  def _store_data(self) -> None:
204
233
  self.logger.info("[BRIDGE MANAGER] Storing data to file.")
205
234
  self.data.store()
206
235
 
207
236
  def _get_updated_bundle(
208
237
  self, requests_params: t.List[t.Dict], force_update: bool
209
- ) -> BridgeRequestBundle:
238
+ ) -> ProviderRequestBundle:
210
239
  """Ensures to return a valid (non expired) bundle for the given inputs."""
211
240
 
212
241
  now = int(time.time())
@@ -231,23 +260,31 @@ class BridgeManager:
231
260
  if not bundle or create_new_bundle:
232
261
  self.logger.info("[BRIDGE MANAGER] Creating new bridge request bundle.")
233
262
 
234
- bridge_requests = []
263
+ provider_requests = []
235
264
  for params in requests_params:
236
- for bridge_provider in self._native_bridge_providers.values():
237
- if bridge_provider.can_handle_request(params):
238
- bridge_requests.append(
239
- bridge_provider.create_request(params=params)
240
- )
265
+ for provider in self._native_bridge_providers.values():
266
+ if provider.can_handle_request(params):
267
+ provider_requests.append(provider.create_request(params=params))
241
268
  break
242
269
  else:
243
- bridge_requests.append(
244
- self._fallback_bridge_provider.create_request(params=params)
270
+ provider_id = ROUTES.get(
271
+ (
272
+ Chain(params["from"]["chain"]),
273
+ params["from"]["token"],
274
+ Chain(params["to"]["chain"]),
275
+ params["to"]["token"],
276
+ ),
277
+ RELAY_PROVIDER_ID,
278
+ )
279
+
280
+ provider_requests.append(
281
+ self._providers[provider_id].create_request(params=params)
245
282
  )
246
283
 
247
- bundle = BridgeRequestBundle(
284
+ bundle = ProviderRequestBundle(
248
285
  id=f"{BRIDGE_REQUEST_BUNDLE_PREFIX}{uuid.uuid4()}",
249
286
  requests_params=requests_params,
250
- bridge_requests=bridge_requests,
287
+ provider_requests=provider_requests,
251
288
  timestamp=now,
252
289
  )
253
290
 
@@ -257,6 +294,18 @@ class BridgeManager:
257
294
 
258
295
  return bundle
259
296
 
297
+ def _sanitize(self, requests_params: t.List) -> None:
298
+ """Sanitize quote requests."""
299
+ w3 = Web3()
300
+ for params in requests_params:
301
+ params["from"]["address"] = w3.to_checksum_address(
302
+ params["from"]["address"]
303
+ )
304
+ params["from"]["token"] = w3.to_checksum_address(params["from"]["token"])
305
+ params["to"]["address"] = w3.to_checksum_address(params["to"]["address"])
306
+ params["to"]["token"] = w3.to_checksum_address(params["to"]["token"])
307
+ params["to"]["amount"] = int(params["to"]["amount"])
308
+
260
309
  def _raise_if_invalid(self, requests_params: t.List) -> None:
261
310
  """Preprocess quote requests."""
262
311
 
@@ -279,7 +328,7 @@ class BridgeManager:
279
328
  self, requests_params: t.List[t.Dict], force_update: bool = False
280
329
  ) -> t.Dict:
281
330
  """Get bridge refill requirements."""
282
-
331
+ self._sanitize(requests_params)
283
332
  self._raise_if_invalid(requests_params)
284
333
  self.logger.info(
285
334
  f"[BRIDGE MANAGER] Quote requests count: {len(requests_params)}."
@@ -350,9 +399,9 @@ class BridgeManager:
350
399
 
351
400
  self.logger.info("[BRIDGE MANAGER] Executing quotes.")
352
401
 
353
- for request in bundle.bridge_requests:
354
- bridge = self._get_bridge_provider(request)
355
- bridge.execute(request)
402
+ for request in bundle.provider_requests:
403
+ provider = self._providers[request.provider_id]
404
+ provider.execute(request)
356
405
  self._store_data()
357
406
 
358
407
  self._store_data()
@@ -370,55 +419,43 @@ class BridgeManager:
370
419
  bundle_path = self.path / EXECUTED_BUNDLES_PATH / f"{bundle_id}.json"
371
420
  if bundle_path.exists():
372
421
  bundle = cast(
373
- BridgeRequestBundle, BridgeRequestBundle.load(bundle_path)
422
+ ProviderRequestBundle, ProviderRequestBundle.load(bundle_path)
374
423
  )
375
424
  bundle.path = bundle_path # TODO backport to resource.py ?
376
425
  else:
377
426
  raise FileNotFoundError(f"Bundle with ID {bundle_id} does not exist.")
378
427
 
379
- initial_status = [request.status for request in bundle.bridge_requests]
428
+ initial_status = [request.status for request in bundle.provider_requests]
380
429
 
381
- bridge_request_status = []
382
- for request in bundle.bridge_requests:
383
- bridge = self._get_bridge_provider(request)
384
- bridge_request_status.append(bridge.status_json(request))
430
+ provider_request_status = []
431
+ for request in bundle.provider_requests:
432
+ provider = self._providers[request.provider_id]
433
+ provider_request_status.append(provider.status_json(request))
385
434
 
386
- updated_status = [request.status for request in bundle.bridge_requests]
435
+ updated_status = [request.status for request in bundle.provider_requests]
387
436
 
388
437
  if initial_status != updated_status and bundle.path is not None:
389
438
  bundle.store()
390
439
 
391
440
  return {
392
441
  "id": bundle.id,
393
- "bridge_request_status": bridge_request_status,
442
+ "bridge_request_status": provider_request_status,
394
443
  }
395
444
 
396
- def _get_bridge_provider(self, request: BridgeRequest) -> BridgeProvider:
397
- bridge = self._native_bridge_providers.get(request.bridge_provider_id, None)
398
- if bridge:
399
- return bridge
400
-
401
- if request.bridge_provider_id == self._fallback_bridge_provider.provider_id:
402
- return self._fallback_bridge_provider
403
-
404
- raise RuntimeError(
405
- f"Bridge request {request.id} does not have a valid provider."
406
- )
407
-
408
- def bridge_total_requirements(self, bundle: BridgeRequestBundle) -> t.Dict:
445
+ def bridge_total_requirements(self, bundle: ProviderRequestBundle) -> t.Dict:
409
446
  """Sum bridge requirements."""
410
447
  requirements = []
411
- for bridge_request in bundle.bridge_requests:
412
- bridge = self._get_bridge_provider(bridge_request)
413
- requirements.append(bridge.bridge_requirements(bridge_request))
448
+ for provider_request in bundle.provider_requests:
449
+ provider = self._providers[provider_request.provider_id]
450
+ requirements.append(provider.requirements(provider_request))
414
451
 
415
452
  return merge_sum_dicts(*requirements)
416
453
 
417
- def quote_bundle(self, bundle: BridgeRequestBundle) -> None:
454
+ def quote_bundle(self, bundle: ProviderRequestBundle) -> None:
418
455
  """Update the bundle with the quotes."""
419
- for bridge_request in bundle.bridge_requests:
420
- bridge = self._get_bridge_provider(bridge_request)
421
- bridge.quote(bridge_request)
456
+ for provider_request in bundle.provider_requests:
457
+ provider = self._providers[provider_request.provider_id]
458
+ provider.quote(provider_request)
422
459
  bundle.timestamp = int(time.time())
423
460
 
424
461
  def last_executed_bundle_id(self) -> t.Optional[str]: