wayfinder-paths 0.1.22__py3-none-any.whl → 0.1.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of wayfinder-paths might be problematic. Click here for more details.

Files changed (156) hide show
  1. wayfinder_paths/__init__.py +0 -4
  2. wayfinder_paths/adapters/balance_adapter/README.md +0 -1
  3. wayfinder_paths/adapters/balance_adapter/adapter.py +313 -167
  4. wayfinder_paths/adapters/balance_adapter/manifest.yaml +8 -0
  5. wayfinder_paths/adapters/balance_adapter/test_adapter.py +41 -124
  6. wayfinder_paths/adapters/boros_adapter/__init__.py +17 -0
  7. wayfinder_paths/adapters/boros_adapter/adapter.py +1574 -0
  8. wayfinder_paths/adapters/boros_adapter/client.py +476 -0
  9. wayfinder_paths/adapters/boros_adapter/manifest.yaml +10 -0
  10. wayfinder_paths/adapters/boros_adapter/parsers.py +88 -0
  11. wayfinder_paths/adapters/boros_adapter/test_adapter.py +460 -0
  12. wayfinder_paths/adapters/boros_adapter/test_golden.py +156 -0
  13. wayfinder_paths/adapters/boros_adapter/types.py +70 -0
  14. wayfinder_paths/adapters/boros_adapter/utils.py +85 -0
  15. wayfinder_paths/adapters/brap_adapter/README.md +22 -75
  16. wayfinder_paths/adapters/brap_adapter/adapter.py +187 -576
  17. wayfinder_paths/adapters/brap_adapter/examples.json +21 -140
  18. wayfinder_paths/adapters/brap_adapter/manifest.yaml +9 -0
  19. wayfinder_paths/adapters/brap_adapter/test_adapter.py +6 -234
  20. wayfinder_paths/adapters/hyperlend_adapter/adapter.py +180 -92
  21. wayfinder_paths/adapters/hyperlend_adapter/manifest.yaml +9 -0
  22. wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py +82 -14
  23. wayfinder_paths/adapters/hyperliquid_adapter/__init__.py +2 -9
  24. wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +586 -61
  25. wayfinder_paths/adapters/hyperliquid_adapter/executor.py +47 -68
  26. wayfinder_paths/adapters/hyperliquid_adapter/manifest.yaml +14 -0
  27. wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py +2 -3
  28. wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py +17 -21
  29. wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +3 -6
  30. wayfinder_paths/adapters/hyperliquid_adapter/test_executor.py +4 -8
  31. wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py +2 -2
  32. wayfinder_paths/adapters/ledger_adapter/README.md +4 -1
  33. wayfinder_paths/adapters/ledger_adapter/adapter.py +3 -3
  34. wayfinder_paths/adapters/ledger_adapter/manifest.yaml +7 -0
  35. wayfinder_paths/adapters/ledger_adapter/test_adapter.py +1 -2
  36. wayfinder_paths/adapters/moonwell_adapter/adapter.py +649 -547
  37. wayfinder_paths/adapters/moonwell_adapter/manifest.yaml +14 -0
  38. wayfinder_paths/adapters/moonwell_adapter/test_adapter.py +160 -239
  39. wayfinder_paths/adapters/multicall_adapter/__init__.py +7 -0
  40. wayfinder_paths/adapters/multicall_adapter/adapter.py +166 -0
  41. wayfinder_paths/adapters/multicall_adapter/manifest.yaml +5 -0
  42. wayfinder_paths/adapters/multicall_adapter/test_adapter.py +97 -0
  43. wayfinder_paths/adapters/pendle_adapter/README.md +102 -0
  44. wayfinder_paths/adapters/pendle_adapter/__init__.py +7 -0
  45. wayfinder_paths/adapters/pendle_adapter/adapter.py +1992 -0
  46. wayfinder_paths/adapters/pendle_adapter/examples.json +11 -0
  47. wayfinder_paths/adapters/pendle_adapter/manifest.yaml +21 -0
  48. wayfinder_paths/adapters/pendle_adapter/test_adapter.py +666 -0
  49. wayfinder_paths/adapters/pool_adapter/manifest.yaml +6 -0
  50. wayfinder_paths/adapters/token_adapter/adapter.py +14 -0
  51. wayfinder_paths/adapters/token_adapter/examples.json +0 -4
  52. wayfinder_paths/adapters/token_adapter/manifest.yaml +7 -0
  53. wayfinder_paths/conftest.py +24 -17
  54. wayfinder_paths/core/__init__.py +0 -3
  55. wayfinder_paths/core/adapters/BaseAdapter.py +0 -25
  56. wayfinder_paths/core/adapters/models.py +17 -7
  57. wayfinder_paths/core/clients/BRAPClient.py +4 -1
  58. wayfinder_paths/core/clients/ClientManager.py +0 -7
  59. wayfinder_paths/core/clients/LedgerClient.py +196 -172
  60. wayfinder_paths/core/clients/TokenClient.py +47 -1
  61. wayfinder_paths/core/clients/WayfinderClient.py +1 -3
  62. wayfinder_paths/core/clients/__init__.py +0 -5
  63. wayfinder_paths/core/clients/protocols.py +21 -35
  64. wayfinder_paths/core/clients/test_ledger_client.py +448 -0
  65. wayfinder_paths/core/config.py +10 -162
  66. wayfinder_paths/core/constants/__init__.py +73 -2
  67. wayfinder_paths/core/constants/base.py +8 -17
  68. wayfinder_paths/core/constants/chains.py +36 -0
  69. wayfinder_paths/core/constants/contracts.py +52 -0
  70. wayfinder_paths/core/constants/erc20_abi.py +0 -1
  71. wayfinder_paths/core/constants/hyperlend_abi.py +0 -4
  72. wayfinder_paths/core/constants/hyperliquid.py +16 -0
  73. wayfinder_paths/core/constants/moonwell_abi.py +0 -15
  74. wayfinder_paths/core/constants/tokens.py +9 -0
  75. wayfinder_paths/core/engine/manifest.py +66 -0
  76. wayfinder_paths/core/strategies/Strategy.py +0 -71
  77. wayfinder_paths/core/strategies/__init__.py +10 -1
  78. wayfinder_paths/core/strategies/opa_loop.py +167 -0
  79. wayfinder_paths/core/utils/evm_helpers.py +5 -15
  80. wayfinder_paths/core/utils/test_transaction.py +289 -0
  81. wayfinder_paths/core/utils/tokens.py +28 -0
  82. wayfinder_paths/core/utils/transaction.py +57 -8
  83. wayfinder_paths/core/utils/web3.py +8 -3
  84. wayfinder_paths/mcp/__init__.py +5 -0
  85. wayfinder_paths/mcp/preview.py +185 -0
  86. wayfinder_paths/mcp/scripting.py +84 -0
  87. wayfinder_paths/mcp/server.py +52 -0
  88. wayfinder_paths/mcp/state/profile_store.py +195 -0
  89. wayfinder_paths/mcp/state/store.py +89 -0
  90. wayfinder_paths/mcp/test_scripting.py +267 -0
  91. wayfinder_paths/mcp/tools/__init__.py +0 -0
  92. wayfinder_paths/mcp/tools/balances.py +290 -0
  93. wayfinder_paths/mcp/tools/discovery.py +158 -0
  94. wayfinder_paths/mcp/tools/execute.py +770 -0
  95. wayfinder_paths/mcp/tools/hyperliquid.py +931 -0
  96. wayfinder_paths/mcp/tools/quotes.py +288 -0
  97. wayfinder_paths/mcp/tools/run_script.py +286 -0
  98. wayfinder_paths/mcp/tools/strategies.py +188 -0
  99. wayfinder_paths/mcp/tools/tokens.py +46 -0
  100. wayfinder_paths/mcp/tools/wallets.py +354 -0
  101. wayfinder_paths/mcp/utils.py +129 -0
  102. wayfinder_paths/policies/enso.py +1 -2
  103. wayfinder_paths/policies/hyper_evm.py +6 -3
  104. wayfinder_paths/policies/hyperlend.py +1 -2
  105. wayfinder_paths/policies/hyperliquid.py +1 -1
  106. wayfinder_paths/policies/lifi.py +18 -0
  107. wayfinder_paths/policies/moonwell.py +12 -7
  108. wayfinder_paths/policies/prjx.py +1 -3
  109. wayfinder_paths/policies/util.py +8 -2
  110. wayfinder_paths/run_strategy.py +97 -300
  111. wayfinder_paths/strategies/basis_trading_strategy/constants.py +3 -1
  112. wayfinder_paths/strategies/basis_trading_strategy/strategy.py +47 -133
  113. wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +24 -53
  114. wayfinder_paths/strategies/boros_hype_strategy/__init__.py +3 -0
  115. wayfinder_paths/strategies/boros_hype_strategy/boros_ops_mixin.py +450 -0
  116. wayfinder_paths/strategies/boros_hype_strategy/constants.py +255 -0
  117. wayfinder_paths/strategies/boros_hype_strategy/examples.json +37 -0
  118. wayfinder_paths/strategies/boros_hype_strategy/hyperevm_ops_mixin.py +114 -0
  119. wayfinder_paths/strategies/boros_hype_strategy/hyperliquid_ops_mixin.py +642 -0
  120. wayfinder_paths/strategies/boros_hype_strategy/manifest.yaml +36 -0
  121. wayfinder_paths/strategies/boros_hype_strategy/planner.py +460 -0
  122. wayfinder_paths/strategies/boros_hype_strategy/risk_ops_mixin.py +886 -0
  123. wayfinder_paths/strategies/boros_hype_strategy/snapshot_mixin.py +494 -0
  124. wayfinder_paths/strategies/boros_hype_strategy/strategy.py +1194 -0
  125. wayfinder_paths/strategies/boros_hype_strategy/test_planner_golden.py +374 -0
  126. wayfinder_paths/{templates/strategy → strategies/boros_hype_strategy}/test_strategy.py +99 -63
  127. wayfinder_paths/strategies/boros_hype_strategy/types.py +365 -0
  128. wayfinder_paths/strategies/boros_hype_strategy/withdraw_mixin.py +997 -0
  129. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +15 -23
  130. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +27 -62
  131. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py +84 -58
  132. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py +5 -15
  133. wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +69 -164
  134. wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +43 -76
  135. wayfinder_paths/tests/test_mcp_quote_swap.py +165 -0
  136. wayfinder_paths/tests/test_test_coverage.py +1 -4
  137. wayfinder_paths-0.1.24.dist-info/METADATA +378 -0
  138. wayfinder_paths-0.1.24.dist-info/RECORD +185 -0
  139. {wayfinder_paths-0.1.22.dist-info → wayfinder_paths-0.1.24.dist-info}/WHEEL +1 -1
  140. wayfinder_paths/core/clients/WalletClient.py +0 -41
  141. wayfinder_paths/core/engine/StrategyJob.py +0 -110
  142. wayfinder_paths/core/services/test_local_evm_txn.py +0 -145
  143. wayfinder_paths/scripts/create_strategy.py +0 -139
  144. wayfinder_paths/scripts/make_wallets.py +0 -142
  145. wayfinder_paths/templates/adapter/README.md +0 -150
  146. wayfinder_paths/templates/adapter/adapter.py +0 -16
  147. wayfinder_paths/templates/adapter/examples.json +0 -8
  148. wayfinder_paths/templates/adapter/test_adapter.py +0 -30
  149. wayfinder_paths/templates/strategy/README.md +0 -186
  150. wayfinder_paths/templates/strategy/examples.json +0 -11
  151. wayfinder_paths/templates/strategy/strategy.py +0 -35
  152. wayfinder_paths/tests/test_smoke_manifest.py +0 -63
  153. wayfinder_paths-0.1.22.dist-info/METADATA +0 -355
  154. wayfinder_paths-0.1.22.dist-info/RECORD +0 -129
  155. /wayfinder_paths/{scripts → mcp/state}/__init__.py +0 -0
  156. {wayfinder_paths-0.1.22.dist-info → wayfinder_paths-0.1.24.dist-info}/LICENSE +0 -0
@@ -0,0 +1,378 @@
1
+ Metadata-Version: 2.3
2
+ Name: wayfinder-paths
3
+ Version: 0.1.24
4
+ Summary: Wayfinder Path: strategies and adapters
5
+ Author: Wayfinder
6
+ Author-email: dev@wayfinder.ai
7
+ Requires-Python: >=3.12,<4.0
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.12
10
+ Classifier: Programming Language :: Python :: 3.13
11
+ Requires-Dist: aiocache (>=0.12.3,<0.13.0)
12
+ Requires-Dist: aiohttp (>=3.13.0,<4.0.0)
13
+ Requires-Dist: eth-account (>=0.13.7,<0.14.0)
14
+ Requires-Dist: httpx (>=0.28.1,<0.29.0)
15
+ Requires-Dist: hyperliquid-felix
16
+ Requires-Dist: loguru (>=0.7.3,<0.8.0)
17
+ Requires-Dist: numpy (>=1.26.0,<2.0.0)
18
+ Requires-Dist: pandas (>=2.2.0,<3.0.0)
19
+ Requires-Dist: pydantic (>=2.11.9,<3.0.0)
20
+ Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
21
+ Requires-Dist: web3 (>=7.13.0,<8.0.0)
22
+ Description-Content-Type: text/markdown
23
+
24
+ # Wayfinder Paths SDK
25
+
26
+ [![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/)
27
+ [![PyPI](https://img.shields.io/pypi/v/wayfinder-paths.svg)](https://pypi.org/project/wayfinder-paths/)
28
+ [![Discord](https://img.shields.io/badge/discord-join-7289da.svg)](https://discord.gg/fUVwGMXjm3)
29
+
30
+ **An open-source SDK for building and managing automated DeFi strategies.** Use it locally to deposit into, monitor, rebalance, and exit strategies across multiple chains and protocols. Powered by the [Wayfinder API](https://wayfinder.ai).
31
+
32
+ ## What is Wayfinder Paths?
33
+
34
+ Wayfinder Paths is an SDK that lets you:
35
+
36
+ - **Enter and exit DeFi strategies** - Deposit funds, let strategies auto-rebalance, withdraw when ready
37
+ - **Build custom trading paths** - Create your own adapters and strategies for any protocol
38
+ - **Use Claude as your DeFi co-pilot** - With MCP (Model Context Protocol) integration, Claude can execute swaps, check balances, place perp orders, and manage your positions conversationally
39
+
40
+ Think of it as programmable DeFi infrastructure that connects your wallets to yield strategies, perpetual exchanges, lending protocols, and cross-chain bridges.
41
+
42
+ ## Getting Your Wayfinder API Key
43
+
44
+ **You need a Wayfinder API key to use this SDK.** The API provides token resolution, cross-chain routing, balance queries, and more.
45
+
46
+ 1. Go to [wayfinder.ai](https://wayfinder.ai)
47
+ 2. Create an account or log in
48
+ 3. Navigate to your account settings to generate an API key
49
+ 4. Add it to your `config.json` under `system.api_key`
50
+
51
+ ## Quick Start
52
+
53
+ ```bash
54
+ # Clone the repository
55
+ git clone https://github.com/WayfinderFoundation/wayfinder-paths.git
56
+ cd wayfinder-paths
57
+
58
+ # One-command setup (installs Poetry + deps, prompts for your Wayfinder API key, updates .mcp.json)
59
+ python3 scripts/setup.py
60
+
61
+ # Optional: create a strategy-specific wallet
62
+ poetry run python scripts/make_wallets.py --label stablecoin_yield_strategy
63
+
64
+ # Check strategy status
65
+ poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --action status --config config.json
66
+
67
+ # Deposit into a strategy
68
+ poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --action deposit \
69
+ --main-token-amount 100 --gas-token-amount 0.01 --config config.json
70
+ ```
71
+
72
+ ## Claude MCP Integration
73
+
74
+ **Turn Claude into an on-chain trading and DeFi engine.** The SDK includes an MCP server that gives Claude direct access to:
75
+
76
+ - **Wallet balances** across all supported chains
77
+ - **Token swaps** via the BRAP cross-chain router
78
+ - **Hyperliquid perpetuals** - market data, orders, leverage, withdrawals
79
+ - **Strategy management** - analyze, snapshot, and query any strategy
80
+ - **Script execution** - run custom Python scripts from `.wayfinder_runs/`
81
+
82
+ ### Setting Up MCP with Claude Code
83
+
84
+ This repo includes a project-scoped Claude Code MCP config at `.mcp.json` (you'll be prompted to enable it).
85
+ If you prefer a global config instead, add:
86
+
87
+ ```json
88
+ {
89
+ "mcpServers": {
90
+ "wayfinder": {
91
+ "command": "poetry",
92
+ "args": ["run", "python", "-m", "wayfinder_paths.mcp.server"],
93
+ "cwd": "/path/to/wayfinder-paths"
94
+ }
95
+ }
96
+ }
97
+ ```
98
+
99
+ ### Available MCP Tools
100
+
101
+ | Tool | Description |
102
+ |------|-------------|
103
+ | `discover` | List available adapters and strategies |
104
+ | `describe` | Get detailed info about any adapter or strategy |
105
+ | `wallets` | List or create local wallets |
106
+ | `tokens` | Resolve token metadata by ID or address |
107
+ | `balances` | Query token/pool balances across chains |
108
+ | `quote_swap` | Get swap quotes without executing |
109
+ | `execute` | Execute swaps, sends, and Hyperliquid deposits |
110
+ | `hyperliquid` | Read-only perp market data and user state |
111
+ | `hyperliquid_execute` | Place orders, update leverage, withdraw |
112
+ | `run_strategy` | Analyze strategies, get snapshots and policies |
113
+ | `run_script` | Execute local Python scripts safely |
114
+
115
+ ### Example Conversation with Claude
116
+
117
+ ```
118
+ You: What's my balance on Arbitrum?
119
+
120
+ Claude: [Uses balances tool to query your wallet]
121
+ Your Arbitrum wallet (0x81830...) holds:
122
+ - 1,245.32 USDC ($1,245.32)
123
+ - 0.42 ETH ($1,512.00)
124
+ - 15,000 ARB ($8,250.00)
125
+
126
+ You: Swap 500 USDC to ETH
127
+
128
+ Claude: [Uses quote_swap, then execute with your approval]
129
+ Swapped 500 USDC for 0.139 ETH via Uniswap V3
130
+ TX: 0xabc123...
131
+
132
+ You: Open a 2x long on BTC with $1000
133
+
134
+ Claude: [Uses hyperliquid_execute to place the order]
135
+ Opened BTC-PERP long position:
136
+ - Size: 0.0234 BTC (~$1,000 notional)
137
+ - Leverage: 2x
138
+ - Entry: $42,735.50
139
+ ```
140
+
141
+ ## Available Strategies
142
+
143
+ | Strategy | Description | Chain | Risk |
144
+ |----------|-------------|-------|------|
145
+ | **Stablecoin Yield** | USDC yield optimization across Base pools | Base | Low |
146
+ | **HyperLend Stable Yield** | Stablecoin rotation on HyperLend | HyperEVM | Medium |
147
+ | **Moonwell wstETH Loop** | Leveraged LST carry trade | Base | High |
148
+ | **Basis Trading** | Delta-neutral funding rate capture | Hyperliquid | High |
149
+ | **Boros HYPE** | Multi-leg HYPE yield with rate locking | Multi-chain | High |
150
+
151
+ ### Strategy Lifecycle
152
+
153
+ ```python
154
+ from wayfinder_paths.core.strategies.Strategy import Strategy, StatusDict, StatusTuple
155
+
156
+ class MyStrategy(Strategy):
157
+ name = "My Strategy"
158
+
159
+ def __init__(self, config=None, **kwargs):
160
+ super().__init__(config, **kwargs)
161
+ balance_adapter = BalanceAdapter(config, **kwargs)
162
+ self.balance_adapter = balance_adapter
163
+
164
+ async def deposit(self, main_token_amount=0.0, gas_token_amount=0.0) -> StatusTuple:
165
+ """Move funds from main wallet into strategy wallet."""
166
+ return (True, "Deposited successfully")
167
+
168
+ async def update(self) -> StatusTuple:
169
+ """Rebalance or optimize positions."""
170
+ return (True, "Updated successfully")
171
+
172
+ async def exit(self, **kwargs) -> StatusTuple:
173
+ """Transfer funds from strategy wallet back to main wallet."""
174
+ return (True, "Exited successfully")
175
+
176
+ async def _status(self) -> StatusDict:
177
+ """Report current state."""
178
+ return {
179
+ "portfolio_value": 0.0,
180
+ "net_deposit": 0.0,
181
+ "strategy_status": {"message": "healthy"},
182
+ "gas_available": 0.0,
183
+ "gassed_up": True,
184
+ }
185
+ ```
186
+
187
+ ## Available Adapters
188
+
189
+ | Adapter | Purpose | External Protocol |
190
+ |---------|---------|-------------------|
191
+ | **BalanceAdapter** | Wallet balances, cross-wallet transfers | - |
192
+ | **BRAPAdapter** | Cross-chain swaps and bridges | Wayfinder BRAP Router |
193
+ | **BorosAdapter** | Fixed-rate lending positions | Boros Protocol |
194
+ | **HyperliquidAdapter** | Perps, spot, deposits, withdrawals | Hyperliquid DEX |
195
+ | **HyperlendAdapter** | Stablecoin lending | HyperLend Protocol |
196
+ | **MoonwellAdapter** | Lending/borrowing on Base | Moonwell Protocol |
197
+ | **PendleAdapter** | PT/YT discovery + Hosted SDK convert (swap/mint/roll/LP) | Pendle Protocol |
198
+ | **MulticallAdapter** | Batch contract calls | Multicall3 |
199
+ | **LedgerAdapter** | Transaction recording | - |
200
+ | **TokenAdapter** | Token metadata and prices | Wayfinder API |
201
+ | **PoolAdapter** | DeFi pool analytics | DeFi Llama |
202
+
203
+ ## Configuration
204
+
205
+ Create `config.json` in the project root:
206
+
207
+ ```json
208
+ {
209
+ "system": {
210
+ "api_base_url": "https://api.wayfinder.ai",
211
+ "api_key": "wk_your_api_key_here"
212
+ },
213
+ "strategy": {
214
+ "rpc_urls": {
215
+ "1": "https://eth.llamarpc.com",
216
+ "8453": "https://mainnet.base.org",
217
+ "42161": "https://arb1.arbitrum.io/rpc",
218
+ "999": "https://rpc.hyperliquid.xyz"
219
+ }
220
+ },
221
+ "wallets": [
222
+ {
223
+ "label": "main",
224
+ "address": "0x...",
225
+ "private_key_hex": "..."
226
+ }
227
+ ]
228
+ }
229
+ ```
230
+
231
+ ### Supported Chains
232
+
233
+ | Chain | ID | Code |
234
+ |-------|-----|------|
235
+ | Ethereum | 1 | `ethereum` |
236
+ | Base | 8453 | `base` |
237
+ | Arbitrum | 42161 | `arbitrum` |
238
+ | Polygon | 137 | `polygon` |
239
+ | BSC | 56 | `bsc` |
240
+ | HyperEVM | 999 | `hyperevm` |
241
+
242
+ ## Architecture
243
+
244
+ ```
245
+ ┌─────────────────────────────────────────────────────────────┐
246
+ │ Claude + MCP Server │
247
+ │ "Swap 100 USDC to ETH" → execute tool → transaction │
248
+ └─────────────────────────────────────────────────────────────┘
249
+
250
+
251
+ ┌─────────────────────────────────────────────────────────────┐
252
+ │ Strategy Layer │
253
+ │ Strategies orchestrate adapters to capture yield │
254
+ │ (deposit → update → update → ... → exit) │
255
+ └─────────────────────────────────────────────────────────────┘
256
+
257
+
258
+ ┌─────────────────────────────────────────────────────────────┐
259
+ │ Adapter Layer │
260
+ │ Protocol integrations: Hyperliquid, Moonwell, Boros, etc. │
261
+ │ All methods return (success: bool, data: Any) tuples │
262
+ └─────────────────────────────────────────────────────────────┘
263
+
264
+
265
+ ┌─────────────────────────────────────────────────────────────┐
266
+ │ Client Layer │
267
+ │ TokenClient, BRAPClient, LedgerClient │
268
+ │ Authenticated via X-API-KEY header │
269
+ └─────────────────────────────────────────────────────────────┘
270
+
271
+
272
+ ┌─────────────────────────────────────────────────────────────┐
273
+ │ Network Layer │
274
+ │ Wayfinder API • Chain RPCs • Protocol APIs │
275
+ └─────────────────────────────────────────────────────────────┘
276
+ ```
277
+
278
+ ## CLI Reference
279
+
280
+ ```bash
281
+ # Check strategy status
282
+ poetry run python wayfinder_paths/run_strategy.py <strategy> --action status
283
+
284
+ # Deposit funds into strategy
285
+ poetry run python wayfinder_paths/run_strategy.py <strategy> --action deposit \
286
+ --main-token-amount 100 --gas-token-amount 0.01
287
+
288
+ # Run strategy update cycle
289
+ poetry run python wayfinder_paths/run_strategy.py <strategy> --action update
290
+
291
+ # Withdraw funds
292
+ poetry run python wayfinder_paths/run_strategy.py <strategy> --action withdraw
293
+
294
+ # Exit strategy (return all funds to main wallet)
295
+ poetry run python wayfinder_paths/run_strategy.py <strategy> --action exit
296
+
297
+ # Run continuously
298
+ poetry run python wayfinder_paths/run_strategy.py <strategy> --action run
299
+
300
+ # Partial liquidation
301
+ poetry run python wayfinder_paths/run_strategy.py <strategy> --action partial-liquidate --amount 50
302
+ ```
303
+
304
+ ## Contributing
305
+
306
+ We welcome contributions! You can add your own strategies and adapters to the SDK.
307
+
308
+ ### Adding a New Strategy
309
+
310
+ ```bash
311
+ # Use the convenience command
312
+ just create-strategy "My Strategy Name"
313
+
314
+ # Or copy the template manually
315
+ cp -r wayfinder_paths/templates/strategy wayfinder_paths/strategies/my_strategy
316
+ ```
317
+
318
+ Implement the required methods:
319
+ - `deposit()` - Move funds from main wallet to strategy
320
+ - `update()` - Rebalance/optimize positions
321
+ - `exit()` - Return funds to main wallet
322
+ - `_status()` - Report current state
323
+
324
+ ### Adding a New Adapter
325
+
326
+ ```bash
327
+ cp -r wayfinder_paths/templates/adapter wayfinder_paths/adapters/my_adapter
328
+ ```
329
+
330
+ Implement protocol-specific methods, returning `(success, data)` tuples.
331
+
332
+ ### Contribution Process
333
+
334
+ The process for contributing new paths to the official SDK is still being defined. For now:
335
+
336
+ 1. Fork the repository
337
+ 2. Create your adapter or strategy
338
+ 3. Add tests
339
+ 4. Open a PR with a description of what your path does
340
+
341
+ Join our [Discord](https://discord.gg/fUVwGMXjm3) to discuss ideas and get help.
342
+
343
+ ## Testing
344
+
345
+ ```bash
346
+ # Generate test wallets
347
+ just create-wallets
348
+
349
+ # Run all tests
350
+ poetry run pytest -v
351
+
352
+ # Run smoke tests
353
+ poetry run pytest -k smoke -v
354
+
355
+ # Run adapter tests
356
+ poetry run pytest wayfinder_paths/adapters/ -v
357
+
358
+ # Run with coverage
359
+ poetry run pytest --cov=wayfinder_paths -v
360
+ ```
361
+
362
+ ## Security
363
+
364
+ - **Never commit `config.json`** - it contains private keys
365
+ - **Use test wallets** for development
366
+ - **DRY_RUN mode** - Set `DRY_RUN=1` env var to simulate executions
367
+ - **Idempotency** - MCP tools use idempotency keys to prevent duplicate transactions
368
+
369
+ ## Community
370
+
371
+ - [Discord](https://discord.gg/fUVwGMXjm3) - Get help, share strategies, discuss DeFi
372
+ - [GitHub Issues](https://github.com/WayfinderFoundation/wayfinder-paths/issues) - Report bugs, request features
373
+ - [Wayfinder](https://wayfinder.ai) - Get your API key
374
+
375
+ ## License
376
+
377
+ MIT License - see [LICENSE](LICENSE) for details.
378
+
@@ -0,0 +1,185 @@
1
+ wayfinder_paths/__init__.py,sha256=9BJHuTJIFFa1dLrY45VWjdJI-m0NchcGJej4lC1jN-U,230
2
+ wayfinder_paths/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ wayfinder_paths/adapters/balance_adapter/README.md,sha256=xek-ZekUPDCUEiyciSYHOp3Z_QA1bgEW1RzXvwTySVE,2363
4
+ wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=__gVhz2agQjjptPuXG4vuJEnLvqDHLYnDoBLAvGxyQc,16897
5
+ wayfinder_paths/adapters/balance_adapter/examples.json,sha256=3R1M4B_VsIy29viAuFT9nQbnQShWl8ZbU-rnSNWUW9U,129
6
+ wayfinder_paths/adapters/balance_adapter/manifest.yaml,sha256=w6Fb9Bui1QKjcGpRX1kzwe8GNGjQXAH6GtLp-D_Ez_Q,218
7
+ wayfinder_paths/adapters/balance_adapter/test_adapter.py,sha256=BQWQWun9En4-10QUTSheSfp4bxypqDWWv1BjuHneu3w,2794
8
+ wayfinder_paths/adapters/boros_adapter/__init__.py,sha256=y32d5WyoTzrqmnk3i1Vi13iMAVoJiWO2mO9YEpg5pGg,337
9
+ wayfinder_paths/adapters/boros_adapter/adapter.py,sha256=FnT2nA9g0cEOG4gzV7RaTo5XRMLKd0jMdqj7GqJfdqM,61696
10
+ wayfinder_paths/adapters/boros_adapter/client.py,sha256=t-Tt9_HOEA3OfhRmkQg9-sf2BYkDQGD11yRdOht4bUM,15215
11
+ wayfinder_paths/adapters/boros_adapter/manifest.yaml,sha256=PGrhgw6A4Pf6Kqg9vGGL8QvL479K9yM0tpP3zhObxX4,240
12
+ wayfinder_paths/adapters/boros_adapter/parsers.py,sha256=r_KtWeLhfIyfTgWZB0CUMGv8N4higojsTsLMhuFP7NM,2792
13
+ wayfinder_paths/adapters/boros_adapter/test_adapter.py,sha256=xicpa62i2TiumlsYibxfKAw4NDQB5vA1GaAliusSYRo,16145
14
+ wayfinder_paths/adapters/boros_adapter/test_golden.py,sha256=9pQSYy8FdGfo38-jJPzvM9DlVK3OjuRQizEBsExp3FA,4895
15
+ wayfinder_paths/adapters/boros_adapter/types.py,sha256=SJN1cUUZF9-_HZaa8TIsLbsOvJ6I-btqjhvjXk_D3cM,1613
16
+ wayfinder_paths/adapters/boros_adapter/utils.py,sha256=fQY0AclEJbxFU4QHFcDsyRkEFPr2C3t6Mwp1FwtHfoU,2259
17
+ wayfinder_paths/adapters/brap_adapter/README.md,sha256=ZzVTYvVmQ-J8PakH2iy_oBKT1YwTEhkOtluCpZFcK1Q,1466
18
+ wayfinder_paths/adapters/brap_adapter/__init__.py,sha256=Hx4JW1tDijXS5YQhVliE0syw1RD1YKO2MM37wN_to9M,60
19
+ wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=1zc8zFDD44ybdmbWuFjae3k7EclCh8hbsqfqaaKtZQ0,10873
20
+ wayfinder_paths/adapters/brap_adapter/examples.json,sha256=XBr7JqtSLyECs9XywZ6oJ9OXJ0TaPPpwCzHcqQZOxCg,1994
21
+ wayfinder_paths/adapters/brap_adapter/manifest.yaml,sha256=nerZ7ShLAuV-ebTby0LJjOrxDEkp37Ku7wW78ZOX1Yw,209
22
+ wayfinder_paths/adapters/brap_adapter/test_adapter.py,sha256=YZq6I0S895ZKPbwv_TbdPjwlIfRVIRf-DVqQhitIvqc,2924
23
+ wayfinder_paths/adapters/hyperlend_adapter/__init__.py,sha256=IDgYOx5rF2Zd8DjZ_VzmZc6EUGS34SfIVQ_M1PdZ0YQ,112
24
+ wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=tqnpZXFEETSvE7Xa9WY2OcosYE-ahKiJ9ScUys3FBAY,11870
25
+ wayfinder_paths/adapters/hyperlend_adapter/manifest.yaml,sha256=M0xfk0KPpILSo-XtFgwFKIy-HZHunzBnXakh6yU_R_I,238
26
+ wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py,sha256=QYpXpxSw-aG20DXPbNowPZs8Z9BnACa-OO8mc0EaR9I,13677
27
+ wayfinder_paths/adapters/hyperliquid_adapter/__init__.py,sha256=8kOiGrmGvk8BR16wHxVo1qaWwAQSTQbkcJg0cW46RCE,288
28
+ wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=icbhuoF3Kcawuz5P-b_UUFPKulE0WzsFKWUfBKlgDDU,43793
29
+ wayfinder_paths/adapters/hyperliquid_adapter/executor.py,sha256=wjTFzjwdwbahu86tEiUH3u8GLr8rDInVUABJyJwS6JQ,15970
30
+ wayfinder_paths/adapters/hyperliquid_adapter/manifest.yaml,sha256=lwADwkooWOivqIUEAxiVTdHBYuchHyuQR8y40K_AUgw,315
31
+ wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py,sha256=V_cIiNJYER6E3r8hYLTy1zR2YuO_GBKhn9rP5dkPaVs,35156
32
+ wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py,sha256=D9YDrlyCMJfk7h2mOig7ebKgZkxCbt481UeJbF-0KNg,3767
33
+ wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=uKNNGx7r1Fg9eD3hVGUIGC4OUF0Un-Y4e89whYaJVG4,5786
34
+ wayfinder_paths/adapters/hyperliquid_adapter/test_executor.py,sha256=9VzTGtGjjfUOt5dpahOFvttP2Oyla6tpQopmWANL89g,3525
35
+ wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py,sha256=n2_vLEqwDTQDweiDW3an6K9ceTweJMT96oi56J5ebfs,5596
36
+ wayfinder_paths/adapters/hyperliquid_adapter/utils.py,sha256=J0UcXR60BHLj147qMZHocrcvIQ71GhGx90u3JDZ3gg8,3838
37
+ wayfinder_paths/adapters/ledger_adapter/README.md,sha256=hxBXJg_wfH7gDTYqUL6yXkDARKTb1zdyYYIIxbvQMDQ,2574
38
+ wayfinder_paths/adapters/ledger_adapter/__init__.py,sha256=CrFEf6_7I27g5CQPPOAFYzQvm33IpdkbQHCKiDdwiWk,64
39
+ wayfinder_paths/adapters/ledger_adapter/adapter.py,sha256=Ei0Dhj7nSki67ZF8MQP-WJbXVhNtaOlYasgzndtKcO4,6661
40
+ wayfinder_paths/adapters/ledger_adapter/examples.json,sha256=DdqTSe4vnBrfIycQVQQ_JZom7fBGHbL7MR4ppK9ljCY,3936
41
+ wayfinder_paths/adapters/ledger_adapter/manifest.yaml,sha256=-WTDO7jk8aPmd788w4DJN86kgvU5FK6MBU6cWOu_Oqo,173
42
+ wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=B9yfpWPwwo0F8KfQWckP8FeFcN7yAq2zRBn9eFUFUA8,6818
43
+ wayfinder_paths/adapters/moonwell_adapter/README.md,sha256=A-xKZo4ssLh1-uJqlp9ihMrnlZ8hB-KW2e0MRH4pnhU,3036
44
+ wayfinder_paths/adapters/moonwell_adapter/__init__.py,sha256=5wMDRIM6z0QbSqKEqaV8tUGkpwrAABqz1T0hP4YJbMg,109
45
+ wayfinder_paths/adapters/moonwell_adapter/adapter.py,sha256=ERiJWrlVZhPVCvKwpWrvsBdenDxCx2CEo5JvcTeatvM,44244
46
+ wayfinder_paths/adapters/moonwell_adapter/manifest.yaml,sha256=A84L59KjeHJi116Kw0PDRytKsI4piOL16x7HwSOMtzY,331
47
+ wayfinder_paths/adapters/moonwell_adapter/test_adapter.py,sha256=5Q62lnAoBq1AfpXUVdossU1ClejNPsiDxIqOzrrfqCI,22566
48
+ wayfinder_paths/adapters/multicall_adapter/__init__.py,sha256=NoPCKUidjkiYjMtdIcPM3LObiEORRfaqxv1JQLD7Xa0,139
49
+ wayfinder_paths/adapters/multicall_adapter/adapter.py,sha256=DJ1hiToTZnS9E9qv343N6qQfNYCd22vYbfb_-9XTA1I,5742
50
+ wayfinder_paths/adapters/multicall_adapter/manifest.yaml,sha256=z8cGp0gNdWELgEvNy_3_KQUCvFIGNGkZQwYqAsaGc0c,145
51
+ wayfinder_paths/adapters/multicall_adapter/test_adapter.py,sha256=g3ywwEAv5kb9xBDEM42YfKa9eFPGw4NnPYyFVpBkvgU,3265
52
+ wayfinder_paths/adapters/pendle_adapter/README.md,sha256=iPcaNx6U7jRWrTW6B89iHwo9wG3MzaxdwOnVpX2vy9I,4011
53
+ wayfinder_paths/adapters/pendle_adapter/__init__.py,sha256=cvxoKzRFaya_GtxrYTnLmZVLxEo8BEmrmkOK6uLyppg,127
54
+ wayfinder_paths/adapters/pendle_adapter/adapter.py,sha256=ENIlhr5D4UJm121jN5UDSdhLeH-AN715LtkBCFK9h_Q,73575
55
+ wayfinder_paths/adapters/pendle_adapter/examples.json,sha256=MnEudDmf4fbe7EAK-2m5PT-6voMl7hlZah0r-wjs1Tw,1132
56
+ wayfinder_paths/adapters/pendle_adapter/manifest.yaml,sha256=nnbV5ukA-Ewd9pL2v2rhfPqLQEwLgeuYl-44UyVdG1I,617
57
+ wayfinder_paths/adapters/pendle_adapter/test_adapter.py,sha256=67Gf89pBnpzhoGmQVo3HnbbAgaEKRNl_JdhLOmDIBPw,24406
58
+ wayfinder_paths/adapters/pool_adapter/README.md,sha256=qxXNcTgxQ4-YEDC-ZHiQ5wTpV_76t-vK58vyDh0IBgU,1282
59
+ wayfinder_paths/adapters/pool_adapter/__init__.py,sha256=LTbty0SuACoj3X5yeGESDUdtJQt8zyB2Loq8BuEp7rE,60
60
+ wayfinder_paths/adapters/pool_adapter/adapter.py,sha256=NHxtFOt10l320AClQUWchUVrQp0ivST25UOczS7aYeQ,1298
61
+ wayfinder_paths/adapters/pool_adapter/examples.json,sha256=NW-7J6_zXxky8uMDRym3jJaPP8hZLEiytQ3WKoZEP54,855
62
+ wayfinder_paths/adapters/pool_adapter/manifest.yaml,sha256=RN6g_elSdROAK3o-XYEFIinbPTbZ1u8MVkm1U2xHW54,145
63
+ wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=GGocdzXbeZMYXeVy7SOkY_ifC719rwYdqTIwQoxRJSo,2262
64
+ wayfinder_paths/adapters/token_adapter/README.md,sha256=JlZhT6MK3gYQ73uJU-DOrEx5eMZXvqceqrawJqNdygI,1623
65
+ wayfinder_paths/adapters/token_adapter/__init__.py,sha256=nEmxrvffEygn3iKH3cZTNLkhnUUhlUAEtshmrFRAjq8,62
66
+ wayfinder_paths/adapters/token_adapter/adapter.py,sha256=WmNU8-qQoR1DjNMBKBLI7Lv8iWRdS4MItl7LBOyjI1c,3257
67
+ wayfinder_paths/adapters/token_adapter/examples.json,sha256=t4BYKxpkz4zASO91TbjZIaQ3msApNY5ayZtZZrkgdCs,2362
68
+ wayfinder_paths/adapters/token_adapter/manifest.yaml,sha256=KR6msMamsFW6aMlpYeYeguuA_4ppj1h4_JAiS8EJYpc,162
69
+ wayfinder_paths/adapters/token_adapter/test_adapter.py,sha256=jDenD0BYbbb_xE3jKrA84io8iVEcvjk5SExf6UjQ410,3980
70
+ wayfinder_paths/conftest.py,sha256=LaCl5qQ5K41O2U7jPI4Tx4EYR7EWj05ZvNeQqYDVKqI,853
71
+ wayfinder_paths/core/__init__.py,sha256=sVbC4eAGYolLE48ZhmbRVE8qsTd5KAA_R5TeskJRXro,257
72
+ wayfinder_paths/core/adapters/BaseAdapter.py,sha256=QlpZswyBTeE6cI9nEvAQvxEUCER7htSZMMHyuy_T7lE,418
73
+ wayfinder_paths/core/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ wayfinder_paths/core/adapters/models.py,sha256=_d4ir3iHGbkTUyLOK6babxocYcjlBX9rXh6udPiN4Y0,1363
75
+ wayfinder_paths/core/analytics/__init__.py,sha256=d_upri6nw5-oUdhOCb45P-ojAqpb0JBGFMBdqFGBI8s,209
76
+ wayfinder_paths/core/analytics/bootstrap.py,sha256=npbLf9Jzx0tl4fHVumeUID5NnBwyHnjbQdIg7Ol-s-Y,1194
77
+ wayfinder_paths/core/analytics/stats.py,sha256=5JzhHEHivXuK5xvQa9BWgkpRD7WwVvQdJDGuILlS7Pc,1161
78
+ wayfinder_paths/core/analytics/test_analytics.py,sha256=COyUP9UBhE6471z9lQA2yM51SNKXZz0i3bkBztcilbs,4193
79
+ wayfinder_paths/core/clients/BRAPClient.py,sha256=xeWmWyennpLS2kF0X2GB009Kxpv_E2QEOMc7H4yDfUI,3340
80
+ wayfinder_paths/core/clients/ClientManager.py,sha256=rNGGcqU9Y7gdnlkNlXtWUW2EB8W50I7i-sxQVc8IZT8,2179
81
+ wayfinder_paths/core/clients/HyperlendClient.py,sha256=_10Hrbo3M4VbW3Nwlt1_rJMrz955u_AIanQotG0fwE8,5508
82
+ wayfinder_paths/core/clients/LedgerClient.py,sha256=9PtXW2o_WZGfvu7wIwBuCPzXYex2B1rsMDN70tKgJeA,11713
83
+ wayfinder_paths/core/clients/PoolClient.py,sha256=ij0aVwV73UiUndOmBrtpg1BhalSIr_Ab78pP7xQQHzY,4266
84
+ wayfinder_paths/core/clients/TokenClient.py,sha256=TRTKg4z0JFdNGjEaQ4UZlBAj1OS4eAyRwnEdUj2g5Yw,5008
85
+ wayfinder_paths/core/clients/WayfinderClient.py,sha256=y7S535kakRP7pFqYEqUXygdW5hv-FMmtxds9ZL476jQ,3423
86
+ wayfinder_paths/core/clients/__init__.py,sha256=8JbfbYKnVlXwEp9gbFKMY41xh-kQ9BTfC_QLZ9VhYS8,951
87
+ wayfinder_paths/core/clients/protocols.py,sha256=kNNyUssPkZVc1f82YdkF8deUyWBMKKLUYygBcHZ4JmA,5180
88
+ wayfinder_paths/core/clients/test_ledger_client.py,sha256=RE-IJ3MfbR9AGEeFhPduYhJRqwLoMaKDuHRf_yq0AHo,15228
89
+ wayfinder_paths/core/config.py,sha256=JZLFdxCMj5naJb3SAoieM--w7UNDrHP0YEMpz1Mmdps,1396
90
+ wayfinder_paths/core/constants/__init__.py,sha256=C5kXQnCPrzhjJrXxUUbnulBLgWK80A8y1znQaSQzPwU,2152
91
+ wayfinder_paths/core/constants/base.py,sha256=4jN3Qr8rBK2ZRAlFmRFeCyRPqwQwQufZx5E5eM8ispo,940
92
+ wayfinder_paths/core/constants/chains.py,sha256=DA03zVjukRGndBB2EROaxvc1uW8bt2550ySh9Cn2J34,729
93
+ wayfinder_paths/core/constants/contracts.py,sha256=R0Moh8Pm5cmDwEVpGytNS2tWjFNzVaRD0ZABeL4AXhU,2336
94
+ wayfinder_paths/core/constants/erc20_abi.py,sha256=o84ShHG1j59i1fkmG7qgBVo1bqdG5_5GRE1ptNlPBWU,2656
95
+ wayfinder_paths/core/constants/hyperlend_abi.py,sha256=rcXnfYvw6Np40lNK1SVTXVknoapu0HbP1DHAR6g4x9A,3893
96
+ wayfinder_paths/core/constants/hyperliquid.py,sha256=54RkDtsuvfm8LtE2W7cUkrxeSQZ7cyWhkL6lBBikHuo,565
97
+ wayfinder_paths/core/constants/moonwell_abi.py,sha256=IERwnQKUG7yyKiICXcfybt8LgPCD1sze95dA2vJalLQ,10940
98
+ wayfinder_paths/core/constants/tokens.py,sha256=lkpZXRJcnygcNKVvrIBgnUozPvcbpHT-BkqqpEG9Xug,326
99
+ wayfinder_paths/core/engine/manifest.py,sha256=-bFBClnIx21FeAq4p-p3nLvzOuZ5OoGVofSbO1W6n80,2201
100
+ wayfinder_paths/core/strategies/Strategy.py,sha256=knf2H22YpjwPpqwDP7CTglKPFsa_aIISaviHCqBgXbQ,3743
101
+ wayfinder_paths/core/strategies/__init__.py,sha256=5Hq9nJf1jS9oZuo0lRAOQw3hazZJg2jRmGCKtJF-1cs,247
102
+ wayfinder_paths/core/strategies/base.py,sha256=-s0qeiGZl5CHTUL2PavGXM7ACkNlaa0c4jeZR_4DuBM,155
103
+ wayfinder_paths/core/strategies/descriptors.py,sha256=2Olef0VWols1CWb-TWcb5pil2rztC0jP6F_Trpv2hIw,1958
104
+ wayfinder_paths/core/strategies/opa_loop.py,sha256=Eoy4uUA2YSo9najJFUwS4wVykPKJ5A_i-Sf6XnwNsv0,5483
105
+ wayfinder_paths/core/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
+ wayfinder_paths/core/utils/evm_helpers.py,sha256=m_h9eMjcMW5a3Di6PGkpZOwpZkZ-tVdwiLsTZqFJacE,3809
107
+ wayfinder_paths/core/utils/test_transaction.py,sha256=0GtXROAWmll-zgbIquO9TeqcClhhCmJJNFg1XoYAYIc,10613
108
+ wayfinder_paths/core/utils/tokens.py,sha256=bSrfu1_58SKcc75j5u01mp1upKWdnMllbo2xUMCxDAs,4328
109
+ wayfinder_paths/core/utils/transaction.py,sha256=2xgX7sZGDB3UzDh1IUrAcuU2FBdahtxyrWtlvcwx07o,8236
110
+ wayfinder_paths/core/utils/wallets.py,sha256=ccCQ128lDShO265AFMOCdijzPLucWe-Neg5wjLrOsnk,1948
111
+ wayfinder_paths/core/utils/web3.py,sha256=KeoUjnVXR8ZQLqjd1ZH4fMowRGSBfykirZFWfiICfN8,2071
112
+ wayfinder_paths/mcp/__init__.py,sha256=ldUqhq_wbWe7-fJB9UWVFyh1rAoeqwD0TuYu0oSw5Ec,172
113
+ wayfinder_paths/mcp/preview.py,sha256=qZmylK3T5h5efJXnjx0Vvm-O5toI61uyug68eFajaMA,6452
114
+ wayfinder_paths/mcp/scripting.py,sha256=fRT-x3wL1kQXkVBl3KUALeAzLhJNhK3v6K7x2RrqGTg,2344
115
+ wayfinder_paths/mcp/server.py,sha256=DfiJHc8ZH5xRSdKyIRW2ZS8z865AI2yU3hpflhYL4c0,1516
116
+ wayfinder_paths/mcp/state/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
+ wayfinder_paths/mcp/state/profile_store.py,sha256=wth_EkIFiVV1Uw7s6na7TzsZLmqa63KY7Ip5-y7-Yuk,6235
118
+ wayfinder_paths/mcp/state/store.py,sha256=BPKwnVJUMAodMiFpXVSoLm0tQinb4GCH_fg--YbFM_g,2797
119
+ wayfinder_paths/mcp/test_scripting.py,sha256=X-Fyy3lkpqOQjU_g5G9OaAOeliVqOJmh3u_PA-ogGe0,9314
120
+ wayfinder_paths/mcp/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ wayfinder_paths/mcp/tools/balances.py,sha256=UcpSOZfa3Iz4MfU7GEiPV0SET_pEmI2XXAfASIt02cY,10225
122
+ wayfinder_paths/mcp/tools/discovery.py,sha256=tFcRc7EF95Cy1ClVwNJ-fmOp_hNzX-GjchoZwrZjOKw,5595
123
+ wayfinder_paths/mcp/tools/execute.py,sha256=ks_ZaRvvojU7JucsVaZy2FgPhAOnALJcGKKvswq9kt4,26185
124
+ wayfinder_paths/mcp/tools/hyperliquid.py,sha256=10GZOtyKlNVW31ZT7S7-SkG-18C7GOg2OZAsds7L3s0,31845
125
+ wayfinder_paths/mcp/tools/quotes.py,sha256=zYEJc4ik6yBCggBARRoRJHIS1vUL6QPQ10vtd6Ag0Nw,9359
126
+ wayfinder_paths/mcp/tools/run_script.py,sha256=RF83GyhXZlXEIcK24vS9bHDDm8Q1scQktBrxWBp6WX8,7887
127
+ wayfinder_paths/mcp/tools/strategies.py,sha256=WSqVWXjvrOsS9X4sffI42lUf2h4QWRWjRQ0t9aHSifQ,6746
128
+ wayfinder_paths/mcp/tools/tokens.py,sha256=AtFv39e6mJ9WeH1ufZ1U0KW6CUbUi2HtVAoiBbnD39A,1535
129
+ wayfinder_paths/mcp/tools/wallets.py,sha256=Xk63su9jUq-tgzejjlwBHyJfKCfxEaW6sMumvjdl6Mc,11840
130
+ wayfinder_paths/mcp/utils.py,sha256=eVRsaEm6FLAGtzt9fG5wrt3jAn6DvqOc_bn_wZDbpuk,3613
131
+ wayfinder_paths/policies/enso.py,sha256=JdmjzGBrIBsqq0nTQN5sbWbcGk5wktoxqAIl9NIvHV0,433
132
+ wayfinder_paths/policies/erc20.py,sha256=K5PQCUivBrU2nYmIdsIARzRiFy36Rijver-RJnaxNT8,960
133
+ wayfinder_paths/policies/evm.py,sha256=8fJpjAl6XVxr51sVMw_VkWmIaI_lj2T7qrLcR8_sWgs,713
134
+ wayfinder_paths/policies/hyper_evm.py,sha256=WNbU2JjWa236HY3AxeQLO6ofFmKoU0bFboTt8KWZVmY,641
135
+ wayfinder_paths/policies/hyperlend.py,sha256=70Zf133lL0Q1HudaZlFEcqINeAYkU5SEncONDMYrb-o,375
136
+ wayfinder_paths/policies/hyperliquid.py,sha256=940rzpLVbIdn8RmFrEKbe0uYcRC2JVDBiKxh6CZiF6Y,795
137
+ wayfinder_paths/policies/lifi.py,sha256=0n9KgXGZ0qyOaEGe_fQquo7PnDBJ8Jfih0uCI7JX7KY,645
138
+ wayfinder_paths/policies/moonwell.py,sha256=aWp3ZgB_NWWuJuIo6idGEiCQN3DRqigXm5ButDRzjAM,1622
139
+ wayfinder_paths/policies/prjx.py,sha256=ncXOGXTkSrzPgtw2VhIC-ep3Il5-V4o9kRX_etIOEEM,702
140
+ wayfinder_paths/policies/util.py,sha256=0g5zQlHfFqvq8ijQwmpe4a58ZPx25ehuZ9CrWY3sS-8,1018
141
+ wayfinder_paths/run_strategy.py,sha256=n2beh0jxi88jNr0nhijz6lP4O77F9j10zFnjQyjugyU,5036
142
+ wayfinder_paths/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
+ wayfinder_paths/strategies/basis_trading_strategy/README.md,sha256=kZtG5NVVZwWsuz65n2SrwPMUGow9xsfIRplbHI0ARgE,3540
144
+ wayfinder_paths/strategies/basis_trading_strategy/__init__.py,sha256=kVcehFjBUtoi5xzSHI56jtDghsy0nYl6XIE6BI1l6aI,79
145
+ wayfinder_paths/strategies/basis_trading_strategy/constants.py,sha256=dYQn_297CB1x9whic8YEMdEig0vibclDGCasjJL10mI,122
146
+ wayfinder_paths/strategies/basis_trading_strategy/examples.json,sha256=q2wlAH8Gr-LUJeamKzWL1EtChL3TBWe0HQ4_P-VCdqQ,429
147
+ wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=F324ILz9w6uT7fkOVUa7gltp2LMEyGBlw3tz-ANcff8,37634
148
+ wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=egBxpzymYbjPwhBTSvg9ejzW2_ViLtqcKt_ZKIHi53Y,142980
149
+ wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=BnjgsYEDkqnG5Qm6zmyOXzgwnunB95UPtr7HLopU9tA,34126
150
+ wayfinder_paths/strategies/basis_trading_strategy/types.py,sha256=xTkLYqwvS0meMdlRAvIKNH9AANRyz63bQSYFSxLI6n4,740
151
+ wayfinder_paths/strategies/boros_hype_strategy/__init__.py,sha256=OZlSnGYwlMUsNWWBMIqA7glI5oX9XDQvlgEZ_Ph2uDY,73
152
+ wayfinder_paths/strategies/boros_hype_strategy/boros_ops_mixin.py,sha256=dXeaRRdT-2FKtB76OL-vyBjEHpATE8zUJpEU7lc3N24,17710
153
+ wayfinder_paths/strategies/boros_hype_strategy/constants.py,sha256=OZqZiQltpbCmKwBBIrKGe0h6nUzl1USPQwiLv_p6p80,11361
154
+ wayfinder_paths/strategies/boros_hype_strategy/examples.json,sha256=_d3WauNJs6DTaS3oIhLn94lKn9_TtK26bdmS3bOrU9A,638
155
+ wayfinder_paths/strategies/boros_hype_strategy/hyperevm_ops_mixin.py,sha256=UZ7a2AWvGvLCVshsKlfmpuQTpkne0MHYgNdgXFDLc2w,4300
156
+ wayfinder_paths/strategies/boros_hype_strategy/hyperliquid_ops_mixin.py,sha256=aLqjRQvJjqLbNf3UhS62l9yPHQ0nxkq1shjFhCfAiXY,25109
157
+ wayfinder_paths/strategies/boros_hype_strategy/manifest.yaml,sha256=Tb7lfXD1261qNhCupRJgHzqEoDRcP0dCkZ4B_PsTXv8,1763
158
+ wayfinder_paths/strategies/boros_hype_strategy/planner.py,sha256=9tckKI_y2OGkwsNEmkKnly8jWC2L39KICZ3zS_U6vTM,17890
159
+ wayfinder_paths/strategies/boros_hype_strategy/risk_ops_mixin.py,sha256=coc3xTZe8hjEEkdjAgKSilcoy39zvTOwxltUjWLsAE8,39294
160
+ wayfinder_paths/strategies/boros_hype_strategy/snapshot_mixin.py,sha256=UtciP6cwFW0I_x_j8CIpFaS9Jvf4CZeNXV3XpZgK5k8,20685
161
+ wayfinder_paths/strategies/boros_hype_strategy/strategy.py,sha256=oJAJfCmFbx_8xrjuyl-HI63E5nprQbiorSwqlhUXoWw,49331
162
+ wayfinder_paths/strategies/boros_hype_strategy/test_planner_golden.py,sha256=IIxEDzAyf1ErjErgCMajKtv4Wv4D5u2-Uzn9l4Bns88,10565
163
+ wayfinder_paths/strategies/boros_hype_strategy/test_strategy.py,sha256=hNOXCI8LNdWHjXSx0yVvx8lsf9rWC2ku-ECEwZ_7LVY,6729
164
+ wayfinder_paths/strategies/boros_hype_strategy/types.py,sha256=qjtGgZs78siy8Yok8YoNTbf3z18qnimRFOyBaOXKjfU,12274
165
+ wayfinder_paths/strategies/boros_hype_strategy/withdraw_mixin.py,sha256=kQEuDWSU-4UVeaXCC6SJw3FZkb2yI8iJaCxd0_txHcQ,47447
166
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=cqCmcWIPiOpCwt-82dnOgHnN64ZUITITR3jqIUYDXmA,2906
167
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=GbVo2p6QiG6M7Ma5s671lw8G9JwnMl1h0n9mrtt-ZS8,164
168
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=z9Baa4hH8XRUE4e1kxlpwIY0TfaFABy_GofHWgJUNCY,92790
169
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=2jvtqUKUXVRhXo90ByaPpEjUZ8CT41wn9q7Bwhi-J3I,14457
170
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md,sha256=PZVbRXfoMNNrZUZY3YOWBW9A-6By7vi-IBBDIfvcdNc,3594
171
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/examples.json,sha256=kgNRdZcqne8XTm-Y8Hv1a1pdajRQsey4Qhd5La-iWss,164
172
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py,sha256=WucYr1JFRUfbfnwYrrrh3P2aR-QhtMpTRtJqiPnOZCg,152762
173
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py,sha256=G92MbYJGSiRxh3TfrIxhq1RB9_wWXM36C0_1l8EyKsI,37171
174
+ wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=efyLd2AJHL_JtHF3eZsnHk2wF4NWzEnuLKRA2vOpLtE,2844
175
+ wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json,sha256=pL1DNFEvYvXKK7xXD5oQYFPQj3Cm1ocKnk6r_iZk0IY,423
176
+ wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=7TJ_U4vRTCcTWIg9BPS3OOfySeoyBpDwHhKaQkhNHP0,71801
177
+ wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=G9TnCjqO5Vd9FnXZmLpJZOavHdj_EPsAJIjwUUOUtP8,17182
178
+ wayfinder_paths/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
+ wayfinder_paths/tests/test_mcp_quote_swap.py,sha256=kRYLfAD5WZ4myqNdFxZ9wZ0NMDFgZpriCIkPQA1B1L8,5475
180
+ wayfinder_paths/tests/test_test_coverage.py,sha256=ZU0zhlm1PllvQkrnESPtEVdr-VcFDT6EtPiPRreLukk,7118
181
+ wayfinder_paths/tests/test_utils.py,sha256=VzweYVaO20deZOwR8RKGYFrDnKTW0gZLm3dBwZiMK28,1015
182
+ wayfinder_paths-0.1.24.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
183
+ wayfinder_paths-0.1.24.dist-info/METADATA,sha256=xf3iBEAo3lOJR7ssGZGlitoXlfJK1Q_e54kMHAg349o,14473
184
+ wayfinder_paths-0.1.24.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
185
+ wayfinder_paths-0.1.24.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.1.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,41 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import NotRequired, Required, TypedDict
4
-
5
- from wayfinder_paths.core.clients.WayfinderClient import WayfinderClient
6
- from wayfinder_paths.core.config import get_api_base_url
7
-
8
-
9
- class AddressBalance(TypedDict):
10
- balance: Required[int]
11
- balance_human: NotRequired[float | None]
12
- usd_value: NotRequired[float | None]
13
- address: NotRequired[str]
14
- token_id: NotRequired[str | None]
15
- wallet_address: NotRequired[str]
16
- chain_id: NotRequired[int]
17
-
18
-
19
- class WalletClient(WayfinderClient):
20
- def __init__(self):
21
- super().__init__()
22
- self.api_base_url = get_api_base_url()
23
-
24
- async def get_token_balance_for_address(
25
- self,
26
- *,
27
- wallet_address: str,
28
- query: str,
29
- chain_id: int | None = None,
30
- ) -> AddressBalance:
31
- if chain_id is None:
32
- raise ValueError("chain_id is required")
33
-
34
- url = f"{self.api_base_url}/v1/blockchain/balances/address/"
35
- params = {
36
- "wallet_address": wallet_address,
37
- "chain_id": chain_id,
38
- "query": query,
39
- }
40
- response = await self._authed_request("GET", url, params=params)
41
- return response.json()