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.
Files changed (51) hide show
  1. wayfinder_paths/CONFIG_GUIDE.md +5 -14
  2. wayfinder_paths/adapters/brap_adapter/README.md +1 -1
  3. wayfinder_paths/adapters/brap_adapter/adapter.py +1 -53
  4. wayfinder_paths/adapters/brap_adapter/test_adapter.py +5 -7
  5. wayfinder_paths/adapters/hyperlend_adapter/adapter.py +0 -7
  6. wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +0 -54
  7. wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +1 -1
  8. wayfinder_paths/adapters/ledger_adapter/README.md +1 -1
  9. wayfinder_paths/adapters/ledger_adapter/test_adapter.py +3 -0
  10. wayfinder_paths/adapters/pool_adapter/README.md +3 -104
  11. wayfinder_paths/adapters/pool_adapter/adapter.py +0 -194
  12. wayfinder_paths/adapters/pool_adapter/examples.json +0 -100
  13. wayfinder_paths/adapters/pool_adapter/test_adapter.py +0 -134
  14. wayfinder_paths/adapters/token_adapter/README.md +1 -1
  15. wayfinder_paths/core/clients/AuthClient.py +0 -3
  16. wayfinder_paths/core/clients/BRAPClient.py +1 -0
  17. wayfinder_paths/core/clients/ClientManager.py +1 -22
  18. wayfinder_paths/core/clients/PoolClient.py +0 -16
  19. wayfinder_paths/core/clients/WalletClient.py +0 -8
  20. wayfinder_paths/core/clients/WayfinderClient.py +9 -14
  21. wayfinder_paths/core/clients/__init__.py +0 -8
  22. wayfinder_paths/core/clients/protocols.py +0 -64
  23. wayfinder_paths/core/config.py +5 -45
  24. wayfinder_paths/core/engine/StrategyJob.py +0 -3
  25. wayfinder_paths/core/services/base.py +0 -49
  26. wayfinder_paths/core/services/local_evm_txn.py +3 -82
  27. wayfinder_paths/core/services/local_token_txn.py +61 -70
  28. wayfinder_paths/core/services/web3_service.py +0 -2
  29. wayfinder_paths/core/settings.py +8 -8
  30. wayfinder_paths/core/strategies/Strategy.py +1 -5
  31. wayfinder_paths/core/utils/evm_helpers.py +7 -12
  32. wayfinder_paths/core/wallets/README.md +3 -6
  33. wayfinder_paths/run_strategy.py +29 -32
  34. wayfinder_paths/scripts/make_wallets.py +1 -25
  35. wayfinder_paths/scripts/run_strategy.py +0 -2
  36. wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py +1 -3
  37. wayfinder_paths/strategies/basis_trading_strategy/strategy.py +86 -137
  38. wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +96 -58
  39. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +2 -2
  40. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json +4 -1
  41. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +106 -28
  42. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +53 -14
  43. wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +1 -6
  44. wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +40 -17
  45. wayfinder_paths/templates/strategy/test_strategy.py +0 -4
  46. {wayfinder_paths-0.1.7.dist-info → wayfinder_paths-0.1.9.dist-info}/METADATA +33 -15
  47. {wayfinder_paths-0.1.7.dist-info → wayfinder_paths-0.1.9.dist-info}/RECORD +49 -51
  48. wayfinder_paths/core/clients/SimulationClient.py +0 -192
  49. wayfinder_paths/core/clients/TransactionClient.py +0 -63
  50. {wayfinder_paths-0.1.7.dist-info → wayfinder_paths-0.1.9.dist-info}/LICENSE +0 -0
  51. {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
- strategy.balance_adapter.get_balance = AsyncMock(
441
- side_effect=lambda token_id, **kwargs: (
442
- True,
443
- strategy.tracked_balances.get(token_id, 0),
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": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
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
- assert strategy.brap_adapter.swap_from_token_ids.called
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.7
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`, `TransactionClient`, `WalletClient`.
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: Set Environment Variable**
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..." // Alternative: system-level API key
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) > `WAYFINDER_API_KEY` environment variable
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 // Optional: use refresh token instead
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 env var (set by Strategy.__init__)
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=PN2ClAZ8FCF16_sstaUxbfvQkVAyXdtRvTrrj-qJPuk,13397
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=euWkSBR6OkYtebhvdNR_PL64sKbzKD5bg5hrYTIWZ1c,7905
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=ndjT7Ayg2_3yJI2gMSNdJZcAxjyZsgEOVO11aXfui5U,26878
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=1IYcmT_bJcOSRDL782AXniCHYHMUJ_PgCd5U66Hfv2g,10806
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=QevMiOrztvTRHx7vA_dAQGX3ioUFdLY4aVOfsT-DXX8,10555
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=kG0oBi07OI4JNwDs14cGJ15qDSoNKX6_v-CUHlsctGQ,36598
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=z3vi6AoIkQmOcUW1WyxIPWfv0SIuSNWNp9ABOIkBjzM,7689
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=OIFbJIlck91K3kBKbkPfOWUDx7tJgDjwCAcBLm7FNK4,4104
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=WFDHJx4dNKCLUDEClewZmGH7V76GoeQY5E0ObXNe2kk,7355
35
- wayfinder_paths/adapters/pool_adapter/README.md,sha256=rF7KYEtxu6BmDa9gi505-IFUddk6BDaMOQPB4YjeOLc,5863
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=jXGq5F-xHXF42JN5R0Hd6LEGDds1qAiwOCGQ4etzuPE,9642
38
- wayfinder_paths/adapters/pool_adapter/examples.json,sha256=hLH74Oy6WlrEvAIOjwqsjpcCDxC-N0efWeLa_-TbntM,3202
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=4RcaCixHuXT75OfwZEhNoexLUdvTDGERJiI9XW7plIA,7653
41
- wayfinder_paths/adapters/token_adapter/README.md,sha256=d2tMJte6HBu62CCYXdjS8GHZXj5f2fU03uZAO6pscBI,2698
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=scz8GvnabNYAQq_XYDcLP2lf2LZqurQOixA7MMAfbCY,2796
59
- wayfinder_paths/core/clients/BRAPClient.py,sha256=AtTYNk1FuCS59xj5FFgv2fIts44BQK19Kv0IeXlcPtw,3700
60
- wayfinder_paths/core/clients/ClientManager.py,sha256=2p8oEFnCxKCH_TBMKo9gMLAwzwLgeotdgFod8wpoa04,8135
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=s4fg-OPPxq7tfy8Fbk_QtGCkzkiRCx-P8UwANUfJpE0,4070
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/TransactionClient.py,sha256=APs-8lMdgBnE40wOn5L8_lEdJ3DddTZFcQbW0tIfJWg,2040
67
- wayfinder_paths/core/clients/WalletClient.py,sha256=Vc2AwllBxUzkdZKKVRrPR4gl8mtvffRxz5QbrpxcH-0,2819
68
- wayfinder_paths/core/clients/WayfinderClient.py,sha256=lLdmD58gAyx5N4yYN4-IYjvRDVzwE3K408XuI07g6g4,10724
69
- wayfinder_paths/core/clients/__init__.py,sha256=oNq6fQW8hUnpkuIZxdbOTLPayJRLA6S-k8e7wqsH_7c,1581
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=A--KQp_EDLXhtituvk3WXPUP2SJv45IcNcm4G_nFMc0,16890
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=DqwkPu5JHp00xkDmj7kyUqs9U-VP0k-OBlVipjEzk14,7257
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=Ip7fkRPvCibLs67n-0_ESrDR0t9lffGqY-4K2pJfoG8,5585
82
- wayfinder_paths/core/services/local_evm_txn.py,sha256=n0LJOH9-Gy9JDjMvz16Lk1PD9gpsuiw2EEW7PNmkzTI,16982
83
- wayfinder_paths/core/services/local_token_txn.py,sha256=S9RJq2_fm1sqmJmn83vMo69-GQLeCkQ-20rrv0ezU1g,8049
84
- wayfinder_paths/core/services/web3_service.py,sha256=_8sEpkWzSzp7dQR5OCwScypyOsEv5s2BeuO8TqB_H-w,1558
85
- wayfinder_paths/core/settings.py,sha256=VqNOU84OsX_6KAWr9JdPfyxtV14yTH1uZl2zuKeiJ3g,1921
86
- wayfinder_paths/core/strategies/Strategy.py,sha256=7Fn29fhCW3TJ1rJnWJHd4e5ndeDfFjNbeAgAazAynUs,9499
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=sJUGpwbc3jD9h1BaaYC4mPDs25S3YKyoY1NfvHq9BBg,6491
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=gwzFapFnpArdIyUz0NdYOq5Nm9_uqDYuFddKAZJ0Ss4,3745
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=HRj5iY2AFWaxRKXukKUKPxaXcz4YN-fb6anSLHJaeDg,14502
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=_diYY5FzpLC5mFVIzZsQUBhlBCUQpvhxL5CtQW0qaT8,6298
109
- wayfinder_paths/scripts/run_strategy.py,sha256=EQDsE59mLHXR0HO7vzmzNsqSj-YpsuObC9tg2ZYVztA,3633
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=pkYJ3Ax7quuJUZT_AjB6PFNPM3iDmEE6xpXGthXa5UY,38748
118
- wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=pA11cJXTVuvwBiSc_BYsapshtKBK5FI_Xm-hKxJ9bhg,173962
119
- wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=cFw191y1ud-dtb8jBMTvEbmvhZAXJmLkHaQ3BQBxlXg,28964
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=8mjDUBkBEYp_GWkM0knbFIbJ2Nmb-63pNR09ztZ67qo,4596
123
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=72lu80KAzPG2Bqu_ct1I0qsnEFVs-lurwCXuHZrefck,95
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=VqHuuULeXZ5bA8g7cK9oD1kgXrK87N8Hxu8bnDBR1Cc,88820
126
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=xXPYV45EivXvKPuq-3sJP4Ce5m9GWfGzG40miOtwmxI,13371
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=6Ug2_cFx3nqw4Of5Oo1e9h1tQL1G3JXk2XcxNoq2Q0g,75607
131
- wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=hCznS-kr7xKb-Iz7MdDEiwhnbclE1nEg8CMcNKEQQ5E,18611
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=-ktqbtJ-lXr0CVGgjFkleWmdZeT2nsyL_zt7Hq1aC1g,7692
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.7.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
147
- wayfinder_paths-0.1.7.dist-info/METADATA,sha256=S_D2fakNObohzexQc3K9WaSbKnRYFf-Oguz-E4yZDtA,31378
148
- wayfinder_paths-0.1.7.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
149
- wayfinder_paths-0.1.7.dist-info/RECORD,,
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,,