olas-operate-middleware 0.6.2__tar.gz → 0.7.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.
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/PKG-INFO +3 -3
- olas_operate_middleware-0.6.2/operate/bridge/bridge.py → olas_operate_middleware-0.7.0/operate/bridge/bridge_manager.py +99 -62
- olas_operate_middleware-0.6.2/operate/bridge/providers/lifi_bridge_provider.py → olas_operate_middleware-0.7.0/operate/bridge/providers/lifi_provider.py +94 -81
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/bridge/providers/native_bridge_provider.py +124 -115
- olas_operate_middleware-0.6.2/operate/bridge/providers/bridge_provider.py → olas_operate_middleware-0.7.0/operate/bridge/providers/provider.py +132 -150
- olas_operate_middleware-0.7.0/operate/bridge/providers/relay_provider.py +442 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/cli.py +72 -7
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/constants.py +1 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/ledger/profiles.py +37 -1
- olas_operate_middleware-0.7.0/operate/quickstart/reset_configs.py +109 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/run_service.py +31 -5
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/utils.py +6 -2
- olas_operate_middleware-0.7.0/operate/services/agent_runner.py +210 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/manage.py +41 -11
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/service.py +10 -2
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/utils/mech.py +6 -4
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/pyproject.toml +3 -3
- olas_operate_middleware-0.6.2/operate/data/contracts/service_staking_token/contract.yaml +0 -23
- olas_operate_middleware-0.6.2/operate/services/agent_runner.py +0 -133
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/LICENSE +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/README.md +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/account/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/account/user.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/README.md +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/dual_staking_token/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/dual_staking_token/build/DualStakingToken.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/dual_staking_token/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/dual_staking_token/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/foreign_omnibridge/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/foreign_omnibridge/build/ForeignOmnibridge.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/foreign_omnibridge/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/foreign_omnibridge/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/home_omnibridge/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/home_omnibridge/build/HomeOmnibridge.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/home_omnibridge/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/home_omnibridge/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l1_standard_bridge/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l1_standard_bridge/build/L1StandardBridge.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l1_standard_bridge/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l1_standard_bridge/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l2_standard_bridge/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l2_standard_bridge/build/L2StandardBridge.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l2_standard_bridge/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/l2_standard_bridge/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/mech_activity/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/mech_activity/build/MechActivity.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/mech_activity/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/mech_activity/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/optimism_mintable_erc20/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/optimism_mintable_erc20/build/OptimismMintableERC20.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/optimism_mintable_erc20/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/optimism_mintable_erc20/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/requester_activity_checker/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/requester_activity_checker/build/RequesterActivityChecker.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/requester_activity_checker/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/requester_activity_checker/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/staking_token/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/staking_token/build/StakingToken.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/staking_token/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/staking_token/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/uniswap_v2_erc20/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/uniswap_v2_erc20/build/IUniswapV2ERC20.json +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/uniswap_v2_erc20/contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/uniswap_v2_erc20/contract.yaml +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/uniswap_v2_erc20/tests/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/data/contracts/uniswap_v2_erc20/tests/test_contract.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/keys.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/ledger/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/migration.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/operate_http/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/operate_http/exceptions.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/operate_types.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/pearl.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/analyse_logs.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/claim_staking_rewards.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/reset_password.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/reset_staking.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/stop_service.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/quickstart/terminate_on_chain_service.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/resource.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/deployment_runner.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/health_checker.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/protocol.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/utils/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/services/utils/tendermint.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/utils/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/utils/gnosis.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.0}/operate/wallet/__init__.py +0 -0
- {olas_operate_middleware-0.6.2 → olas_operate_middleware-0.7.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.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary:
|
|
5
5
|
Author: David Vilela
|
|
6
6
|
Author-email: dvilelaf@gmail.com
|
|
@@ -23,7 +23,7 @@ Requires-Dist: eth-keys (==0.4.0)
|
|
|
23
23
|
Requires-Dist: eth-rlp (==0.3.0)
|
|
24
24
|
Requires-Dist: eth-typing (==3.5.2)
|
|
25
25
|
Requires-Dist: eth-utils (==2.3.1)
|
|
26
|
-
Requires-Dist: fastapi (==0.110.
|
|
26
|
+
Requires-Dist: fastapi (==0.110.3)
|
|
27
27
|
Requires-Dist: frozenlist (==1.4.1)
|
|
28
28
|
Requires-Dist: halo (==0.0.31)
|
|
29
29
|
Requires-Dist: hexbytes (==0.3.1)
|
|
@@ -38,7 +38,7 @@ Requires-Dist: open-autonomy (>=0.19.11,<0.20.0)
|
|
|
38
38
|
Requires-Dist: psutil (>=5.9.8,<6.0.0)
|
|
39
39
|
Requires-Dist: pyinstaller (>=6.8.0,<7.0.0)
|
|
40
40
|
Requires-Dist: requests-toolbelt (==1.0.0)
|
|
41
|
-
Requires-Dist: starlette (==0.
|
|
41
|
+
Requires-Dist: starlette (==0.37.2)
|
|
42
42
|
Requires-Dist: twikit (==2.2.0)
|
|
43
43
|
Requires-Dist: uvicorn (==0.27.0)
|
|
44
44
|
Requires-Dist: web3 (==6.1.0)
|
|
@@ -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.
|
|
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
|
-
|
|
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
|
|
93
|
-
"""
|
|
114
|
+
class ProviderRequestBundle(LocalResource):
|
|
115
|
+
"""ProviderRequestBundle"""
|
|
94
116
|
|
|
95
117
|
requests_params: t.List[t.Dict]
|
|
96
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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[
|
|
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
|
-
|
|
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
|
-
|
|
212
|
+
provider_id,
|
|
197
213
|
wallet_manager,
|
|
198
214
|
logger,
|
|
199
215
|
)
|
|
200
|
-
for
|
|
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
|
-
) ->
|
|
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
|
-
|
|
263
|
+
provider_requests = []
|
|
235
264
|
for params in requests_params:
|
|
236
|
-
for
|
|
237
|
-
if
|
|
238
|
-
|
|
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
|
-
|
|
244
|
-
|
|
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 =
|
|
284
|
+
bundle = ProviderRequestBundle(
|
|
248
285
|
id=f"{BRIDGE_REQUEST_BUNDLE_PREFIX}{uuid.uuid4()}",
|
|
249
286
|
requests_params=requests_params,
|
|
250
|
-
|
|
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.
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
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.
|
|
428
|
+
initial_status = [request.status for request in bundle.provider_requests]
|
|
380
429
|
|
|
381
|
-
|
|
382
|
-
for request in bundle.
|
|
383
|
-
|
|
384
|
-
|
|
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.
|
|
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":
|
|
442
|
+
"bridge_request_status": provider_request_status,
|
|
394
443
|
}
|
|
395
444
|
|
|
396
|
-
def
|
|
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
|
|
412
|
-
|
|
413
|
-
requirements.append(
|
|
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:
|
|
454
|
+
def quote_bundle(self, bundle: ProviderRequestBundle) -> None:
|
|
418
455
|
"""Update the bundle with the quotes."""
|
|
419
|
-
for
|
|
420
|
-
|
|
421
|
-
|
|
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]:
|