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.
- wayfinder_paths/adapters/balance_adapter/README.md +19 -20
- wayfinder_paths/adapters/balance_adapter/adapter.py +91 -22
- wayfinder_paths/adapters/balance_adapter/test_adapter.py +5 -11
- wayfinder_paths/adapters/brap_adapter/README.md +22 -19
- wayfinder_paths/adapters/brap_adapter/adapter.py +95 -45
- wayfinder_paths/adapters/brap_adapter/test_adapter.py +8 -24
- wayfinder_paths/adapters/hyperlend_adapter/adapter.py +40 -42
- wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py +8 -15
- wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py +6 -6
- wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +12 -12
- wayfinder_paths/adapters/ledger_adapter/test_adapter.py +6 -6
- wayfinder_paths/adapters/moonwell_adapter/README.md +29 -31
- wayfinder_paths/adapters/moonwell_adapter/adapter.py +326 -364
- wayfinder_paths/adapters/moonwell_adapter/test_adapter.py +285 -189
- wayfinder_paths/adapters/pool_adapter/test_adapter.py +2 -2
- wayfinder_paths/adapters/token_adapter/test_adapter.py +4 -4
- wayfinder_paths/core/config.py +8 -47
- wayfinder_paths/core/constants/base.py +0 -1
- wayfinder_paths/core/constants/erc20_abi.py +13 -24
- wayfinder_paths/core/engine/StrategyJob.py +3 -1
- wayfinder_paths/core/services/test_local_evm_txn.py +145 -0
- wayfinder_paths/core/strategies/Strategy.py +22 -4
- wayfinder_paths/core/utils/erc20_service.py +100 -0
- wayfinder_paths/core/utils/evm_helpers.py +1 -8
- wayfinder_paths/core/utils/transaction.py +191 -0
- wayfinder_paths/core/utils/web3.py +66 -0
- wayfinder_paths/policies/erc20.py +1 -1
- wayfinder_paths/run_strategy.py +42 -6
- wayfinder_paths/strategies/basis_trading_strategy/strategy.py +263 -220
- wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +132 -155
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +0 -1
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +123 -80
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +0 -12
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md +6 -6
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py +2270 -1328
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py +282 -121
- wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +0 -1
- wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +107 -85
- wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +0 -8
- wayfinder_paths/templates/adapter/README.md +1 -1
- wayfinder_paths/templates/strategy/README.md +1 -5
- {wayfinder_paths-0.1.14.dist-info → wayfinder_paths-0.1.16.dist-info}/METADATA +3 -41
- {wayfinder_paths-0.1.14.dist-info → wayfinder_paths-0.1.16.dist-info}/RECORD +45 -54
- {wayfinder_paths-0.1.14.dist-info → wayfinder_paths-0.1.16.dist-info}/WHEEL +1 -1
- wayfinder_paths/abis/generic/erc20.json +0 -383
- wayfinder_paths/core/clients/sdk_example.py +0 -125
- wayfinder_paths/core/engine/__init__.py +0 -5
- wayfinder_paths/core/services/__init__.py +0 -0
- wayfinder_paths/core/services/base.py +0 -130
- wayfinder_paths/core/services/local_evm_txn.py +0 -334
- wayfinder_paths/core/services/local_token_txn.py +0 -242
- wayfinder_paths/core/services/web3_service.py +0 -43
- wayfinder_paths/core/wallets/README.md +0 -88
- wayfinder_paths/core/wallets/WalletManager.py +0 -56
- wayfinder_paths/core/wallets/__init__.py +0 -7
- wayfinder_paths/scripts/run_strategy.py +0 -152
- wayfinder_paths/strategies/config.py +0 -85
- {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
|
-
|
|
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
|
-
|
|
182
|
-
self.
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
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
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
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"
|
|
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 = {
|
|
@@ -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
|
-
|
|
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.
|
|
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
|
|
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=
|
|
5
|
-
wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=
|
|
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=
|
|
8
|
-
wayfinder_paths/adapters/brap_adapter/README.md,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
15
|
-
wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py,sha256=
|
|
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=
|
|
21
|
-
wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=
|
|
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=
|
|
30
|
-
wayfinder_paths/adapters/moonwell_adapter/README.md,sha256=
|
|
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=
|
|
33
|
-
wayfinder_paths/adapters/moonwell_adapter/test_adapter.py,sha256=
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
68
|
-
wayfinder_paths/core/constants/erc20_abi.py,sha256=
|
|
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=
|
|
72
|
-
wayfinder_paths/core/
|
|
73
|
-
wayfinder_paths/core/
|
|
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/
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
109
|
-
wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=
|
|
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/
|
|
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=
|
|
115
|
-
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=
|
|
116
|
-
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md,sha256=
|
|
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=
|
|
119
|
-
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py,sha256=
|
|
120
|
-
wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=
|
|
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=
|
|
123
|
-
wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=
|
|
124
|
-
wayfinder_paths/templates/adapter/README.md,sha256=
|
|
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=
|
|
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.
|
|
137
|
-
wayfinder_paths-0.1.
|
|
138
|
-
wayfinder_paths-0.1.
|
|
139
|
-
wayfinder_paths-0.1.
|
|
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,,
|