wayfinder-paths 0.1.18__tar.gz → 0.1.20__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.

Files changed (148) hide show
  1. wayfinder_paths-0.1.20/PKG-INFO +355 -0
  2. wayfinder_paths-0.1.20/README.md +332 -0
  3. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/pyproject.toml +2 -2
  4. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/__init__.py +0 -2
  5. wayfinder_paths-0.1.20/wayfinder_paths/adapters/balance_adapter/README.md +105 -0
  6. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/balance_adapter/adapter.py +0 -21
  7. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/balance_adapter/test_adapter.py +0 -14
  8. wayfinder_paths-0.1.20/wayfinder_paths/adapters/brap_adapter/README.md +124 -0
  9. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/brap_adapter/__init__.py +0 -4
  10. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/brap_adapter/adapter.py +2 -160
  11. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/brap_adapter/test_adapter.py +0 -15
  12. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperlend_adapter/__init__.py +0 -4
  13. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperlend_adapter/adapter.py +6 -13
  14. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py +0 -17
  15. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +3 -312
  16. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/executor.py +1 -71
  17. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py +0 -57
  18. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py +0 -17
  19. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +2 -42
  20. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/test_executor.py +1 -9
  21. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py +15 -47
  22. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/utils.py +0 -7
  23. wayfinder_paths-0.1.20/wayfinder_paths/adapters/ledger_adapter/README.md +125 -0
  24. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/ledger_adapter/__init__.py +0 -4
  25. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/ledger_adapter/adapter.py +0 -106
  26. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/ledger_adapter/test_adapter.py +0 -12
  27. wayfinder_paths-0.1.20/wayfinder_paths/adapters/moonwell_adapter/README.md +133 -0
  28. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/moonwell_adapter/__init__.py +0 -4
  29. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/moonwell_adapter/adapter.py +9 -121
  30. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/moonwell_adapter/test_adapter.py +84 -83
  31. wayfinder_paths-0.1.20/wayfinder_paths/adapters/pool_adapter/README.md +68 -0
  32. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/pool_adapter/__init__.py +0 -4
  33. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/pool_adapter/adapter.py +0 -19
  34. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/pool_adapter/test_adapter.py +0 -8
  35. wayfinder_paths-0.1.20/wayfinder_paths/adapters/token_adapter/README.md +81 -0
  36. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/token_adapter/adapter.py +0 -32
  37. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/token_adapter/test_adapter.py +1 -12
  38. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/conftest.py +0 -8
  39. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/__init__.py +0 -2
  40. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/adapters/BaseAdapter.py +0 -22
  41. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/adapters/models.py +0 -5
  42. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/analytics/__init__.py +0 -2
  43. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/analytics/bootstrap.py +0 -16
  44. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/analytics/stats.py +0 -7
  45. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/analytics/test_analytics.py +5 -34
  46. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/BRAPClient.py +0 -35
  47. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/ClientManager.py +0 -51
  48. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/HyperlendClient.py +0 -77
  49. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/LedgerClient.py +2 -122
  50. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/PoolClient.py +0 -2
  51. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/TokenClient.py +0 -39
  52. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/WalletClient.py +0 -15
  53. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/WayfinderClient.py +0 -24
  54. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/__init__.py +0 -4
  55. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/clients/protocols.py +25 -98
  56. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/config.py +0 -24
  57. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/constants/__init__.py +0 -7
  58. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/constants/base.py +2 -9
  59. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/constants/erc20_abi.py +0 -5
  60. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/constants/hyperlend_abi.py +0 -7
  61. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/constants/moonwell_abi.py +0 -35
  62. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/engine/StrategyJob.py +0 -32
  63. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/strategies/Strategy.py +0 -99
  64. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/strategies/__init__.py +0 -2
  65. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/utils/erc20_service.py +0 -1
  66. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/utils/evm_helpers.py +0 -50
  67. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/utils/transaction.py +0 -1
  68. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/run_strategy.py +0 -46
  69. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/scripts/create_strategy.py +0 -17
  70. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/scripts/make_wallets.py +1 -4
  71. wayfinder_paths-0.1.20/wayfinder_paths/strategies/__init__.py +0 -0
  72. wayfinder_paths-0.1.20/wayfinder_paths/strategies/basis_trading_strategy/README.md +121 -0
  73. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py +0 -24
  74. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/basis_trading_strategy/strategy.py +36 -400
  75. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +15 -64
  76. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/basis_trading_strategy/types.py +0 -4
  77. wayfinder_paths-0.1.20/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +93 -0
  78. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +5 -28
  79. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +0 -10
  80. wayfinder_paths-0.1.20/wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md +107 -0
  81. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py +23 -227
  82. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py +120 -113
  83. wayfinder_paths-0.1.20/wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +93 -0
  84. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +4 -44
  85. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +2 -35
  86. wayfinder_paths-0.1.20/wayfinder_paths/templates/adapter/README.md +150 -0
  87. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/templates/adapter/adapter.py +0 -9
  88. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/templates/adapter/test_adapter.py +0 -19
  89. wayfinder_paths-0.1.20/wayfinder_paths/templates/strategy/README.md +186 -0
  90. wayfinder_paths-0.1.20/wayfinder_paths/templates/strategy/strategy.py +35 -0
  91. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/templates/strategy/test_strategy.py +0 -28
  92. wayfinder_paths-0.1.20/wayfinder_paths/tests/__init__.py +0 -0
  93. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/tests/test_test_coverage.py +2 -12
  94. wayfinder_paths-0.1.20/wayfinder_paths/tests/test_utils.py +34 -0
  95. wayfinder_paths-0.1.18/PKG-INFO +0 -592
  96. wayfinder_paths-0.1.18/README.md +0 -569
  97. wayfinder_paths-0.1.18/wayfinder_paths/adapters/balance_adapter/README.md +0 -91
  98. wayfinder_paths-0.1.18/wayfinder_paths/adapters/brap_adapter/README.md +0 -247
  99. wayfinder_paths-0.1.18/wayfinder_paths/adapters/ledger_adapter/README.md +0 -145
  100. wayfinder_paths-0.1.18/wayfinder_paths/adapters/moonwell_adapter/README.md +0 -172
  101. wayfinder_paths-0.1.18/wayfinder_paths/adapters/pool_adapter/README.md +0 -89
  102. wayfinder_paths-0.1.18/wayfinder_paths/adapters/token_adapter/README.md +0 -89
  103. wayfinder_paths-0.1.18/wayfinder_paths/core/adapters/__init__.py +0 -5
  104. wayfinder_paths-0.1.18/wayfinder_paths/core/adapters/base.py +0 -5
  105. wayfinder_paths-0.1.18/wayfinder_paths/core/utils/__init__.py +0 -1
  106. wayfinder_paths-0.1.18/wayfinder_paths/strategies/basis_trading_strategy/README.md +0 -213
  107. wayfinder_paths-0.1.18/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +0 -84
  108. wayfinder_paths-0.1.18/wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md +0 -108
  109. wayfinder_paths-0.1.18/wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +0 -88
  110. wayfinder_paths-0.1.18/wayfinder_paths/templates/adapter/README.md +0 -89
  111. wayfinder_paths-0.1.18/wayfinder_paths/templates/strategy/README.md +0 -132
  112. wayfinder_paths-0.1.18/wayfinder_paths/templates/strategy/strategy.py +0 -57
  113. wayfinder_paths-0.1.18/wayfinder_paths/tests/test_utils.py +0 -64
  114. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/LICENSE +0 -0
  115. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/__init__.py +0 -0
  116. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/balance_adapter/examples.json +0 -0
  117. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/brap_adapter/examples.json +0 -0
  118. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/hyperliquid_adapter/__init__.py +0 -0
  119. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/ledger_adapter/examples.json +0 -0
  120. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/pool_adapter/examples.json +0 -0
  121. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/token_adapter/__init__.py +0 -0
  122. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/adapters/token_adapter/examples.json +0 -0
  123. {wayfinder_paths-0.1.18/wayfinder_paths/scripts → wayfinder_paths-0.1.20/wayfinder_paths/core/adapters}/__init__.py +0 -0
  124. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/services/test_local_evm_txn.py +0 -0
  125. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/strategies/base.py +0 -0
  126. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/strategies/descriptors.py +0 -0
  127. {wayfinder_paths-0.1.18/wayfinder_paths/strategies → wayfinder_paths-0.1.20/wayfinder_paths/core/utils}/__init__.py +0 -0
  128. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/utils/wallets.py +0 -0
  129. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/core/utils/web3.py +0 -0
  130. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/enso.py +0 -0
  131. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/erc20.py +0 -0
  132. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/evm.py +0 -0
  133. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/hyper_evm.py +0 -0
  134. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/hyperlend.py +0 -0
  135. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/hyperliquid.py +0 -0
  136. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/moonwell.py +0 -0
  137. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/prjx.py +0 -0
  138. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/policies/util.py +0 -0
  139. {wayfinder_paths-0.1.18/wayfinder_paths/tests → wayfinder_paths-0.1.20/wayfinder_paths/scripts}/__init__.py +0 -0
  140. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/basis_trading_strategy/__init__.py +0 -0
  141. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/basis_trading_strategy/constants.py +0 -0
  142. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/basis_trading_strategy/examples.json +0 -0
  143. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json +0 -0
  144. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/examples.json +0 -0
  145. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json +0 -0
  146. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/templates/adapter/examples.json +0 -0
  147. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/templates/strategy/examples.json +0 -0
  148. {wayfinder_paths-0.1.18 → wayfinder_paths-0.1.20}/wayfinder_paths/tests/test_smoke_manifest.py +0 -0
@@ -0,0 +1,355 @@
1
+ Metadata-Version: 2.3
2
+ Name: wayfinder-paths
3
+ Version: 0.1.20
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: aiohttp (>=3.13.0,<4.0.0)
12
+ Requires-Dist: eth-account (>=0.13.7,<0.14.0)
13
+ Requires-Dist: httpx (>=0.28.1,<0.29.0)
14
+ Requires-Dist: hyperliquid-felix
15
+ Requires-Dist: loguru (>=0.7.3,<0.8.0)
16
+ Requires-Dist: numpy (>=1.26.0,<2.0.0)
17
+ Requires-Dist: pandas (>=2.2.0,<3.0.0)
18
+ Requires-Dist: pydantic (>=2.11.9,<3.0.0)
19
+ Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
20
+ Requires-Dist: web3 (>=7.13.0,<8.0.0)
21
+ Description-Content-Type: text/markdown
22
+
23
+ # Wayfinder Paths
24
+
25
+ [![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/)
26
+ [![PyPI](https://img.shields.io/pypi/v/wayfinder-paths.svg)](https://pypi.org/project/wayfinder-paths/)
27
+ [![Discord](https://img.shields.io/badge/discord-join-7289da.svg)](https://discord.gg/fUVwGMXjm3)
28
+
29
+ Open-source framework for building automated crypto trading strategies and protocol integrations. Develop, test, and deploy strategies with direct wallet integration across multiple chains.
30
+
31
+ ## Quick Start
32
+
33
+ ```bash
34
+ # Clone the repository
35
+ git clone https://github.com/WayfinderFoundation/wayfinder-paths.git
36
+ cd wayfinder-paths
37
+
38
+ # Install Poetry if needed
39
+ curl -sSL https://install.python-poetry.org | python3 -
40
+
41
+ # Install dependencies
42
+ poetry install
43
+
44
+ # Generate test wallets (creates config.json with main wallet)
45
+ just create-wallets
46
+ # Or: poetry run python wayfinder_paths/scripts/make_wallets.py -n 1
47
+
48
+ # Create a strategy-specific wallet
49
+ just create-wallet stablecoin_yield_strategy
50
+ # Or: poetry run python wayfinder_paths/scripts/make_wallets.py --label stablecoin_yield_strategy
51
+
52
+ # Add your API key to config.json under system.api_key
53
+
54
+ # Run a strategy
55
+ poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --action status --config config.json
56
+ ```
57
+
58
+ ## Repository Structure
59
+
60
+ ```
61
+ wayfinder-paths/
62
+ ├── wayfinder_paths/
63
+ │ ├── core/ # Core framework (maintained by team)
64
+ │ │ ├── adapters/ # BaseAdapter class
65
+ │ │ ├── clients/ # API clients (Token, Wallet, Pool, BRAP, Ledger, etc.)
66
+ │ │ ├── engine/ # StrategyJob execution engine
67
+ │ │ ├── strategies/ # Strategy base class and descriptors
68
+ │ │ ├── utils/ # Web3, EVM helpers, transaction utilities
69
+ │ │ └── config.py # Configuration system
70
+ │ ├── adapters/ # Protocol integrations (community contributions)
71
+ │ │ ├── balance_adapter/ # Wallet/token balances and transfers
72
+ │ │ ├── brap_adapter/ # Cross-chain swaps and bridges
73
+ │ │ ├── ledger_adapter/ # Transaction recording
74
+ │ │ ├── moonwell_adapter/ # Moonwell lending protocol
75
+ │ │ ├── pool_adapter/ # DeFi pool data
76
+ │ │ └── token_adapter/ # Token metadata and prices
77
+ │ ├── strategies/ # Trading strategies (community contributions)
78
+ │ │ ├── basis_trading_strategy/
79
+ │ │ ├── hyperlend_stable_yield_strategy/
80
+ │ │ ├── moonwell_wsteth_loop_strategy/
81
+ │ │ └── stablecoin_yield_strategy/
82
+ │ ├── templates/ # Starter templates
83
+ │ │ ├── adapter/
84
+ │ │ └── strategy/
85
+ │ ├── scripts/ # Utility scripts
86
+ │ └── run_strategy.py # CLI entry point
87
+ ├── config.json # Local config (not committed)
88
+ ├── pyproject.toml # Project dependencies
89
+ └── README.md
90
+ ```
91
+
92
+ ## Architecture
93
+
94
+ ### Layered Design
95
+
96
+ ```
97
+ Strategy Layer - Trading logic (deposit, update, withdraw, exit)
98
+
99
+ Adapter Layer - Protocol integrations (BalanceAdapter, PoolAdapter, etc.)
100
+
101
+ Client Layer - API wrappers (TokenClient, WalletClient, PoolClient, etc.)
102
+
103
+ Network - RPCs, Wayfinder API, external services
104
+ ```
105
+
106
+ **Key principle**: Strategies call adapters, adapters compose clients, clients handle network communication.
107
+
108
+ ### Strategies
109
+
110
+ Strategies implement trading logic by extending the `Strategy` base class:
111
+
112
+ ```python
113
+ from wayfinder_paths.core.strategies.Strategy import Strategy, StatusDict, StatusTuple
114
+
115
+ class MyStrategy(Strategy):
116
+ name = "My Strategy"
117
+
118
+ def __init__(self, config=None, **kwargs):
119
+ super().__init__(config, **kwargs)
120
+ # Register adapters
121
+ balance_adapter = BalanceAdapter(config, **kwargs)
122
+ self.register_adapters([balance_adapter])
123
+ self.balance_adapter = balance_adapter
124
+
125
+ async def deposit(self, main_token_amount=0.0, gas_token_amount=0.0) -> StatusTuple:
126
+ """Move funds from main wallet into strategy wallet."""
127
+ return (True, "Deposited successfully")
128
+
129
+ async def update(self) -> StatusTuple:
130
+ """Rebalance or optimize positions."""
131
+ return (True, "Updated successfully")
132
+
133
+ async def exit(self, **kwargs) -> StatusTuple:
134
+ """Transfer funds from strategy wallet back to main wallet."""
135
+ return (True, "Exited successfully")
136
+
137
+ async def _status(self) -> StatusDict:
138
+ """Report current state."""
139
+ return {
140
+ "portfolio_value": 0.0,
141
+ "net_deposit": 0.0,
142
+ "strategy_status": {"message": "healthy"},
143
+ "gas_available": 0.0,
144
+ "gassed_up": True,
145
+ }
146
+ ```
147
+
148
+ **Required methods**: `deposit`, `update`, `exit`, `_status`
149
+
150
+ **Optional methods**: `withdraw` (has default implementation), `partial_liquidate`, `setup`, `health_check`
151
+
152
+ ### Adapters
153
+
154
+ Adapters wrap protocol-specific logic and expose capabilities to strategies:
155
+
156
+ ```python
157
+ from wayfinder_paths.core.adapters.BaseAdapter import BaseAdapter
158
+
159
+ class MyAdapter(BaseAdapter):
160
+ adapter_type = "MY_ADAPTER"
161
+
162
+ def __init__(self, config=None):
163
+ super().__init__("my_adapter", config)
164
+ self.client = SomeClient()
165
+
166
+ async def connect(self) -> bool:
167
+ return True
168
+
169
+ async def do_something(self, param: str) -> tuple[bool, Any]:
170
+ try:
171
+ result = await self.client.call(param)
172
+ return (True, result)
173
+ except Exception as e:
174
+ return (False, str(e))
175
+ ```
176
+
177
+ All adapter methods return `(success: bool, data: Any)` tuples.
178
+
179
+ ### Built-in Adapters
180
+
181
+ | Adapter | Type | Purpose |
182
+ |---------|------|---------|
183
+ | BalanceAdapter | BALANCE | Wallet/token balances, cross-wallet transfers with ledger tracking |
184
+ | PoolAdapter | POOL | DeFi pool metadata and yield analytics |
185
+ | BRAPAdapter | BRAP | Cross-chain swap quotes and execution |
186
+ | LedgerAdapter | LEDGER | Transaction recording and net deposit tracking |
187
+ | TokenAdapter | TOKEN | Token metadata and price feeds |
188
+ | MoonwellAdapter | MOONWELL | Moonwell lending/borrowing on Base |
189
+
190
+ ### Built-in Strategies
191
+
192
+ | Strategy | Description | Chain |
193
+ |----------|-------------|-------|
194
+ | stablecoin_yield_strategy | USDC yield optimization on Base | Base |
195
+ | hyperlend_stable_yield_strategy | Stablecoin yield on HyperLend | HyperEVM |
196
+ | moonwell_wsteth_loop_strategy | Leveraged wstETH carry trade | Base |
197
+ | basis_trading_strategy | Delta-neutral funding rate capture | Hyperliquid |
198
+
199
+ ## Configuration
200
+
201
+ Configuration lives in `config.json`:
202
+
203
+ ```json
204
+ {
205
+ "system": {
206
+ "api_base_url": "https://api.wayfinder.ai",
207
+ "api_key": "sk_live_..."
208
+ },
209
+ "strategy": {
210
+ "rpc_urls": {
211
+ "1": "https://eth.llamarpc.com",
212
+ "8453": "https://mainnet.base.org",
213
+ "42161": "https://arb1.arbitrum.io/rpc"
214
+ }
215
+ },
216
+ "wallets": [
217
+ {
218
+ "label": "main",
219
+ "address": "0x...",
220
+ "private_key_hex": "0x..."
221
+ },
222
+ {
223
+ "label": "stablecoin_yield_strategy",
224
+ "address": "0x...",
225
+ "private_key_hex": "0x..."
226
+ }
227
+ ]
228
+ }
229
+ ```
230
+
231
+ - **system.api_key**: Required for Wayfinder API authentication (sent as `X-API-KEY` header)
232
+ - **wallets**: Array of wallets with labels; strategies look up wallets by label matching their directory name
233
+ - **strategy.rpc_urls**: Custom RPC endpoints by chain ID
234
+
235
+ See [CONFIG_GUIDE.md](CONFIG_GUIDE.md) for detailed configuration documentation.
236
+
237
+ ## CLI Usage
238
+
239
+ ```bash
240
+ # Check strategy status
241
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action status --config config.json
242
+
243
+ # Deposit funds
244
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action deposit \
245
+ --main-token-amount 100 --gas-token-amount 0.01 --config config.json
246
+
247
+ # Run update cycle
248
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action update --config config.json
249
+
250
+ # Withdraw funds
251
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action withdraw --config config.json
252
+
253
+ # Exit (return funds to main wallet)
254
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action exit --config config.json
255
+
256
+ # Run continuously
257
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action run --config config.json
258
+
259
+ # Partial liquidation
260
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action partial-liquidate \
261
+ --amount 50 --config config.json
262
+ ```
263
+
264
+ **Available actions**: `status`, `deposit`, `update`, `withdraw`, `exit`, `run`, `partial-liquidate`, `policy`, `script`
265
+
266
+ ## Testing
267
+
268
+ ```bash
269
+ # Generate test wallets first
270
+ just create-wallets
271
+
272
+ # Run all smoke tests
273
+ poetry run pytest -k smoke -v
274
+
275
+ # Test specific strategy
276
+ poetry run pytest wayfinder_paths/strategies/my_strategy/ -v
277
+
278
+ # Test specific adapter
279
+ poetry run pytest wayfinder_paths/adapters/my_adapter/ -v
280
+
281
+ # Run with coverage
282
+ poetry run pytest --cov=wayfinder_paths -v
283
+ ```
284
+
285
+ See [TESTING.md](TESTING.md) for detailed testing guidance.
286
+
287
+ ## Contributing
288
+
289
+ ### Creating a New Strategy
290
+
291
+ ```bash
292
+ # Use the convenience command (creates wallet automatically)
293
+ just create-strategy "My Strategy Name"
294
+
295
+ # Or manually copy the template
296
+ cp -r wayfinder_paths/templates/strategy wayfinder_paths/strategies/my_strategy
297
+ ```
298
+
299
+ Then:
300
+ 1. Rename the class in `strategy.py`
301
+ 2. Implement `deposit`, `update`, `exit`, and `_status` methods
302
+ 3. Add tests in `test_strategy.py`
303
+ 4. Create `examples.json` with test data
304
+ 5. Update the README
305
+
306
+ ### Creating a New Adapter
307
+
308
+ ```bash
309
+ cp -r wayfinder_paths/templates/adapter wayfinder_paths/adapters/my_adapter
310
+ ```
311
+
312
+ Then:
313
+ 1. Rename the class in `adapter.py`
314
+ 2. Implement protocol-specific methods
315
+ 3. Add tests in `test_adapter.py`
316
+ 4. Update the README
317
+
318
+ ### Guidelines
319
+
320
+ - Strategies call adapters, not clients directly
321
+ - All adapter methods return `(success, data)` tuples
322
+ - Use `examples.json` for strategy test data
323
+ - Never hardcode API keys or private keys
324
+ - Add tests before submitting PRs
325
+
326
+ ## Publishing
327
+
328
+ ```bash
329
+ # Must be on main branch
330
+ export PUBLISH_TOKEN="your_pypi_token"
331
+ just publish
332
+ ```
333
+
334
+ **Version bumping**: Update `version` in `pyproject.toml` before publishing. Follow [SemVer](https://semver.org/):
335
+ - PATCH: Bug fixes
336
+ - MINOR: New features (backward compatible)
337
+ - MAJOR: Breaking changes
338
+
339
+ ## Security
340
+
341
+ - Never commit `config.json` (contains private keys)
342
+ - Use test wallets for development
343
+ - Test on testnets when available
344
+ - Validate all inputs
345
+ - Set appropriate gas limits
346
+
347
+ ## Community
348
+
349
+ - [Discord](https://discord.gg/fUVwGMXjm3)
350
+ - [GitHub Issues](https://github.com/WayfinderFoundation/wayfinder-paths/issues)
351
+
352
+ ## License
353
+
354
+ MIT License - see [LICENSE](LICENSE) for details.
355
+
@@ -0,0 +1,332 @@
1
+ # Wayfinder Paths
2
+
3
+ [![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/downloads/)
4
+ [![PyPI](https://img.shields.io/pypi/v/wayfinder-paths.svg)](https://pypi.org/project/wayfinder-paths/)
5
+ [![Discord](https://img.shields.io/badge/discord-join-7289da.svg)](https://discord.gg/fUVwGMXjm3)
6
+
7
+ Open-source framework for building automated crypto trading strategies and protocol integrations. Develop, test, and deploy strategies with direct wallet integration across multiple chains.
8
+
9
+ ## Quick Start
10
+
11
+ ```bash
12
+ # Clone the repository
13
+ git clone https://github.com/WayfinderFoundation/wayfinder-paths.git
14
+ cd wayfinder-paths
15
+
16
+ # Install Poetry if needed
17
+ curl -sSL https://install.python-poetry.org | python3 -
18
+
19
+ # Install dependencies
20
+ poetry install
21
+
22
+ # Generate test wallets (creates config.json with main wallet)
23
+ just create-wallets
24
+ # Or: poetry run python wayfinder_paths/scripts/make_wallets.py -n 1
25
+
26
+ # Create a strategy-specific wallet
27
+ just create-wallet stablecoin_yield_strategy
28
+ # Or: poetry run python wayfinder_paths/scripts/make_wallets.py --label stablecoin_yield_strategy
29
+
30
+ # Add your API key to config.json under system.api_key
31
+
32
+ # Run a strategy
33
+ poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --action status --config config.json
34
+ ```
35
+
36
+ ## Repository Structure
37
+
38
+ ```
39
+ wayfinder-paths/
40
+ ├── wayfinder_paths/
41
+ │ ├── core/ # Core framework (maintained by team)
42
+ │ │ ├── adapters/ # BaseAdapter class
43
+ │ │ ├── clients/ # API clients (Token, Wallet, Pool, BRAP, Ledger, etc.)
44
+ │ │ ├── engine/ # StrategyJob execution engine
45
+ │ │ ├── strategies/ # Strategy base class and descriptors
46
+ │ │ ├── utils/ # Web3, EVM helpers, transaction utilities
47
+ │ │ └── config.py # Configuration system
48
+ │ ├── adapters/ # Protocol integrations (community contributions)
49
+ │ │ ├── balance_adapter/ # Wallet/token balances and transfers
50
+ │ │ ├── brap_adapter/ # Cross-chain swaps and bridges
51
+ │ │ ├── ledger_adapter/ # Transaction recording
52
+ │ │ ├── moonwell_adapter/ # Moonwell lending protocol
53
+ │ │ ├── pool_adapter/ # DeFi pool data
54
+ │ │ └── token_adapter/ # Token metadata and prices
55
+ │ ├── strategies/ # Trading strategies (community contributions)
56
+ │ │ ├── basis_trading_strategy/
57
+ │ │ ├── hyperlend_stable_yield_strategy/
58
+ │ │ ├── moonwell_wsteth_loop_strategy/
59
+ │ │ └── stablecoin_yield_strategy/
60
+ │ ├── templates/ # Starter templates
61
+ │ │ ├── adapter/
62
+ │ │ └── strategy/
63
+ │ ├── scripts/ # Utility scripts
64
+ │ └── run_strategy.py # CLI entry point
65
+ ├── config.json # Local config (not committed)
66
+ ├── pyproject.toml # Project dependencies
67
+ └── README.md
68
+ ```
69
+
70
+ ## Architecture
71
+
72
+ ### Layered Design
73
+
74
+ ```
75
+ Strategy Layer - Trading logic (deposit, update, withdraw, exit)
76
+
77
+ Adapter Layer - Protocol integrations (BalanceAdapter, PoolAdapter, etc.)
78
+
79
+ Client Layer - API wrappers (TokenClient, WalletClient, PoolClient, etc.)
80
+
81
+ Network - RPCs, Wayfinder API, external services
82
+ ```
83
+
84
+ **Key principle**: Strategies call adapters, adapters compose clients, clients handle network communication.
85
+
86
+ ### Strategies
87
+
88
+ Strategies implement trading logic by extending the `Strategy` base class:
89
+
90
+ ```python
91
+ from wayfinder_paths.core.strategies.Strategy import Strategy, StatusDict, StatusTuple
92
+
93
+ class MyStrategy(Strategy):
94
+ name = "My Strategy"
95
+
96
+ def __init__(self, config=None, **kwargs):
97
+ super().__init__(config, **kwargs)
98
+ # Register adapters
99
+ balance_adapter = BalanceAdapter(config, **kwargs)
100
+ self.register_adapters([balance_adapter])
101
+ self.balance_adapter = balance_adapter
102
+
103
+ async def deposit(self, main_token_amount=0.0, gas_token_amount=0.0) -> StatusTuple:
104
+ """Move funds from main wallet into strategy wallet."""
105
+ return (True, "Deposited successfully")
106
+
107
+ async def update(self) -> StatusTuple:
108
+ """Rebalance or optimize positions."""
109
+ return (True, "Updated successfully")
110
+
111
+ async def exit(self, **kwargs) -> StatusTuple:
112
+ """Transfer funds from strategy wallet back to main wallet."""
113
+ return (True, "Exited successfully")
114
+
115
+ async def _status(self) -> StatusDict:
116
+ """Report current state."""
117
+ return {
118
+ "portfolio_value": 0.0,
119
+ "net_deposit": 0.0,
120
+ "strategy_status": {"message": "healthy"},
121
+ "gas_available": 0.0,
122
+ "gassed_up": True,
123
+ }
124
+ ```
125
+
126
+ **Required methods**: `deposit`, `update`, `exit`, `_status`
127
+
128
+ **Optional methods**: `withdraw` (has default implementation), `partial_liquidate`, `setup`, `health_check`
129
+
130
+ ### Adapters
131
+
132
+ Adapters wrap protocol-specific logic and expose capabilities to strategies:
133
+
134
+ ```python
135
+ from wayfinder_paths.core.adapters.BaseAdapter import BaseAdapter
136
+
137
+ class MyAdapter(BaseAdapter):
138
+ adapter_type = "MY_ADAPTER"
139
+
140
+ def __init__(self, config=None):
141
+ super().__init__("my_adapter", config)
142
+ self.client = SomeClient()
143
+
144
+ async def connect(self) -> bool:
145
+ return True
146
+
147
+ async def do_something(self, param: str) -> tuple[bool, Any]:
148
+ try:
149
+ result = await self.client.call(param)
150
+ return (True, result)
151
+ except Exception as e:
152
+ return (False, str(e))
153
+ ```
154
+
155
+ All adapter methods return `(success: bool, data: Any)` tuples.
156
+
157
+ ### Built-in Adapters
158
+
159
+ | Adapter | Type | Purpose |
160
+ |---------|------|---------|
161
+ | BalanceAdapter | BALANCE | Wallet/token balances, cross-wallet transfers with ledger tracking |
162
+ | PoolAdapter | POOL | DeFi pool metadata and yield analytics |
163
+ | BRAPAdapter | BRAP | Cross-chain swap quotes and execution |
164
+ | LedgerAdapter | LEDGER | Transaction recording and net deposit tracking |
165
+ | TokenAdapter | TOKEN | Token metadata and price feeds |
166
+ | MoonwellAdapter | MOONWELL | Moonwell lending/borrowing on Base |
167
+
168
+ ### Built-in Strategies
169
+
170
+ | Strategy | Description | Chain |
171
+ |----------|-------------|-------|
172
+ | stablecoin_yield_strategy | USDC yield optimization on Base | Base |
173
+ | hyperlend_stable_yield_strategy | Stablecoin yield on HyperLend | HyperEVM |
174
+ | moonwell_wsteth_loop_strategy | Leveraged wstETH carry trade | Base |
175
+ | basis_trading_strategy | Delta-neutral funding rate capture | Hyperliquid |
176
+
177
+ ## Configuration
178
+
179
+ Configuration lives in `config.json`:
180
+
181
+ ```json
182
+ {
183
+ "system": {
184
+ "api_base_url": "https://api.wayfinder.ai",
185
+ "api_key": "sk_live_..."
186
+ },
187
+ "strategy": {
188
+ "rpc_urls": {
189
+ "1": "https://eth.llamarpc.com",
190
+ "8453": "https://mainnet.base.org",
191
+ "42161": "https://arb1.arbitrum.io/rpc"
192
+ }
193
+ },
194
+ "wallets": [
195
+ {
196
+ "label": "main",
197
+ "address": "0x...",
198
+ "private_key_hex": "0x..."
199
+ },
200
+ {
201
+ "label": "stablecoin_yield_strategy",
202
+ "address": "0x...",
203
+ "private_key_hex": "0x..."
204
+ }
205
+ ]
206
+ }
207
+ ```
208
+
209
+ - **system.api_key**: Required for Wayfinder API authentication (sent as `X-API-KEY` header)
210
+ - **wallets**: Array of wallets with labels; strategies look up wallets by label matching their directory name
211
+ - **strategy.rpc_urls**: Custom RPC endpoints by chain ID
212
+
213
+ See [CONFIG_GUIDE.md](CONFIG_GUIDE.md) for detailed configuration documentation.
214
+
215
+ ## CLI Usage
216
+
217
+ ```bash
218
+ # Check strategy status
219
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action status --config config.json
220
+
221
+ # Deposit funds
222
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action deposit \
223
+ --main-token-amount 100 --gas-token-amount 0.01 --config config.json
224
+
225
+ # Run update cycle
226
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action update --config config.json
227
+
228
+ # Withdraw funds
229
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action withdraw --config config.json
230
+
231
+ # Exit (return funds to main wallet)
232
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action exit --config config.json
233
+
234
+ # Run continuously
235
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action run --config config.json
236
+
237
+ # Partial liquidation
238
+ poetry run python wayfinder_paths/run_strategy.py <strategy_name> --action partial-liquidate \
239
+ --amount 50 --config config.json
240
+ ```
241
+
242
+ **Available actions**: `status`, `deposit`, `update`, `withdraw`, `exit`, `run`, `partial-liquidate`, `policy`, `script`
243
+
244
+ ## Testing
245
+
246
+ ```bash
247
+ # Generate test wallets first
248
+ just create-wallets
249
+
250
+ # Run all smoke tests
251
+ poetry run pytest -k smoke -v
252
+
253
+ # Test specific strategy
254
+ poetry run pytest wayfinder_paths/strategies/my_strategy/ -v
255
+
256
+ # Test specific adapter
257
+ poetry run pytest wayfinder_paths/adapters/my_adapter/ -v
258
+
259
+ # Run with coverage
260
+ poetry run pytest --cov=wayfinder_paths -v
261
+ ```
262
+
263
+ See [TESTING.md](TESTING.md) for detailed testing guidance.
264
+
265
+ ## Contributing
266
+
267
+ ### Creating a New Strategy
268
+
269
+ ```bash
270
+ # Use the convenience command (creates wallet automatically)
271
+ just create-strategy "My Strategy Name"
272
+
273
+ # Or manually copy the template
274
+ cp -r wayfinder_paths/templates/strategy wayfinder_paths/strategies/my_strategy
275
+ ```
276
+
277
+ Then:
278
+ 1. Rename the class in `strategy.py`
279
+ 2. Implement `deposit`, `update`, `exit`, and `_status` methods
280
+ 3. Add tests in `test_strategy.py`
281
+ 4. Create `examples.json` with test data
282
+ 5. Update the README
283
+
284
+ ### Creating a New Adapter
285
+
286
+ ```bash
287
+ cp -r wayfinder_paths/templates/adapter wayfinder_paths/adapters/my_adapter
288
+ ```
289
+
290
+ Then:
291
+ 1. Rename the class in `adapter.py`
292
+ 2. Implement protocol-specific methods
293
+ 3. Add tests in `test_adapter.py`
294
+ 4. Update the README
295
+
296
+ ### Guidelines
297
+
298
+ - Strategies call adapters, not clients directly
299
+ - All adapter methods return `(success, data)` tuples
300
+ - Use `examples.json` for strategy test data
301
+ - Never hardcode API keys or private keys
302
+ - Add tests before submitting PRs
303
+
304
+ ## Publishing
305
+
306
+ ```bash
307
+ # Must be on main branch
308
+ export PUBLISH_TOKEN="your_pypi_token"
309
+ just publish
310
+ ```
311
+
312
+ **Version bumping**: Update `version` in `pyproject.toml` before publishing. Follow [SemVer](https://semver.org/):
313
+ - PATCH: Bug fixes
314
+ - MINOR: New features (backward compatible)
315
+ - MAJOR: Breaking changes
316
+
317
+ ## Security
318
+
319
+ - Never commit `config.json` (contains private keys)
320
+ - Use test wallets for development
321
+ - Test on testnets when available
322
+ - Validate all inputs
323
+ - Set appropriate gas limits
324
+
325
+ ## Community
326
+
327
+ - [Discord](https://discord.gg/fUVwGMXjm3)
328
+ - [GitHub Issues](https://github.com/WayfinderFoundation/wayfinder-paths/issues)
329
+
330
+ ## License
331
+
332
+ MIT License - see [LICENSE](LICENSE) for details.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "wayfinder-paths"
3
- version = "0.1.18"
3
+ version = "0.1.20"
4
4
  description = "Wayfinder Path: strategies and adapters"
5
5
  readme = "README.md"
6
6
  authors = ["Wayfinder <dev@wayfinder.ai>"]
@@ -19,7 +19,7 @@ eth-account = "^0.13.7"
19
19
  aiohttp = "^3.13.0"
20
20
  numpy = "^1.26.0"
21
21
  pandas = "^2.2.0"
22
- hyperliquid-python-sdk = "^0.21.0"
22
+ hyperliquid-felix = "*"
23
23
 
24
24
  [tool.poetry.group.dev.dependencies]
25
25
  pytest = "^8.4.2"