wayfinder-paths 0.1.7__tar.gz → 0.1.8__tar.gz

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