wayfinder-paths 0.1.7__tar.gz → 0.1.8__tar.gz
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-0.1.7 → wayfinder_paths-0.1.8}/PKG-INFO +31 -3
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/README.md +30 -2
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/pyproject.toml +1 -1
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/brap_adapter/adapter.py +1 -2
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/brap_adapter/test_adapter.py +5 -7
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/ledger_adapter/test_adapter.py +3 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/README.md +3 -28
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/adapter.py +0 -72
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/examples.json +0 -43
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/test_adapter.py +0 -48
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/BRAPClient.py +1 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/PoolClient.py +0 -16
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/protocols.py +0 -4
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +40 -13
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/LICENSE +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/CONFIG_GUIDE.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/abis/generic/erc20.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/balance_adapter/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/balance_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/balance_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/balance_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/balance_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/brap_adapter/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/brap_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/brap_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/brap_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperlend_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperlend_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperlend_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/executor.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/hyperliquid_adapter/utils.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/ledger_adapter/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/ledger_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/ledger_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/ledger_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/ledger_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/token_adapter/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/token_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/token_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/token_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/token_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/token_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/config.example.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/conftest.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/adapters/BaseAdapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/adapters/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/adapters/base.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/adapters/models.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/analytics/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/analytics/bootstrap.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/analytics/stats.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/analytics/test_analytics.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/AuthClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/ClientManager.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/HyperlendClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/LedgerClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/SimulationClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/TokenClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/TransactionClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/WalletClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/WayfinderClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/clients/sdk_example.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/config.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/constants/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/constants/base.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/constants/erc20_abi.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/constants/hyperlend_abi.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/engine/StrategyJob.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/engine/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/engine/manifest.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/services/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/services/base.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/services/local_evm_txn.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/services/local_token_txn.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/services/web3_service.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/settings.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/strategies/Strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/strategies/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/strategies/base.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/strategies/descriptors.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/utils/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/utils/evm_helpers.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/utils/wallets.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/wallets/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/wallets/WalletManager.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/core/wallets/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/enso.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/erc20.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/evm.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/hyper_evm.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/hyperlend.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/hyperliquid.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/moonwell.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/prjx.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/policies/util.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/run_strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/scripts/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/scripts/create_strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/scripts/make_wallets.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/scripts/run_strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/scripts/validate_manifests.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/constants.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/basis_trading_strategy/types.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/config.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/adapter/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/strategy/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/strategy/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/strategy/strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/templates/strategy/test_strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/tests/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/tests/test_smoke_manifest.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/tests/test_test_coverage.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/tests/test_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: wayfinder-paths
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
4
4
|
Summary: Wayfinder Path: strategies and adapters
|
|
5
5
|
Author: Wayfinder
|
|
6
6
|
Author-email: dev@wayfinder.ai
|
|
@@ -125,6 +125,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
125
125
|
### Contributor Guidelines
|
|
126
126
|
|
|
127
127
|
#### For Adapters
|
|
128
|
+
|
|
128
129
|
- **Start from the template**: Copy `wayfinder_paths/templates/adapter/` as a starting point
|
|
129
130
|
- Extend `BaseAdapter` from `wayfinder_paths/core/adapters/BaseAdapter.py`
|
|
130
131
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/adapter/manifest.yaml`) with:
|
|
@@ -138,6 +139,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
138
139
|
- Validate your manifest: `just validate-manifests`
|
|
139
140
|
|
|
140
141
|
#### For Strategies
|
|
142
|
+
|
|
141
143
|
- **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
144
|
- Extend `Strategy` from `wayfinder_paths/core/strategies/Strategy.py`
|
|
143
145
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/strategy/manifest.yaml`) with:
|
|
@@ -151,6 +153,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
151
153
|
- Validate your manifest: `just validate-manifests`
|
|
152
154
|
|
|
153
155
|
#### General Guidelines
|
|
156
|
+
|
|
154
157
|
- **Code Quality**: Follow existing patterns and use type hints
|
|
155
158
|
- **Testing**: See [TESTING.md](TESTING.md) - minimum: smoke test for strategies, basic tests for adapters
|
|
156
159
|
- **Documentation**: Update README files and add docstrings
|
|
@@ -205,6 +208,7 @@ poetry run python wayfinder_paths/run_strategy.py your_strategy --action status
|
|
|
205
208
|
## 🏗️ Architecture
|
|
206
209
|
|
|
207
210
|
### Client System
|
|
211
|
+
|
|
208
212
|
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
213
|
|
|
210
214
|
### Clients vs Adapters
|
|
@@ -231,6 +235,7 @@ Adapter manifests declare the capabilities an adapter provides and the clients i
|
|
|
231
235
|
**Template:** Copy `wayfinder_paths/templates/adapter/manifest.yaml` as a starting point.
|
|
232
236
|
|
|
233
237
|
**Schema:**
|
|
238
|
+
|
|
234
239
|
```yaml
|
|
235
240
|
schema_version: "0.1"
|
|
236
241
|
entrypoint: "adapters.my_adapter.adapter.MyAdapter"
|
|
@@ -243,12 +248,14 @@ dependencies:
|
|
|
243
248
|
```
|
|
244
249
|
|
|
245
250
|
**Fields:**
|
|
251
|
+
|
|
246
252
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
247
253
|
- `entrypoint`: Full Python import path to the adapter class (required)
|
|
248
254
|
- `capabilities`: List of abstract capabilities this adapter provides (required, non-empty)
|
|
249
255
|
- `dependencies`: List of client class names from `core.clients` that this adapter requires (required, non-empty)
|
|
250
256
|
|
|
251
257
|
**Example** (`wayfinder_paths/adapters/pool_adapter/manifest.yaml`):
|
|
258
|
+
|
|
252
259
|
```yaml
|
|
253
260
|
schema_version: "0.1"
|
|
254
261
|
entrypoint: "adapters.pool_adapter.adapter.PoolAdapter"
|
|
@@ -269,6 +276,7 @@ Strategy manifests declare permissions and required adapters with their capabili
|
|
|
269
276
|
**Template:** Copy `wayfinder_paths/templates/strategy/manifest.yaml` as a starting point.
|
|
270
277
|
|
|
271
278
|
**Schema:**
|
|
279
|
+
|
|
272
280
|
```yaml
|
|
273
281
|
schema_version: "0.1"
|
|
274
282
|
entrypoint: "strategies.my_strategy.strategy.MyStrategy"
|
|
@@ -282,6 +290,7 @@ adapters:
|
|
|
282
290
|
```
|
|
283
291
|
|
|
284
292
|
**Fields:**
|
|
293
|
+
|
|
285
294
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
286
295
|
- `entrypoint`: Full Python import path to the strategy class (required)
|
|
287
296
|
- `name`: Strategy directory name (optional, used for wallet lookup - defaults to directory name)
|
|
@@ -291,6 +300,7 @@ adapters:
|
|
|
291
300
|
- `capabilities`: List of capabilities required from this adapter
|
|
292
301
|
|
|
293
302
|
**Example** (`wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml`):
|
|
303
|
+
|
|
294
304
|
```yaml
|
|
295
305
|
schema_version: "0.1"
|
|
296
306
|
entrypoint: "strategies.stablecoin_yield_strategy.strategy.StablecoinYieldStrategy"
|
|
@@ -308,12 +318,14 @@ adapters:
|
|
|
308
318
|
#### Manifest Validation
|
|
309
319
|
|
|
310
320
|
Manifests are automatically validated to ensure:
|
|
321
|
+
|
|
311
322
|
- Schema compliance (all required fields present, correct types)
|
|
312
323
|
- Entrypoint classes exist and are importable
|
|
313
324
|
- Dependencies are valid client classes
|
|
314
325
|
- Permissions policies are non-empty
|
|
315
326
|
|
|
316
327
|
**Validate locally:**
|
|
328
|
+
|
|
317
329
|
```bash
|
|
318
330
|
# Validate all manifests
|
|
319
331
|
just validate-manifests
|
|
@@ -348,6 +360,7 @@ The `validate_manifests.py` script performs multi-stage validation:
|
|
|
348
360
|
- Policy syntax is not parsed/validated (assumed to be valid at runtime)
|
|
349
361
|
|
|
350
362
|
**Validation Flow:**
|
|
363
|
+
|
|
351
364
|
```
|
|
352
365
|
For each manifest file:
|
|
353
366
|
1. Load YAML → Parse with Pydantic (schema validation)
|
|
@@ -357,6 +370,7 @@ For each manifest file:
|
|
|
357
370
|
```
|
|
358
371
|
|
|
359
372
|
The script automatically discovers all manifests by scanning:
|
|
373
|
+
|
|
360
374
|
- `wayfinder_paths/adapters/*/manifest.yaml` for adapter manifests
|
|
361
375
|
- `wayfinder_paths/strategies/*/manifest.yaml` for strategy manifests
|
|
362
376
|
|
|
@@ -367,12 +381,15 @@ All errors are collected and reported at the end, with the script exiting with c
|
|
|
367
381
|
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
382
|
|
|
369
383
|
When creating an adapter:
|
|
384
|
+
|
|
370
385
|
1. Declare capabilities in your `manifest.yaml`
|
|
371
386
|
2. Implement methods that fulfill those capabilities
|
|
372
387
|
3. Capabilities are validated at manifest validation time (entrypoint must be importable)
|
|
373
388
|
|
|
374
389
|
### Configuration
|
|
390
|
+
|
|
375
391
|
Configuration is split between:
|
|
392
|
+
|
|
376
393
|
- **User Config**: Your credentials and preferences
|
|
377
394
|
- **System Config**: Platform settings
|
|
378
395
|
- **Strategy Config**: Strategy-specific parameters
|
|
@@ -384,9 +401,11 @@ See [CONFIG_GUIDE.md](wayfinder_paths/CONFIG_GUIDE.md) for details.
|
|
|
384
401
|
Wayfinder Paths supports two authentication methods:
|
|
385
402
|
|
|
386
403
|
#### 1. Service Account Authentication (API Key)
|
|
404
|
+
|
|
387
405
|
For backend services and automated systems with higher rate limits:
|
|
388
406
|
|
|
389
407
|
**Option A: Pass to Strategy Constructor**
|
|
408
|
+
|
|
390
409
|
```python
|
|
391
410
|
from wayfinder_paths.strategies.stablecoin_yield_strategy.strategy import StablecoinYieldStrategy
|
|
392
411
|
|
|
@@ -397,19 +416,21 @@ strategy = StablecoinYieldStrategy(
|
|
|
397
416
|
```
|
|
398
417
|
|
|
399
418
|
**Option B: Set Environment Variable**
|
|
419
|
+
|
|
400
420
|
```bash
|
|
401
421
|
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
402
422
|
# All clients will automatically discover and use this
|
|
403
423
|
```
|
|
404
424
|
|
|
405
425
|
**Option C: Add to config.json**
|
|
426
|
+
|
|
406
427
|
```json
|
|
407
428
|
{
|
|
408
429
|
"user": {
|
|
409
430
|
"api_key": "sk_live_abc123..."
|
|
410
431
|
},
|
|
411
432
|
"system": {
|
|
412
|
-
"api_key": "sk_live_abc123..."
|
|
433
|
+
"api_key": "sk_live_abc123..." // Alternative: system-level API key
|
|
413
434
|
}
|
|
414
435
|
}
|
|
415
436
|
```
|
|
@@ -419,6 +440,7 @@ export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
|
419
440
|
**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
441
|
|
|
421
442
|
#### 2. Personal Access Authentication (OAuth)
|
|
443
|
+
|
|
422
444
|
For standalone SDK users with username/password:
|
|
423
445
|
|
|
424
446
|
```json
|
|
@@ -426,12 +448,13 @@ For standalone SDK users with username/password:
|
|
|
426
448
|
"user": {
|
|
427
449
|
"username": "your_username",
|
|
428
450
|
"password": "your_password",
|
|
429
|
-
"refresh_token": null
|
|
451
|
+
"refresh_token": null // Optional: use refresh token instead
|
|
430
452
|
}
|
|
431
453
|
}
|
|
432
454
|
```
|
|
433
455
|
|
|
434
456
|
**How It Works:**
|
|
457
|
+
|
|
435
458
|
- API keys are automatically discovered by all clients (no need to pass explicitly)
|
|
436
459
|
- When an API key is available, it's used for all API requests (including public endpoints) for rate limiting
|
|
437
460
|
- If no API key is found, the system falls back to OAuth authentication
|
|
@@ -614,6 +637,7 @@ just create-wallets
|
|
|
614
637
|
```
|
|
615
638
|
|
|
616
639
|
This creates:
|
|
640
|
+
|
|
617
641
|
- `main` wallet - your main wallet for testing (labeled "main" in wallets.json)
|
|
618
642
|
- `wallets.json` - wallet addresses and private keys for local testing
|
|
619
643
|
|
|
@@ -689,12 +713,14 @@ This package follows [Semantic Versioning](https://semver.org/) (SemVer) and is
|
|
|
689
713
|
3. **Dependent changes**: Only after publishing can dependent changes be merged in other applications
|
|
690
714
|
|
|
691
715
|
**Why this order matters:**
|
|
716
|
+
|
|
692
717
|
- Other applications depend on this package from PyPI
|
|
693
718
|
- They cannot merge changes that depend on new versions until those versions are available on PyPI
|
|
694
719
|
- Publishing from `main` ensures the published version matches what's in the repository
|
|
695
720
|
- This prevents dependency resolution failures in downstream applications
|
|
696
721
|
|
|
697
722
|
**Example workflow:**
|
|
723
|
+
|
|
698
724
|
```bash
|
|
699
725
|
# 1. Make changes in a feature branch
|
|
700
726
|
git checkout -b feature/new-adapter
|
|
@@ -727,6 +753,7 @@ just publish
|
|
|
727
753
|
```
|
|
728
754
|
|
|
729
755
|
**Important:**
|
|
756
|
+
|
|
730
757
|
- ⚠️ **Publishing is only allowed from the `main` branch** - the publish command will fail if run from any other branch
|
|
731
758
|
- ⚠️ **Versions must be unique** - ensure the version in `pyproject.toml` has been bumped and is unique
|
|
732
759
|
- ⚠️ **Follow the order of operations** - see [Versioning](#-versioning) section above for the required workflow
|
|
@@ -749,6 +776,7 @@ pip install git+https://github.com/wayfinder-ai/wayfinder-paths.git
|
|
|
749
776
|
### Managing Package Access
|
|
750
777
|
|
|
751
778
|
To add collaborators who can publish updates:
|
|
779
|
+
|
|
752
780
|
1. Go to https://pypi.org/project/wayfinder-paths/
|
|
753
781
|
2. Click "Manage" → "Collaborators"
|
|
754
782
|
3. Add users as "Maintainers" (can publish) or "Owners" (full control)
|
|
@@ -102,6 +102,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
102
102
|
### Contributor Guidelines
|
|
103
103
|
|
|
104
104
|
#### For Adapters
|
|
105
|
+
|
|
105
106
|
- **Start from the template**: Copy `wayfinder_paths/templates/adapter/` as a starting point
|
|
106
107
|
- Extend `BaseAdapter` from `wayfinder_paths/core/adapters/BaseAdapter.py`
|
|
107
108
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/adapter/manifest.yaml`) with:
|
|
@@ -115,6 +116,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
115
116
|
- Validate your manifest: `just validate-manifests`
|
|
116
117
|
|
|
117
118
|
#### For Strategies
|
|
119
|
+
|
|
118
120
|
- **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
|
|
119
121
|
- Extend `Strategy` from `wayfinder_paths/core/strategies/Strategy.py`
|
|
120
122
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/strategy/manifest.yaml`) with:
|
|
@@ -128,6 +130,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
128
130
|
- Validate your manifest: `just validate-manifests`
|
|
129
131
|
|
|
130
132
|
#### General Guidelines
|
|
133
|
+
|
|
131
134
|
- **Code Quality**: Follow existing patterns and use type hints
|
|
132
135
|
- **Testing**: See [TESTING.md](TESTING.md) - minimum: smoke test for strategies, basic tests for adapters
|
|
133
136
|
- **Documentation**: Update README files and add docstrings
|
|
@@ -182,6 +185,7 @@ poetry run python wayfinder_paths/run_strategy.py your_strategy --action status
|
|
|
182
185
|
## 🏗️ Architecture
|
|
183
186
|
|
|
184
187
|
### Client System
|
|
188
|
+
|
|
185
189
|
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.
|
|
186
190
|
|
|
187
191
|
### Clients vs Adapters
|
|
@@ -208,6 +212,7 @@ Adapter manifests declare the capabilities an adapter provides and the clients i
|
|
|
208
212
|
**Template:** Copy `wayfinder_paths/templates/adapter/manifest.yaml` as a starting point.
|
|
209
213
|
|
|
210
214
|
**Schema:**
|
|
215
|
+
|
|
211
216
|
```yaml
|
|
212
217
|
schema_version: "0.1"
|
|
213
218
|
entrypoint: "adapters.my_adapter.adapter.MyAdapter"
|
|
@@ -220,12 +225,14 @@ dependencies:
|
|
|
220
225
|
```
|
|
221
226
|
|
|
222
227
|
**Fields:**
|
|
228
|
+
|
|
223
229
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
224
230
|
- `entrypoint`: Full Python import path to the adapter class (required)
|
|
225
231
|
- `capabilities`: List of abstract capabilities this adapter provides (required, non-empty)
|
|
226
232
|
- `dependencies`: List of client class names from `core.clients` that this adapter requires (required, non-empty)
|
|
227
233
|
|
|
228
234
|
**Example** (`wayfinder_paths/adapters/pool_adapter/manifest.yaml`):
|
|
235
|
+
|
|
229
236
|
```yaml
|
|
230
237
|
schema_version: "0.1"
|
|
231
238
|
entrypoint: "adapters.pool_adapter.adapter.PoolAdapter"
|
|
@@ -246,6 +253,7 @@ Strategy manifests declare permissions and required adapters with their capabili
|
|
|
246
253
|
**Template:** Copy `wayfinder_paths/templates/strategy/manifest.yaml` as a starting point.
|
|
247
254
|
|
|
248
255
|
**Schema:**
|
|
256
|
+
|
|
249
257
|
```yaml
|
|
250
258
|
schema_version: "0.1"
|
|
251
259
|
entrypoint: "strategies.my_strategy.strategy.MyStrategy"
|
|
@@ -259,6 +267,7 @@ adapters:
|
|
|
259
267
|
```
|
|
260
268
|
|
|
261
269
|
**Fields:**
|
|
270
|
+
|
|
262
271
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
263
272
|
- `entrypoint`: Full Python import path to the strategy class (required)
|
|
264
273
|
- `name`: Strategy directory name (optional, used for wallet lookup - defaults to directory name)
|
|
@@ -268,6 +277,7 @@ adapters:
|
|
|
268
277
|
- `capabilities`: List of capabilities required from this adapter
|
|
269
278
|
|
|
270
279
|
**Example** (`wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml`):
|
|
280
|
+
|
|
271
281
|
```yaml
|
|
272
282
|
schema_version: "0.1"
|
|
273
283
|
entrypoint: "strategies.stablecoin_yield_strategy.strategy.StablecoinYieldStrategy"
|
|
@@ -285,12 +295,14 @@ adapters:
|
|
|
285
295
|
#### Manifest Validation
|
|
286
296
|
|
|
287
297
|
Manifests are automatically validated to ensure:
|
|
298
|
+
|
|
288
299
|
- Schema compliance (all required fields present, correct types)
|
|
289
300
|
- Entrypoint classes exist and are importable
|
|
290
301
|
- Dependencies are valid client classes
|
|
291
302
|
- Permissions policies are non-empty
|
|
292
303
|
|
|
293
304
|
**Validate locally:**
|
|
305
|
+
|
|
294
306
|
```bash
|
|
295
307
|
# Validate all manifests
|
|
296
308
|
just validate-manifests
|
|
@@ -325,6 +337,7 @@ The `validate_manifests.py` script performs multi-stage validation:
|
|
|
325
337
|
- Policy syntax is not parsed/validated (assumed to be valid at runtime)
|
|
326
338
|
|
|
327
339
|
**Validation Flow:**
|
|
340
|
+
|
|
328
341
|
```
|
|
329
342
|
For each manifest file:
|
|
330
343
|
1. Load YAML → Parse with Pydantic (schema validation)
|
|
@@ -334,6 +347,7 @@ For each manifest file:
|
|
|
334
347
|
```
|
|
335
348
|
|
|
336
349
|
The script automatically discovers all manifests by scanning:
|
|
350
|
+
|
|
337
351
|
- `wayfinder_paths/adapters/*/manifest.yaml` for adapter manifests
|
|
338
352
|
- `wayfinder_paths/strategies/*/manifest.yaml` for strategy manifests
|
|
339
353
|
|
|
@@ -344,12 +358,15 @@ All errors are collected and reported at the end, with the script exiting with c
|
|
|
344
358
|
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.
|
|
345
359
|
|
|
346
360
|
When creating an adapter:
|
|
361
|
+
|
|
347
362
|
1. Declare capabilities in your `manifest.yaml`
|
|
348
363
|
2. Implement methods that fulfill those capabilities
|
|
349
364
|
3. Capabilities are validated at manifest validation time (entrypoint must be importable)
|
|
350
365
|
|
|
351
366
|
### Configuration
|
|
367
|
+
|
|
352
368
|
Configuration is split between:
|
|
369
|
+
|
|
353
370
|
- **User Config**: Your credentials and preferences
|
|
354
371
|
- **System Config**: Platform settings
|
|
355
372
|
- **Strategy Config**: Strategy-specific parameters
|
|
@@ -361,9 +378,11 @@ See [CONFIG_GUIDE.md](wayfinder_paths/CONFIG_GUIDE.md) for details.
|
|
|
361
378
|
Wayfinder Paths supports two authentication methods:
|
|
362
379
|
|
|
363
380
|
#### 1. Service Account Authentication (API Key)
|
|
381
|
+
|
|
364
382
|
For backend services and automated systems with higher rate limits:
|
|
365
383
|
|
|
366
384
|
**Option A: Pass to Strategy Constructor**
|
|
385
|
+
|
|
367
386
|
```python
|
|
368
387
|
from wayfinder_paths.strategies.stablecoin_yield_strategy.strategy import StablecoinYieldStrategy
|
|
369
388
|
|
|
@@ -374,19 +393,21 @@ strategy = StablecoinYieldStrategy(
|
|
|
374
393
|
```
|
|
375
394
|
|
|
376
395
|
**Option B: Set Environment Variable**
|
|
396
|
+
|
|
377
397
|
```bash
|
|
378
398
|
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
379
399
|
# All clients will automatically discover and use this
|
|
380
400
|
```
|
|
381
401
|
|
|
382
402
|
**Option C: Add to config.json**
|
|
403
|
+
|
|
383
404
|
```json
|
|
384
405
|
{
|
|
385
406
|
"user": {
|
|
386
407
|
"api_key": "sk_live_abc123..."
|
|
387
408
|
},
|
|
388
409
|
"system": {
|
|
389
|
-
"api_key": "sk_live_abc123..."
|
|
410
|
+
"api_key": "sk_live_abc123..." // Alternative: system-level API key
|
|
390
411
|
}
|
|
391
412
|
}
|
|
392
413
|
```
|
|
@@ -396,6 +417,7 @@ export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
|
396
417
|
**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.
|
|
397
418
|
|
|
398
419
|
#### 2. Personal Access Authentication (OAuth)
|
|
420
|
+
|
|
399
421
|
For standalone SDK users with username/password:
|
|
400
422
|
|
|
401
423
|
```json
|
|
@@ -403,12 +425,13 @@ For standalone SDK users with username/password:
|
|
|
403
425
|
"user": {
|
|
404
426
|
"username": "your_username",
|
|
405
427
|
"password": "your_password",
|
|
406
|
-
"refresh_token": null
|
|
428
|
+
"refresh_token": null // Optional: use refresh token instead
|
|
407
429
|
}
|
|
408
430
|
}
|
|
409
431
|
```
|
|
410
432
|
|
|
411
433
|
**How It Works:**
|
|
434
|
+
|
|
412
435
|
- API keys are automatically discovered by all clients (no need to pass explicitly)
|
|
413
436
|
- When an API key is available, it's used for all API requests (including public endpoints) for rate limiting
|
|
414
437
|
- If no API key is found, the system falls back to OAuth authentication
|
|
@@ -591,6 +614,7 @@ just create-wallets
|
|
|
591
614
|
```
|
|
592
615
|
|
|
593
616
|
This creates:
|
|
617
|
+
|
|
594
618
|
- `main` wallet - your main wallet for testing (labeled "main" in wallets.json)
|
|
595
619
|
- `wallets.json` - wallet addresses and private keys for local testing
|
|
596
620
|
|
|
@@ -666,12 +690,14 @@ This package follows [Semantic Versioning](https://semver.org/) (SemVer) and is
|
|
|
666
690
|
3. **Dependent changes**: Only after publishing can dependent changes be merged in other applications
|
|
667
691
|
|
|
668
692
|
**Why this order matters:**
|
|
693
|
+
|
|
669
694
|
- Other applications depend on this package from PyPI
|
|
670
695
|
- They cannot merge changes that depend on new versions until those versions are available on PyPI
|
|
671
696
|
- Publishing from `main` ensures the published version matches what's in the repository
|
|
672
697
|
- This prevents dependency resolution failures in downstream applications
|
|
673
698
|
|
|
674
699
|
**Example workflow:**
|
|
700
|
+
|
|
675
701
|
```bash
|
|
676
702
|
# 1. Make changes in a feature branch
|
|
677
703
|
git checkout -b feature/new-adapter
|
|
@@ -704,6 +730,7 @@ just publish
|
|
|
704
730
|
```
|
|
705
731
|
|
|
706
732
|
**Important:**
|
|
733
|
+
|
|
707
734
|
- ⚠️ **Publishing is only allowed from the `main` branch** - the publish command will fail if run from any other branch
|
|
708
735
|
- ⚠️ **Versions must be unique** - ensure the version in `pyproject.toml` has been bumped and is unique
|
|
709
736
|
- ⚠️ **Follow the order of operations** - see [Versioning](#-versioning) section above for the required workflow
|
|
@@ -726,6 +753,7 @@ pip install git+https://github.com/wayfinder-ai/wayfinder-paths.git
|
|
|
726
753
|
### Managing Package Access
|
|
727
754
|
|
|
728
755
|
To add collaborators who can publish updates:
|
|
756
|
+
|
|
729
757
|
1. Go to https://pypi.org/project/wayfinder-paths/
|
|
730
758
|
2. Click "Manage" → "Collaborators"
|
|
731
759
|
3. Add users as "Maintainers" (can publish) or "Owners" (full control)
|
{wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/brap_adapter/adapter.py
RENAMED
|
@@ -147,8 +147,7 @@ class BRAPAdapter(BaseAdapter):
|
|
|
147
147
|
)
|
|
148
148
|
|
|
149
149
|
# Extract best quote from response
|
|
150
|
-
|
|
151
|
-
best_quote = quotes.get("best_quote")
|
|
150
|
+
best_quote = data["best_route"]
|
|
152
151
|
|
|
153
152
|
if not best_quote:
|
|
154
153
|
return (False, "No quotes available")
|
|
@@ -81,12 +81,10 @@ class TestBRAPAdapter:
|
|
|
81
81
|
async def test_get_best_quote_success(self, adapter, mock_brap_client):
|
|
82
82
|
"""Test successful best quote retrieval"""
|
|
83
83
|
mock_response = {
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
"total_fee": "8000000000000000",
|
|
89
|
-
}
|
|
84
|
+
"best_route": {
|
|
85
|
+
"input_amount": "1000000000000000000",
|
|
86
|
+
"output_amount": "995000000000000000",
|
|
87
|
+
"total_fee": "8000000000000000",
|
|
90
88
|
}
|
|
91
89
|
}
|
|
92
90
|
mock_brap_client.get_quote = AsyncMock(return_value=mock_response)
|
|
@@ -108,7 +106,7 @@ class TestBRAPAdapter:
|
|
|
108
106
|
@pytest.mark.asyncio
|
|
109
107
|
async def test_get_best_quote_no_quotes(self, adapter, mock_brap_client):
|
|
110
108
|
"""Test best quote retrieval when no quotes available"""
|
|
111
|
-
mock_response = {"
|
|
109
|
+
mock_response = {"best_route": None}
|
|
112
110
|
mock_brap_client.get_quote = AsyncMock(return_value=mock_response)
|
|
113
111
|
|
|
114
112
|
success, data = await adapter.get_best_quote(
|
|
@@ -159,12 +159,15 @@ class TestLedgerAdapter:
|
|
|
159
159
|
|
|
160
160
|
# Test
|
|
161
161
|
operation_data = SWAP(
|
|
162
|
+
adapter="TestAdapter",
|
|
162
163
|
from_token_id="0xA0b86a33E6441c8C06DdD4D4c4c4c4c4c4c4c4c4c",
|
|
163
164
|
to_token_id="0xB1c97a44F7552d9Dd5e5e5e5e5e5e5e5e5e5e5e5e5e",
|
|
164
165
|
from_amount="1000000000000000000",
|
|
165
166
|
to_amount="995000000000000000",
|
|
166
167
|
from_amount_usd=1000.0,
|
|
167
168
|
to_amount_usd=995.0,
|
|
169
|
+
transaction_hash="0x123abc",
|
|
170
|
+
transaction_chain_id=8453,
|
|
168
171
|
)
|
|
169
172
|
|
|
170
173
|
success, data = await adapter.record_operation(
|
{wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/README.md
RENAMED
|
@@ -15,6 +15,7 @@ A Wayfinder adapter that provides high-level operations for DeFi pool data and a
|
|
|
15
15
|
The adapter uses the PoolClient which automatically handles authentication and API configuration through the Wayfinder settings. No additional configuration is required.
|
|
16
16
|
|
|
17
17
|
The PoolClient will automatically:
|
|
18
|
+
|
|
18
19
|
- Use the WAYFINDER_API_URL from settings
|
|
19
20
|
- Handle authentication via environment variables or config.json
|
|
20
21
|
- Manage token refresh and retry logic
|
|
@@ -44,17 +45,6 @@ else:
|
|
|
44
45
|
print(f"Error: {data}")
|
|
45
46
|
```
|
|
46
47
|
|
|
47
|
-
### Get All Pools
|
|
48
|
-
|
|
49
|
-
```python
|
|
50
|
-
success, data = await adapter.get_all_pools(merge_external=False)
|
|
51
|
-
if success:
|
|
52
|
-
pools = data.get("pools", [])
|
|
53
|
-
print(f"Total pools available: {len(pools)}")
|
|
54
|
-
else:
|
|
55
|
-
print(f"Error: {data}")
|
|
56
|
-
```
|
|
57
|
-
|
|
58
48
|
### Find High Yield Pools
|
|
59
49
|
|
|
60
50
|
```python
|
|
@@ -90,22 +80,6 @@ else:
|
|
|
90
80
|
print(f"Error: {data}")
|
|
91
81
|
```
|
|
92
82
|
|
|
93
|
-
### Search Pools
|
|
94
|
-
|
|
95
|
-
```python
|
|
96
|
-
success, data = await adapter.search_pools(
|
|
97
|
-
query="USDC",
|
|
98
|
-
limit=10
|
|
99
|
-
)
|
|
100
|
-
if success:
|
|
101
|
-
pools = data.get("pools", [])
|
|
102
|
-
print(f"Found {len(pools)} pools matching 'USDC'")
|
|
103
|
-
for pool in pools:
|
|
104
|
-
print(f"Pool: {pool.get('name')} - {pool.get('symbol')}")
|
|
105
|
-
else:
|
|
106
|
-
print(f"Error: {data}")
|
|
107
|
-
```
|
|
108
|
-
|
|
109
83
|
### Get Llama Matches
|
|
110
84
|
|
|
111
85
|
```python
|
|
@@ -168,7 +142,7 @@ if success:
|
|
|
168
142
|
for pool_analytics in analytics:
|
|
169
143
|
pool = pool_analytics.get("pool", {})
|
|
170
144
|
llama_data = pool_analytics.get("llama_data", {})
|
|
171
|
-
|
|
145
|
+
|
|
172
146
|
print(f"Pool: {pool.get('name')}")
|
|
173
147
|
print(f" Combined APY: {pool_analytics.get('combined_apy', 0):.2%}")
|
|
174
148
|
print(f" TVL: ${pool_analytics.get('tvl_usd', 0):,.0f}")
|
|
@@ -189,6 +163,7 @@ The adapter uses the following Wayfinder API endpoints:
|
|
|
189
163
|
## Error Handling
|
|
190
164
|
|
|
191
165
|
All methods return a tuple of `(success: bool, data: Any)` where:
|
|
166
|
+
|
|
192
167
|
- `success` is `True` if the operation succeeded
|
|
193
168
|
- `data` contains the response data on success or error message on failure
|
|
194
169
|
|
{wayfinder_paths-0.1.7 → wayfinder_paths-0.1.8}/wayfinder_paths/adapters/pool_adapter/adapter.py
RENAMED
|
@@ -53,25 +53,6 @@ class PoolAdapter(BaseAdapter):
|
|
|
53
53
|
self.logger.error(f"Error fetching pools by IDs: {e}")
|
|
54
54
|
return (False, str(e))
|
|
55
55
|
|
|
56
|
-
async def get_all_pools(
|
|
57
|
-
self, merge_external: bool | None = None
|
|
58
|
-
) -> tuple[bool, PoolList | str]:
|
|
59
|
-
"""
|
|
60
|
-
Get all available pools.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
merge_external: Whether to merge external data
|
|
64
|
-
|
|
65
|
-
Returns:
|
|
66
|
-
Tuple of (success, data) where data is all pools or error message
|
|
67
|
-
"""
|
|
68
|
-
try:
|
|
69
|
-
data = await self.pool_client.get_all_pools(merge_external=merge_external)
|
|
70
|
-
return (True, data)
|
|
71
|
-
except Exception as e:
|
|
72
|
-
self.logger.error(f"Error fetching all pools: {e}")
|
|
73
|
-
return (False, str(e))
|
|
74
|
-
|
|
75
56
|
async def get_llama_matches(self) -> tuple[bool, dict[str, LlamaMatch] | str]:
|
|
76
57
|
"""
|
|
77
58
|
Get Llama protocol matches for pools.
|
|
@@ -227,56 +208,3 @@ class PoolAdapter(BaseAdapter):
|
|
|
227
208
|
except Exception as e:
|
|
228
209
|
self.logger.error(f"Error getting pool analytics: {e}")
|
|
229
210
|
return (False, str(e))
|
|
230
|
-
|
|
231
|
-
async def search_pools(self, query: str, limit: int = 10) -> tuple[bool, Any]:
|
|
232
|
-
"""
|
|
233
|
-
Search pools by name, symbol, or other criteria.
|
|
234
|
-
|
|
235
|
-
Args:
|
|
236
|
-
query: Search query string
|
|
237
|
-
limit: Maximum number of results
|
|
238
|
-
|
|
239
|
-
Returns:
|
|
240
|
-
Tuple of (success, data) where data is search results or error message
|
|
241
|
-
"""
|
|
242
|
-
try:
|
|
243
|
-
success, all_pools_data = await self.get_all_pools()
|
|
244
|
-
if not success:
|
|
245
|
-
return (False, f"Failed to fetch pools: {all_pools_data}")
|
|
246
|
-
|
|
247
|
-
pools = all_pools_data.get("pools", [])
|
|
248
|
-
query_lower = query.lower()
|
|
249
|
-
|
|
250
|
-
# Simple text search
|
|
251
|
-
matching_pools = []
|
|
252
|
-
for pool in pools:
|
|
253
|
-
name = pool.get("name", "").lower()
|
|
254
|
-
symbol = pool.get("symbol", "").lower()
|
|
255
|
-
description = pool.get("description", "").lower()
|
|
256
|
-
|
|
257
|
-
if (
|
|
258
|
-
query_lower in name
|
|
259
|
-
or query_lower in symbol
|
|
260
|
-
or query_lower in description
|
|
261
|
-
):
|
|
262
|
-
matching_pools.append(pool)
|
|
263
|
-
|
|
264
|
-
# Sort by relevance (exact matches first)
|
|
265
|
-
matching_pools.sort(
|
|
266
|
-
key=lambda x: (
|
|
267
|
-
query_lower not in x.get("name", "").lower(),
|
|
268
|
-
query_lower not in x.get("symbol", "").lower(),
|
|
269
|
-
)
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
return (
|
|
273
|
-
True,
|
|
274
|
-
{
|
|
275
|
-
"pools": matching_pools[:limit],
|
|
276
|
-
"total_found": len(matching_pools),
|
|
277
|
-
"query": query,
|
|
278
|
-
},
|
|
279
|
-
)
|
|
280
|
-
except Exception as e:
|
|
281
|
-
self.logger.error(f"Error searching pools: {e}")
|
|
282
|
-
return (False, str(e))
|