wayfinder-paths 0.1.7__tar.gz → 0.1.9__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.
Potentially problematic release.
This version of wayfinder-paths might be problematic. Click here for more details.
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/PKG-INFO +33 -15
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/README.md +32 -14
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/pyproject.toml +1 -1
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/CONFIG_GUIDE.md +5 -14
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/README.md +1 -1
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/adapter.py +1 -53
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/test_adapter.py +5 -7
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperlend_adapter/adapter.py +0 -7
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +0 -54
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +1 -1
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/ledger_adapter/README.md +1 -1
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/ledger_adapter/test_adapter.py +3 -0
- wayfinder_paths-0.1.9/wayfinder_paths/adapters/pool_adapter/README.md +105 -0
- wayfinder_paths-0.1.9/wayfinder_paths/adapters/pool_adapter/adapter.py +88 -0
- wayfinder_paths-0.1.9/wayfinder_paths/adapters/pool_adapter/examples.json +43 -0
- wayfinder_paths-0.1.9/wayfinder_paths/adapters/pool_adapter/test_adapter.py +86 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/token_adapter/README.md +1 -1
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/AuthClient.py +0 -3
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/BRAPClient.py +1 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/ClientManager.py +1 -22
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/PoolClient.py +0 -16
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/WalletClient.py +0 -8
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/WayfinderClient.py +9 -14
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/__init__.py +0 -8
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/protocols.py +0 -64
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/config.py +5 -45
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/engine/StrategyJob.py +0 -3
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/services/base.py +0 -49
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/services/local_evm_txn.py +3 -82
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/services/local_token_txn.py +61 -70
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/services/web3_service.py +0 -2
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/settings.py +8 -8
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/strategies/Strategy.py +1 -5
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/utils/evm_helpers.py +7 -12
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/wallets/README.md +3 -6
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/run_strategy.py +29 -32
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/scripts/make_wallets.py +1 -25
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/scripts/run_strategy.py +0 -2
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py +1 -3
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/strategy.py +86 -137
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +96 -58
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +2 -2
- wayfinder_paths-0.1.9/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json +11 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +106 -28
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +53 -14
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +1 -6
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +40 -17
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/strategy/test_strategy.py +0 -4
- wayfinder_paths-0.1.7/wayfinder_paths/adapters/pool_adapter/README.md +0 -206
- wayfinder_paths-0.1.7/wayfinder_paths/adapters/pool_adapter/adapter.py +0 -282
- wayfinder_paths-0.1.7/wayfinder_paths/adapters/pool_adapter/examples.json +0 -143
- wayfinder_paths-0.1.7/wayfinder_paths/adapters/pool_adapter/test_adapter.py +0 -220
- wayfinder_paths-0.1.7/wayfinder_paths/core/clients/SimulationClient.py +0 -192
- wayfinder_paths-0.1.7/wayfinder_paths/core/clients/TransactionClient.py +0 -63
- wayfinder_paths-0.1.7/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json +0 -8
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/LICENSE +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/abis/generic/erc20.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/balance_adapter/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/balance_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/balance_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/balance_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/balance_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperlend_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperlend_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/executor.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/hyperliquid_adapter/utils.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/ledger_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/ledger_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/ledger_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/ledger_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/pool_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/pool_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/token_adapter/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/token_adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/token_adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/token_adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/token_adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/config.example.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/conftest.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/adapters/BaseAdapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/adapters/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/adapters/base.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/adapters/models.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/analytics/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/analytics/bootstrap.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/analytics/stats.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/analytics/test_analytics.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/HyperlendClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/LedgerClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/TokenClient.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/clients/sdk_example.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/constants/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/constants/base.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/constants/erc20_abi.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/constants/hyperlend_abi.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/engine/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/engine/manifest.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/services/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/strategies/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/strategies/base.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/strategies/descriptors.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/utils/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/utils/wallets.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/wallets/WalletManager.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/core/wallets/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/enso.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/erc20.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/evm.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/hyper_evm.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/hyperlend.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/hyperliquid.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/moonwell.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/prjx.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/policies/util.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/scripts/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/scripts/create_strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/scripts/validate_manifests.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/constants.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/basis_trading_strategy/types.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/config.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/adapter/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/adapter/adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/adapter/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/adapter/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/adapter/test_adapter.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/strategy/README.md +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/strategy/examples.json +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/strategy/manifest.yaml +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/templates/strategy/strategy.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/tests/__init__.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/tests/test_smoke_manifest.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/tests/test_test_coverage.py +0 -0
- {wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/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.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)
|
|
@@ -31,9 +31,6 @@ cp wayfinder_paths/config.example.json config.json
|
|
|
31
31
|
# Run a strategy locally (one-shot status check)
|
|
32
32
|
poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --action status --config config.json
|
|
33
33
|
|
|
34
|
-
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
35
|
-
poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --config config.json
|
|
36
|
-
|
|
37
34
|
# Run continuously (production mode)
|
|
38
35
|
poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --config config.json
|
|
39
36
|
```
|
|
@@ -102,6 +99,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
102
99
|
### Contributor Guidelines
|
|
103
100
|
|
|
104
101
|
#### For Adapters
|
|
102
|
+
|
|
105
103
|
- **Start from the template**: Copy `wayfinder_paths/templates/adapter/` as a starting point
|
|
106
104
|
- Extend `BaseAdapter` from `wayfinder_paths/core/adapters/BaseAdapter.py`
|
|
107
105
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/adapter/manifest.yaml`) with:
|
|
@@ -115,6 +113,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
115
113
|
- Validate your manifest: `just validate-manifests`
|
|
116
114
|
|
|
117
115
|
#### For Strategies
|
|
116
|
+
|
|
118
117
|
- **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
118
|
- Extend `Strategy` from `wayfinder_paths/core/strategies/Strategy.py`
|
|
120
119
|
- Create a `manifest.yaml` (template at `wayfinder_paths/templates/strategy/manifest.yaml`) with:
|
|
@@ -128,6 +127,7 @@ We welcome contributions! This is an open-source project where community members
|
|
|
128
127
|
- Validate your manifest: `just validate-manifests`
|
|
129
128
|
|
|
130
129
|
#### General Guidelines
|
|
130
|
+
|
|
131
131
|
- **Code Quality**: Follow existing patterns and use type hints
|
|
132
132
|
- **Testing**: See [TESTING.md](TESTING.md) - minimum: smoke test for strategies, basic tests for adapters
|
|
133
133
|
- **Documentation**: Update README files and add docstrings
|
|
@@ -182,11 +182,12 @@ poetry run python wayfinder_paths/run_strategy.py your_strategy --action status
|
|
|
182
182
|
## 🏗️ Architecture
|
|
183
183
|
|
|
184
184
|
### Client System
|
|
185
|
+
|
|
185
186
|
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
187
|
|
|
187
188
|
### Clients vs Adapters
|
|
188
189
|
|
|
189
|
-
- **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`, `
|
|
190
|
+
- **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`.
|
|
190
191
|
- **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.
|
|
191
192
|
|
|
192
193
|
Recommended usage:
|
|
@@ -208,6 +209,7 @@ Adapter manifests declare the capabilities an adapter provides and the clients i
|
|
|
208
209
|
**Template:** Copy `wayfinder_paths/templates/adapter/manifest.yaml` as a starting point.
|
|
209
210
|
|
|
210
211
|
**Schema:**
|
|
212
|
+
|
|
211
213
|
```yaml
|
|
212
214
|
schema_version: "0.1"
|
|
213
215
|
entrypoint: "adapters.my_adapter.adapter.MyAdapter"
|
|
@@ -220,12 +222,14 @@ dependencies:
|
|
|
220
222
|
```
|
|
221
223
|
|
|
222
224
|
**Fields:**
|
|
225
|
+
|
|
223
226
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
224
227
|
- `entrypoint`: Full Python import path to the adapter class (required)
|
|
225
228
|
- `capabilities`: List of abstract capabilities this adapter provides (required, non-empty)
|
|
226
229
|
- `dependencies`: List of client class names from `core.clients` that this adapter requires (required, non-empty)
|
|
227
230
|
|
|
228
231
|
**Example** (`wayfinder_paths/adapters/pool_adapter/manifest.yaml`):
|
|
232
|
+
|
|
229
233
|
```yaml
|
|
230
234
|
schema_version: "0.1"
|
|
231
235
|
entrypoint: "adapters.pool_adapter.adapter.PoolAdapter"
|
|
@@ -246,6 +250,7 @@ Strategy manifests declare permissions and required adapters with their capabili
|
|
|
246
250
|
**Template:** Copy `wayfinder_paths/templates/strategy/manifest.yaml` as a starting point.
|
|
247
251
|
|
|
248
252
|
**Schema:**
|
|
253
|
+
|
|
249
254
|
```yaml
|
|
250
255
|
schema_version: "0.1"
|
|
251
256
|
entrypoint: "strategies.my_strategy.strategy.MyStrategy"
|
|
@@ -259,6 +264,7 @@ adapters:
|
|
|
259
264
|
```
|
|
260
265
|
|
|
261
266
|
**Fields:**
|
|
267
|
+
|
|
262
268
|
- `schema_version`: Manifest schema version (currently `"0.1"`)
|
|
263
269
|
- `entrypoint`: Full Python import path to the strategy class (required)
|
|
264
270
|
- `name`: Strategy directory name (optional, used for wallet lookup - defaults to directory name)
|
|
@@ -268,6 +274,7 @@ adapters:
|
|
|
268
274
|
- `capabilities`: List of capabilities required from this adapter
|
|
269
275
|
|
|
270
276
|
**Example** (`wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml`):
|
|
277
|
+
|
|
271
278
|
```yaml
|
|
272
279
|
schema_version: "0.1"
|
|
273
280
|
entrypoint: "strategies.stablecoin_yield_strategy.strategy.StablecoinYieldStrategy"
|
|
@@ -285,12 +292,14 @@ adapters:
|
|
|
285
292
|
#### Manifest Validation
|
|
286
293
|
|
|
287
294
|
Manifests are automatically validated to ensure:
|
|
295
|
+
|
|
288
296
|
- Schema compliance (all required fields present, correct types)
|
|
289
297
|
- Entrypoint classes exist and are importable
|
|
290
298
|
- Dependencies are valid client classes
|
|
291
299
|
- Permissions policies are non-empty
|
|
292
300
|
|
|
293
301
|
**Validate locally:**
|
|
302
|
+
|
|
294
303
|
```bash
|
|
295
304
|
# Validate all manifests
|
|
296
305
|
just validate-manifests
|
|
@@ -325,6 +334,7 @@ The `validate_manifests.py` script performs multi-stage validation:
|
|
|
325
334
|
- Policy syntax is not parsed/validated (assumed to be valid at runtime)
|
|
326
335
|
|
|
327
336
|
**Validation Flow:**
|
|
337
|
+
|
|
328
338
|
```
|
|
329
339
|
For each manifest file:
|
|
330
340
|
1. Load YAML → Parse with Pydantic (schema validation)
|
|
@@ -334,6 +344,7 @@ For each manifest file:
|
|
|
334
344
|
```
|
|
335
345
|
|
|
336
346
|
The script automatically discovers all manifests by scanning:
|
|
347
|
+
|
|
337
348
|
- `wayfinder_paths/adapters/*/manifest.yaml` for adapter manifests
|
|
338
349
|
- `wayfinder_paths/strategies/*/manifest.yaml` for strategy manifests
|
|
339
350
|
|
|
@@ -344,12 +355,15 @@ All errors are collected and reported at the end, with the script exiting with c
|
|
|
344
355
|
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
356
|
|
|
346
357
|
When creating an adapter:
|
|
358
|
+
|
|
347
359
|
1. Declare capabilities in your `manifest.yaml`
|
|
348
360
|
2. Implement methods that fulfill those capabilities
|
|
349
361
|
3. Capabilities are validated at manifest validation time (entrypoint must be importable)
|
|
350
362
|
|
|
351
363
|
### Configuration
|
|
364
|
+
|
|
352
365
|
Configuration is split between:
|
|
366
|
+
|
|
353
367
|
- **User Config**: Your credentials and preferences
|
|
354
368
|
- **System Config**: Platform settings
|
|
355
369
|
- **Strategy Config**: Strategy-specific parameters
|
|
@@ -361,9 +375,11 @@ See [CONFIG_GUIDE.md](wayfinder_paths/CONFIG_GUIDE.md) for details.
|
|
|
361
375
|
Wayfinder Paths supports two authentication methods:
|
|
362
376
|
|
|
363
377
|
#### 1. Service Account Authentication (API Key)
|
|
378
|
+
|
|
364
379
|
For backend services and automated systems with higher rate limits:
|
|
365
380
|
|
|
366
381
|
**Option A: Pass to Strategy Constructor**
|
|
382
|
+
|
|
367
383
|
```python
|
|
368
384
|
from wayfinder_paths.strategies.stablecoin_yield_strategy.strategy import StablecoinYieldStrategy
|
|
369
385
|
|
|
@@ -373,29 +389,25 @@ strategy = StablecoinYieldStrategy(
|
|
|
373
389
|
)
|
|
374
390
|
```
|
|
375
391
|
|
|
376
|
-
**Option B:
|
|
377
|
-
```bash
|
|
378
|
-
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
379
|
-
# All clients will automatically discover and use this
|
|
380
|
-
```
|
|
392
|
+
**Option B: Add to config.json**
|
|
381
393
|
|
|
382
|
-
**Option C: Add to config.json**
|
|
383
394
|
```json
|
|
384
395
|
{
|
|
385
396
|
"user": {
|
|
386
397
|
"api_key": "sk_live_abc123..."
|
|
387
398
|
},
|
|
388
399
|
"system": {
|
|
389
|
-
"api_key": "sk_live_abc123..."
|
|
400
|
+
"api_key": "sk_live_abc123..." // Alternative: system-level API key
|
|
390
401
|
}
|
|
391
402
|
}
|
|
392
403
|
```
|
|
393
404
|
|
|
394
|
-
**Priority Order:** Constructor parameter > `config.json` (user.api_key or system.api_key)
|
|
405
|
+
**Priority Order:** Constructor parameter > `config.json` (user.api_key or system.api_key)
|
|
395
406
|
|
|
396
407
|
**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
408
|
|
|
398
409
|
#### 2. Personal Access Authentication (OAuth)
|
|
410
|
+
|
|
399
411
|
For standalone SDK users with username/password:
|
|
400
412
|
|
|
401
413
|
```json
|
|
@@ -403,12 +415,13 @@ For standalone SDK users with username/password:
|
|
|
403
415
|
"user": {
|
|
404
416
|
"username": "your_username",
|
|
405
417
|
"password": "your_password",
|
|
406
|
-
"refresh_token": null
|
|
418
|
+
"refresh_token": null // Optional: use refresh token instead
|
|
407
419
|
}
|
|
408
420
|
}
|
|
409
421
|
```
|
|
410
422
|
|
|
411
423
|
**How It Works:**
|
|
424
|
+
|
|
412
425
|
- API keys are automatically discovered by all clients (no need to pass explicitly)
|
|
413
426
|
- When an API key is available, it's used for all API requests (including public endpoints) for rate limiting
|
|
414
427
|
- If no API key is found, the system falls back to OAuth authentication
|
|
@@ -470,7 +483,7 @@ class MyStrategy(Strategy):
|
|
|
470
483
|
super().__init__(api_key=api_key) # Pass to base class for auto-discovery
|
|
471
484
|
self.config = config or {}
|
|
472
485
|
web3_service = DefaultWeb3Service(self.config)
|
|
473
|
-
# Adapters automatically discover API key from
|
|
486
|
+
# Adapters automatically discover API key from constructor or config.json
|
|
474
487
|
balance_adapter = BalanceAdapter(self.config, web3_service=web3_service)
|
|
475
488
|
self.register_adapters([balance_adapter])
|
|
476
489
|
self.balance_adapter = balance_adapter
|
|
@@ -591,6 +604,7 @@ just create-wallets
|
|
|
591
604
|
```
|
|
592
605
|
|
|
593
606
|
This creates:
|
|
607
|
+
|
|
594
608
|
- `main` wallet - your main wallet for testing (labeled "main" in wallets.json)
|
|
595
609
|
- `wallets.json` - wallet addresses and private keys for local testing
|
|
596
610
|
|
|
@@ -666,12 +680,14 @@ This package follows [Semantic Versioning](https://semver.org/) (SemVer) and is
|
|
|
666
680
|
3. **Dependent changes**: Only after publishing can dependent changes be merged in other applications
|
|
667
681
|
|
|
668
682
|
**Why this order matters:**
|
|
683
|
+
|
|
669
684
|
- Other applications depend on this package from PyPI
|
|
670
685
|
- They cannot merge changes that depend on new versions until those versions are available on PyPI
|
|
671
686
|
- Publishing from `main` ensures the published version matches what's in the repository
|
|
672
687
|
- This prevents dependency resolution failures in downstream applications
|
|
673
688
|
|
|
674
689
|
**Example workflow:**
|
|
690
|
+
|
|
675
691
|
```bash
|
|
676
692
|
# 1. Make changes in a feature branch
|
|
677
693
|
git checkout -b feature/new-adapter
|
|
@@ -704,6 +720,7 @@ just publish
|
|
|
704
720
|
```
|
|
705
721
|
|
|
706
722
|
**Important:**
|
|
723
|
+
|
|
707
724
|
- ⚠️ **Publishing is only allowed from the `main` branch** - the publish command will fail if run from any other branch
|
|
708
725
|
- ⚠️ **Versions must be unique** - ensure the version in `pyproject.toml` has been bumped and is unique
|
|
709
726
|
- ⚠️ **Follow the order of operations** - see [Versioning](#-versioning) section above for the required workflow
|
|
@@ -726,6 +743,7 @@ pip install git+https://github.com/wayfinder-ai/wayfinder-paths.git
|
|
|
726
743
|
### Managing Package Access
|
|
727
744
|
|
|
728
745
|
To add collaborators who can publish updates:
|
|
746
|
+
|
|
729
747
|
1. Go to https://pypi.org/project/wayfinder-paths/
|
|
730
748
|
2. Click "Manage" → "Collaborators"
|
|
731
749
|
3. Add users as "Maintainers" (can publish) or "Owners" (full control)
|
|
@@ -52,7 +52,6 @@ cp wayfinder_paths/config.example.json config.json
|
|
|
52
52
|
**Option 1: Service Account (API Key) - Recommended for Production**
|
|
53
53
|
- `user.api_key` - Your Wayfinder API key for service account authentication (loaded directly by clients from config.json)
|
|
54
54
|
- OR `system.api_key` - System-level API key (alternative location, loaded directly by clients)
|
|
55
|
-
- OR set `WAYFINDER_API_KEY` environment variable
|
|
56
55
|
- OR pass `api_key` parameter to strategy constructor
|
|
57
56
|
|
|
58
57
|
**Note:** API keys in `config.json` are loaded directly by `WayfinderClient` via `_load_config_credentials()`, not through the `UserConfig` or `SystemConfig` dataclasses. This is intentional to allow flexible credential loading.
|
|
@@ -229,7 +228,6 @@ The strategy system supports multiple wallet types through a wallet abstraction
|
|
|
229
228
|
|
|
230
229
|
By default, adapters use `LocalWalletProvider` which resolves private keys from:
|
|
231
230
|
- `wallets.json` (matched by address)
|
|
232
|
-
- Environment variables (`PRIVATE_KEY`, `PRIVATE_KEY_STRATEGY`)
|
|
233
231
|
- Wallet config in `config.json`
|
|
234
232
|
|
|
235
233
|
No code changes are required - existing strategies continue to work.
|
|
@@ -270,7 +268,7 @@ Wayfinder Paths supports **dual authentication** for different use cases:
|
|
|
270
268
|
|
|
271
269
|
**Best for:** Backend services, automated systems, and production deployments with higher rate limits.
|
|
272
270
|
|
|
273
|
-
API keys provide service account authentication and are automatically discovered by all clients. You can provide an API key in
|
|
271
|
+
API keys provide service account authentication and are automatically discovered by all clients. You can provide an API key in two ways:
|
|
274
272
|
|
|
275
273
|
#### Option A: Strategy Constructor (Programmatic)
|
|
276
274
|
```python
|
|
@@ -278,16 +276,11 @@ from wayfinder_paths.strategies.stablecoin_yield_strategy.strategy import Stable
|
|
|
278
276
|
|
|
279
277
|
strategy = StablecoinYieldStrategy(
|
|
280
278
|
config={...},
|
|
281
|
-
api_key="sk_live_abc123..." #
|
|
279
|
+
api_key="sk_live_abc123..." # API key is auto-discovered by all clients
|
|
282
280
|
)
|
|
283
281
|
```
|
|
284
282
|
|
|
285
|
-
#### Option B:
|
|
286
|
-
```bash
|
|
287
|
-
export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
#### Option C: config.json
|
|
283
|
+
#### Option B: config.json
|
|
291
284
|
```json
|
|
292
285
|
{
|
|
293
286
|
"user": {
|
|
@@ -299,14 +292,12 @@ export WAYFINDER_API_KEY="sk_live_abc123..."
|
|
|
299
292
|
}
|
|
300
293
|
```
|
|
301
294
|
|
|
302
|
-
**Priority Order:** Constructor parameter > `config.json` (user.api_key or system.api_key)
|
|
295
|
+
**Priority Order:** Constructor parameter > `config.json` (user.api_key or system.api_key)
|
|
303
296
|
|
|
304
297
|
**How It Works:**
|
|
305
|
-
- When a strategy receives an `api_key`, it sets `os.environ["WAYFINDER_API_KEY"]`
|
|
306
298
|
- All clients created by adapters automatically discover the API key from:
|
|
307
299
|
- Constructor parameter (if passed)
|
|
308
300
|
- `config.json` (via `WayfinderClient._load_config_credentials()` which reads `user.api_key` or `system.api_key`)
|
|
309
|
-
- `WAYFINDER_API_KEY` environment variable
|
|
310
301
|
- API keys are included in **all** API requests (including public endpoints) for rate limiting
|
|
311
302
|
- No need to pass API keys explicitly to adapters or clients—they auto-discover it
|
|
312
303
|
- **Note:** API keys in `config.json` are loaded directly by clients, not stored in the `UserConfig` or `SystemConfig` dataclasses
|
|
@@ -379,7 +370,7 @@ To use custom RPC endpoints, update the `strategy.rpc_urls` section in `config.j
|
|
|
379
370
|
**Issue:** "Authentication failed"
|
|
380
371
|
- **If using API key:**
|
|
381
372
|
- Verify API key is correct and not expired
|
|
382
|
-
- Check that API key is set in one of: constructor parameter
|
|
373
|
+
- Check that API key is set in one of: constructor parameter or `config.json` (user.api_key or system.api_key)
|
|
383
374
|
- Ensure API key has proper permissions for the operations you're performing
|
|
384
375
|
- **If using OAuth:**
|
|
385
376
|
- Check that `username` and `password` are correct in `config.json`
|
{wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/README.md
RENAMED
|
@@ -17,7 +17,7 @@ The adapter uses the BRAPClient which automatically handles authentication and A
|
|
|
17
17
|
|
|
18
18
|
The BRAPClient will automatically:
|
|
19
19
|
- Use the WAYFINDER_API_URL from settings
|
|
20
|
-
- Handle authentication via
|
|
20
|
+
- Handle authentication via config.json
|
|
21
21
|
- Manage token refresh and retry logic
|
|
22
22
|
|
|
23
23
|
## Usage
|
{wayfinder_paths-0.1.7 → wayfinder_paths-0.1.9}/wayfinder_paths/adapters/brap_adapter/adapter.py
RENAMED
|
@@ -10,10 +10,6 @@ from wayfinder_paths.core.adapters.BaseAdapter import BaseAdapter
|
|
|
10
10
|
from wayfinder_paths.core.adapters.models import SWAP
|
|
11
11
|
from wayfinder_paths.core.clients.BRAPClient import BRAPClient, BRAPQuote
|
|
12
12
|
from wayfinder_paths.core.clients.LedgerClient import TransactionRecord
|
|
13
|
-
from wayfinder_paths.core.clients.SimulationClient import (
|
|
14
|
-
SimulationClient,
|
|
15
|
-
SimulationResult,
|
|
16
|
-
)
|
|
17
13
|
from wayfinder_paths.core.clients.TokenClient import TokenClient
|
|
18
14
|
from wayfinder_paths.core.constants import DEFAULT_SLIPPAGE
|
|
19
15
|
from wayfinder_paths.core.constants.base import DEFAULT_TRANSACTION_TIMEOUT
|
|
@@ -45,7 +41,6 @@ class BRAPAdapter(BaseAdapter):
|
|
|
45
41
|
config: dict[str, Any] | None = None,
|
|
46
42
|
*,
|
|
47
43
|
web3_service: Web3Service,
|
|
48
|
-
simulation: bool = False,
|
|
49
44
|
):
|
|
50
45
|
super().__init__("brap_adapter", config)
|
|
51
46
|
self.brap_client = BRAPClient()
|
|
@@ -55,8 +50,6 @@ class BRAPAdapter(BaseAdapter):
|
|
|
55
50
|
self.web3_service = web3_service
|
|
56
51
|
self.wallet_provider = web3_service.evm_transactions
|
|
57
52
|
self.token_transactions = web3_service.token_transactions
|
|
58
|
-
self.simulation = simulation
|
|
59
|
-
self.simulation_client = SimulationClient() if simulation else None
|
|
60
53
|
|
|
61
54
|
async def get_swap_quote(
|
|
62
55
|
self,
|
|
@@ -147,8 +140,7 @@ class BRAPAdapter(BaseAdapter):
|
|
|
147
140
|
)
|
|
148
141
|
|
|
149
142
|
# Extract best quote from response
|
|
150
|
-
|
|
151
|
-
best_quote = quotes.get("best_quote")
|
|
143
|
+
best_quote = data["best_route"]
|
|
152
144
|
|
|
153
145
|
if not best_quote:
|
|
154
146
|
return (False, "No quotes available")
|
|
@@ -368,12 +360,6 @@ class BRAPAdapter(BaseAdapter):
|
|
|
368
360
|
if not approve_success:
|
|
369
361
|
return (False, approve_response)
|
|
370
362
|
|
|
371
|
-
if self.simulation:
|
|
372
|
-
simulation = await self._simulate_swap(
|
|
373
|
-
from_token, to_token, from_address, chain_id, quote
|
|
374
|
-
)
|
|
375
|
-
return (True, {"quote": quote, "simulation": simulation})
|
|
376
|
-
|
|
377
363
|
broadcast_success, broadcast_response = await self._broadcast_transaction(
|
|
378
364
|
transaction
|
|
379
365
|
)
|
|
@@ -678,44 +664,6 @@ class BRAPAdapter(BaseAdapter):
|
|
|
678
664
|
/ 10 ** int(decimals)
|
|
679
665
|
)
|
|
680
666
|
|
|
681
|
-
async def _simulate_swap(
|
|
682
|
-
self,
|
|
683
|
-
from_token: dict[str, Any],
|
|
684
|
-
to_token: dict[str, Any],
|
|
685
|
-
from_address: str,
|
|
686
|
-
chain_id: int,
|
|
687
|
-
quote: dict[str, Any],
|
|
688
|
-
) -> SimulationResult:
|
|
689
|
-
client = await self._get_simulation_client()
|
|
690
|
-
initial_balances = {"native": "5000000000000000000"}
|
|
691
|
-
if from_token.get("address"):
|
|
692
|
-
initial_balances[from_token.get("address")] = "1000000000000000000000000"
|
|
693
|
-
|
|
694
|
-
slippage = quote.get("slippage") or quote.get("slippage_percent")
|
|
695
|
-
if isinstance(slippage, str):
|
|
696
|
-
try:
|
|
697
|
-
slippage = float(slippage)
|
|
698
|
-
except ValueError:
|
|
699
|
-
slippage = DEFAULT_SLIPPAGE
|
|
700
|
-
slippage = slippage or DEFAULT_SLIPPAGE
|
|
701
|
-
|
|
702
|
-
amount = quote.get("input_amount") or quote.get("inputAmount") or "0"
|
|
703
|
-
return await client.simulate_swap(
|
|
704
|
-
from_token_address=from_token.get("address"),
|
|
705
|
-
to_token_address=to_token.get("address"),
|
|
706
|
-
from_chain_id=chain_id,
|
|
707
|
-
to_chain_id=chain_id,
|
|
708
|
-
amount=str(amount),
|
|
709
|
-
from_address=from_address,
|
|
710
|
-
slippage=float(slippage),
|
|
711
|
-
initial_balances=initial_balances,
|
|
712
|
-
)
|
|
713
|
-
|
|
714
|
-
async def _get_simulation_client(self) -> SimulationClient:
|
|
715
|
-
if not self.simulation_client:
|
|
716
|
-
self.simulation_client = SimulationClient()
|
|
717
|
-
return self.simulation_client
|
|
718
|
-
|
|
719
667
|
def _chain_id(self, chain: Any) -> int:
|
|
720
668
|
if isinstance(chain, dict):
|
|
721
669
|
chain_id = chain.get("id") or chain.get("chain_id")
|