wayfinder-paths 0.1.14__py3-none-any.whl → 0.1.16__py3-none-any.whl

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 (58) hide show
  1. wayfinder_paths/adapters/balance_adapter/README.md +19 -20
  2. wayfinder_paths/adapters/balance_adapter/adapter.py +91 -22
  3. wayfinder_paths/adapters/balance_adapter/test_adapter.py +5 -11
  4. wayfinder_paths/adapters/brap_adapter/README.md +22 -19
  5. wayfinder_paths/adapters/brap_adapter/adapter.py +95 -45
  6. wayfinder_paths/adapters/brap_adapter/test_adapter.py +8 -24
  7. wayfinder_paths/adapters/hyperlend_adapter/adapter.py +40 -42
  8. wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py +8 -15
  9. wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py +6 -6
  10. wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +12 -12
  11. wayfinder_paths/adapters/ledger_adapter/test_adapter.py +6 -6
  12. wayfinder_paths/adapters/moonwell_adapter/README.md +29 -31
  13. wayfinder_paths/adapters/moonwell_adapter/adapter.py +326 -364
  14. wayfinder_paths/adapters/moonwell_adapter/test_adapter.py +285 -189
  15. wayfinder_paths/adapters/pool_adapter/test_adapter.py +2 -2
  16. wayfinder_paths/adapters/token_adapter/test_adapter.py +4 -4
  17. wayfinder_paths/core/config.py +8 -47
  18. wayfinder_paths/core/constants/base.py +0 -1
  19. wayfinder_paths/core/constants/erc20_abi.py +13 -24
  20. wayfinder_paths/core/engine/StrategyJob.py +3 -1
  21. wayfinder_paths/core/services/test_local_evm_txn.py +145 -0
  22. wayfinder_paths/core/strategies/Strategy.py +22 -4
  23. wayfinder_paths/core/utils/erc20_service.py +100 -0
  24. wayfinder_paths/core/utils/evm_helpers.py +1 -8
  25. wayfinder_paths/core/utils/transaction.py +191 -0
  26. wayfinder_paths/core/utils/web3.py +66 -0
  27. wayfinder_paths/policies/erc20.py +1 -1
  28. wayfinder_paths/run_strategy.py +42 -6
  29. wayfinder_paths/strategies/basis_trading_strategy/strategy.py +263 -220
  30. wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +132 -155
  31. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +0 -1
  32. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +123 -80
  33. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +0 -12
  34. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md +6 -6
  35. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py +2270 -1328
  36. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py +282 -121
  37. wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +0 -1
  38. wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +107 -85
  39. wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +0 -8
  40. wayfinder_paths/templates/adapter/README.md +1 -1
  41. wayfinder_paths/templates/strategy/README.md +1 -5
  42. {wayfinder_paths-0.1.14.dist-info → wayfinder_paths-0.1.16.dist-info}/METADATA +3 -41
  43. {wayfinder_paths-0.1.14.dist-info → wayfinder_paths-0.1.16.dist-info}/RECORD +45 -54
  44. {wayfinder_paths-0.1.14.dist-info → wayfinder_paths-0.1.16.dist-info}/WHEEL +1 -1
  45. wayfinder_paths/abis/generic/erc20.json +0 -383
  46. wayfinder_paths/core/clients/sdk_example.py +0 -125
  47. wayfinder_paths/core/engine/__init__.py +0 -5
  48. wayfinder_paths/core/services/__init__.py +0 -0
  49. wayfinder_paths/core/services/base.py +0 -130
  50. wayfinder_paths/core/services/local_evm_txn.py +0 -334
  51. wayfinder_paths/core/services/local_token_txn.py +0 -242
  52. wayfinder_paths/core/services/web3_service.py +0 -43
  53. wayfinder_paths/core/wallets/README.md +0 -88
  54. wayfinder_paths/core/wallets/WalletManager.py +0 -56
  55. wayfinder_paths/core/wallets/__init__.py +0 -7
  56. wayfinder_paths/scripts/run_strategy.py +0 -152
  57. wayfinder_paths/strategies/config.py +0 -85
  58. {wayfinder_paths-0.1.14.dist-info → wayfinder_paths-0.1.16.dist-info}/LICENSE +0 -0
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
2
  import math
3
3
  import time
4
+ from collections.abc import Awaitable, Callable
4
5
  from datetime import UTC, datetime, timedelta
5
6
  from typing import Any
6
7
 
@@ -12,10 +13,6 @@ from wayfinder_paths.adapters.ledger_adapter.adapter import LedgerAdapter
12
13
  from wayfinder_paths.adapters.pool_adapter.adapter import PoolAdapter
13
14
  from wayfinder_paths.adapters.token_adapter.adapter import TokenAdapter
14
15
  from wayfinder_paths.core.constants.base import DEFAULT_SLIPPAGE
15
- from wayfinder_paths.core.services.local_token_txn import (
16
- LocalTokenTxnService,
17
- )
18
- from wayfinder_paths.core.services.web3_service import DefaultWeb3Service
19
16
  from wayfinder_paths.core.strategies.descriptors import (
20
17
  Complexity,
21
18
  Directionality,
@@ -25,7 +22,6 @@ from wayfinder_paths.core.strategies.descriptors import (
25
22
  Volatility,
26
23
  )
27
24
  from wayfinder_paths.core.strategies.Strategy import StatusDict, StatusTuple, Strategy
28
- from wayfinder_paths.core.wallets.WalletManager import WalletManager
29
25
 
30
26
 
31
27
  class StablecoinYieldStrategy(Strategy):
@@ -156,9 +152,16 @@ class StablecoinYieldStrategy(Strategy):
156
152
  *,
157
153
  main_wallet: dict[str, Any] | None = None,
158
154
  strategy_wallet: dict[str, Any] | None = None,
159
- web3_service=None,
155
+ api_key: str | None = None,
156
+ main_wallet_signing_callback: Callable[[dict], Awaitable[str]] | None = None,
157
+ strategy_wallet_signing_callback: Callable[[dict], Awaitable[str]]
158
+ | None = None,
160
159
  ):
161
- super().__init__()
160
+ super().__init__(
161
+ api_key=api_key,
162
+ main_wallet_signing_callback=main_wallet_signing_callback,
163
+ strategy_wallet_signing_callback=strategy_wallet_signing_callback,
164
+ )
162
165
  merged_config: dict[str, Any] = dict(config or {})
163
166
  if main_wallet is not None:
164
167
  merged_config["main_wallet"] = main_wallet
@@ -170,16 +173,16 @@ class StablecoinYieldStrategy(Strategy):
170
173
  self.current_pool = None
171
174
  self.current_apy = 0
172
175
  self.balance_adapter = None
173
- self.tx_adapter = None
174
- self.web3_service = web3_service
175
176
  self.token_adapter = None
176
177
  self.ledger_adapter = None
177
178
  self.pool_adapter = None
178
179
  self.brap_adapter = None
179
180
 
180
181
  # State tracking for deterministic token management
181
- self.tracked_token_ids: set[str] = set() # All tokens strategy might hold
182
- self.tracked_balances: dict[str, int] = {} # token_id -> balance in wei
182
+ # All tokens strategy might hold
183
+ self.tracked_token_ids: set[str] = set()
184
+ # token_id -> balance in wei
185
+ self.tracked_balances: dict[str, int] = {}
183
186
 
184
187
  try:
185
188
  main_wallet_cfg = self.config.get("main_wallet")
@@ -191,23 +194,18 @@ class StablecoinYieldStrategy(Strategy):
191
194
  "strategy": self.config,
192
195
  }
193
196
 
194
- if self.web3_service is None:
195
- wallet_provider = WalletManager.get_provider(adapter_config)
196
- tx_adapter = LocalTokenTxnService(
197
- adapter_config,
198
- wallet_provider=wallet_provider,
199
- )
200
- web3_service = DefaultWeb3Service(
201
- wallet_provider=wallet_provider, evm_transactions=tx_adapter
202
- )
203
- else:
204
- web3_service = self.web3_service
205
- tx_adapter = web3_service.token_transactions
206
- balance = BalanceAdapter(adapter_config, web3_service=web3_service)
197
+ balance = BalanceAdapter(
198
+ adapter_config,
199
+ main_wallet_signing_callback=self.main_wallet_signing_callback,
200
+ strategy_wallet_signing_callback=self.strategy_wallet_signing_callback,
201
+ )
207
202
  token_adapter = TokenAdapter()
208
203
  ledger_adapter = LedgerAdapter()
209
204
  pool_adapter = PoolAdapter()
210
- brap_adapter = BRAPAdapter(web3_service=web3_service)
205
+ brap_adapter = BRAPAdapter(
206
+ adapter_config,
207
+ strategy_wallet_signing_callback=self.strategy_wallet_signing_callback,
208
+ )
211
209
 
212
210
  self.register_adapters(
213
211
  [
@@ -216,12 +214,9 @@ class StablecoinYieldStrategy(Strategy):
216
214
  ledger_adapter,
217
215
  pool_adapter,
218
216
  brap_adapter,
219
- tx_adapter,
220
217
  ]
221
218
  )
222
219
  self.balance_adapter = balance
223
- self.tx_adapter = tx_adapter
224
- self.web3_service = web3_service
225
220
  self.token_adapter = token_adapter
226
221
  self.ledger_adapter = ledger_adapter
227
222
  self.pool_adapter = pool_adapter
@@ -1010,85 +1005,112 @@ class StablecoinYieldStrategy(Strategy):
1010
1005
  )
1011
1006
 
1012
1007
  await self._sweep_wallet(self.usdc_token_info)
1013
- withdrawn_breakdown = []
1014
- withdrawn_token_ids = set()
1015
1008
 
1016
- if self.usdc_token_info.get("token_id") in withdrawn_token_ids:
1017
- pass
1009
+ # Get final USDC balance in strategy wallet
1018
1010
  status, raw_balance = await self.balance_adapter.get_balance(
1019
1011
  query=self.usdc_token_info.get("token_id"),
1020
1012
  wallet_address=self._get_strategy_wallet_address(),
1021
1013
  )
1022
- if not status or not raw_balance:
1023
- pass
1024
- amount = float(raw_balance) / 10 ** self.usdc_token_info.get("decimals")
1025
- if amount > 0:
1026
- (
1027
- move_status,
1028
- move_message,
1029
- ) = await self.balance_adapter.move_from_strategy_wallet_to_main_wallet(
1030
- self.usdc_token_info.get("token_id"),
1031
- amount,
1032
- strategy_name=self.name,
1014
+ usdc_amount = 0.0
1015
+ if status and raw_balance:
1016
+ usdc_amount = float(raw_balance) / 10 ** self.usdc_token_info.get(
1017
+ "decimals"
1033
1018
  )
1034
- if not move_status:
1035
- return (False, f"USDC return to main failed: {move_message}")
1036
1019
 
1037
- withdrawn_breakdown.append(
1038
- (
1039
- self.usdc_token_info.get("symbol"),
1040
- self.usdc_token_info.get("chain").get("name"),
1041
- float(amount),
1042
- )
1043
- )
1044
- withdrawn_token_ids.add(self.usdc_token_info.get("token_id"))
1045
-
1046
- if self.gas_token and self.gas_token.get("token_id") not in withdrawn_token_ids:
1020
+ # Get gas balance in strategy wallet
1021
+ gas_amount = 0.0
1022
+ if self.gas_token:
1047
1023
  status, raw_gas = await self.balance_adapter.get_balance(
1048
1024
  query=self.gas_token.get("token_id"),
1049
1025
  wallet_address=self._get_strategy_wallet_address(),
1050
1026
  )
1051
1027
  if status and raw_gas:
1052
- gas_amount = (
1053
- float(raw_gas) / 10 ** self.gas_token.get("decimals")
1054
- ) * 0.9
1055
- if gas_amount > 0:
1056
- (
1057
- move_gas_status,
1058
- move_gas_message,
1059
- ) = await self.balance_adapter.move_from_strategy_wallet_to_main_wallet(
1060
- self.gas_token.get("token_id"),
1061
- gas_amount,
1062
- strategy_name=self.name,
1063
- )
1064
- if move_gas_status:
1065
- withdrawn_breakdown.append(
1066
- (
1067
- self.gas_token.get("symbol"),
1068
- self.gas_token.get("chain").get("name"),
1069
- float(gas_amount),
1070
- )
1071
- )
1072
- withdrawn_token_ids.add(self.gas_token.get("token_id"))
1028
+ gas_amount = float(raw_gas) / 10 ** self.gas_token.get("decimals")
1073
1029
 
1074
1030
  self.DEPOSIT_USDC = 0
1075
1031
  self.current_pool_balance = 0
1076
1032
 
1077
- if not withdrawn_breakdown:
1078
- return (True, f"Successfully withdrew {amount} USDC from strategy")
1079
-
1080
- breakdown_msg = ", ".join(
1081
- f"{amount:.6f} {symbol} on {chain.capitalize()}"
1082
- for symbol, chain, amount in withdrawn_breakdown
1083
- )
1084
-
1085
1033
  elapsed_time = time.time() - start_time
1086
1034
  logger.info(f"Withdrawal completed successfully in {elapsed_time:.2f} seconds")
1035
+
1036
+ strategy_address = self._get_strategy_wallet_address()
1037
+ breakdown_parts = [f"{usdc_amount:.2f} USDC"]
1038
+ if gas_amount > 0:
1039
+ breakdown_parts.append(
1040
+ f"{gas_amount:.6f} {self.gas_token.get('symbol', 'ETH')}"
1041
+ )
1042
+
1087
1043
  return (
1088
1044
  True,
1089
- f"Successfully withdrew {amount} USDC from strategy: {breakdown_msg}",
1045
+ f"Liquidated positions to strategy wallet ({strategy_address}): {', '.join(breakdown_parts)}. "
1046
+ f"Call exit() to transfer to main wallet.",
1090
1047
  )
1091
1048
 
1049
+ async def exit(self, **kwargs) -> StatusTuple:
1050
+ """Transfer funds from strategy wallet to main wallet."""
1051
+ logger.info("EXIT: Transferring remaining funds to main wallet")
1052
+
1053
+ strategy_address = self._get_strategy_wallet_address()
1054
+ main_address = self._get_main_wallet_address()
1055
+
1056
+ if strategy_address.lower() == main_address.lower():
1057
+ return (True, "Main wallet is strategy wallet, no transfer needed")
1058
+
1059
+ transferred_items = []
1060
+
1061
+ # Transfer USDC to main wallet
1062
+ usdc_ok, usdc_raw = await self.balance_adapter.get_balance(
1063
+ token_id="usd-coin-base",
1064
+ wallet_address=strategy_address,
1065
+ )
1066
+ if usdc_ok and usdc_raw:
1067
+ usdc_balance = float(usdc_raw.get("balance", 0))
1068
+ if usdc_balance > 1.0:
1069
+ logger.info(f"Transferring {usdc_balance:.2f} USDC to main wallet")
1070
+ (
1071
+ success,
1072
+ msg,
1073
+ ) = await self.balance_adapter.move_from_strategy_wallet_to_main_wallet(
1074
+ query="usd-coin-base",
1075
+ amount=usdc_balance,
1076
+ strategy_name=self.name,
1077
+ skip_ledger=False,
1078
+ )
1079
+ if success:
1080
+ transferred_items.append(f"{usdc_balance:.2f} USDC")
1081
+ else:
1082
+ logger.warning(f"USDC transfer failed: {msg}")
1083
+
1084
+ # Transfer ETH (minus reserve for tx fees) to main wallet
1085
+ eth_ok, eth_raw = await self.balance_adapter.get_balance(
1086
+ token_id="ethereum-base",
1087
+ wallet_address=strategy_address,
1088
+ )
1089
+ if eth_ok and eth_raw:
1090
+ eth_balance = float(eth_raw.get("balance", 0))
1091
+ tx_fee_reserve = 0.0002
1092
+ transferable_eth = eth_balance - tx_fee_reserve
1093
+ if transferable_eth > 0.0001:
1094
+ logger.info(f"Transferring {transferable_eth:.6f} ETH to main wallet")
1095
+ (
1096
+ success,
1097
+ msg,
1098
+ ) = await self.balance_adapter.move_from_strategy_wallet_to_main_wallet(
1099
+ query="ethereum-base",
1100
+ amount=transferable_eth,
1101
+ strategy_name=self.name,
1102
+ skip_ledger=False,
1103
+ )
1104
+ if success:
1105
+ transferred_items.append(f"{transferable_eth:.6f} ETH")
1106
+ else:
1107
+ logger.warning(f"ETH transfer failed: {msg}")
1108
+
1109
+ if not transferred_items:
1110
+ return (True, "No funds to transfer to main wallet")
1111
+
1112
+ return (True, f"Transferred to main wallet: {', '.join(transferred_items)}")
1113
+
1092
1114
  async def _get_last_rotation_time(self, wallet_address: str) -> datetime | None:
1093
1115
  success, data = await self.ledger_adapter.get_strategy_latest_transactions(
1094
1116
  wallet_address=self._get_strategy_wallet_address(),
@@ -118,10 +118,6 @@ def strategy():
118
118
  s.balance_adapter.move_from_strategy_wallet_to_main_wallet = AsyncMock(
119
119
  return_value=(True, "Transfer successful (simulated)")
120
120
  )
121
- if hasattr(s.balance_adapter, "wallet_provider"):
122
- s.balance_adapter.wallet_provider.broadcast_transaction = AsyncMock(
123
- return_value=(True, {"transaction_hash": "0xDEADBEEF"})
124
- )
125
121
 
126
122
  if hasattr(s, "ledger_adapter") and s.ledger_adapter:
127
123
  # NOTE: The real LedgerClient returns float, not dict!
@@ -200,10 +196,6 @@ def strategy():
200
196
  and hasattr(s.brap_adapter, "swap_from_quote")
201
197
  ):
202
198
  s.brap_adapter.swap_from_quote = AsyncMock(return_value=None)
203
- if hasattr(s, "brap_adapter") and hasattr(s.brap_adapter, "wallet_provider"):
204
- s.brap_adapter.wallet_provider.broadcast_transaction = AsyncMock(
205
- return_value=(True, {"transaction_hash": "0xBEEF"})
206
- )
207
199
 
208
200
  s.DEPOSIT_USDC = 0
209
201
  s.usdc_token_info = {
@@ -77,7 +77,7 @@ async def test_get_pools():
77
77
  ):
78
78
  adapter = MyAdapter(config={})
79
79
  success, data = await adapter.get_pools(["pool-1"])
80
- assert success is True
80
+ assert success
81
81
  assert "pools" in data
82
82
  ```
83
83
 
@@ -41,12 +41,10 @@ async def _status(self) -> StatusDict:
41
41
 
42
42
  Strategies typically:
43
43
 
44
- 1. Build a `DefaultWeb3Service` so every adapter shares a wallet provider.
45
44
  2. Instantiate adapters (balance, ledger, protocol specific, etc.).
46
45
  3. Register adapters via `self.register_adapters([...])` and keep references as attributes.
47
46
 
48
47
  ```python
49
- from wayfinder_paths.core.services.web3_service import DefaultWeb3Service
50
48
  from wayfinder_paths.core.strategies.Strategy import StatusDict, StatusTuple, Strategy
51
49
  from wayfinder_paths.adapters.balance_adapter.adapter import BalanceAdapter
52
50
 
@@ -57,8 +55,7 @@ class MyStrategy(Strategy):
57
55
  def __init__(self, config: dict | None = None):
58
56
  super().__init__()
59
57
  self.config = config or {}
60
- web3_service = DefaultWeb3Service(self.config)
61
- balance_adapter = BalanceAdapter(self.config, web3_service=web3_service)
58
+ balance_adapter = BalanceAdapter(self.config)
62
59
  self.register_adapters([balance_adapter])
63
60
  self.balance_adapter = balance_adapter
64
61
 
@@ -76,7 +73,6 @@ class MyStrategy(Strategy):
76
73
  if not success:
77
74
  return (False, "Unable to fetch balances")
78
75
 
79
- # Use BalanceAdapter (which leverages LocalTokenTxnService builders) for transfers.
80
76
  self.last_deposit = main_token_amount
81
77
  return (True, f"Deposited {main_token_amount} tokens")
82
78
 
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wayfinder-paths
3
- Version: 0.1.14
3
+ Version: 0.1.16
4
4
  Summary: Wayfinder Path: strategies and adapters
5
5
  Author: Wayfinder
6
6
  Author-email: dev@wayfinder.ai
7
7
  Requires-Python: >=3.12,<4.0
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: Programming Language :: Python :: 3.12
10
+ Classifier: Programming Language :: Python :: 3.13
10
11
  Requires-Dist: aiohttp (>=3.13.0,<4.0.0)
11
12
  Requires-Dist: eth-account (>=0.13.7,<0.14.0)
12
13
  Requires-Dist: httpx (>=0.28.1,<0.29.0)
@@ -275,7 +276,6 @@ Strategies implement trading logic using adapters and the unified client system.
275
276
 
276
277
  ```python
277
278
  # wayfinder_paths/strategies/my_strategy/strategy.py
278
- from wayfinder_paths.core.services.web3_service import DefaultWeb3Service
279
279
  from wayfinder_paths.core.strategies.Strategy import StatusDict, StatusTuple, Strategy
280
280
  from wayfinder_paths.adapters.balance_adapter.adapter import BalanceAdapter
281
281
 
@@ -291,9 +291,8 @@ class MyStrategy(Strategy):
291
291
  ):
292
292
  super().__init__(api_key=api_key) # Pass to base class for auto-discovery
293
293
  self.config = config or {}
294
- web3_service = DefaultWeb3Service(self.config)
295
294
  # Adapters automatically discover API key from constructor or config.json
296
- balance_adapter = BalanceAdapter(self.config, web3_service=web3_service)
295
+ balance_adapter = BalanceAdapter(self.config)
297
296
  self.register_adapters([balance_adapter])
298
297
  self.balance_adapter = balance_adapter
299
298
 
@@ -311,7 +310,6 @@ class MyStrategy(Strategy):
311
310
  if not success:
312
311
  return (False, "Unable to fetch balances")
313
312
 
314
- # Use BalanceAdapter (which leverages LocalTokenTxnService builders) for transfers here.
315
313
  self.last_deposit = main_token_amount
316
314
  return (True, f"Deposited {main_token_amount} tokens")
317
315
 
@@ -344,42 +342,6 @@ The following strategies are available and can be run using the CLI:
344
342
 
345
343
  #### Running Strategies
346
344
 
347
- ```bash
348
- # Check strategy status
349
- poetry run python wayfinder_paths/scripts/run_strategy.py \
350
- --strategy moonwell_wsteth_loop_strategy \
351
- --main-wallet-label main \
352
- --strategy-wallet-label moonwell_wsteth_loop_strategy \
353
- status
354
-
355
- # Deposit funds (USDC amount, optional ETH for gas)
356
- poetry run python wayfinder_paths/scripts/run_strategy.py \
357
- --strategy moonwell_wsteth_loop_strategy \
358
- --main-wallet-label main \
359
- --strategy-wallet-label moonwell_wsteth_loop_strategy \
360
- deposit --usdc 100 --eth 0.01
361
-
362
- # Run periodic update
363
- poetry run python wayfinder_paths/scripts/run_strategy.py \
364
- --strategy moonwell_wsteth_loop_strategy \
365
- --main-wallet-label main \
366
- --strategy-wallet-label moonwell_wsteth_loop_strategy \
367
- update
368
-
369
- # Withdraw funds (omit --amount for full withdrawal)
370
- poetry run python wayfinder_paths/scripts/run_strategy.py \
371
- --strategy moonwell_wsteth_loop_strategy \
372
- --main-wallet-label main \
373
- --strategy-wallet-label moonwell_wsteth_loop_strategy \
374
- withdraw --amount 50
375
-
376
- # Run in simulation mode (no real transactions)
377
- poetry run python wayfinder_paths/scripts/run_strategy.py \
378
- --strategy moonwell_wsteth_loop_strategy \
379
- --simulation \
380
- status
381
- ```
382
-
383
345
  ### Built-in adapters
384
346
 
385
347
  - **BALANCE (BalanceAdapter)**: wraps `WalletClient`/`TokenClient` to read wallet, token, and pool balances and now orchestrates transfers between the main/strategy wallets with ledger bookkeeping. Requires a `Web3Service` so it can share the same wallet provider as the strategy.
@@ -1,24 +1,23 @@
1
1
  wayfinder_paths/__init__.py,sha256=YgOg-PRPT3ROh0zg6hgQyQE-YFkFGw6TM77zDvB4_sE,427
2
- wayfinder_paths/abis/generic/erc20.json,sha256=geyzVzdTNt3u1XHKxi4seszP_GIWIzPTl0FYgiftRnM,9336
3
2
  wayfinder_paths/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- wayfinder_paths/adapters/balance_adapter/README.md,sha256=VCBvhAzgWayVgRZonwAB0oMIip1iXvRWb0cYSmeDmPI,3789
5
- wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=OzhnMfB1z7BgCKaXv7Yp4Hdl2Ny2LZ6Yzjz51-Ur3EM,8580
3
+ wayfinder_paths/adapters/balance_adapter/README.md,sha256=NXd9NSIz6j10_WL8UMDRJ3LXepiZ0DMfRgd_hmulg9o,3155
4
+ wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=nL29BY12rbCiB3WUgpNHvyMAYZtoxjz6n1CD3AmbFa8,11126
6
5
  wayfinder_paths/adapters/balance_adapter/examples.json,sha256=3R1M4B_VsIy29viAuFT9nQbnQShWl8ZbU-rnSNWUW9U,129
7
- wayfinder_paths/adapters/balance_adapter/test_adapter.py,sha256=slCRF6JlLSbLAUyPYQsl19KxwSgrF9853O7XOPyUPNY,6311
8
- wayfinder_paths/adapters/brap_adapter/README.md,sha256=eOWIwAPdaBuvPCmT_E4myucUSvgupvvQQKDcptgRluw,7756
6
+ wayfinder_paths/adapters/balance_adapter/test_adapter.py,sha256=UQArZUMLWC_F9vsXt_cKhwX_4_4SWwOIwEGSFTwlvkQ,6078
7
+ wayfinder_paths/adapters/brap_adapter/README.md,sha256=Yihq35seDSvypW9c6u7IJViDGPTTWs_X3-mfjjc6uRA,7477
9
8
  wayfinder_paths/adapters/brap_adapter/__init__.py,sha256=jpqxZ-Bv_8kBo-lhgO_QCWaVZNq_WwlkNBHD4RsqOJg,90
10
- wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=rTy4g6-_pkP61o-plTNBIb7j1phB5xX7lmaYadtYAfE,30446
9
+ wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=1qdE9jfnxkwuIKxeVnn6z50hGtzFeLab_DL8whni4g4,32539
11
10
  wayfinder_paths/adapters/brap_adapter/examples.json,sha256=FGZhNaMCAQ56KhovEGSsV1BHOcMd_QqQBNmCU6m8zfQ,5389
12
- wayfinder_paths/adapters/brap_adapter/test_adapter.py,sha256=qIPPHk1_WGKYSFndWC-CzHE7z1OvM8hNVypvFNV_lG4,12848
11
+ wayfinder_paths/adapters/brap_adapter/test_adapter.py,sha256=ohaiMPyGxW5faOXjjAHuW5yAdcqx_lRWa3-Tm6Px0U0,12110
13
12
  wayfinder_paths/adapters/hyperlend_adapter/__init__.py,sha256=DsWOnEn-Tlu9ZoIoGaFeSqOYI3b4lXGVK3_FTntWpLw,139
14
- wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=DtdKzi8dDTBZdzbddIDuzJXWF_NOvOG_EtfxE6taTGY,10013
15
- wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py,sha256=7QYUh0xEQd2dDyt069abHjSduVPtPXAL5q_TNeQXk_4,12152
13
+ wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=Zm1be-r6KgUjyGv6SVPzLsEMadBg4KFOkGrCCY4twUg,9940
14
+ wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py,sha256=UEKGh-cRMhuc7k1tClLu8wuh6oQ4KV8ViczUa62qibk,11811
16
15
  wayfinder_paths/adapters/hyperliquid_adapter/__init__.py,sha256=QpA258RzVbxzsha86HQduAuNVG0g0qvsI5OcZunQ8DQ,467
17
16
  wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=Z5Gl9M9wk7PVUIyP_i2oAMegmCTbVFd48Zp57DURh6M,34510
18
17
  wayfinder_paths/adapters/hyperliquid_adapter/executor.py,sha256=ix1FmRO6DPiPk0BwGy4zrCP5IfKzzMSQNhnOmIewfGA,18977
19
18
  wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py,sha256=nOBsrAka8PKv5h8SuoJuLTH4HYS4n0vpTIADUCyDKlA,37546
20
- wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py,sha256=JEDeIMSTdrgcSy4BGSVB0CixQzl3NsKpukOZ9mRu3kE,4542
21
- wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=lnlL0njECM6C4hVlsEZ4_7wtcixIBO8qqTRO6b1yGGg,7672
19
+ wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py,sha256=pZb8FcreC_Y9-_B7BRBZnihquuR2noEddlsJeBQIoAw,4494
20
+ wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=RVqfPVLeER7GLFwpIc-66T09pDkFPhyueMB6Ju1yDuY,7576
22
21
  wayfinder_paths/adapters/hyperliquid_adapter/test_executor.py,sha256=6tAstfO2fFTWWYSqYsd3jzY5iQ1RrCsLl_0pbwJO-bE,4147
23
22
  wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py,sha256=2gSrXJgtfrTqNOQIhBS92vUkfcwhFsMLgFRkf1bzLy8,7290
24
23
  wayfinder_paths/adapters/hyperliquid_adapter/utils.py,sha256=WjLEaNVvcB8FfYlTrwZBrmw7k2MLS5KhBeW4NNoLlVI,4254
@@ -26,21 +25,21 @@ wayfinder_paths/adapters/ledger_adapter/README.md,sha256=_tGIpIkg-TCYddf8d4FhJvJ
26
25
  wayfinder_paths/adapters/ledger_adapter/__init__.py,sha256=DK9GShIUiQ57YKSqhCKoS43GCweBxi0lzkUQ9sYVxUA,96
27
26
  wayfinder_paths/adapters/ledger_adapter/adapter.py,sha256=6Fjxltvn9iXp_-CZtN7lDz1Xt0lWaNQX2drx6lgeryw,10260
28
27
  wayfinder_paths/adapters/ledger_adapter/examples.json,sha256=DdqTSe4vnBrfIycQVQQ_JZom7fBGHbL7MR4ppK9ljCY,3936
29
- wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=Z1-rPP9k5fI-8ofWMKgU3syzNegKGH_hGO6CKApQj1c,7470
30
- wayfinder_paths/adapters/moonwell_adapter/README.md,sha256=PyQllVXgW0aUUoWhAZ5phLPAxtR9A5GkwesnZznckV8,5465
28
+ wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=9q38ublf4mxc8c8K5Rttb8JevljHNz7urEab6czWPpg,7422
29
+ wayfinder_paths/adapters/moonwell_adapter/README.md,sha256=6vHLZTJBeH1hOkx0T477laZVTlqmFqRCrf3aBheH7EM,6119
31
30
  wayfinder_paths/adapters/moonwell_adapter/__init__.py,sha256=Gf6AM4BylxxPenUQ_cveUg70QcB9i61SIYaCsXMSjXw,135
32
- wayfinder_paths/adapters/moonwell_adapter/adapter.py,sha256=kpzuIEUQHHo8WUkt-XGO5FqMtPBRNubYqkkWT0jKvKM,45030
33
- wayfinder_paths/adapters/moonwell_adapter/test_adapter.py,sha256=DLbbCW6ytjKY2C5aQUrW-YBFyrXjush9qbGWiuL42DM,23440
31
+ wayfinder_paths/adapters/moonwell_adapter/adapter.py,sha256=Fsao8ggTmrDJRnQKyov2C7HJb3ucXhVQx9iq2-yIPGM,45081
32
+ wayfinder_paths/adapters/moonwell_adapter/test_adapter.py,sha256=L3gBOaiAm9l0UDokTTeB_Ztq2XvWZta27jTG5tm2h8Q,25661
34
33
  wayfinder_paths/adapters/pool_adapter/README.md,sha256=cBeWz8UzOOIKCkyBUDGTujR1vZNPyhgqKO2HNgq0j3I,2470
35
34
  wayfinder_paths/adapters/pool_adapter/__init__.py,sha256=rv56pYzz2Gqiz33uoPJktCQRe3CRt8U9ry5GbjVgK3A,90
36
35
  wayfinder_paths/adapters/pool_adapter/adapter.py,sha256=zHYCcCjum3jJpG4BZnTJ8YuOyI9ZJlSN5r8TMO4KCDM,1806
37
36
  wayfinder_paths/adapters/pool_adapter/examples.json,sha256=NW-7J6_zXxky8uMDRym3jJaPP8hZLEiytQ3WKoZEP54,855
38
- wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=jz3QYP8ubHjIfE4Sz7CMQai_7zqG9IJBjXz7CKC0PU0,2625
37
+ wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=5AEDGdrCR-D31b8hOhfYo4RpwkPXrJ1Chca38T71fsU,2609
39
38
  wayfinder_paths/adapters/token_adapter/README.md,sha256=mvsfm1fZDsNim4A_H0o54l4y4BNH9mxDu2UB_mNz1xw,2338
40
39
  wayfinder_paths/adapters/token_adapter/__init__.py,sha256=nEmxrvffEygn3iKH3cZTNLkhnUUhlUAEtshmrFRAjq8,62
41
40
  wayfinder_paths/adapters/token_adapter/adapter.py,sha256=aAfcMpxlG5W9UbYQ4mPks0o7A1KsrYyMZzWw-1dQz8Q,3729
42
41
  wayfinder_paths/adapters/token_adapter/examples.json,sha256=bvwP9XL9c_endFlMQgkavXh_IzNEEUyJd4gh5QjrcqY,2944
43
- wayfinder_paths/adapters/token_adapter/test_adapter.py,sha256=k3N_em0cgkyL_k3YF6W17trDten8nD5hoE1Tpx9OJC8,4505
42
+ wayfinder_paths/adapters/token_adapter/test_adapter.py,sha256=vu8evYdDV5I0iOBkMrrfCtGWgcgjTX_Wi2WAFhm_Kvw,4473
44
43
  wayfinder_paths/conftest.py,sha256=pqDNijXn9_zmbAdkt_2a18UQLjtsDkNTBJVTgC6H2nA,1136
45
44
  wayfinder_paths/core/__init__.py,sha256=AJK8oS2dCVuJ2pmSxqXOCvuWacNaVEU3yALEqsD3rog,398
46
45
  wayfinder_paths/core/adapters/BaseAdapter.py,sha256=bzc3ER7aKOsmk9cxyoJxGdI54eibbpcMC8nGYJUrsp0,2033
@@ -61,32 +60,26 @@ wayfinder_paths/core/clients/WalletClient.py,sha256=efvdJlS1fZfvNBU_hXn63mOKoETB
61
60
  wayfinder_paths/core/clients/WayfinderClient.py,sha256=gl-YHTYDa5GStg5O2xETiL4dAaCLphRos-btB1rQzVE,4319
62
61
  wayfinder_paths/core/clients/__init__.py,sha256=2xpZ4tBYkK0QjpBI88ZB4t4esfIc-enm0LqHdRo479M,1173
63
62
  wayfinder_paths/core/clients/protocols.py,sha256=Z0vvce55wfXrSXfuO0Y-s9EfT9zvwUier4-XhwPZSTs,7984
64
- wayfinder_paths/core/clients/sdk_example.py,sha256=SETyEJ_vw7pJcZVMxBMSjJk9Ag3levyn4WrpDueai_A,3589
65
- wayfinder_paths/core/config.py,sha256=ADdrYAapSCwpV4ljSziBmxZV2Z2ORsu8ku-_MptSjjc,9060
63
+ wayfinder_paths/core/config.py,sha256=hcmK0o_FPuAqQvPCOS_OHwRsC8o6i8ftW13dvAN1Hck,7538
66
64
  wayfinder_paths/core/constants/__init__.py,sha256=upAVwHDgMXJ3DWaAuXo52UZktS8NZ17s5XwVH0qxgzg,591
67
- wayfinder_paths/core/constants/base.py,sha256=BYQAD72XrsY6WRrOMIlUOpXLVANS7EYaS5Ell4Nj1H4,1551
68
- wayfinder_paths/core/constants/erc20_abi.py,sha256=3ljIyUl6FesoEa4uprwNo-nF0Q5s73M9WEqXLw6ONI4,3214
65
+ wayfinder_paths/core/constants/base.py,sha256=mJHZWZ9g9loIV0RVVJNRAM0wUid4vW2ql1bn-qAco48,1481
66
+ wayfinder_paths/core/constants/erc20_abi.py,sha256=SQD4aNiw_xhb-8NxsnAfUAx1LeG9cIaBbCVrtU_5Z68,2885
69
67
  wayfinder_paths/core/constants/hyperlend_abi.py,sha256=nIaqsfMl5-_InYN82pjz0FIKsT-AnNkwz0DIc9VrZSc,4331
70
68
  wayfinder_paths/core/constants/moonwell_abi.py,sha256=ALb-kKdfF9aUtEHR8OlqvA-3zJ48N66RvVptTJyCfe4,13135
71
- wayfinder_paths/core/engine/StrategyJob.py,sha256=4H_A3DdTzUUM2e-420I4FpjIhySw_wTJNs3LM_Cf0Xw,5254
72
- wayfinder_paths/core/engine/__init__.py,sha256=WZ2KWnmOZnBocYrqdwq6EUHp6lmTyrKyXgHSHyQswnU,108
73
- wayfinder_paths/core/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- wayfinder_paths/core/services/base.py,sha256=94Wvs7Ym7tK9J3k9lEOhSSIC7ptnMJ161dYtF4XTSZ8,4096
75
- wayfinder_paths/core/services/local_evm_txn.py,sha256=4SHMJz-PrnpLgz94MfchZifPmOlWoDAj_ADFXAWbDD0,12612
76
- wayfinder_paths/core/services/local_token_txn.py,sha256=rRz2H6IZIUNrPAXoyXe0Qy_TAtTU2VpnHVxu6Im0kW4,8531
77
- wayfinder_paths/core/services/web3_service.py,sha256=7iR7bfqfUQCQcdfEWVGqy04PZBtZTuzCDpfLt1a-4OI,1485
78
- wayfinder_paths/core/strategies/Strategy.py,sha256=1Ntx91B1QjN3jrPS36kpVIE36OzamOIea2n-OOBDdIo,9296
69
+ wayfinder_paths/core/engine/StrategyJob.py,sha256=zkYo8TmHdj1Hj8cHMmeLgyWJzO7Vy_onF7I0hq_H_2k,5355
70
+ wayfinder_paths/core/services/test_local_evm_txn.py,sha256=tmP3pt4QBihA6T3PgCSd8hjBkVh4ImNtKGFiFKOkWWA,4829
71
+ wayfinder_paths/core/strategies/Strategy.py,sha256=WTO8KLieMufdCEUjwT5qWmpnz6kA3Ris-O0Skr2OusI,9973
79
72
  wayfinder_paths/core/strategies/__init__.py,sha256=2NjvvDw6sIQGUFV4Qo1olXTxUOY3GmCM8Ivz_J1FSmc,157
80
73
  wayfinder_paths/core/strategies/base.py,sha256=-s0qeiGZl5CHTUL2PavGXM7ACkNlaa0c4jeZR_4DuBM,155
81
74
  wayfinder_paths/core/strategies/descriptors.py,sha256=2Olef0VWols1CWb-TWcb5pil2rztC0jP6F_Trpv2hIw,1958
82
75
  wayfinder_paths/core/utils/__init__.py,sha256=TEylMYHnG37Z3mizSmw28bUm0vyNBFzf0Nc8dB_7l1A,73
83
- wayfinder_paths/core/utils/evm_helpers.py,sha256=EzUOsyGE9DmBp82hsrE_KTopYaSAu161AR-jVoYBC8U,5624
76
+ wayfinder_paths/core/utils/erc20_service.py,sha256=MM2nE1iirPdqpohzvmbv50tFsu03LzAer7cmNWHjYQQ,3422
77
+ wayfinder_paths/core/utils/evm_helpers.py,sha256=ml6f2oMRv_YWFoiPxsoZYUSqM-IOkp4IbTrpfFHn-fU,5400
78
+ wayfinder_paths/core/utils/transaction.py,sha256=JDeSOHw7YxTMsYmMmCXk28nIdmH9FQ99b8F0fw0fYl4,6914
84
79
  wayfinder_paths/core/utils/wallets.py,sha256=ccCQ128lDShO265AFMOCdijzPLucWe-Neg5wjLrOsnk,1948
85
- wayfinder_paths/core/wallets/README.md,sha256=ks3tqO3I69PiOXp4hXfZ7ayupvfS0kB8PW3fBR2bDNA,3700
86
- wayfinder_paths/core/wallets/WalletManager.py,sha256=sptj0Dya9iM87BDzUktrYM_Mw33xyVJNrRUTVfBjHGw,1870
87
- wayfinder_paths/core/wallets/__init__.py,sha256=hIuhy64pJOs_8mAP7Zup28goXbT8qjBeeVYMkbqlyu8,315
80
+ wayfinder_paths/core/utils/web3.py,sha256=UuTZ102CW9KNYgupwN1rm7WrqEgi8xOirUi1OOix7kI,1903
88
81
  wayfinder_paths/policies/enso.py,sha256=oytco04eeGjiRbZPGFE1YpH4NxvV0tfVM14QmlyzjkY,428
89
- wayfinder_paths/policies/erc20.py,sha256=cmiG03gz82LRUgwf7BD_yoZ9QTiIvIURL40y48NwaFo,958
82
+ wayfinder_paths/policies/erc20.py,sha256=K5PQCUivBrU2nYmIdsIARzRiFy36Rijver-RJnaxNT8,960
90
83
  wayfinder_paths/policies/evm.py,sha256=8fJpjAl6XVxr51sVMw_VkWmIaI_lj2T7qrLcR8_sWgs,713
91
84
  wayfinder_paths/policies/hyper_evm.py,sha256=wLkrE158rPaDjfU5q-PyRXuQ6KA67VcqWo484UHsLb8,649
92
85
  wayfinder_paths/policies/hyperlend.py,sha256=4u0NP80t7rpHlw_nvParUN90sIXypWyXACfE0OPqFys,370
@@ -94,38 +87,36 @@ wayfinder_paths/policies/hyperliquid.py,sha256=hAxNtWdxavwf_a-AnlXMOmEYakkNBkrPT
94
87
  wayfinder_paths/policies/moonwell.py,sha256=sKWLbruMKiW7Yh1DhXdVPRe0JBP-nooNybRz0G9PgvA,1605
95
88
  wayfinder_paths/policies/prjx.py,sha256=6kfZ6OQFroFHYJl4vSWT-svwwfvoHlS_ZrcHt8nmZMU,743
96
89
  wayfinder_paths/policies/util.py,sha256=r8xQLPvE3kU21_LG6VbkFI9sUSYltcsKunryZdHOUDA,912
97
- wayfinder_paths/run_strategy.py,sha256=VWW9GIgX1KbNU8gp40qCef0ALbI-BiUoFTVVzBSfTZU,11505
90
+ wayfinder_paths/run_strategy.py,sha256=vs54IVLzWpdzRFb8siMcvvlBfX80StmDp8ExaulivVU,13324
98
91
  wayfinder_paths/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
92
  wayfinder_paths/scripts/create_strategy.py,sha256=WQQLBhClfjyLxEaKubQkBqBpSOFESnk1m6WTau9LylQ,5352
100
93
  wayfinder_paths/scripts/make_wallets.py,sha256=RuCa9uYAsOzv8TyFdeOH89-SPJVGXwl5RuAqfJesLOk,5237
101
- wayfinder_paths/scripts/run_strategy.py,sha256=xXa9Ch7mf1UXSO2UqyUZ6_IJG0TOjoYPyTzCU1U56TM,4450
102
94
  wayfinder_paths/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
95
  wayfinder_paths/strategies/basis_trading_strategy/README.md,sha256=rTUXQ2owEoPmXlfHcJfRFCwcQxlU3a4hOJGN5kaWWQ0,7176
104
96
  wayfinder_paths/strategies/basis_trading_strategy/__init__.py,sha256=kVcehFjBUtoi5xzSHI56jtDghsy0nYl6XIE6BI1l6aI,79
105
97
  wayfinder_paths/strategies/basis_trading_strategy/constants.py,sha256=PJ1WtSALxiuW1FXx-BF30ciFISEhO5VBfrSZyfhPuz0,45
106
98
  wayfinder_paths/strategies/basis_trading_strategy/examples.json,sha256=q2wlAH8Gr-LUJeamKzWL1EtChL3TBWe0HQ4_P-VCdqQ,429
107
99
  wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=jjXv-w-uXdkw3-eSUgMmWCE7cPCRrkhyD4_TQjOnRO0,38640
108
- wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=LpThF7HZ5eU2uqt08k5jMaaJYCSu79x5a7Z430-5KYw,161167
109
- wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=PWTJf2sqNb4BkKQytr_teqOqiV5n_7Fh5fPeZtr9Ito,40149
100
+ wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=9lHl20065LQSc2GSbyDN0z4Y_1fHVpdn7X6GfEwFKtY,162891
101
+ wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=NDqJIA47IwXAksxyWIcFGqFv67O628Q79k3gSj0SNtM,38281
110
102
  wayfinder_paths/strategies/basis_trading_strategy/types.py,sha256=rlbouTUOVPLfGPzMbsf-fUmMcn0R_OsG-IdfiBJmmqI,845
111
- wayfinder_paths/strategies/config.py,sha256=5dv-8tWwoxH3Sxd9jtiw90shrLipEe3UlU-IYUBfciM,2762
112
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=3dOmUCjs_zu4TgPhis0WG-U1XP_dl9aEGi49EkW_-jw,4180
103
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=20gA0Ae37tuILWdUoODcVLFTR73S7hTGUv4lAZhOvzA,4073
113
104
  wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=GbVo2p6QiG6M7Ma5s671lw8G9JwnMl1h0n9mrtt-ZS8,164
114
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=Uwq0ca_1_xnlFqmEtdoC_ok44LvWQcqoCFD3vXc6xZ8,92388
115
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=YFyfls9HjlB5DbzcPWa7_OFbAJrW7i_HWhGtA6_YXPo,17067
116
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md,sha256=fv4uLA0Ioxp_LS35aFLhVCPJPoG_uvEYV89KYKmWv_o,4516
105
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=rWwm_Zd9__XCF6Rl1qd2SMEXmxbDq9v2GeP475DQxf8,94074
106
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=82VvObTwpmsnTlh_jMwLXHMQFDEH1qgbee4xQoDEzXo,16429
107
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md,sha256=Rfx6qeSYL9ttn7Wxi-_LiM7qqleoDByfhLaqLiGSKAw,4773
117
108
  wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/examples.json,sha256=kgNRdZcqne8XTm-Y8Hv1a1pdajRQsey4Qhd5La-iWss,164
118
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py,sha256=G5V57vH9vpkLvSvkbVbowrwuD-qZr7WKhCRsDsyvED4,125713
119
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py,sha256=UOR6bEC5Y2fiOu4idgK8TqlFgt7QazVo82QS3iVp9nA,31715
120
- wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=ZiHXmnyvh85sC-X1a_HzUcUZRvNEjwbmrSQkRIK8OQQ,4980
109
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py,sha256=98P6qzaiqkeVU8nkeCwRaJRXn2SiQ_OFLbynWanfHFc,161871
110
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py,sha256=f1w6jYZlfg0pdZDLmD01PNXENph8MIb03_GgPRNEXZ4,38348
111
+ wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=LOWLL-Z3DX0WTitZYkoVXjzVzGtqR9dCAy2L0OK8qqM,4878
121
112
  wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json,sha256=pL1DNFEvYvXKK7xXD5oQYFPQj3Cm1ocKnk6r_iZk0IY,423
122
- wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=mCNN-HBsf880If1Eaglsn9xB4nG-mZN15MKMZqxpHbw,77232
123
- wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=gEw7kEeC9-TPTbsbAjhalsNQEcAdwelh_w8fT0i_bW0,21085
124
- wayfinder_paths/templates/adapter/README.md,sha256=pat-Xdvu1y8-neKcgvW8ygVlCkuj2OdHLgp1prJDRkY,2894
113
+ wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=xe8s_Qi7poeSQvQKIBU2aUoERtQaDZlndvzZpd399Fc,78092
114
+ wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=Rqy28eTEuvQcB0dJv-bUg73h2h_KqxUr3wEKkaN-gnw,20630
115
+ wayfinder_paths/templates/adapter/README.md,sha256=saBsgYOjdI-EMZIjc8wO0CYm4KgsC7zN7I_ucH6iNeg,2886
125
116
  wayfinder_paths/templates/adapter/adapter.py,sha256=UGPvD8SNcrEtYQXRTUxvK9WZ9Bzx1Xwb8sr9zSbqnuc,763
126
117
  wayfinder_paths/templates/adapter/examples.json,sha256=KLHy3AgPIplAaZN0qY2A-HBMa1xXkMhIyusORovTD9w,79
127
118
  wayfinder_paths/templates/adapter/test_adapter.py,sha256=PeG9ZZwx-cWXCDUKxrvj1cR8ljo9aXrKANZuz2hFAhk,1510
128
- wayfinder_paths/templates/strategy/README.md,sha256=721aGfPsKmQBIzwBcEav2cYWMRKNDnvj1ImKJSmH2MM,4963
119
+ wayfinder_paths/templates/strategy/README.md,sha256=LMSE7Zo7IptU7MDMkIH76kkCOhP5FLeE3DxCh4Vnhco,4640
129
120
  wayfinder_paths/templates/strategy/examples.json,sha256=s8UdlD5uxLITQrRMCqgiaAP0IE0tdnnLfX-Zn-OChIc,135
130
121
  wayfinder_paths/templates/strategy/strategy.py,sha256=dso2jhVphsdKNd17JPwnFAFzU01-1kHlWrKPAKIKSWw,2024
131
122
  wayfinder_paths/templates/strategy/test_strategy.py,sha256=TWw8NHOLy_dKgffHTK43N5He5gJ-oNUFi5QbSQM3l1k,7591
@@ -133,7 +124,7 @@ wayfinder_paths/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
133
124
  wayfinder_paths/tests/test_smoke_manifest.py,sha256=kTcIa4qikcspVh2ohQIk0aHUdIvBvcQBfNbm3PNiVvg,1636
134
125
  wayfinder_paths/tests/test_test_coverage.py,sha256=9NrZeVmP02D4W7Qc0XjciC05bhvdTCVibYjTGfa_GQk,7893
135
126
  wayfinder_paths/tests/test_utils.py,sha256=pxHT0QKFlyJeJo8bFnKXzWcOdi6t8rbJ0JFCBaFCBRQ,2112
136
- wayfinder_paths-0.1.14.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
137
- wayfinder_paths-0.1.14.dist-info/METADATA,sha256=1ehMcYQAekFVNY2W_ft-xZFS97MB9BFNslG0vrGFZpc,24314
138
- wayfinder_paths-0.1.14.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
139
- wayfinder_paths-0.1.14.dist-info/RECORD,,
127
+ wayfinder_paths-0.1.16.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
128
+ wayfinder_paths-0.1.16.dist-info/METADATA,sha256=baZT_LBKdtV8t7MzDqM8CGDoQ4nMwUDxototj9fmaHw,22924
129
+ wayfinder_paths-0.1.16.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
130
+ wayfinder_paths-0.1.16.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.8.1
2
+ Generator: poetry-core 1.9.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any