wayfinder-paths 0.1.8__py3-none-any.whl → 0.1.9__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/CONFIG_GUIDE.md +5 -14
- wayfinder_paths/adapters/brap_adapter/README.md +1 -1
- wayfinder_paths/adapters/brap_adapter/adapter.py +0 -51
- wayfinder_paths/adapters/hyperlend_adapter/adapter.py +0 -7
- wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +0 -54
- wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +1 -1
- wayfinder_paths/adapters/ledger_adapter/README.md +1 -1
- wayfinder_paths/adapters/pool_adapter/README.md +1 -77
- wayfinder_paths/adapters/pool_adapter/adapter.py +0 -122
- wayfinder_paths/adapters/pool_adapter/examples.json +0 -57
- wayfinder_paths/adapters/pool_adapter/test_adapter.py +0 -86
- wayfinder_paths/adapters/token_adapter/README.md +1 -1
- wayfinder_paths/core/clients/AuthClient.py +0 -3
- wayfinder_paths/core/clients/ClientManager.py +1 -22
- wayfinder_paths/core/clients/WalletClient.py +0 -8
- wayfinder_paths/core/clients/WayfinderClient.py +9 -14
- wayfinder_paths/core/clients/__init__.py +0 -8
- wayfinder_paths/core/clients/protocols.py +0 -60
- wayfinder_paths/core/config.py +5 -45
- wayfinder_paths/core/engine/StrategyJob.py +0 -3
- wayfinder_paths/core/services/base.py +0 -49
- wayfinder_paths/core/services/local_evm_txn.py +3 -82
- wayfinder_paths/core/services/local_token_txn.py +61 -70
- wayfinder_paths/core/services/web3_service.py +0 -2
- wayfinder_paths/core/settings.py +8 -8
- wayfinder_paths/core/strategies/Strategy.py +1 -5
- wayfinder_paths/core/utils/evm_helpers.py +7 -12
- wayfinder_paths/core/wallets/README.md +3 -6
- wayfinder_paths/run_strategy.py +29 -32
- wayfinder_paths/scripts/make_wallets.py +1 -25
- wayfinder_paths/scripts/run_strategy.py +0 -2
- wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py +1 -3
- wayfinder_paths/strategies/basis_trading_strategy/strategy.py +86 -137
- wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +96 -58
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +2 -2
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json +4 -1
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +106 -28
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +53 -14
- wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +1 -6
- wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +0 -4
- wayfinder_paths/templates/strategy/test_strategy.py +0 -4
- {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.9.dist-info}/METADATA +5 -15
- {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.9.dist-info}/RECORD +45 -47
- wayfinder_paths/core/clients/SimulationClient.py +0 -192
- wayfinder_paths/core/clients/TransactionClient.py +0 -63
- {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.9.dist-info}/LICENSE +0 -0
- {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.9.dist-info}/WHEEL +0 -0
|
@@ -195,7 +195,6 @@ class HyperlendStableYieldStrategy(Strategy):
|
|
|
195
195
|
*,
|
|
196
196
|
main_wallet: dict[str, Any] | None = None,
|
|
197
197
|
strategy_wallet: dict[str, Any] | None = None,
|
|
198
|
-
simulation: bool = False,
|
|
199
198
|
web3_service: Web3Service = None,
|
|
200
199
|
api_key: str | None = None,
|
|
201
200
|
):
|
|
@@ -207,7 +206,6 @@ class HyperlendStableYieldStrategy(Strategy):
|
|
|
207
206
|
merged_config["strategy_wallet"] = strategy_wallet
|
|
208
207
|
|
|
209
208
|
self.config = merged_config
|
|
210
|
-
self.simulation = simulation
|
|
211
209
|
self.balance_adapter = None
|
|
212
210
|
self.tx_adapter = None
|
|
213
211
|
self.token_adapter = None
|
|
@@ -238,7 +236,6 @@ class HyperlendStableYieldStrategy(Strategy):
|
|
|
238
236
|
token_transaction_service = LocalTokenTxnService(
|
|
239
237
|
adapter_config,
|
|
240
238
|
wallet_provider=wallet_provider,
|
|
241
|
-
simulation=self.simulation,
|
|
242
239
|
)
|
|
243
240
|
web3_service = DefaultWeb3Service(
|
|
244
241
|
wallet_provider=wallet_provider,
|
|
@@ -250,12 +247,9 @@ class HyperlendStableYieldStrategy(Strategy):
|
|
|
250
247
|
balance = BalanceAdapter(adapter_config, web3_service=web3_service)
|
|
251
248
|
token_adapter = TokenAdapter()
|
|
252
249
|
ledger_adapter = LedgerAdapter() # here
|
|
253
|
-
brap_adapter = BRAPAdapter(
|
|
254
|
-
web3_service=web3_service, simulation=self.simulation
|
|
255
|
-
)
|
|
250
|
+
brap_adapter = BRAPAdapter(web3_service=web3_service)
|
|
256
251
|
hyperlend_adapter = HyperlendAdapter(
|
|
257
252
|
adapter_config,
|
|
258
|
-
simulation=self.simulation,
|
|
259
253
|
web3_service=web3_service,
|
|
260
254
|
)
|
|
261
255
|
|
|
@@ -323,11 +317,109 @@ class HyperlendStableYieldStrategy(Strategy):
|
|
|
323
317
|
self.hys_z: float = self.HYSTERESIS_Z
|
|
324
318
|
self.rotation_tx_cost: float = self.ROTATION_TX_COST
|
|
325
319
|
|
|
326
|
-
async def deposit(
|
|
320
|
+
async def deposit(
|
|
321
|
+
self, main_token_amount: float = 0.0, gas_token_amount: float = 0.0
|
|
322
|
+
) -> StatusTuple:
|
|
323
|
+
if main_token_amount == 0.0 and gas_token_amount == 0.0:
|
|
324
|
+
return (
|
|
325
|
+
False,
|
|
326
|
+
"Either main_token_amount or gas_token_amount must be provided",
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
if main_token_amount > 0:
|
|
330
|
+
if main_token_amount < self.MIN_USDT0_DEPOSIT_AMOUNT:
|
|
331
|
+
return (
|
|
332
|
+
False,
|
|
333
|
+
f"Main token amount {main_token_amount} is below minimum {self.MIN_USDT0_DEPOSIT_AMOUNT}",
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
if gas_token_amount and gas_token_amount > self.GAS_MAXIMUM:
|
|
337
|
+
return (
|
|
338
|
+
False,
|
|
339
|
+
f"Gas token amount exceeds maximum configured gas buffer: {self.GAS_MAXIMUM}",
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
if self.balance_adapter is None:
|
|
343
|
+
return (
|
|
344
|
+
False,
|
|
345
|
+
"Balance adapter not initialized. Strategy initialization may have failed.",
|
|
346
|
+
)
|
|
347
|
+
|
|
348
|
+
(
|
|
349
|
+
success,
|
|
350
|
+
main_usdt0_balance,
|
|
351
|
+
) = await self.balance_adapter.get_balance(
|
|
352
|
+
token_id=self.usdt_token_info.get("token_id"),
|
|
353
|
+
wallet_address=self._get_main_wallet_address(),
|
|
354
|
+
)
|
|
355
|
+
if not success:
|
|
356
|
+
return (
|
|
357
|
+
False,
|
|
358
|
+
f"Failed to get main wallet USDT0 balance: {main_usdt0_balance}",
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
(
|
|
362
|
+
success,
|
|
363
|
+
main_hype_balance,
|
|
364
|
+
) = await self.balance_adapter.get_balance(
|
|
365
|
+
token_id=self.hype_token_info.get("token_id"),
|
|
366
|
+
wallet_address=self._get_main_wallet_address(),
|
|
367
|
+
)
|
|
368
|
+
if not success:
|
|
369
|
+
return (
|
|
370
|
+
False,
|
|
371
|
+
f"Failed to get main wallet HYPE balance: {main_hype_balance}",
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
main_usdt0_native = main_usdt0_balance / (
|
|
375
|
+
10 ** self.usdt_token_info.get("decimals")
|
|
376
|
+
)
|
|
377
|
+
main_hype_native = main_hype_balance / (
|
|
378
|
+
10 ** self.hype_token_info.get("decimals")
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
if main_token_amount > 0:
|
|
382
|
+
if main_usdt0_native < main_token_amount:
|
|
383
|
+
return (
|
|
384
|
+
False,
|
|
385
|
+
f"Main wallet USDT0 balance is less than the deposit amount: {main_usdt0_native} < {main_token_amount}",
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
if gas_token_amount > 0:
|
|
389
|
+
if main_hype_native < gas_token_amount:
|
|
390
|
+
return (
|
|
391
|
+
False,
|
|
392
|
+
f"Main wallet HYPE balance is less than the deposit amount: {main_hype_native} < {gas_token_amount}",
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
if gas_token_amount > 0:
|
|
396
|
+
(
|
|
397
|
+
success,
|
|
398
|
+
msg,
|
|
399
|
+
) = await self.balance_adapter.move_from_main_wallet_to_strategy_wallet(
|
|
400
|
+
self.hype_token_info.get("token_id"),
|
|
401
|
+
gas_token_amount,
|
|
402
|
+
strategy_name=self.name,
|
|
403
|
+
)
|
|
404
|
+
if not success:
|
|
405
|
+
return (False, f"HYPE transfer to strategy failed: {msg}")
|
|
406
|
+
|
|
407
|
+
if main_token_amount > 0:
|
|
408
|
+
(
|
|
409
|
+
success,
|
|
410
|
+
msg,
|
|
411
|
+
) = await self.balance_adapter.move_from_main_wallet_to_strategy_wallet(
|
|
412
|
+
self.usdt_token_info.get("token_id"),
|
|
413
|
+
main_token_amount,
|
|
414
|
+
strategy_name=self.name,
|
|
415
|
+
)
|
|
416
|
+
if not success:
|
|
417
|
+
return (False, f"USDT0 transfer to strategy failed: {msg}")
|
|
418
|
+
|
|
327
419
|
self._invalidate_assets_snapshot()
|
|
328
420
|
await self._hydrate_position_from_chain()
|
|
329
421
|
|
|
330
|
-
return (
|
|
422
|
+
return (success, msg)
|
|
331
423
|
|
|
332
424
|
async def _estimate_redeploy_tokens(self) -> float:
|
|
333
425
|
positions = await self._get_lent_positions()
|
|
@@ -1344,26 +1436,12 @@ class HyperlendStableYieldStrategy(Strategy):
|
|
|
1344
1436
|
continue
|
|
1345
1437
|
|
|
1346
1438
|
balance_tokens = float(entry.get("tokens") or 0)
|
|
1347
|
-
if balance_tokens
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
transfer_success,
|
|
1353
|
-
_,
|
|
1354
|
-
) = await self.balance_adapter.move_from_strategy_wallet_to_main_wallet(
|
|
1355
|
-
token_id=token.get("token_id"),
|
|
1356
|
-
amount=balance_tokens,
|
|
1357
|
-
strategy_name=self.name,
|
|
1358
|
-
)
|
|
1359
|
-
except Exception:
|
|
1360
|
-
continue
|
|
1361
|
-
|
|
1362
|
-
if transfer_success:
|
|
1363
|
-
actions.append(
|
|
1364
|
-
f"Transferred {balance_tokens:.4f} {token.get('symbol')} to main wallet"
|
|
1439
|
+
if balance_tokens > 0:
|
|
1440
|
+
logger.warning(
|
|
1441
|
+
f"Failed to swap {balance_tokens:.4f} {token.get('symbol', 'unknown')} "
|
|
1442
|
+
f"to {target_token.get('symbol', 'target')} during alignment. "
|
|
1443
|
+
f"Leaving in strategy wallet for next update cycle."
|
|
1365
1444
|
)
|
|
1366
|
-
self._invalidate_assets_snapshot()
|
|
1367
1445
|
|
|
1368
1446
|
kept_tokens = float(balances.get("native", {}).get("tokens") or 0)
|
|
1369
1447
|
|
|
@@ -46,20 +46,20 @@ def strategy():
|
|
|
46
46
|
config=mock_config,
|
|
47
47
|
main_wallet=mock_config["main_wallet"],
|
|
48
48
|
strategy_wallet=mock_config["strategy_wallet"],
|
|
49
|
-
simulation=True,
|
|
50
49
|
)
|
|
51
50
|
|
|
52
51
|
if hasattr(s, "balance_adapter") and s.balance_adapter:
|
|
53
52
|
# Mock balances: 1000 USDT0 (with 6 decimals) and 2 HYPE (with 18 decimals)
|
|
54
|
-
usdt0_balance_mock = AsyncMock(return_value=(True, 1000000000))
|
|
55
|
-
hype_balance_mock = AsyncMock(return_value=(True, 2000000000000000000))
|
|
56
|
-
|
|
57
53
|
def get_balance_side_effect(token_id, wallet_address, **kwargs):
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
return
|
|
62
|
-
|
|
54
|
+
token_id_str = str(token_id).lower() if token_id else ""
|
|
55
|
+
if "usdt0" in token_id_str or token_id_str == "usdt0":
|
|
56
|
+
# 1000 USDT0 with 6 decimals = 1000 * 10^6 = 1000000000
|
|
57
|
+
return (True, 1000000000)
|
|
58
|
+
elif "hype" in token_id_str or token_id_str == "hype":
|
|
59
|
+
# 2 HYPE with 18 decimals = 2 * 10^18 = 2000000000000000000
|
|
60
|
+
return (True, 2000000000000000000)
|
|
61
|
+
# Default: return high balance for any other token
|
|
62
|
+
return (True, 2000000000000000000)
|
|
63
63
|
|
|
64
64
|
s.balance_adapter.get_balance = AsyncMock(side_effect=get_balance_side_effect)
|
|
65
65
|
|
|
@@ -101,15 +101,54 @@ def strategy():
|
|
|
101
101
|
)
|
|
102
102
|
|
|
103
103
|
if hasattr(s, "balance_adapter") and s.balance_adapter:
|
|
104
|
+
# Mock the main methods first
|
|
104
105
|
s.balance_adapter.move_from_main_wallet_to_strategy_wallet = AsyncMock(
|
|
105
106
|
return_value=(True, "Transfer successful (simulated)")
|
|
106
107
|
)
|
|
107
108
|
s.balance_adapter.move_from_strategy_wallet_to_main_wallet = AsyncMock(
|
|
108
109
|
return_value=(True, "Transfer successful (simulated)")
|
|
109
110
|
)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
# Mock internal dependencies unconditionally to prevent MagicMock await errors
|
|
112
|
+
# These are needed if the real method somehow gets called
|
|
113
|
+
s.balance_adapter.token_client = AsyncMock()
|
|
114
|
+
s.balance_adapter.token_client.get_token_details = AsyncMock(
|
|
115
|
+
return_value={
|
|
116
|
+
"id": "usdt0-hyperevm",
|
|
117
|
+
"address": "0x1234",
|
|
118
|
+
"decimals": 6,
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
s.balance_adapter.token_transactions = AsyncMock()
|
|
122
|
+
s.balance_adapter.token_transactions.build_send = AsyncMock(
|
|
123
|
+
return_value=(True, {"transaction": "0xMOCK"})
|
|
124
|
+
)
|
|
125
|
+
s.balance_adapter.wallet_provider = AsyncMock()
|
|
126
|
+
s.balance_adapter.wallet_provider.broadcast_transaction = AsyncMock(
|
|
127
|
+
return_value=(True, {"transaction_hash": "0xCAFEBABE"})
|
|
128
|
+
)
|
|
129
|
+
# token_adapter might already be set, so check before overriding
|
|
130
|
+
if (
|
|
131
|
+
not hasattr(s.balance_adapter, "token_adapter")
|
|
132
|
+
or s.balance_adapter.token_adapter is None
|
|
133
|
+
):
|
|
134
|
+
s.balance_adapter.token_adapter = AsyncMock()
|
|
135
|
+
if hasattr(s.balance_adapter.token_adapter, "get_token_price"):
|
|
136
|
+
s.balance_adapter.token_adapter.get_token_price = AsyncMock(
|
|
137
|
+
return_value=(True, {"current_price": 1.0})
|
|
138
|
+
)
|
|
139
|
+
# ledger_adapter might already be set, so check before overriding
|
|
140
|
+
if (
|
|
141
|
+
not hasattr(s.balance_adapter, "ledger_adapter")
|
|
142
|
+
or s.balance_adapter.ledger_adapter is None
|
|
143
|
+
):
|
|
144
|
+
s.balance_adapter.ledger_adapter = AsyncMock()
|
|
145
|
+
if hasattr(s.balance_adapter.ledger_adapter, "record_deposit"):
|
|
146
|
+
s.balance_adapter.ledger_adapter.record_deposit = AsyncMock(
|
|
147
|
+
return_value=(True, {})
|
|
148
|
+
)
|
|
149
|
+
if hasattr(s.balance_adapter.ledger_adapter, "record_withdrawal"):
|
|
150
|
+
s.balance_adapter.ledger_adapter.record_withdrawal = AsyncMock(
|
|
151
|
+
return_value=(True, {})
|
|
113
152
|
)
|
|
114
153
|
|
|
115
154
|
if hasattr(s, "ledger_adapter") and s.ledger_adapter:
|
|
@@ -304,8 +343,8 @@ async def test_canonical_usage(strategy):
|
|
|
304
343
|
for example_name, example_data in canonical.items():
|
|
305
344
|
if "deposit" in example_data:
|
|
306
345
|
deposit_params = example_data.get("deposit", {})
|
|
307
|
-
ok,
|
|
308
|
-
assert ok, f"Canonical example '{example_name}' deposit failed"
|
|
346
|
+
ok, msg = await strategy.deposit(**deposit_params)
|
|
347
|
+
assert ok, f"Canonical example '{example_name}' deposit failed: {msg}"
|
|
309
348
|
|
|
310
349
|
if "update" in example_data:
|
|
311
350
|
result = await strategy.update()
|
|
@@ -155,7 +155,6 @@ class StablecoinYieldStrategy(Strategy):
|
|
|
155
155
|
*,
|
|
156
156
|
main_wallet: dict[str, Any] | None = None,
|
|
157
157
|
strategy_wallet: dict[str, Any] | None = None,
|
|
158
|
-
simulation: bool = False,
|
|
159
158
|
web3_service=None,
|
|
160
159
|
api_key: str | None = None,
|
|
161
160
|
):
|
|
@@ -167,7 +166,6 @@ class StablecoinYieldStrategy(Strategy):
|
|
|
167
166
|
merged_config["strategy_wallet"] = strategy_wallet
|
|
168
167
|
|
|
169
168
|
self.config = merged_config
|
|
170
|
-
self.simulation = simulation
|
|
171
169
|
self.deposited_amount = 0
|
|
172
170
|
self.current_pool = None
|
|
173
171
|
self.current_apy = 0
|
|
@@ -198,7 +196,6 @@ class StablecoinYieldStrategy(Strategy):
|
|
|
198
196
|
tx_adapter = LocalTokenTxnService(
|
|
199
197
|
adapter_config,
|
|
200
198
|
wallet_provider=wallet_provider,
|
|
201
|
-
simulation=self.simulation,
|
|
202
199
|
)
|
|
203
200
|
web3_service = DefaultWeb3Service(
|
|
204
201
|
wallet_provider=wallet_provider, evm_transactions=tx_adapter
|
|
@@ -210,9 +207,7 @@ class StablecoinYieldStrategy(Strategy):
|
|
|
210
207
|
token_adapter = TokenAdapter()
|
|
211
208
|
ledger_adapter = LedgerAdapter()
|
|
212
209
|
pool_adapter = PoolAdapter()
|
|
213
|
-
brap_adapter = BRAPAdapter(
|
|
214
|
-
web3_service=web3_service, simulation=self.simulation
|
|
215
|
-
)
|
|
210
|
+
brap_adapter = BRAPAdapter(web3_service=web3_service)
|
|
216
211
|
|
|
217
212
|
self.register_adapters(
|
|
218
213
|
[
|
|
@@ -46,7 +46,6 @@ def strategy():
|
|
|
46
46
|
config=mock_config,
|
|
47
47
|
main_wallet=mock_config["main_wallet"],
|
|
48
48
|
strategy_wallet=mock_config["strategy_wallet"],
|
|
49
|
-
simulation=True,
|
|
50
49
|
)
|
|
51
50
|
|
|
52
51
|
if hasattr(s, "balance_adapter") and s.balance_adapter:
|
|
@@ -130,9 +129,6 @@ def strategy():
|
|
|
130
129
|
)
|
|
131
130
|
|
|
132
131
|
if hasattr(s, "pool_adapter") and s.pool_adapter:
|
|
133
|
-
s.pool_adapter.find_high_yield_pools = AsyncMock(
|
|
134
|
-
return_value=(True, {"pools": [], "total_found": 0})
|
|
135
|
-
)
|
|
136
132
|
s.pool_adapter.get_pools_by_ids = AsyncMock(
|
|
137
133
|
return_value=(
|
|
138
134
|
True,
|
|
@@ -58,7 +58,6 @@ def strategy():
|
|
|
58
58
|
config=mock_config,
|
|
59
59
|
main_wallet=mock_config["main_wallet"],
|
|
60
60
|
strategy_wallet=mock_config["strategy_wallet"],
|
|
61
|
-
simulation=True,
|
|
62
61
|
)
|
|
63
62
|
|
|
64
63
|
# TODO: Add mocking for your adapters here if needed
|
|
@@ -77,9 +76,6 @@ def strategy():
|
|
|
77
76
|
# s.balance_adapter.get_token_balance_for_wallet = AsyncMock(
|
|
78
77
|
# side_effect=get_balance_side_effect
|
|
79
78
|
# )
|
|
80
|
-
# s.balance_adapter.get_all_enriched_token_balances_for_wallet = AsyncMock(
|
|
81
|
-
# return_value=(True, {"balances": []})
|
|
82
|
-
# )
|
|
83
79
|
|
|
84
80
|
# Example for token_adapter:
|
|
85
81
|
# if hasattr(s, "token_adapter") and s.token_adapter:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: wayfinder-paths
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.9
|
|
4
4
|
Summary: Wayfinder Path: strategies and adapters
|
|
5
5
|
Author: Wayfinder
|
|
6
6
|
Author-email: dev@wayfinder.ai
|
|
@@ -54,9 +54,6 @@ cp wayfinder_paths/config.example.json config.json
|
|
|
54
54
|
# Run a strategy locally (one-shot status check)
|
|
55
55
|
poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --action status --config config.json
|
|
56
56
|
|
|
57
|
-
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
58
|
-
poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --config config.json
|
|
59
|
-
|
|
60
57
|
# Run continuously (production mode)
|
|
61
58
|
poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --config config.json
|
|
62
59
|
```
|
|
@@ -213,7 +210,7 @@ The platform uses a unified client system for all API interactions. Clients are
|
|
|
213
210
|
|
|
214
211
|
### Clients vs Adapters
|
|
215
212
|
|
|
216
|
-
- **Clients**: Low-level, reusable service wrappers that talk to networks and external APIs. They handle auth, headers, retries, and response parsing, and expose generic capabilities (e.g., token info, tx building). Examples: `TokenClient`, `
|
|
213
|
+
- **Clients**: Low-level, reusable service wrappers that talk to networks and external APIs. They handle auth, headers, retries, and response parsing, and expose generic capabilities (e.g., token info, tx building). Examples: `TokenClient`, `WalletClient`.
|
|
217
214
|
- **Adapters**: Strategy-facing integrations for a specific exchange/protocol. They compose one or more clients to implement a manifest of capabilities (e.g., `supply`, `borrow`, `place_order`). Adapters encapsulate protocol-specific semantics and raise `NotImplementedError` for unsupported ops.
|
|
218
215
|
|
|
219
216
|
Recommended usage:
|
|
@@ -415,14 +412,7 @@ strategy = StablecoinYieldStrategy(
|
|
|
415
412
|
)
|
|
416
413
|
```
|
|
417
414
|
|
|
418
|
-
**Option B:
|
|
419
|
-
|
|
420
|
-
```bash
|
|
421
|
-
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
422
|
-
# All clients will automatically discover and use this
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
**Option C: Add to config.json**
|
|
415
|
+
**Option B: Add to config.json**
|
|
426
416
|
|
|
427
417
|
```json
|
|
428
418
|
{
|
|
@@ -435,7 +425,7 @@ export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
|
435
425
|
}
|
|
436
426
|
```
|
|
437
427
|
|
|
438
|
-
**Priority Order:** Constructor parameter > `config.json` (user.api_key or system.api_key)
|
|
428
|
+
**Priority Order:** Constructor parameter > `config.json` (user.api_key or system.api_key)
|
|
439
429
|
|
|
440
430
|
**Note:** API keys in `config.json` are loaded directly by `WayfinderClient` via `_load_config_credentials()`, not through the `UserConfig` or `SystemConfig` dataclasses. This allows flexible credential loading.
|
|
441
431
|
|
|
@@ -516,7 +506,7 @@ class MyStrategy(Strategy):
|
|
|
516
506
|
super().__init__(api_key=api_key) # Pass to base class for auto-discovery
|
|
517
507
|
self.config = config or {}
|
|
518
508
|
web3_service = DefaultWeb3Service(self.config)
|
|
519
|
-
# Adapters automatically discover API key from
|
|
509
|
+
# Adapters automatically discover API key from constructor or config.json
|
|
520
510
|
balance_adapter = BalanceAdapter(self.config, web3_service=web3_service)
|
|
521
511
|
self.register_adapters([balance_adapter])
|
|
522
512
|
self.balance_adapter = balance_adapter
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
wayfinder_paths/CONFIG_GUIDE.md,sha256=
|
|
1
|
+
wayfinder_paths/CONFIG_GUIDE.md,sha256=REW6wOv8r3YBctAbAjL7gsKyCUbREYmPylcgYJ5aci4,12983
|
|
2
2
|
wayfinder_paths/__init__.py,sha256=YgOg-PRPT3ROh0zg6hgQyQE-YFkFGw6TM77zDvB4_sE,427
|
|
3
3
|
wayfinder_paths/abis/generic/erc20.json,sha256=geyzVzdTNt3u1XHKxi4seszP_GIWIzPTl0FYgiftRnM,9336
|
|
4
4
|
wayfinder_paths/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -7,38 +7,38 @@ wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=byfucmlGXT4_qGD4eeTvL
|
|
|
7
7
|
wayfinder_paths/adapters/balance_adapter/examples.json,sha256=3R1M4B_VsIy29viAuFT9nQbnQShWl8ZbU-rnSNWUW9U,129
|
|
8
8
|
wayfinder_paths/adapters/balance_adapter/manifest.yaml,sha256=vp2VoQJf-TxFxgkTsUJ1AEeeOoImM_QjrGYCmjyEQYI,189
|
|
9
9
|
wayfinder_paths/adapters/balance_adapter/test_adapter.py,sha256=Z8iTRU0Rv1UsODuVSo5q4j-DrTXMd4YRxvaxLdZE4Us,1878
|
|
10
|
-
wayfinder_paths/adapters/brap_adapter/README.md,sha256=
|
|
10
|
+
wayfinder_paths/adapters/brap_adapter/README.md,sha256=H4_ep4r17DpQ0rnTSIbRsAdnK174NGBAcHNlHhvEA7o,7880
|
|
11
11
|
wayfinder_paths/adapters/brap_adapter/__init__.py,sha256=jpqxZ-Bv_8kBo-lhgO_QCWaVZNq_WwlkNBHD4RsqOJg,90
|
|
12
|
-
wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=
|
|
12
|
+
wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=cNyW3f5HXzcADmof505mU3RA52e01NWUPLUhMUfRMdk,24917
|
|
13
13
|
wayfinder_paths/adapters/brap_adapter/examples.json,sha256=KWuAklUspd2uvk0s2ey8gczg4nbzhdwxQqzhascyMiQ,5287
|
|
14
14
|
wayfinder_paths/adapters/brap_adapter/manifest.yaml,sha256=bJ8o4j9ZPjfnLxXxHfekoXKUHoBkXmWQ3nokTH1aya4,240
|
|
15
15
|
wayfinder_paths/adapters/brap_adapter/test_adapter.py,sha256=w2q35tcE7j2QG53jSm_XZgIk7OKL4O51fnFuGMVRSNQ,10754
|
|
16
16
|
wayfinder_paths/adapters/hyperlend_adapter/__init__.py,sha256=DsWOnEn-Tlu9ZoIoGaFeSqOYI3b4lXGVK3_FTntWpLw,139
|
|
17
|
-
wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=
|
|
17
|
+
wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=OiHIzhfTJTBk2iQs3px82DubhgTkuoPWHtgTPfAB7UQ,10260
|
|
18
18
|
wayfinder_paths/adapters/hyperlend_adapter/manifest.yaml,sha256=Ugc0jNf3txAQRGAXlVvTN3Mbdc4-fUMS1yVs0SZcBwI,259
|
|
19
19
|
wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py,sha256=iLnrALVnK7JWJV2KFDqBYZlr1ShW1tjHC-kCV6-FlgE,9558
|
|
20
20
|
wayfinder_paths/adapters/hyperliquid_adapter/__init__.py,sha256=QpA258RzVbxzsha86HQduAuNVG0g0qvsI5OcZunQ8DQ,467
|
|
21
|
-
wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=
|
|
21
|
+
wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=qkU_Au0rqj_vf5O6j81EikrHDk8_M8uaxltQvI3dvbU,34516
|
|
22
22
|
wayfinder_paths/adapters/hyperliquid_adapter/executor.py,sha256=uibNnfsgB_KMOYpZzaSDTsiKGQPIKwZyZ6uH34-Xu4A,17447
|
|
23
23
|
wayfinder_paths/adapters/hyperliquid_adapter/manifest.yaml,sha256=IOK5kFaOuqqEcf3EuY5oXufEaUQNoz2oBXRGVbCdSXQ,206
|
|
24
24
|
wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py,sha256=nOBsrAka8PKv5h8SuoJuLTH4HYS4n0vpTIADUCyDKlA,37546
|
|
25
25
|
wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py,sha256=JEDeIMSTdrgcSy4BGSVB0CixQzl3NsKpukOZ9mRu3kE,4542
|
|
26
|
-
wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=
|
|
26
|
+
wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=lnlL0njECM6C4hVlsEZ4_7wtcixIBO8qqTRO6b1yGGg,7672
|
|
27
27
|
wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py,sha256=2gSrXJgtfrTqNOQIhBS92vUkfcwhFsMLgFRkf1bzLy8,7290
|
|
28
28
|
wayfinder_paths/adapters/hyperliquid_adapter/utils.py,sha256=WjLEaNVvcB8FfYlTrwZBrmw7k2MLS5KhBeW4NNoLlVI,4254
|
|
29
|
-
wayfinder_paths/adapters/ledger_adapter/README.md,sha256=
|
|
29
|
+
wayfinder_paths/adapters/ledger_adapter/README.md,sha256=_tGIpIkg-TCYddf8d4FhJvJuHV79iTizqePosKX2ekU,4079
|
|
30
30
|
wayfinder_paths/adapters/ledger_adapter/__init__.py,sha256=DK9GShIUiQ57YKSqhCKoS43GCweBxi0lzkUQ9sYVxUA,96
|
|
31
31
|
wayfinder_paths/adapters/ledger_adapter/adapter.py,sha256=6Fjxltvn9iXp_-CZtN7lDz1Xt0lWaNQX2drx6lgeryw,10260
|
|
32
32
|
wayfinder_paths/adapters/ledger_adapter/examples.json,sha256=DdqTSe4vnBrfIycQVQQ_JZom7fBGHbL7MR4ppK9ljCY,3936
|
|
33
33
|
wayfinder_paths/adapters/ledger_adapter/manifest.yaml,sha256=121VPXNpx13vO9qoBww47Wvpi29JLn5WoIFnudCkDYs,271
|
|
34
34
|
wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=Z1-rPP9k5fI-8ofWMKgU3syzNegKGH_hGO6CKApQj1c,7470
|
|
35
|
-
wayfinder_paths/adapters/pool_adapter/README.md,sha256=
|
|
35
|
+
wayfinder_paths/adapters/pool_adapter/README.md,sha256=JJZ5V-RpDfG-D0-UxyLEYMorPCORNPUaaLpccB5Oslk,2848
|
|
36
36
|
wayfinder_paths/adapters/pool_adapter/__init__.py,sha256=rv56pYzz2Gqiz33uoPJktCQRe3CRt8U9ry5GbjVgK3A,90
|
|
37
|
-
wayfinder_paths/adapters/pool_adapter/adapter.py,sha256
|
|
38
|
-
wayfinder_paths/adapters/pool_adapter/examples.json,sha256=
|
|
37
|
+
wayfinder_paths/adapters/pool_adapter/adapter.py,sha256=-XfmOHqKIr2Q8iyfyKrwIv6bYlyTDDL0WX-XdtKGFqQ,2793
|
|
38
|
+
wayfinder_paths/adapters/pool_adapter/examples.json,sha256=3eLXQIECR3tmUJUeX5wAhiJwFwPMYsUhzkc1i8vUAX8,923
|
|
39
39
|
wayfinder_paths/adapters/pool_adapter/manifest.yaml,sha256=z-OQYBsl2RdV6M34RZzqtQTAFHtQod0po_JD_-9ElNM,217
|
|
40
|
-
wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=
|
|
41
|
-
wayfinder_paths/adapters/token_adapter/README.md,sha256=
|
|
40
|
+
wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=wtdr-IzfhTeS3oBjZLPHUxwYP-3o6tlir3kA6C7lbcE,2709
|
|
41
|
+
wayfinder_paths/adapters/token_adapter/README.md,sha256=TXn7pYQ6bCAiYNl-avem3_Hoz0p3JVyyThxObr59s8k,2673
|
|
42
42
|
wayfinder_paths/adapters/token_adapter/__init__.py,sha256=nEmxrvffEygn3iKH3cZTNLkhnUUhlUAEtshmrFRAjq8,62
|
|
43
43
|
wayfinder_paths/adapters/token_adapter/adapter.py,sha256=JEb7A8wJYHxENFhJ6upAgnQAbPZeVfYi6OGs1hiHxnA,3432
|
|
44
44
|
wayfinder_paths/adapters/token_adapter/examples.json,sha256=RW-3xazj4wbTPl-AVrzduRH1NCXx8m7-06bRMOUJ-lc,3626
|
|
@@ -55,42 +55,40 @@ wayfinder_paths/core/analytics/__init__.py,sha256=AtcSpt2vPpCNgdDaFDLhyZZpKa0QXK
|
|
|
55
55
|
wayfinder_paths/core/analytics/bootstrap.py,sha256=lb_PjL4Vh3O2F8eXgvAbnAFevJczRF59ODG-dxtpCZ8,1782
|
|
56
56
|
wayfinder_paths/core/analytics/stats.py,sha256=qE6h0j8TZAbqbVpDeYlVKe0YbV5CENQcHbREzKyZ_s8,1426
|
|
57
57
|
wayfinder_paths/core/analytics/test_analytics.py,sha256=DNkVTsbWPLc9I1eeCD5wsPPqUDgN-npbGRhBgMKn3GM,5580
|
|
58
|
-
wayfinder_paths/core/clients/AuthClient.py,sha256=
|
|
58
|
+
wayfinder_paths/core/clients/AuthClient.py,sha256=lHB0bhGpStWKropwC8d4qwZyOuKH_Xti9afu0nlsYRI,2711
|
|
59
59
|
wayfinder_paths/core/clients/BRAPClient.py,sha256=-cL05ELlroi3pUfT_5nF8Axie2a0n19npnuP408bkAQ,3744
|
|
60
|
-
wayfinder_paths/core/clients/ClientManager.py,sha256=
|
|
60
|
+
wayfinder_paths/core/clients/ClientManager.py,sha256=pZ4e8XgwDYceCUBFyyemexAH8pqZCAN47iAVVwJWW2Q,7239
|
|
61
61
|
wayfinder_paths/core/clients/HyperlendClient.py,sha256=6yAhojEbjrRC7YLckwGL_2z5lwI4xnrRVNzxspqKSTg,6173
|
|
62
62
|
wayfinder_paths/core/clients/LedgerClient.py,sha256=M6VlG0yq3H4rQt6qRxc0QQVd7GoPXJpj2FcD0RM_C_k,14430
|
|
63
63
|
wayfinder_paths/core/clients/PoolClient.py,sha256=EMIRRw7nh2bha-Qb5uOcIRgbnnu_v5FIvDU0D61nXGI,3475
|
|
64
|
-
wayfinder_paths/core/clients/SimulationClient.py,sha256=ViQmXCQKwhpnZA-YkfIgArrpxGr1U11lZNlbBIak1MU,6364
|
|
65
64
|
wayfinder_paths/core/clients/TokenClient.py,sha256=zg39K-uA1ObkNEcxoXviA1QYSd-fxQXxjBHFOeClY9E,2788
|
|
66
|
-
wayfinder_paths/core/clients/
|
|
67
|
-
wayfinder_paths/core/clients/
|
|
68
|
-
wayfinder_paths/core/clients/
|
|
69
|
-
wayfinder_paths/core/clients/
|
|
70
|
-
wayfinder_paths/core/clients/protocols.py,sha256=3TYdOdvz9en72_xA6sMHgahB21ZQFP5w86qE6pwo7YA,10117
|
|
65
|
+
wayfinder_paths/core/clients/WalletClient.py,sha256=xG-b5YW1Wps-Lw1JFR3OwAGq0oKMvgIp1crXWd31guE,2604
|
|
66
|
+
wayfinder_paths/core/clients/WayfinderClient.py,sha256=JsU8u-YUCc32jPSSgN6iGqGTGlCdtb3unkR8rpct6Fo,10329
|
|
67
|
+
wayfinder_paths/core/clients/__init__.py,sha256=eKbB81C9ZphAKH1uKwkqOmVHtEwFdkDuZLVAQXQXa5M,1254
|
|
68
|
+
wayfinder_paths/core/clients/protocols.py,sha256=yUDz2dEnO-dDZY5pJfDtcvp5rtsoEQYE4G5IQTGLxfA,8469
|
|
71
69
|
wayfinder_paths/core/clients/sdk_example.py,sha256=Y6mSyHfsWcOje6E-geNI0C4CQ6uyZaD3V9Q8kPM53eo,2969
|
|
72
|
-
wayfinder_paths/core/config.py,sha256=
|
|
70
|
+
wayfinder_paths/core/config.py,sha256=ktogrNlE4DSf1DZONN4_C-sjjuoMFqQtS7chx2KDVYY,15382
|
|
73
71
|
wayfinder_paths/core/constants/__init__.py,sha256=KH-TtfNBJgp0WfKIxvHnvS521odH8RS3Qhl8cQhr4Ys,663
|
|
74
72
|
wayfinder_paths/core/constants/base.py,sha256=9XEcgsT_0EMkCoMMdEkvQjjEW9G_8SM3chOBxPpWj00,1169
|
|
75
73
|
wayfinder_paths/core/constants/erc20_abi.py,sha256=3ljIyUl6FesoEa4uprwNo-nF0Q5s73M9WEqXLw6ONI4,3214
|
|
76
74
|
wayfinder_paths/core/constants/hyperlend_abi.py,sha256=nIaqsfMl5-_InYN82pjz0FIKsT-AnNkwz0DIc9VrZSc,4331
|
|
77
|
-
wayfinder_paths/core/engine/StrategyJob.py,sha256=
|
|
75
|
+
wayfinder_paths/core/engine/StrategyJob.py,sha256=YMgIdtpEVVDhl1FnheaS-HydJT3fwq7k0oQWJaxmpz0,7164
|
|
78
76
|
wayfinder_paths/core/engine/__init__.py,sha256=WZ2KWnmOZnBocYrqdwq6EUHp6lmTyrKyXgHSHyQswnU,108
|
|
79
77
|
wayfinder_paths/core/engine/manifest.py,sha256=rkrALipqwqR61lZu_lF1jJj1aqJk6ZskuXokcB1g0HI,3146
|
|
80
78
|
wayfinder_paths/core/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
81
|
-
wayfinder_paths/core/services/base.py,sha256=
|
|
82
|
-
wayfinder_paths/core/services/local_evm_txn.py,sha256=
|
|
83
|
-
wayfinder_paths/core/services/local_token_txn.py,sha256=
|
|
84
|
-
wayfinder_paths/core/services/web3_service.py,sha256=
|
|
85
|
-
wayfinder_paths/core/settings.py,sha256=
|
|
86
|
-
wayfinder_paths/core/strategies/Strategy.py,sha256=
|
|
79
|
+
wayfinder_paths/core/services/base.py,sha256=94Wvs7Ym7tK9J3k9lEOhSSIC7ptnMJ161dYtF4XTSZ8,4096
|
|
80
|
+
wayfinder_paths/core/services/local_evm_txn.py,sha256=XqXw1djXd7N-SAoPFWyNWV9FCSZafLD-PFTirF8zi_w,14281
|
|
81
|
+
wayfinder_paths/core/services/local_token_txn.py,sha256=9iAky-HEIyTzREUHubf9687m7O7lxXL5cSHhqb5FUiI,7767
|
|
82
|
+
wayfinder_paths/core/services/web3_service.py,sha256=7iR7bfqfUQCQcdfEWVGqy04PZBtZTuzCDpfLt1a-4OI,1485
|
|
83
|
+
wayfinder_paths/core/settings.py,sha256=aJdy2bRcJtufr4TZnu30R2iv---Ru4s6nxKo-j22uKQ,1962
|
|
84
|
+
wayfinder_paths/core/strategies/Strategy.py,sha256=nEzry8V-FGSM-S1eBmT35Ba2cVOJn3hNNWenpTMAVv8,9455
|
|
87
85
|
wayfinder_paths/core/strategies/__init__.py,sha256=2NjvvDw6sIQGUFV4Qo1olXTxUOY3GmCM8Ivz_J1FSmc,157
|
|
88
86
|
wayfinder_paths/core/strategies/base.py,sha256=-s0qeiGZl5CHTUL2PavGXM7ACkNlaa0c4jeZR_4DuBM,155
|
|
89
87
|
wayfinder_paths/core/strategies/descriptors.py,sha256=E8vi7ssaj6rglKVp1xl4PlUlJYLSoayXkTzsPb78vrs,1648
|
|
90
88
|
wayfinder_paths/core/utils/__init__.py,sha256=TEylMYHnG37Z3mizSmw28bUm0vyNBFzf0Nc8dB_7l1A,73
|
|
91
|
-
wayfinder_paths/core/utils/evm_helpers.py,sha256=
|
|
89
|
+
wayfinder_paths/core/utils/evm_helpers.py,sha256=D1NFanIdy7TcBHOFwYHAgnhENChaW34BNarFfauMX38,6230
|
|
92
90
|
wayfinder_paths/core/utils/wallets.py,sha256=tGgVxDW2ZvkvJIb6yow1cirrqhQ67_X9IqxZocBEy2k,2438
|
|
93
|
-
wayfinder_paths/core/wallets/README.md,sha256=
|
|
91
|
+
wayfinder_paths/core/wallets/README.md,sha256=GdO1RFUG_jZdVH6qeobHlr_c69hEDgLLrgqYCvj_dGs,3701
|
|
94
92
|
wayfinder_paths/core/wallets/WalletManager.py,sha256=sptj0Dya9iM87BDzUktrYM_Mw33xyVJNrRUTVfBjHGw,1870
|
|
95
93
|
wayfinder_paths/core/wallets/__init__.py,sha256=hIuhy64pJOs_8mAP7Zup28goXbT8qjBeeVYMkbqlyu8,315
|
|
96
94
|
wayfinder_paths/policies/enso.py,sha256=oytco04eeGjiRbZPGFE1YpH4NxvV0tfVM14QmlyzjkY,428
|
|
@@ -102,11 +100,11 @@ wayfinder_paths/policies/hyperliquid.py,sha256=hAxNtWdxavwf_a-AnlXMOmEYakkNBkrPT
|
|
|
102
100
|
wayfinder_paths/policies/moonwell.py,sha256=sKWLbruMKiW7Yh1DhXdVPRe0JBP-nooNybRz0G9PgvA,1605
|
|
103
101
|
wayfinder_paths/policies/prjx.py,sha256=6kfZ6OQFroFHYJl4vSWT-svwwfvoHlS_ZrcHt8nmZMU,743
|
|
104
102
|
wayfinder_paths/policies/util.py,sha256=r8xQLPvE3kU21_LG6VbkFI9sUSYltcsKunryZdHOUDA,912
|
|
105
|
-
wayfinder_paths/run_strategy.py,sha256=
|
|
103
|
+
wayfinder_paths/run_strategy.py,sha256=HiHdnbu_4rwMgFHTulxCd-AKWeETa3D9TRHlH_NhuzU,14299
|
|
106
104
|
wayfinder_paths/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
107
105
|
wayfinder_paths/scripts/create_strategy.py,sha256=rp2kkGXsmcAbOt1eZthV1iZ2yM6wAbjn4R10IATulOw,6275
|
|
108
|
-
wayfinder_paths/scripts/make_wallets.py,sha256=
|
|
109
|
-
wayfinder_paths/scripts/run_strategy.py,sha256=
|
|
106
|
+
wayfinder_paths/scripts/make_wallets.py,sha256=LkWr65mKtKMYlm2ZINsacvnIJ--A5c97xG9ZY1azVec,5242
|
|
107
|
+
wayfinder_paths/scripts/run_strategy.py,sha256=Cue3lxbZCPYrlICAriuQJqrEWwBFp_YK6Kd_LQQGqxw,3541
|
|
110
108
|
wayfinder_paths/scripts/validate_manifests.py,sha256=sTJhCVTb8X0SFYozArVbX4AMAEv-0R1Imp4dpHfAuHE,7075
|
|
111
109
|
wayfinder_paths/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
112
110
|
wayfinder_paths/strategies/basis_trading_strategy/README.md,sha256=rTUXQ2owEoPmXlfHcJfRFCwcQxlU3a4hOJGN5kaWWQ0,7176
|
|
@@ -114,21 +112,21 @@ wayfinder_paths/strategies/basis_trading_strategy/__init__.py,sha256=kVcehFjBUto
|
|
|
114
112
|
wayfinder_paths/strategies/basis_trading_strategy/constants.py,sha256=PJ1WtSALxiuW1FXx-BF30ciFISEhO5VBfrSZyfhPuz0,45
|
|
115
113
|
wayfinder_paths/strategies/basis_trading_strategy/examples.json,sha256=q2wlAH8Gr-LUJeamKzWL1EtChL3TBWe0HQ4_P-VCdqQ,429
|
|
116
114
|
wayfinder_paths/strategies/basis_trading_strategy/manifest.yaml,sha256=cmvAizwBP_SoXvypal8CEHLNh4Du5M_RBKy37ScUjL0,1078
|
|
117
|
-
wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=
|
|
118
|
-
wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=
|
|
119
|
-
wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=
|
|
115
|
+
wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=Z1rgAfLGaSFFL2bS9_XPc7RzpY1Q74jZQGc86Yo_0DQ,38634
|
|
116
|
+
wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=qkXKvZr1As8ZEjQHXhg5pP6mJdEtsvyHjrn0Hqg8Xr8,171716
|
|
117
|
+
wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=FH0napmPYTzmflxfyqrqHujO9fmatYbXRH19LSsO_sA,31579
|
|
120
118
|
wayfinder_paths/strategies/basis_trading_strategy/types.py,sha256=rlbouTUOVPLfGPzMbsf-fUmMcn0R_OsG-IdfiBJmmqI,845
|
|
121
119
|
wayfinder_paths/strategies/config.py,sha256=5dv-8tWwoxH3Sxd9jtiw90shrLipEe3UlU-IYUBfciM,2762
|
|
122
|
-
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=
|
|
123
|
-
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=
|
|
120
|
+
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=3xgX_6qXob7ZSefPHHHdzJtUY1ousVh_YtsS0rwXfpc,4571
|
|
121
|
+
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=GbVo2p6QiG6M7Ma5s671lw8G9JwnMl1h0n9mrtt-ZS8,164
|
|
124
122
|
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/manifest.yaml,sha256=__YWl6MEeTBLbNWwUyZjQky0ok1T8B1m8dHPQWtW454,240
|
|
125
|
-
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=
|
|
126
|
-
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=
|
|
123
|
+
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=V5Tv0Y8Bxbpbyu2JKv7PKHoRiebbWxbtCi7iIp2ivXA,91673
|
|
124
|
+
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=puHIf160DQ_a1G3LXFHjIel504vKDhZvqktysyEwOdo,15296
|
|
127
125
|
wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=Qj1b2bU5606pbZXsPf1WOtsx0erfBaXpRygxIDGVIgE,5211
|
|
128
126
|
wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json,sha256=pL1DNFEvYvXKK7xXD5oQYFPQj3Cm1ocKnk6r_iZk0IY,423
|
|
129
127
|
wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml,sha256=rBb7-Fmub8twfKJgbBIiCWbwI2nLnuqBNyAJs36WhIg,750
|
|
130
|
-
wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=
|
|
131
|
-
wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=
|
|
128
|
+
wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=uoy0TnKRG2ZgbJ_4JjC_DBRWAjEvUxiC3MN-QhohB7o,75430
|
|
129
|
+
wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=z3vkiyELwJipWNjksdG3Vs6HIVE_y-UoHJCDezXMH60,19967
|
|
132
130
|
wayfinder_paths/templates/adapter/README.md,sha256=QcJ0cwXqqtj1VRK1wAs-unUphTPHdJwoIrIoSU4hTmA,3550
|
|
133
131
|
wayfinder_paths/templates/adapter/adapter.py,sha256=8wdqcEwqb7XGUxl2gQvGnbFwhPi1h15ZJhB2lgtZieI,814
|
|
134
132
|
wayfinder_paths/templates/adapter/examples.json,sha256=KLHy3AgPIplAaZN0qY2A-HBMa1xXkMhIyusORovTD9w,79
|
|
@@ -138,12 +136,12 @@ wayfinder_paths/templates/strategy/README.md,sha256=c7iKlgkz0FPQC3xjMlXqYaDIwC_E
|
|
|
138
136
|
wayfinder_paths/templates/strategy/examples.json,sha256=s8UdlD5uxLITQrRMCqgiaAP0IE0tdnnLfX-Zn-OChIc,135
|
|
139
137
|
wayfinder_paths/templates/strategy/manifest.yaml,sha256=Q13sIhfE7u0wMwa8oFwMZr_twwVMprMV4c_JEQNhkz8,289
|
|
140
138
|
wayfinder_paths/templates/strategy/strategy.py,sha256=dso2jhVphsdKNd17JPwnFAFzU01-1kHlWrKPAKIKSWw,2024
|
|
141
|
-
wayfinder_paths/templates/strategy/test_strategy.py,sha256
|
|
139
|
+
wayfinder_paths/templates/strategy/test_strategy.py,sha256=PwDVFTo7gql3WRqhhmyiBE9orfhXv46FBO989NQNxI0,7519
|
|
142
140
|
wayfinder_paths/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
143
141
|
wayfinder_paths/tests/test_smoke_manifest.py,sha256=YjVzHTWys5o6Ae2cUuuJPhk-QgKxT1InDFHLjpouRiY,1267
|
|
144
142
|
wayfinder_paths/tests/test_test_coverage.py,sha256=9NrZeVmP02D4W7Qc0XjciC05bhvdTCVibYjTGfa_GQk,7893
|
|
145
143
|
wayfinder_paths/tests/test_utils.py,sha256=pxHT0QKFlyJeJo8bFnKXzWcOdi6t8rbJ0JFCBaFCBRQ,2112
|
|
146
|
-
wayfinder_paths-0.1.
|
|
147
|
-
wayfinder_paths-0.1.
|
|
148
|
-
wayfinder_paths-0.1.
|
|
149
|
-
wayfinder_paths-0.1.
|
|
144
|
+
wayfinder_paths-0.1.9.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
|
|
145
|
+
wayfinder_paths-0.1.9.dist-info/METADATA,sha256=cSavzU1Fz9Hgwin71AwbwAaBbVLRGlKXhjpmJrzcCQ8,31036
|
|
146
|
+
wayfinder_paths-0.1.9.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
147
|
+
wayfinder_paths-0.1.9.dist-info/RECORD,,
|