wayfinder-paths 0.1.7__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 +1 -53
- wayfinder_paths/adapters/brap_adapter/test_adapter.py +5 -7
- 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/ledger_adapter/test_adapter.py +3 -0
- wayfinder_paths/adapters/pool_adapter/README.md +3 -104
- wayfinder_paths/adapters/pool_adapter/adapter.py +0 -194
- wayfinder_paths/adapters/pool_adapter/examples.json +0 -100
- wayfinder_paths/adapters/pool_adapter/test_adapter.py +0 -134
- wayfinder_paths/adapters/token_adapter/README.md +1 -1
- wayfinder_paths/core/clients/AuthClient.py +0 -3
- wayfinder_paths/core/clients/BRAPClient.py +1 -0
- wayfinder_paths/core/clients/ClientManager.py +1 -22
- wayfinder_paths/core/clients/PoolClient.py +0 -16
- 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 -64
- 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 +40 -17
- wayfinder_paths/templates/strategy/test_strategy.py +0 -4
- {wayfinder_paths-0.1.7.dist-info → wayfinder_paths-0.1.9.dist-info}/METADATA +33 -15
- {wayfinder_paths-0.1.7.dist-info → wayfinder_paths-0.1.9.dist-info}/RECORD +49 -51
- wayfinder_paths/core/clients/SimulationClient.py +0 -192
- wayfinder_paths/core/clients/TransactionClient.py +0 -63
- {wayfinder_paths-0.1.7.dist-info → wayfinder_paths-0.1.9.dist-info}/LICENSE +0 -0
- {wayfinder_paths-0.1.7.dist-info → wayfinder_paths-0.1.9.dist-info}/WHEEL +0 -0
|
@@ -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:
|
|
@@ -65,6 +64,7 @@ def strategy():
|
|
|
65
64
|
if hasattr(s, "token_adapter") and s.token_adapter:
|
|
66
65
|
default_usdc = {
|
|
67
66
|
"id": "usd-coin-base",
|
|
67
|
+
"token_id": "usd-coin-base",
|
|
68
68
|
"symbol": "USDC",
|
|
69
69
|
"name": "USD Coin",
|
|
70
70
|
"decimals": 6,
|
|
@@ -74,6 +74,7 @@ def strategy():
|
|
|
74
74
|
|
|
75
75
|
default_pool_token = {
|
|
76
76
|
"id": "test-pool-base",
|
|
77
|
+
"token_id": "test-pool-base",
|
|
77
78
|
"symbol": "POOL",
|
|
78
79
|
"name": "Test Pool",
|
|
79
80
|
"decimals": 18,
|
|
@@ -97,6 +98,7 @@ def strategy():
|
|
|
97
98
|
True,
|
|
98
99
|
{
|
|
99
100
|
"id": "ethereum-base",
|
|
101
|
+
"token_id": "ethereum-base",
|
|
100
102
|
"symbol": "ETH",
|
|
101
103
|
"name": "Ethereum",
|
|
102
104
|
"decimals": 18,
|
|
@@ -127,9 +129,6 @@ def strategy():
|
|
|
127
129
|
)
|
|
128
130
|
|
|
129
131
|
if hasattr(s, "pool_adapter") and s.pool_adapter:
|
|
130
|
-
s.pool_adapter.find_high_yield_pools = AsyncMock(
|
|
131
|
-
return_value=(True, {"pools": [], "total_found": 0})
|
|
132
|
-
)
|
|
133
132
|
s.pool_adapter.get_pools_by_ids = AsyncMock(
|
|
134
133
|
return_value=(
|
|
135
134
|
True,
|
|
@@ -207,6 +206,7 @@ def strategy():
|
|
|
207
206
|
s.DEPOSIT_USDC = 0
|
|
208
207
|
s.usdc_token_info = {
|
|
209
208
|
"id": "usd-coin-base",
|
|
209
|
+
"token_id": "usd-coin-base",
|
|
210
210
|
"symbol": "USDC",
|
|
211
211
|
"name": "USD Coin",
|
|
212
212
|
"decimals": 6,
|
|
@@ -215,6 +215,7 @@ def strategy():
|
|
|
215
215
|
}
|
|
216
216
|
s.gas_token = {
|
|
217
217
|
"id": "ethereum-base",
|
|
218
|
+
"token_id": "ethereum-base",
|
|
218
219
|
"symbol": "ETH",
|
|
219
220
|
"name": "Ethereum",
|
|
220
221
|
"decimals": 18,
|
|
@@ -223,6 +224,7 @@ def strategy():
|
|
|
223
224
|
}
|
|
224
225
|
s.current_pool = {
|
|
225
226
|
"id": "usd-coin-base",
|
|
227
|
+
"token_id": "usd-coin-base",
|
|
226
228
|
"symbol": "USDC",
|
|
227
229
|
"decimals": 6,
|
|
228
230
|
"chain": {"code": "base", "id": 8453, "name": "Base"},
|
|
@@ -245,9 +247,6 @@ def strategy():
|
|
|
245
247
|
side_effect=get_token_price_side_effect
|
|
246
248
|
)
|
|
247
249
|
|
|
248
|
-
async def mock_sweep_wallet(target_token):
|
|
249
|
-
pass
|
|
250
|
-
|
|
251
250
|
async def mock_refresh_current_pool_balance():
|
|
252
251
|
pass
|
|
253
252
|
|
|
@@ -257,7 +256,6 @@ def strategy():
|
|
|
257
256
|
async def mock_has_idle_assets(balances, target):
|
|
258
257
|
return True
|
|
259
258
|
|
|
260
|
-
s._sweep_wallet = mock_sweep_wallet
|
|
261
259
|
s._refresh_current_pool_balance = mock_refresh_current_pool_balance
|
|
262
260
|
s._rebalance_gas = mock_rebalance_gas
|
|
263
261
|
s._has_idle_assets = mock_has_idle_assets
|
|
@@ -432,17 +430,34 @@ async def test_deposit_tracks_usdc(strategy):
|
|
|
432
430
|
@pytest.mark.asyncio
|
|
433
431
|
async def test_sweep_wallet_uses_tracked_tokens(strategy):
|
|
434
432
|
"""Test that _sweep_wallet only swaps tracked tokens."""
|
|
433
|
+
# Import the real implementation to restore it
|
|
434
|
+
from wayfinder_paths.strategies.stablecoin_yield_strategy.strategy import (
|
|
435
|
+
StablecoinYieldStrategy,
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
# Restore the real _sweep_wallet method (fixture mocks it as a no-op)
|
|
439
|
+
strategy._sweep_wallet = StablecoinYieldStrategy._sweep_wallet.__get__(
|
|
440
|
+
strategy, StablecoinYieldStrategy
|
|
441
|
+
)
|
|
442
|
+
|
|
435
443
|
# Setup: track some tokens with balances
|
|
436
444
|
strategy._track_token("token-1", 1000000)
|
|
437
445
|
strategy._track_token("token-2", 2000000)
|
|
438
446
|
|
|
447
|
+
# Track the actual token IDs to avoid issues with gas token
|
|
448
|
+
# Make sure we're not accidentally matching gas token
|
|
449
|
+
assert "token-1" in strategy.tracked_token_ids
|
|
450
|
+
assert "token-2" in strategy.tracked_token_ids
|
|
451
|
+
|
|
439
452
|
# Mock balance adapter to return fresh balances
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
453
|
+
async def get_balance_mock(token_id, **kwargs):
|
|
454
|
+
balance = strategy.tracked_balances.get(token_id, 0)
|
|
455
|
+
# Return the balance, ensuring it's an int
|
|
456
|
+
return (True, int(balance) if balance else 0)
|
|
457
|
+
|
|
458
|
+
# Create a new AsyncMock that will track calls
|
|
459
|
+
new_mock = AsyncMock(side_effect=get_balance_mock)
|
|
460
|
+
strategy.balance_adapter.get_balance = new_mock
|
|
446
461
|
|
|
447
462
|
# Mock brap adapter swap
|
|
448
463
|
strategy.brap_adapter.swap_from_token_ids = AsyncMock(
|
|
@@ -451,15 +466,23 @@ async def test_sweep_wallet_uses_tracked_tokens(strategy):
|
|
|
451
466
|
|
|
452
467
|
target_token = {
|
|
453
468
|
"token_id": "usd-coin-base",
|
|
454
|
-
"address": "
|
|
469
|
+
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
|
|
455
470
|
"chain": {"code": "base", "name": "Base"},
|
|
456
471
|
}
|
|
457
472
|
|
|
458
473
|
# Call sweep
|
|
459
474
|
await strategy._sweep_wallet(target_token)
|
|
460
475
|
|
|
461
|
-
# Verify that swap was called for tracked tokens
|
|
462
|
-
|
|
476
|
+
# Verify that swap was called for tracked tokens (should be called twice, once for each token)
|
|
477
|
+
# If this fails, check: balance_adapter.get_balance was called, tracked_balances has values,
|
|
478
|
+
# and tokens pass the gas/target token checks
|
|
479
|
+
assert strategy.brap_adapter.swap_from_token_ids.call_count >= 1, (
|
|
480
|
+
f"Expected at least 1 swap call, got {strategy.brap_adapter.swap_from_token_ids.call_count}. "
|
|
481
|
+
f"Tracked tokens: {strategy.tracked_token_ids}, "
|
|
482
|
+
f"Tracked balances: {strategy.tracked_balances}, "
|
|
483
|
+
f"Get balance calls: {new_mock.call_count}, "
|
|
484
|
+
f"balance_adapter mock is: {id(strategy.balance_adapter.get_balance)}, new_mock is: {id(new_mock)}"
|
|
485
|
+
)
|
|
463
486
|
|
|
464
487
|
|
|
465
488
|
@pytest.mark.asyncio
|
|
@@ -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
|
```
|
|
@@ -125,6 +122,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
125
122
|
### Contributor Guidelines
|
|
126
123
|
|
|
127
124
|
#### For Adapters
|
|
125
|
+
|
|
128
126
|
- **Start from the template**: Copy `wayfinder_paths/templates/adapter/` as a starting point
|
|
129
127
|
- Extend `BaseAdapter` from `wayfinder_paths/core/adapters/BaseAdapter.py`
|
|
130
128
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/adapter/manifest.yaml`) with:
|
|
@@ -138,6 +136,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
138
136
|
- Validate your manifest: `just validate-manifests`
|
|
139
137
|
|
|
140
138
|
#### For Strategies
|
|
139
|
+
|
|
141
140
|
- **Start from the template**: Use `just create-strategy "Strategy Name"` to create a new strategy with its own wallet, or copy `wayfinder_paths/templates/strategy/` manually
|
|
142
141
|
- Extend `Strategy` from `wayfinder_paths/core/strategies/Strategy.py`
|
|
143
142
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/strategy/manifest.yaml`) with:
|
|
@@ -151,6 +150,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
151
150
|
- Validate your manifest: `just validate-manifests`
|
|
152
151
|
|
|
153
152
|
#### General Guidelines
|
|
153
|
+
|
|
154
154
|
- **Code Quality**: Follow existing patterns and use type hints
|
|
155
155
|
- **Testing**: See [TESTING.md](TESTING.md) - minimum: smoke test for strategies, basic tests for adapters
|
|
156
156
|
- **Documentation**: Update README files and add docstrings
|
|
@@ -205,11 +205,12 @@ poetry run python wayfinder_paths/run_strategy.py your_strategy --action status
|
|
|
205
205
|
## 🏗️ Architecture
|
|
206
206
|
|
|
207
207
|
### Client System
|
|
208
|
+
|
|
208
209
|
The platform uses a unified client system for all API interactions. Clients are thin wrappers that handle low-level API calls, authentication, and network communication. **Strategies should not call clients directly** - use adapters instead for domain-specific operations.
|
|
209
210
|
|
|
210
211
|
### Clients vs Adapters
|
|
211
212
|
|
|
212
|
-
- **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`.
|
|
213
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.
|
|
214
215
|
|
|
215
216
|
Recommended usage:
|
|
@@ -231,6 +232,7 @@ Adapter manifests declare the capabilities an adapter provides and the clients i
|
|
|
231
232
|
**Template:** Copy `wayfinder_paths/templates/adapter/manifest.yaml` as a starting point.
|
|
232
233
|
|
|
233
234
|
**Schema:**
|
|
235
|
+
|
|
234
236
|
```yaml
|
|
235
237
|
schema_version: "0.1"
|
|
236
238
|
entrypoint: "adapters.my_adapter.adapter.MyAdapter"
|
|
@@ -243,12 +245,14 @@ dependencies:
|
|
|
243
245
|
```
|
|
244
246
|
|
|
245
247
|
**Fields:**
|
|
248
|
+
|
|
246
249
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
247
250
|
- `entrypoint`: Full Python import path to the adapter class (required)
|
|
248
251
|
- `capabilities`: List of abstract capabilities this adapter provides (required, non-empty)
|
|
249
252
|
- `dependencies`: List of client class names from `core.clients` that this adapter requires (required, non-empty)
|
|
250
253
|
|
|
251
254
|
**Example** (`wayfinder_paths/adapters/pool_adapter/manifest.yaml`):
|
|
255
|
+
|
|
252
256
|
```yaml
|
|
253
257
|
schema_version: "0.1"
|
|
254
258
|
entrypoint: "adapters.pool_adapter.adapter.PoolAdapter"
|
|
@@ -269,6 +273,7 @@ Strategy manifests declare permissions and required adapters with their capabili
|
|
|
269
273
|
**Template:** Copy `wayfinder_paths/templates/strategy/manifest.yaml` as a starting point.
|
|
270
274
|
|
|
271
275
|
**Schema:**
|
|
276
|
+
|
|
272
277
|
```yaml
|
|
273
278
|
schema_version: "0.1"
|
|
274
279
|
entrypoint: "strategies.my_strategy.strategy.MyStrategy"
|
|
@@ -282,6 +287,7 @@ adapters:
|
|
|
282
287
|
```
|
|
283
288
|
|
|
284
289
|
**Fields:**
|
|
290
|
+
|
|
285
291
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
286
292
|
- `entrypoint`: Full Python import path to the strategy class (required)
|
|
287
293
|
- `name`: Strategy directory name (optional, used for wallet lookup - defaults to directory name)
|
|
@@ -291,6 +297,7 @@ adapters:
|
|
|
291
297
|
- `capabilities`: List of capabilities required from this adapter
|
|
292
298
|
|
|
293
299
|
**Example** (`wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml`):
|
|
300
|
+
|
|
294
301
|
```yaml
|
|
295
302
|
schema_version: "0.1"
|
|
296
303
|
entrypoint: "strategies.stablecoin_yield_strategy.strategy.StablecoinYieldStrategy"
|
|
@@ -308,12 +315,14 @@ adapters:
|
|
|
308
315
|
#### Manifest Validation
|
|
309
316
|
|
|
310
317
|
Manifests are automatically validated to ensure:
|
|
318
|
+
|
|
311
319
|
- Schema compliance (all required fields present, correct types)
|
|
312
320
|
- Entrypoint classes exist and are importable
|
|
313
321
|
- Dependencies are valid client classes
|
|
314
322
|
- Permissions policies are non-empty
|
|
315
323
|
|
|
316
324
|
**Validate locally:**
|
|
325
|
+
|
|
317
326
|
```bash
|
|
318
327
|
# Validate all manifests
|
|
319
328
|
just validate-manifests
|
|
@@ -348,6 +357,7 @@ The `validate_manifests.py` script performs multi-stage validation:
|
|
|
348
357
|
- Policy syntax is not parsed/validated (assumed to be valid at runtime)
|
|
349
358
|
|
|
350
359
|
**Validation Flow:**
|
|
360
|
+
|
|
351
361
|
```
|
|
352
362
|
For each manifest file:
|
|
353
363
|
1. Load YAML → Parse with Pydantic (schema validation)
|
|
@@ -357,6 +367,7 @@ For each manifest file:
|
|
|
357
367
|
```
|
|
358
368
|
|
|
359
369
|
The script automatically discovers all manifests by scanning:
|
|
370
|
+
|
|
360
371
|
- `wayfinder_paths/adapters/*/manifest.yaml` for adapter manifests
|
|
361
372
|
- `wayfinder_paths/strategies/*/manifest.yaml` for strategy manifests
|
|
362
373
|
|
|
@@ -367,12 +378,15 @@ All errors are collected and reported at the end, with the script exiting with c
|
|
|
367
378
|
Capabilities are abstract operation identifiers (e.g., `"pool.read"`, `"swap.execute"`) declared in manifests. They represent what operations an adapter can perform, not specific method names. The manifest is the **single source of truth** for capabilities—they are not duplicated in code.
|
|
368
379
|
|
|
369
380
|
When creating an adapter:
|
|
381
|
+
|
|
370
382
|
1. Declare capabilities in your `manifest.yaml`
|
|
371
383
|
2. Implement methods that fulfill those capabilities
|
|
372
384
|
3. Capabilities are validated at manifest validation time (entrypoint must be importable)
|
|
373
385
|
|
|
374
386
|
### Configuration
|
|
387
|
+
|
|
375
388
|
Configuration is split between:
|
|
389
|
+
|
|
376
390
|
- **User Config**: Your credentials and preferences
|
|
377
391
|
- **System Config**: Platform settings
|
|
378
392
|
- **Strategy Config**: Strategy-specific parameters
|
|
@@ -384,9 +398,11 @@ See [CONFIG_GUIDE.md](wayfinder_paths/CONFIG_GUIDE.md) for details.
|
|
|
384
398
|
Wayfinder Paths supports two authentication methods:
|
|
385
399
|
|
|
386
400
|
#### 1. Service Account Authentication (API Key)
|
|
401
|
+
|
|
387
402
|
For backend services and automated systems with higher rate limits:
|
|
388
403
|
|
|
389
404
|
**Option A: Pass to Strategy Constructor**
|
|
405
|
+
|
|
390
406
|
```python
|
|
391
407
|
from wayfinder_paths.strategies.stablecoin_yield_strategy.strategy import StablecoinYieldStrategy
|
|
392
408
|
|
|
@@ -396,29 +412,25 @@ strategy = StablecoinYieldStrategy(
|
|
|
396
412
|
)
|
|
397
413
|
```
|
|
398
414
|
|
|
399
|
-
**Option B:
|
|
400
|
-
```bash
|
|
401
|
-
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
402
|
-
# All clients will automatically discover and use this
|
|
403
|
-
```
|
|
415
|
+
**Option B: Add to config.json**
|
|
404
416
|
|
|
405
|
-
**Option C: Add to config.json**
|
|
406
417
|
```json
|
|
407
418
|
{
|
|
408
419
|
"user": {
|
|
409
420
|
"api_key": "sk_live_abc123..."
|
|
410
421
|
},
|
|
411
422
|
"system": {
|
|
412
|
-
"api_key": "sk_live_abc123..."
|
|
423
|
+
"api_key": "sk_live_abc123..." // Alternative: system-level API key
|
|
413
424
|
}
|
|
414
425
|
}
|
|
415
426
|
```
|
|
416
427
|
|
|
417
|
-
**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)
|
|
418
429
|
|
|
419
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.
|
|
420
431
|
|
|
421
432
|
#### 2. Personal Access Authentication (OAuth)
|
|
433
|
+
|
|
422
434
|
For standalone SDK users with username/password:
|
|
423
435
|
|
|
424
436
|
```json
|
|
@@ -426,12 +438,13 @@ For standalone SDK users with username/password:
|
|
|
426
438
|
"user": {
|
|
427
439
|
"username": "your_username",
|
|
428
440
|
"password": "your_password",
|
|
429
|
-
"refresh_token": null
|
|
441
|
+
"refresh_token": null // Optional: use refresh token instead
|
|
430
442
|
}
|
|
431
443
|
}
|
|
432
444
|
```
|
|
433
445
|
|
|
434
446
|
**How It Works:**
|
|
447
|
+
|
|
435
448
|
- API keys are automatically discovered by all clients (no need to pass explicitly)
|
|
436
449
|
- When an API key is available, it's used for all API requests (including public endpoints) for rate limiting
|
|
437
450
|
- If no API key is found, the system falls back to OAuth authentication
|
|
@@ -493,7 +506,7 @@ class MyStrategy(Strategy):
|
|
|
493
506
|
super().__init__(api_key=api_key) # Pass to base class for auto-discovery
|
|
494
507
|
self.config = config or {}
|
|
495
508
|
web3_service = DefaultWeb3Service(self.config)
|
|
496
|
-
# Adapters automatically discover API key from
|
|
509
|
+
# Adapters automatically discover API key from constructor or config.json
|
|
497
510
|
balance_adapter = BalanceAdapter(self.config, web3_service=web3_service)
|
|
498
511
|
self.register_adapters([balance_adapter])
|
|
499
512
|
self.balance_adapter = balance_adapter
|
|
@@ -614,6 +627,7 @@ just create-wallets
|
|
|
614
627
|
```
|
|
615
628
|
|
|
616
629
|
This creates:
|
|
630
|
+
|
|
617
631
|
- `main` wallet - your main wallet for testing (labeled "main" in wallets.json)
|
|
618
632
|
- `wallets.json` - wallet addresses and private keys for local testing
|
|
619
633
|
|
|
@@ -689,12 +703,14 @@ This package follows [Semantic Versioning](https://semver.org/) (SemVer) and is
|
|
|
689
703
|
3. **Dependent changes**: Only after publishing can dependent changes be merged in other applications
|
|
690
704
|
|
|
691
705
|
**Why this order matters:**
|
|
706
|
+
|
|
692
707
|
- Other applications depend on this package from PyPI
|
|
693
708
|
- They cannot merge changes that depend on new versions until those versions are available on PyPI
|
|
694
709
|
- Publishing from `main` ensures the published version matches what's in the repository
|
|
695
710
|
- This prevents dependency resolution failures in downstream applications
|
|
696
711
|
|
|
697
712
|
**Example workflow:**
|
|
713
|
+
|
|
698
714
|
```bash
|
|
699
715
|
# 1. Make changes in a feature branch
|
|
700
716
|
git checkout -b feature/new-adapter
|
|
@@ -727,6 +743,7 @@ just publish
|
|
|
727
743
|
```
|
|
728
744
|
|
|
729
745
|
**Important:**
|
|
746
|
+
|
|
730
747
|
- ⚠️ **Publishing is only allowed from the `main` branch** - the publish command will fail if run from any other branch
|
|
731
748
|
- ⚠️ **Versions must be unique** - ensure the version in `pyproject.toml` has been bumped and is unique
|
|
732
749
|
- ⚠️ **Follow the order of operations** - see [Versioning](#-versioning) section above for the required workflow
|
|
@@ -749,6 +766,7 @@ pip install git+https://github.com/wayfinder-ai/wayfinder-paths.git
|
|
|
749
766
|
### Managing Package Access
|
|
750
767
|
|
|
751
768
|
To add collaborators who can publish updates:
|
|
769
|
+
|
|
752
770
|
1. Go to https://pypi.org/project/wayfinder-paths/
|
|
753
771
|
2. Click "Manage" → "Collaborators"
|
|
754
772
|
3. Add users as "Maintainers" (can publish) or "Owners" (full control)
|
|
@@ -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
|
-
wayfinder_paths/adapters/brap_adapter/test_adapter.py,sha256=
|
|
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
|
-
wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=
|
|
35
|
-
wayfinder_paths/adapters/pool_adapter/README.md,sha256=
|
|
34
|
+
wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=Z1-rPP9k5fI-8ofWMKgU3syzNegKGH_hGO6CKApQj1c,7470
|
|
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=
|
|
59
|
-
wayfinder_paths/core/clients/BRAPClient.py,sha256
|
|
60
|
-
wayfinder_paths/core/clients/ClientManager.py,sha256=
|
|
58
|
+
wayfinder_paths/core/clients/AuthClient.py,sha256=lHB0bhGpStWKropwC8d4qwZyOuKH_Xti9afu0nlsYRI,2711
|
|
59
|
+
wayfinder_paths/core/clients/BRAPClient.py,sha256=-cL05ELlroi3pUfT_5nF8Axie2a0n19npnuP408bkAQ,3744
|
|
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
|
-
wayfinder_paths/core/clients/PoolClient.py,sha256=
|
|
64
|
-
wayfinder_paths/core/clients/SimulationClient.py,sha256=ViQmXCQKwhpnZA-YkfIgArrpxGr1U11lZNlbBIak1MU,6364
|
|
63
|
+
wayfinder_paths/core/clients/PoolClient.py,sha256=EMIRRw7nh2bha-Qb5uOcIRgbnnu_v5FIvDU0D61nXGI,3475
|
|
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=qSPPRCEkb1FVNu_OWiUfXAg_GustfPSZ_H2gkKxZoPs,10246
|
|
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,,
|