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

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

Potentially problematic release.


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

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