wayfinder-paths 0.1.10__py3-none-any.whl → 0.1.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of wayfinder-paths might be problematic. Click here for more details.
- wayfinder_paths/adapters/balance_adapter/adapter.py +3 -7
- wayfinder_paths/adapters/brap_adapter/adapter.py +10 -13
- wayfinder_paths/adapters/hyperlend_adapter/adapter.py +6 -9
- wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +1 -1
- wayfinder_paths/adapters/hyperliquid_adapter/executor.py +44 -5
- wayfinder_paths/adapters/hyperliquid_adapter/test_executor.py +104 -0
- wayfinder_paths/adapters/moonwell_adapter/adapter.py +0 -3
- wayfinder_paths/adapters/pool_adapter/README.md +4 -19
- wayfinder_paths/adapters/pool_adapter/adapter.py +4 -29
- wayfinder_paths/adapters/pool_adapter/examples.json +6 -7
- wayfinder_paths/adapters/pool_adapter/test_adapter.py +8 -8
- wayfinder_paths/core/clients/AuthClient.py +2 -2
- wayfinder_paths/core/clients/BRAPClient.py +2 -2
- wayfinder_paths/core/clients/HyperlendClient.py +2 -2
- wayfinder_paths/core/clients/PoolClient.py +18 -54
- wayfinder_paths/core/clients/TokenClient.py +3 -3
- wayfinder_paths/core/clients/WalletClient.py +2 -2
- wayfinder_paths/core/clients/WayfinderClient.py +9 -10
- wayfinder_paths/core/clients/protocols.py +1 -7
- wayfinder_paths/core/config.py +60 -224
- wayfinder_paths/core/services/base.py +0 -55
- wayfinder_paths/core/services/local_evm_txn.py +37 -134
- wayfinder_paths/core/strategies/Strategy.py +3 -3
- wayfinder_paths/core/strategies/descriptors.py +7 -0
- wayfinder_paths/core/utils/evm_helpers.py +5 -28
- wayfinder_paths/core/utils/wallets.py +12 -19
- wayfinder_paths/core/wallets/README.md +1 -1
- wayfinder_paths/run_strategy.py +10 -8
- wayfinder_paths/scripts/create_strategy.py +5 -5
- wayfinder_paths/scripts/make_wallets.py +5 -5
- wayfinder_paths/scripts/run_strategy.py +3 -3
- wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py +1 -1
- wayfinder_paths/strategies/basis_trading_strategy/strategy.py +196 -515
- wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +228 -11
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +2 -2
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +1 -0
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md +1 -1
- wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py +8 -7
- wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +2 -2
- wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +25 -25
- wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +28 -9
- wayfinder_paths/templates/adapter/README.md +1 -1
- {wayfinder_paths-0.1.10.dist-info → wayfinder_paths-0.1.13.dist-info}/METADATA +15 -18
- {wayfinder_paths-0.1.10.dist-info → wayfinder_paths-0.1.13.dist-info}/RECORD +46 -48
- wayfinder_paths/CONFIG_GUIDE.md +0 -390
- wayfinder_paths/config.example.json +0 -22
- wayfinder_paths/core/settings.py +0 -61
- {wayfinder_paths-0.1.10.dist-info → wayfinder_paths-0.1.13.dist-info}/LICENSE +0 -0
- {wayfinder_paths-0.1.10.dist-info → wayfinder_paths-0.1.13.dist-info}/WHEEL +0 -0
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
wayfinder_paths/CONFIG_GUIDE.md,sha256=p8eT2FC_dp4bBdezwGmQYLiefLNze-I6lY__UXv07zQ,12975
|
|
2
1
|
wayfinder_paths/__init__.py,sha256=YgOg-PRPT3ROh0zg6hgQyQE-YFkFGw6TM77zDvB4_sE,427
|
|
3
2
|
wayfinder_paths/abis/generic/erc20.json,sha256=geyzVzdTNt3u1XHKxi4seszP_GIWIzPTl0FYgiftRnM,9336
|
|
4
3
|
wayfinder_paths/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
4
|
wayfinder_paths/adapters/balance_adapter/README.md,sha256=t8-QRfU49g9FmJ18xDGbN_k-ybWebBfM7s4bBrnyo-g,3635
|
|
6
|
-
wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=
|
|
5
|
+
wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=_Y7AiI8lXqGv7RV8jteTGD1FMw9_Er02F6aQ2swjApg,8178
|
|
7
6
|
wayfinder_paths/adapters/balance_adapter/examples.json,sha256=3R1M4B_VsIy29viAuFT9nQbnQShWl8ZbU-rnSNWUW9U,129
|
|
8
7
|
wayfinder_paths/adapters/balance_adapter/test_adapter.py,sha256=Z8iTRU0Rv1UsODuVSo5q4j-DrTXMd4YRxvaxLdZE4Us,1878
|
|
9
8
|
wayfinder_paths/adapters/brap_adapter/README.md,sha256=H4_ep4r17DpQ0rnTSIbRsAdnK174NGBAcHNlHhvEA7o,7880
|
|
10
9
|
wayfinder_paths/adapters/brap_adapter/__init__.py,sha256=jpqxZ-Bv_8kBo-lhgO_QCWaVZNq_WwlkNBHD4RsqOJg,90
|
|
11
|
-
wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=
|
|
10
|
+
wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=QoTEm4wOO1yiZz2tmoThOdD_pbZP1S8XzsXwQiR6u7I,30054
|
|
12
11
|
wayfinder_paths/adapters/brap_adapter/examples.json,sha256=KWuAklUspd2uvk0s2ey8gczg4nbzhdwxQqzhascyMiQ,5287
|
|
13
12
|
wayfinder_paths/adapters/brap_adapter/test_adapter.py,sha256=w2q35tcE7j2QG53jSm_XZgIk7OKL4O51fnFuGMVRSNQ,10754
|
|
14
13
|
wayfinder_paths/adapters/hyperlend_adapter/__init__.py,sha256=DsWOnEn-Tlu9ZoIoGaFeSqOYI3b4lXGVK3_FTntWpLw,139
|
|
15
|
-
wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=
|
|
14
|
+
wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=_boW8n7cSySYbxmlbeJ4jDuw5Bj21fGx0irGVBXWQnw,10135
|
|
16
15
|
wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py,sha256=iLnrALVnK7JWJV2KFDqBYZlr1ShW1tjHC-kCV6-FlgE,9558
|
|
17
16
|
wayfinder_paths/adapters/hyperliquid_adapter/__init__.py,sha256=QpA258RzVbxzsha86HQduAuNVG0g0qvsI5OcZunQ8DQ,467
|
|
18
|
-
wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=
|
|
19
|
-
wayfinder_paths/adapters/hyperliquid_adapter/executor.py,sha256=
|
|
17
|
+
wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=Z5Gl9M9wk7PVUIyP_i2oAMegmCTbVFd48Zp57DURh6M,34510
|
|
18
|
+
wayfinder_paths/adapters/hyperliquid_adapter/executor.py,sha256=ix1FmRO6DPiPk0BwGy4zrCP5IfKzzMSQNhnOmIewfGA,18977
|
|
20
19
|
wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py,sha256=nOBsrAka8PKv5h8SuoJuLTH4HYS4n0vpTIADUCyDKlA,37546
|
|
21
20
|
wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py,sha256=JEDeIMSTdrgcSy4BGSVB0CixQzl3NsKpukOZ9mRu3kE,4542
|
|
22
21
|
wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=lnlL0njECM6C4hVlsEZ4_7wtcixIBO8qqTRO6b1yGGg,7672
|
|
22
|
+
wayfinder_paths/adapters/hyperliquid_adapter/test_executor.py,sha256=6tAstfO2fFTWWYSqYsd3jzY5iQ1RrCsLl_0pbwJO-bE,4147
|
|
23
23
|
wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py,sha256=2gSrXJgtfrTqNOQIhBS92vUkfcwhFsMLgFRkf1bzLy8,7290
|
|
24
24
|
wayfinder_paths/adapters/hyperliquid_adapter/utils.py,sha256=WjLEaNVvcB8FfYlTrwZBrmw7k2MLS5KhBeW4NNoLlVI,4254
|
|
25
25
|
wayfinder_paths/adapters/ledger_adapter/README.md,sha256=_tGIpIkg-TCYddf8d4FhJvJuHV79iTizqePosKX2ekU,4079
|
|
@@ -29,19 +29,18 @@ wayfinder_paths/adapters/ledger_adapter/examples.json,sha256=DdqTSe4vnBrfIycQVQQ
|
|
|
29
29
|
wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=Z1-rPP9k5fI-8ofWMKgU3syzNegKGH_hGO6CKApQj1c,7470
|
|
30
30
|
wayfinder_paths/adapters/moonwell_adapter/README.md,sha256=PyQllVXgW0aUUoWhAZ5phLPAxtR9A5GkwesnZznckV8,5465
|
|
31
31
|
wayfinder_paths/adapters/moonwell_adapter/__init__.py,sha256=Gf6AM4BylxxPenUQ_cveUg70QcB9i61SIYaCsXMSjXw,135
|
|
32
|
-
wayfinder_paths/adapters/moonwell_adapter/adapter.py,sha256=
|
|
32
|
+
wayfinder_paths/adapters/moonwell_adapter/adapter.py,sha256=kpzuIEUQHHo8WUkt-XGO5FqMtPBRNubYqkkWT0jKvKM,45030
|
|
33
33
|
wayfinder_paths/adapters/moonwell_adapter/test_adapter.py,sha256=DLbbCW6ytjKY2C5aQUrW-YBFyrXjush9qbGWiuL42DM,23440
|
|
34
|
-
wayfinder_paths/adapters/pool_adapter/README.md,sha256
|
|
34
|
+
wayfinder_paths/adapters/pool_adapter/README.md,sha256=-3FJ-NcVdP5IdnBJfljySKuzhoKSrFAjZttHvqAicbo,2453
|
|
35
35
|
wayfinder_paths/adapters/pool_adapter/__init__.py,sha256=rv56pYzz2Gqiz33uoPJktCQRe3CRt8U9ry5GbjVgK3A,90
|
|
36
|
-
wayfinder_paths/adapters/pool_adapter/adapter.py,sha256
|
|
37
|
-
wayfinder_paths/adapters/pool_adapter/examples.json,sha256=
|
|
38
|
-
wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=
|
|
36
|
+
wayfinder_paths/adapters/pool_adapter/adapter.py,sha256=FrzgoXUkrLjL_SDHT5-zK7VMTPx6QdDdMpO--R5b5AE,1842
|
|
37
|
+
wayfinder_paths/adapters/pool_adapter/examples.json,sha256=NW-7J6_zXxky8uMDRym3jJaPP8hZLEiytQ3WKoZEP54,855
|
|
38
|
+
wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=jz3QYP8ubHjIfE4Sz7CMQai_7zqG9IJBjXz7CKC0PU0,2625
|
|
39
39
|
wayfinder_paths/adapters/token_adapter/README.md,sha256=TXn7pYQ6bCAiYNl-avem3_Hoz0p3JVyyThxObr59s8k,2673
|
|
40
40
|
wayfinder_paths/adapters/token_adapter/__init__.py,sha256=nEmxrvffEygn3iKH3cZTNLkhnUUhlUAEtshmrFRAjq8,62
|
|
41
41
|
wayfinder_paths/adapters/token_adapter/adapter.py,sha256=JEb7A8wJYHxENFhJ6upAgnQAbPZeVfYi6OGs1hiHxnA,3432
|
|
42
42
|
wayfinder_paths/adapters/token_adapter/examples.json,sha256=RW-3xazj4wbTPl-AVrzduRH1NCXx8m7-06bRMOUJ-lc,3626
|
|
43
43
|
wayfinder_paths/adapters/token_adapter/test_adapter.py,sha256=oEhV5OooRh1oGnaTTMKtdU9oqvHBKR25KgL6-ZB6Mzo,4304
|
|
44
|
-
wayfinder_paths/config.example.json,sha256=gDvS7W-cbaNe2IV7Q72di_PYpCDKODojELaXdd77Gx4,605
|
|
45
44
|
wayfinder_paths/conftest.py,sha256=pqDNijXn9_zmbAdkt_2a18UQLjtsDkNTBJVTgC6H2nA,1136
|
|
46
45
|
wayfinder_paths/core/__init__.py,sha256=AJK8oS2dCVuJ2pmSxqXOCvuWacNaVEU3yALEqsD3rog,398
|
|
47
46
|
wayfinder_paths/core/adapters/BaseAdapter.py,sha256=bzc3ER7aKOsmk9cxyoJxGdI54eibbpcMC8nGYJUrsp0,2033
|
|
@@ -52,19 +51,19 @@ wayfinder_paths/core/analytics/__init__.py,sha256=AtcSpt2vPpCNgdDaFDLhyZZpKa0QXK
|
|
|
52
51
|
wayfinder_paths/core/analytics/bootstrap.py,sha256=lb_PjL4Vh3O2F8eXgvAbnAFevJczRF59ODG-dxtpCZ8,1782
|
|
53
52
|
wayfinder_paths/core/analytics/stats.py,sha256=qE6h0j8TZAbqbVpDeYlVKe0YbV5CENQcHbREzKyZ_s8,1426
|
|
54
53
|
wayfinder_paths/core/analytics/test_analytics.py,sha256=DNkVTsbWPLc9I1eeCD5wsPPqUDgN-npbGRhBgMKn3GM,5580
|
|
55
|
-
wayfinder_paths/core/clients/AuthClient.py,sha256=
|
|
56
|
-
wayfinder_paths/core/clients/BRAPClient.py,sha256
|
|
54
|
+
wayfinder_paths/core/clients/AuthClient.py,sha256=rr9q1YEharGFiAiL-I87TK2atxek1PsMc8cJXIunWuM,2789
|
|
55
|
+
wayfinder_paths/core/clients/BRAPClient.py,sha256=gkZtjOgAwRP0q7LxVmqBUlFWzKdaQrQFkv-nVsJ7Amg,3737
|
|
57
56
|
wayfinder_paths/core/clients/ClientManager.py,sha256=pZ4e8XgwDYceCUBFyyemexAH8pqZCAN47iAVVwJWW2Q,7239
|
|
58
|
-
wayfinder_paths/core/clients/HyperlendClient.py,sha256=
|
|
57
|
+
wayfinder_paths/core/clients/HyperlendClient.py,sha256=QZFPsSIGumfabmLtOSkymtjmyW5aQoXbLRTSbsYdAOg,6166
|
|
59
58
|
wayfinder_paths/core/clients/LedgerClient.py,sha256=M6VlG0yq3H4rQt6qRxc0QQVd7GoPXJpj2FcD0RM_C_k,14430
|
|
60
|
-
wayfinder_paths/core/clients/PoolClient.py,sha256=
|
|
61
|
-
wayfinder_paths/core/clients/TokenClient.py,sha256=
|
|
62
|
-
wayfinder_paths/core/clients/WalletClient.py,sha256=
|
|
63
|
-
wayfinder_paths/core/clients/WayfinderClient.py,sha256=
|
|
59
|
+
wayfinder_paths/core/clients/PoolClient.py,sha256=t0H6EffDjdyK8e_PJKngU3uEkWNCTJ9BMF0HBYYRNLQ,2187
|
|
60
|
+
wayfinder_paths/core/clients/TokenClient.py,sha256=aIdHdV6896XceI-dKOMvWEi_PIoV7qLlaSNcRCE83N0,2778
|
|
61
|
+
wayfinder_paths/core/clients/WalletClient.py,sha256=EhZI7q0U3P769DEQ28ef9RvaqJJ0nSBbdxbWUPhouXM,2597
|
|
62
|
+
wayfinder_paths/core/clients/WayfinderClient.py,sha256=x-SBg1mf6mKy6F5qpamnXmFdJ3vNmZ8Z5veJnVoZIAM,10269
|
|
64
63
|
wayfinder_paths/core/clients/__init__.py,sha256=eKbB81C9ZphAKH1uKwkqOmVHtEwFdkDuZLVAQXQXa5M,1254
|
|
65
|
-
wayfinder_paths/core/clients/protocols.py,sha256=
|
|
64
|
+
wayfinder_paths/core/clients/protocols.py,sha256=a0D14D2sEq77Nu-Cut4bXgpXyf02jQbkxWKSTGg6kiw,8245
|
|
66
65
|
wayfinder_paths/core/clients/sdk_example.py,sha256=Y6mSyHfsWcOje6E-geNI0C4CQ6uyZaD3V9Q8kPM53eo,2969
|
|
67
|
-
wayfinder_paths/core/config.py,sha256=
|
|
66
|
+
wayfinder_paths/core/config.py,sha256=ADdrYAapSCwpV4ljSziBmxZV2Z2ORsu8ku-_MptSjjc,9060
|
|
68
67
|
wayfinder_paths/core/constants/__init__.py,sha256=upAVwHDgMXJ3DWaAuXo52UZktS8NZ17s5XwVH0qxgzg,591
|
|
69
68
|
wayfinder_paths/core/constants/base.py,sha256=BYQAD72XrsY6WRrOMIlUOpXLVANS7EYaS5Ell4Nj1H4,1551
|
|
70
69
|
wayfinder_paths/core/constants/erc20_abi.py,sha256=3ljIyUl6FesoEa4uprwNo-nF0Q5s73M9WEqXLw6ONI4,3214
|
|
@@ -73,19 +72,18 @@ wayfinder_paths/core/constants/moonwell_abi.py,sha256=ALb-kKdfF9aUtEHR8OlqvA-3zJ
|
|
|
73
72
|
wayfinder_paths/core/engine/StrategyJob.py,sha256=DqwkPu5JHp00xkDmj7kyUqs9U-VP0k-OBlVipjEzk14,7257
|
|
74
73
|
wayfinder_paths/core/engine/__init__.py,sha256=WZ2KWnmOZnBocYrqdwq6EUHp6lmTyrKyXgHSHyQswnU,108
|
|
75
74
|
wayfinder_paths/core/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
-
wayfinder_paths/core/services/base.py,sha256=
|
|
77
|
-
wayfinder_paths/core/services/local_evm_txn.py,sha256=
|
|
75
|
+
wayfinder_paths/core/services/base.py,sha256=94Wvs7Ym7tK9J3k9lEOhSSIC7ptnMJ161dYtF4XTSZ8,4096
|
|
76
|
+
wayfinder_paths/core/services/local_evm_txn.py,sha256=OHxDWDfctxui2YbPRI3B6c3pt9xC66N0-sFC7OLmz4c,12600
|
|
78
77
|
wayfinder_paths/core/services/local_token_txn.py,sha256=YQjuHjdyGwVfAZt3FGMkSKoc34bRiJrWRiR5pXJmL9U,8556
|
|
79
78
|
wayfinder_paths/core/services/web3_service.py,sha256=7iR7bfqfUQCQcdfEWVGqy04PZBtZTuzCDpfLt1a-4OI,1485
|
|
80
|
-
wayfinder_paths/core/
|
|
81
|
-
wayfinder_paths/core/strategies/Strategy.py,sha256=nEzry8V-FGSM-S1eBmT35Ba2cVOJn3hNNWenpTMAVv8,9455
|
|
79
|
+
wayfinder_paths/core/strategies/Strategy.py,sha256=Q_R-i4kxASdWrsq58VGHkV1k5l-sMF2MdVRw6nMNtJ8,9407
|
|
82
80
|
wayfinder_paths/core/strategies/__init__.py,sha256=2NjvvDw6sIQGUFV4Qo1olXTxUOY3GmCM8Ivz_J1FSmc,157
|
|
83
81
|
wayfinder_paths/core/strategies/base.py,sha256=-s0qeiGZl5CHTUL2PavGXM7ACkNlaa0c4jeZR_4DuBM,155
|
|
84
|
-
wayfinder_paths/core/strategies/descriptors.py,sha256=
|
|
82
|
+
wayfinder_paths/core/strategies/descriptors.py,sha256=2Olef0VWols1CWb-TWcb5pil2rztC0jP6F_Trpv2hIw,1958
|
|
85
83
|
wayfinder_paths/core/utils/__init__.py,sha256=TEylMYHnG37Z3mizSmw28bUm0vyNBFzf0Nc8dB_7l1A,73
|
|
86
|
-
wayfinder_paths/core/utils/evm_helpers.py,sha256=
|
|
87
|
-
wayfinder_paths/core/utils/wallets.py,sha256=
|
|
88
|
-
wayfinder_paths/core/wallets/README.md,sha256=
|
|
84
|
+
wayfinder_paths/core/utils/evm_helpers.py,sha256=vxxgenCaRdFEFlrW7eGB9TRubywuCdGvPg5N4C2P9-c,5633
|
|
85
|
+
wayfinder_paths/core/utils/wallets.py,sha256=ccCQ128lDShO265AFMOCdijzPLucWe-Neg5wjLrOsnk,1948
|
|
86
|
+
wayfinder_paths/core/wallets/README.md,sha256=ks3tqO3I69PiOXp4hXfZ7ayupvfS0kB8PW3fBR2bDNA,3700
|
|
89
87
|
wayfinder_paths/core/wallets/WalletManager.py,sha256=sptj0Dya9iM87BDzUktrYM_Mw33xyVJNrRUTVfBjHGw,1870
|
|
90
88
|
wayfinder_paths/core/wallets/__init__.py,sha256=hIuhy64pJOs_8mAP7Zup28goXbT8qjBeeVYMkbqlyu8,315
|
|
91
89
|
wayfinder_paths/policies/enso.py,sha256=oytco04eeGjiRbZPGFE1YpH4NxvV0tfVM14QmlyzjkY,428
|
|
@@ -97,34 +95,34 @@ wayfinder_paths/policies/hyperliquid.py,sha256=hAxNtWdxavwf_a-AnlXMOmEYakkNBkrPT
|
|
|
97
95
|
wayfinder_paths/policies/moonwell.py,sha256=sKWLbruMKiW7Yh1DhXdVPRe0JBP-nooNybRz0G9PgvA,1605
|
|
98
96
|
wayfinder_paths/policies/prjx.py,sha256=6kfZ6OQFroFHYJl4vSWT-svwwfvoHlS_ZrcHt8nmZMU,743
|
|
99
97
|
wayfinder_paths/policies/util.py,sha256=r8xQLPvE3kU21_LG6VbkFI9sUSYltcsKunryZdHOUDA,912
|
|
100
|
-
wayfinder_paths/run_strategy.py,sha256=
|
|
98
|
+
wayfinder_paths/run_strategy.py,sha256=dBkIw5GUru1ZDOycQs6PWLm1E6dYAcO_cRRNpg6GAXI,11924
|
|
101
99
|
wayfinder_paths/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
102
|
-
wayfinder_paths/scripts/create_strategy.py,sha256=
|
|
103
|
-
wayfinder_paths/scripts/make_wallets.py,sha256=
|
|
104
|
-
wayfinder_paths/scripts/run_strategy.py,sha256=
|
|
100
|
+
wayfinder_paths/scripts/create_strategy.py,sha256=WQQLBhClfjyLxEaKubQkBqBpSOFESnk1m6WTau9LylQ,5352
|
|
101
|
+
wayfinder_paths/scripts/make_wallets.py,sha256=RuCa9uYAsOzv8TyFdeOH89-SPJVGXwl5RuAqfJesLOk,5237
|
|
102
|
+
wayfinder_paths/scripts/run_strategy.py,sha256=xXa9Ch7mf1UXSO2UqyUZ6_IJG0TOjoYPyTzCU1U56TM,4450
|
|
105
103
|
wayfinder_paths/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
106
104
|
wayfinder_paths/strategies/basis_trading_strategy/README.md,sha256=rTUXQ2owEoPmXlfHcJfRFCwcQxlU3a4hOJGN5kaWWQ0,7176
|
|
107
105
|
wayfinder_paths/strategies/basis_trading_strategy/__init__.py,sha256=kVcehFjBUtoi5xzSHI56jtDghsy0nYl6XIE6BI1l6aI,79
|
|
108
106
|
wayfinder_paths/strategies/basis_trading_strategy/constants.py,sha256=PJ1WtSALxiuW1FXx-BF30ciFISEhO5VBfrSZyfhPuz0,45
|
|
109
107
|
wayfinder_paths/strategies/basis_trading_strategy/examples.json,sha256=q2wlAH8Gr-LUJeamKzWL1EtChL3TBWe0HQ4_P-VCdqQ,429
|
|
110
|
-
wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=
|
|
111
|
-
wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=
|
|
112
|
-
wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=
|
|
108
|
+
wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=jjXv-w-uXdkw3-eSUgMmWCE7cPCRrkhyD4_TQjOnRO0,38640
|
|
109
|
+
wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=lntYxZCNyNvnobwBk3UFXiqUABnrFnIObwFGVDO6GV8,161245
|
|
110
|
+
wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=PWTJf2sqNb4BkKQytr_teqOqiV5n_7Fh5fPeZtr9Ito,40149
|
|
113
111
|
wayfinder_paths/strategies/basis_trading_strategy/types.py,sha256=rlbouTUOVPLfGPzMbsf-fUmMcn0R_OsG-IdfiBJmmqI,845
|
|
114
112
|
wayfinder_paths/strategies/config.py,sha256=5dv-8tWwoxH3Sxd9jtiw90shrLipEe3UlU-IYUBfciM,2762
|
|
115
|
-
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=
|
|
113
|
+
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=3dOmUCjs_zu4TgPhis0WG-U1XP_dl9aEGi49EkW_-jw,4180
|
|
116
114
|
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=GbVo2p6QiG6M7Ma5s671lw8G9JwnMl1h0n9mrtt-ZS8,164
|
|
117
|
-
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=
|
|
115
|
+
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=QQ18aOZD2M7xdY6LttmrTALA-TyyFQASgf6b3RlTMOg,92076
|
|
118
116
|
wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=puHIf160DQ_a1G3LXFHjIel504vKDhZvqktysyEwOdo,15296
|
|
119
|
-
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md,sha256=
|
|
117
|
+
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md,sha256=fv4uLA0Ioxp_LS35aFLhVCPJPoG_uvEYV89KYKmWv_o,4516
|
|
120
118
|
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/examples.json,sha256=kgNRdZcqne8XTm-Y8Hv1a1pdajRQsey4Qhd5La-iWss,164
|
|
121
|
-
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py,sha256=
|
|
119
|
+
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py,sha256=PhFwyAWbO7qyJ2tOldTIIW9rK6ElHXbAEtRyo909ztQ,125722
|
|
122
120
|
wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py,sha256=9PfA5AiTdsyWcd3weNgFaoYJ5iWirZSPFoUwSBts7BY,31248
|
|
123
|
-
wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=
|
|
121
|
+
wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=GirWeShoIVyzwFIJLta5oNLsa62Gozx2nQ5cFGrgxNM,4952
|
|
124
122
|
wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json,sha256=pL1DNFEvYvXKK7xXD5oQYFPQj3Cm1ocKnk6r_iZk0IY,423
|
|
125
|
-
wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256
|
|
126
|
-
wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=
|
|
127
|
-
wayfinder_paths/templates/adapter/README.md,sha256=
|
|
123
|
+
wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=-WEQO70p-jMlDGtAVbv-vdBXIXSOp3SKm_2sXrxvbW0,75699
|
|
124
|
+
wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=ScEJTu4WAFzYmAZUX2Y3fO97RVF2mhADewUxz7lruzc,20669
|
|
125
|
+
wayfinder_paths/templates/adapter/README.md,sha256=pat-Xdvu1y8-neKcgvW8ygVlCkuj2OdHLgp1prJDRkY,2894
|
|
128
126
|
wayfinder_paths/templates/adapter/adapter.py,sha256=UGPvD8SNcrEtYQXRTUxvK9WZ9Bzx1Xwb8sr9zSbqnuc,763
|
|
129
127
|
wayfinder_paths/templates/adapter/examples.json,sha256=KLHy3AgPIplAaZN0qY2A-HBMa1xXkMhIyusORovTD9w,79
|
|
130
128
|
wayfinder_paths/templates/adapter/test_adapter.py,sha256=PeG9ZZwx-cWXCDUKxrvj1cR8ljo9aXrKANZuz2hFAhk,1510
|
|
@@ -136,7 +134,7 @@ wayfinder_paths/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
136
134
|
wayfinder_paths/tests/test_smoke_manifest.py,sha256=kTcIa4qikcspVh2ohQIk0aHUdIvBvcQBfNbm3PNiVvg,1636
|
|
137
135
|
wayfinder_paths/tests/test_test_coverage.py,sha256=9NrZeVmP02D4W7Qc0XjciC05bhvdTCVibYjTGfa_GQk,7893
|
|
138
136
|
wayfinder_paths/tests/test_utils.py,sha256=pxHT0QKFlyJeJo8bFnKXzWcOdi6t8rbJ0JFCBaFCBRQ,2112
|
|
139
|
-
wayfinder_paths-0.1.
|
|
140
|
-
wayfinder_paths-0.1.
|
|
141
|
-
wayfinder_paths-0.1.
|
|
142
|
-
wayfinder_paths-0.1.
|
|
137
|
+
wayfinder_paths-0.1.13.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
|
|
138
|
+
wayfinder_paths-0.1.13.dist-info/METADATA,sha256=yu9x6tdOizRjLaEEzr-g3gUrA1I0VAH_FUsJNu5O6kk,25587
|
|
139
|
+
wayfinder_paths-0.1.13.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
|
140
|
+
wayfinder_paths-0.1.13.dist-info/RECORD,,
|
wayfinder_paths/CONFIG_GUIDE.md
DELETED
|
@@ -1,390 +0,0 @@
|
|
|
1
|
-
# Configuration Guide
|
|
2
|
-
|
|
3
|
-
This guide explains how to configure your strategies for local testing.
|
|
4
|
-
|
|
5
|
-
## Quick Setup
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# 1. Generate test wallets (required!)
|
|
9
|
-
# Creates a main wallet (or use 'just create-strategy' which auto-creates wallets)
|
|
10
|
-
just create-wallets
|
|
11
|
-
# Or manually: poetry run python wayfinder_paths/scripts/make_wallets.py -n 1
|
|
12
|
-
|
|
13
|
-
# 2. Create your config file
|
|
14
|
-
cp wayfinder_paths/config.example.json config.json
|
|
15
|
-
|
|
16
|
-
# 3. Edit config.json with your Wayfinder credentials
|
|
17
|
-
# NEVER commit this file - it contains your credentials!
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Configuration Structure
|
|
21
|
-
|
|
22
|
-
### config.json Structure
|
|
23
|
-
|
|
24
|
-
```json
|
|
25
|
-
{
|
|
26
|
-
"user": {
|
|
27
|
-
"username": "your_username", // OPTIONAL: For OAuth authentication
|
|
28
|
-
"password": "your_password", // OPTIONAL: For OAuth authentication
|
|
29
|
-
"refresh_token": null, // OPTIONAL: Alternative to username/password
|
|
30
|
-
"api_key": "sk_live_abc123..." // OPTIONAL: For service account authentication (loaded directly by clients, not stored in UserConfig)
|
|
31
|
-
},
|
|
32
|
-
"system": {
|
|
33
|
-
"api_base_url": "https://wayfinder.ai/api/v1",
|
|
34
|
-
"api_key": "sk_live_abc123...", // OPTIONAL: System-level API key (alternative to user.api_key, loaded directly by clients)
|
|
35
|
-
"wallets_path": "wallets.json" // Path to your generated wallets.json
|
|
36
|
-
},
|
|
37
|
-
"strategy": {
|
|
38
|
-
"rpc_urls": { // RPC endpoints for different chains
|
|
39
|
-
"1": "https://eth.llamarpc.com",
|
|
40
|
-
"42161": "https://arb1.arbitrum.io/rpc",
|
|
41
|
-
"8453": "https://mainnet.base.org",
|
|
42
|
-
"solana": "https://api.mainnet-beta.solana.com"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## User Configuration
|
|
49
|
-
|
|
50
|
-
**Authentication (choose one method):**
|
|
51
|
-
|
|
52
|
-
**Option 1: Service Account (API Key) - Recommended for Production**
|
|
53
|
-
- `user.api_key` - Your Wayfinder API key for service account authentication (loaded directly by clients from config.json)
|
|
54
|
-
- OR `system.api_key` - System-level API key (alternative location, loaded directly by clients)
|
|
55
|
-
- OR pass `api_key` parameter to strategy constructor
|
|
56
|
-
|
|
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.
|
|
58
|
-
|
|
59
|
-
**Option 2: Personal Access (OAuth) - For Development**
|
|
60
|
-
- `user.username` - Your Wayfinder backend username
|
|
61
|
-
- `user.password` - Your Wayfinder backend password
|
|
62
|
-
- OR `user.refresh_token` - Alternative to username/password
|
|
63
|
-
|
|
64
|
-
**Other Optional fields:**
|
|
65
|
-
- `user.main_wallet_address` - Override auto-loaded main wallet
|
|
66
|
-
- `user.strategy_wallet_address` - Override auto-loaded strategy wallet
|
|
67
|
-
|
|
68
|
-
**Security Note:** Never commit `config.json` to version control. Add it to `.gitignore`.
|
|
69
|
-
|
|
70
|
-
## System Configuration
|
|
71
|
-
|
|
72
|
-
These are managed automatically by Wayfinder:
|
|
73
|
-
- `api_base_url` - Wayfinder backend API endpoint
|
|
74
|
-
- `wallets_path` - Location of generated wallets.json
|
|
75
|
-
- `job_id` - Auto-generated by Wayfinder
|
|
76
|
-
- `job_type` - Set to "strategy"
|
|
77
|
-
|
|
78
|
-
## Strategy Configuration
|
|
79
|
-
|
|
80
|
-
### RPC Endpoints
|
|
81
|
-
|
|
82
|
-
Default RPC URLs are provided for:
|
|
83
|
-
- Ethereum (chain ID: 1)
|
|
84
|
-
- Arbitrum (chain ID: 42161)
|
|
85
|
-
- Base (chain ID: 8453)
|
|
86
|
-
- Solana
|
|
87
|
-
|
|
88
|
-
You can override these in `config.json` if needed.
|
|
89
|
-
|
|
90
|
-
### Strategy-Specific Settings
|
|
91
|
-
|
|
92
|
-
Individual strategies may have their own configuration parameters. Check the strategy's README for available options.
|
|
93
|
-
|
|
94
|
-
## Wallet Generation for Testing
|
|
95
|
-
|
|
96
|
-
Use the built-in script to generate test wallets for local development:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
# Generate main wallet (recommended for initial setup)
|
|
100
|
-
poetry run python wayfinder_paths/scripts/make_wallets.py -n 1
|
|
101
|
-
|
|
102
|
-
# Add additional wallets for multi-account testing
|
|
103
|
-
poetry run python wayfinder_paths/scripts/make_wallets.py -n 3
|
|
104
|
-
|
|
105
|
-
# Create a wallet with a specific label (e.g., for a strategy)
|
|
106
|
-
poetry run python wayfinder_paths/scripts/make_wallets.py --label "my_strategy_name"
|
|
107
|
-
|
|
108
|
-
# Generate keystore files (for geth/web3 compatibility)
|
|
109
|
-
poetry run python wayfinder_paths/scripts/make_wallets.py -n 1 --keystore-password "your-password"
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
This creates `wallets.json` in the repository root with:
|
|
113
|
-
- **main** wallet - your main wallet for testing (labeled "main")
|
|
114
|
-
- Additional wallets with labels if specified
|
|
115
|
-
|
|
116
|
-
**Note:** Generated wallets are for testing only. Wallet addresses are automatically loaded from `wallets.json` when not explicitly set in config. Strategy-specific wallets are automatically created when you use `just create-strategy "Strategy Name"`.
|
|
117
|
-
|
|
118
|
-
## Per-Strategy Wallets
|
|
119
|
-
|
|
120
|
-
Each strategy should have its own dedicated wallet for isolation and security. The system automatically looks up wallets by strategy directory name.
|
|
121
|
-
|
|
122
|
-
### How It Works
|
|
123
|
-
|
|
124
|
-
When you run a strategy:
|
|
125
|
-
1. The system uses the strategy directory name (e.g., `hyperlend_stable_yield_strategy`) to look up a wallet
|
|
126
|
-
2. It searches `wallets.json` for a wallet with a matching `label`
|
|
127
|
-
3. If found, that wallet is used as the strategy's dedicated wallet
|
|
128
|
-
4. Falls back to `strategy_wallet_address` from config if explicitly provided
|
|
129
|
-
|
|
130
|
-
### Creating a Strategy with Wallet
|
|
131
|
-
|
|
132
|
-
The easiest way to create a new strategy with its own wallet:
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
# Create a new strategy with dedicated wallet
|
|
136
|
-
just create-strategy "My Strategy Name"
|
|
137
|
-
|
|
138
|
-
# This automatically:
|
|
139
|
-
# - Creates the strategy directory
|
|
140
|
-
# - Generates a wallet with label matching the directory name
|
|
141
|
-
# - Updates the strategy files with the correct names
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### Wallet Structure
|
|
145
|
-
|
|
146
|
-
Wallets in `wallets.json` are stored with labels that match strategy directory names:
|
|
147
|
-
|
|
148
|
-
```json
|
|
149
|
-
[
|
|
150
|
-
{
|
|
151
|
-
"address": "0x...",
|
|
152
|
-
"private_key_hex": "...",
|
|
153
|
-
"label": "main"
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
"address": "0x...",
|
|
157
|
-
"private_key_hex": "...",
|
|
158
|
-
"label": "hyperlend_stable_yield_strategy"
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
"address": "0x...",
|
|
162
|
-
"private_key_hex": "...",
|
|
163
|
-
"label": "my_awesome_strategy"
|
|
164
|
-
}
|
|
165
|
-
]
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### Manual Wallet Creation
|
|
169
|
-
|
|
170
|
-
If you need to manually create a wallet for an existing strategy:
|
|
171
|
-
|
|
172
|
-
```bash
|
|
173
|
-
# Generate a wallet
|
|
174
|
-
poetry run python wayfinder_paths/scripts/make_wallets.py -n 1
|
|
175
|
-
|
|
176
|
-
# Then edit wallets.json to add a label matching your strategy directory name:
|
|
177
|
-
# {
|
|
178
|
-
# "address": "0x...",
|
|
179
|
-
# "private_key_hex": "...",
|
|
180
|
-
# "label": "your_strategy_directory_name"
|
|
181
|
-
# }
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### Strategy Access
|
|
185
|
-
|
|
186
|
-
Strategies access wallets the same way as before:
|
|
187
|
-
|
|
188
|
-
```python
|
|
189
|
-
# In strategy code
|
|
190
|
-
strategy_address = self.config.get("strategy_wallet").get("address")
|
|
191
|
-
main_address = self.config.get("main_wallet").get("address")
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
The strategy wallet is automatically populated from the wallet with label matching the strategy directory name.
|
|
195
|
-
|
|
196
|
-
## Loading Configuration
|
|
197
|
-
|
|
198
|
-
The configuration is loaded automatically when running strategies via `run_strategy.py`:
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
poetry run python wayfinder_paths/run_strategy.py stablecoin_yield_strategy --config config.json
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
For programmatic use:
|
|
205
|
-
|
|
206
|
-
```python
|
|
207
|
-
from pathlib import Path
|
|
208
|
-
from core.config import StrategyJobConfig
|
|
209
|
-
import json
|
|
210
|
-
|
|
211
|
-
# Load from file
|
|
212
|
-
with open("config.json") as f:
|
|
213
|
-
config_data = json.load(f)
|
|
214
|
-
|
|
215
|
-
config = StrategyJobConfig.from_dict(config_data)
|
|
216
|
-
|
|
217
|
-
# Configuration now has:
|
|
218
|
-
# - config.user.username & password (for Wayfinder backend)
|
|
219
|
-
# - config.system.api_base_url & wallets_path
|
|
220
|
-
# - config.strategy_config (strategy-specific settings)
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
## Wallet Abstraction
|
|
224
|
-
|
|
225
|
-
The strategy system supports multiple wallet types through a wallet abstraction layer. By default, adapters use local private keys (self-custodial wallets), but you can inject custom wallet providers for custodial wallets like Privy or Turnkey.
|
|
226
|
-
|
|
227
|
-
### Default Behavior (Local Wallets)
|
|
228
|
-
|
|
229
|
-
By default, adapters use `LocalWalletProvider` which resolves private keys from:
|
|
230
|
-
- `wallets.json` (matched by address)
|
|
231
|
-
- Wallet config in `config.json`
|
|
232
|
-
|
|
233
|
-
No code changes are required - existing strategies continue to work.
|
|
234
|
-
|
|
235
|
-
### Using Custom Wallet Providers
|
|
236
|
-
|
|
237
|
-
To use a custodial wallet provider (e.g., Privy, Turnkey), inject it directly into adapters:
|
|
238
|
-
|
|
239
|
-
```python
|
|
240
|
-
from adapters.evm_transaction_adapter.adapter import EvmTransactionAdapter
|
|
241
|
-
from my_privy_integration import PrivyWalletProvider
|
|
242
|
-
|
|
243
|
-
# Create your custom wallet provider
|
|
244
|
-
privy_provider = PrivyWalletProvider(privy_api_key, privy_wallet_id)
|
|
245
|
-
|
|
246
|
-
# Inject it into adapters
|
|
247
|
-
adapter = EvmTransactionAdapter(config, wallet_provider=privy_provider)
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
See `core/wallets/README.md` for details on implementing custom wallet providers.
|
|
251
|
-
|
|
252
|
-
## Security Best Practices
|
|
253
|
-
|
|
254
|
-
1. **Never commit `config.json`** - add it to `.gitignore`
|
|
255
|
-
2. **Never commit `wallets.json`** - contains private keys
|
|
256
|
-
3. **Use test wallets** - the script generates throwaway wallets for testing
|
|
257
|
-
4. **Keep credentials secure** - Wayfinder username/password grant access to backend resources
|
|
258
|
-
5. **Set conservative parameters** for initial testing:
|
|
259
|
-
- Lower leverage ratios
|
|
260
|
-
- Higher slippage tolerance
|
|
261
|
-
- Lower position sizes
|
|
262
|
-
|
|
263
|
-
## Authentication with Wayfinder Backend
|
|
264
|
-
|
|
265
|
-
Wayfinder Paths supports **dual authentication** for different use cases:
|
|
266
|
-
|
|
267
|
-
### 1. Service Account Authentication (API Key)
|
|
268
|
-
|
|
269
|
-
**Best for:** Backend services, automated systems, and production deployments with higher rate limits.
|
|
270
|
-
|
|
271
|
-
API keys provide service account authentication and are automatically discovered by all clients. You can provide an API key in two ways:
|
|
272
|
-
|
|
273
|
-
#### Option A: Strategy Constructor (Programmatic)
|
|
274
|
-
```python
|
|
275
|
-
from wayfinder_paths.strategies.stablecoin_yield_strategy.strategy import StablecoinYieldStrategy
|
|
276
|
-
|
|
277
|
-
strategy = StablecoinYieldStrategy(
|
|
278
|
-
config={...},
|
|
279
|
-
api_key="sk_live_abc123..." # API key is auto-discovered by all clients
|
|
280
|
-
)
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
#### Option B: config.json
|
|
284
|
-
```json
|
|
285
|
-
{
|
|
286
|
-
"user": {
|
|
287
|
-
"api_key": "sk_live_abc123..."
|
|
288
|
-
},
|
|
289
|
-
"system": {
|
|
290
|
-
"api_key": "sk_live_abc123..." // Alternative: system-level API key
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
**Priority Order:** Constructor parameter > `config.json` (user.api_key or system.api_key)
|
|
296
|
-
|
|
297
|
-
**How It Works:**
|
|
298
|
-
- All clients created by adapters automatically discover the API key from:
|
|
299
|
-
- Constructor parameter (if passed)
|
|
300
|
-
- `config.json` (via `WayfinderClient._load_config_credentials()` which reads `user.api_key` or `system.api_key`)
|
|
301
|
-
- API keys are included in **all** API requests (including public endpoints) for rate limiting
|
|
302
|
-
- No need to pass API keys explicitly to adapters or clients—they auto-discover it
|
|
303
|
-
- **Note:** API keys in `config.json` are loaded directly by clients, not stored in the `UserConfig` or `SystemConfig` dataclasses
|
|
304
|
-
|
|
305
|
-
### 2. Personal Access Authentication (OAuth)
|
|
306
|
-
|
|
307
|
-
**Best for:** Standalone SDK users and local development.
|
|
308
|
-
|
|
309
|
-
The `username` and `password` in your config authenticate with the Wayfinder backend to access:
|
|
310
|
-
- Wallet management
|
|
311
|
-
- Transaction signing services
|
|
312
|
-
- Strategy execution services
|
|
313
|
-
|
|
314
|
-
```json
|
|
315
|
-
{
|
|
316
|
-
"user": {
|
|
317
|
-
"username": "your_username",
|
|
318
|
-
"password": "your_password",
|
|
319
|
-
"refresh_token": null // Optional: use refresh token instead of username/password
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
**Fallback Behavior:**
|
|
325
|
-
- If an API key is not found or authentication fails, the system automatically falls back to OAuth
|
|
326
|
-
- OAuth tokens are automatically refreshed when they expire
|
|
327
|
-
|
|
328
|
-
### Security Best Practices
|
|
329
|
-
|
|
330
|
-
- **Never commit credentials** to version control - add `config.json` to `.gitignore`
|
|
331
|
-
- **Use API keys for production** - they provide better rate limits and don't require token refresh
|
|
332
|
-
- **Use OAuth for development** - simpler setup for local testing
|
|
333
|
-
- **Rotate credentials regularly** - especially if exposed or compromised
|
|
334
|
-
|
|
335
|
-
## Configuration in Strategies
|
|
336
|
-
|
|
337
|
-
Strategies receive configuration automatically through StrategyJob:
|
|
338
|
-
|
|
339
|
-
```python
|
|
340
|
-
from core.strategies.Strategy import Strategy
|
|
341
|
-
|
|
342
|
-
class MyStrategy(Strategy):
|
|
343
|
-
async def setup(self):
|
|
344
|
-
# Access strategy-specific config
|
|
345
|
-
target_leverage = self.config.get("target_leverage", 1.0)
|
|
346
|
-
|
|
347
|
-
# Access RPC URLs
|
|
348
|
-
eth_rpc = self.config.get("rpc_urls", {}).get("1")
|
|
349
|
-
|
|
350
|
-
# Configuration is already loaded from config.json
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
## Advanced: Custom RPC Endpoints
|
|
354
|
-
|
|
355
|
-
To use custom RPC endpoints, update the `strategy.rpc_urls` section in `config.json`:
|
|
356
|
-
|
|
357
|
-
```json
|
|
358
|
-
{
|
|
359
|
-
"strategy": {
|
|
360
|
-
"rpc_urls": {
|
|
361
|
-
"1": "https://your-custom-ethereum-rpc.com",
|
|
362
|
-
"8453": "https://your-custom-base-rpc.com"
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
## Troubleshooting
|
|
369
|
-
|
|
370
|
-
**Issue:** "Authentication failed"
|
|
371
|
-
- **If using API key:**
|
|
372
|
-
- Verify API key is correct and not expired
|
|
373
|
-
- Check that API key is set in one of: constructor parameter or `config.json` (user.api_key or system.api_key)
|
|
374
|
-
- Ensure API key has proper permissions for the operations you're performing
|
|
375
|
-
- **If using OAuth:**
|
|
376
|
-
- Check that `username` and `password` are correct in `config.json`
|
|
377
|
-
- Verify your Wayfinder account credentials
|
|
378
|
-
- Try using `refresh_token` instead if you have one
|
|
379
|
-
- **General:**
|
|
380
|
-
- The system automatically falls back from API key to OAuth if API key authentication fails
|
|
381
|
-
- Check logs for specific authentication error messages
|
|
382
|
-
|
|
383
|
-
**Issue:** "Wallet not found"
|
|
384
|
-
- Run the wallet generation script first
|
|
385
|
-
- Check that `wallets.json` exists in repository root
|
|
386
|
-
- Verify `system.wallets_path` in config points to the correct location
|
|
387
|
-
|
|
388
|
-
**Issue:** "Invalid config"
|
|
389
|
-
- Ensure `config.json` follows the correct structure
|
|
390
|
-
- Check that all required fields are present
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"user": {
|
|
3
|
-
"username": "your_username",
|
|
4
|
-
"password": "your_password",
|
|
5
|
-
"refresh_token": null,
|
|
6
|
-
"api_key": "sk_live_abc123..."
|
|
7
|
-
},
|
|
8
|
-
"system": {
|
|
9
|
-
"api_base_url": "https://wayfinder.ai/api/v1",
|
|
10
|
-
"api_key": "sk_live_abc123...",
|
|
11
|
-
"wallets_path": "wallets.json"
|
|
12
|
-
},
|
|
13
|
-
"strategy": {
|
|
14
|
-
"rpc_urls": {
|
|
15
|
-
"1": "https://eth.llamarpc.com",
|
|
16
|
-
"42161": "https://arb1.arbitrum.io/rpc",
|
|
17
|
-
"8453": "https://mainnet.base.org",
|
|
18
|
-
"solana": "https://api.mainnet-beta.solana.com",
|
|
19
|
-
"999": "https://rpc.hyperliquid.xyz/evm"
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
wayfinder_paths/core/settings.py
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import os
|
|
3
|
-
|
|
4
|
-
from pydantic import Field
|
|
5
|
-
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class CoreSettings(BaseSettings):
|
|
9
|
-
"""
|
|
10
|
-
Core settings for Wayfinder Paths Engine
|
|
11
|
-
These are minimal settings required by the core engine
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
model_config = SettingsConfigDict(
|
|
15
|
-
# Note: .env file is only used for publishing (REPOSITORY_NAME, PUBLISH_TOKEN)
|
|
16
|
-
# All other configuration should come from config.json
|
|
17
|
-
case_sensitive=False,
|
|
18
|
-
extra="ignore", # Ignore extra environment variables (e.g., from Django)
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
# Core API Configuration
|
|
22
|
-
API_ENV: str = Field(default="development")
|
|
23
|
-
|
|
24
|
-
def _compute_default_api_url() -> str:
|
|
25
|
-
"""
|
|
26
|
-
Determine default API base URL from config.json if present, otherwise fallback.
|
|
27
|
-
Do not mutate the value (consistent with rpc_urls resolution).
|
|
28
|
-
"""
|
|
29
|
-
cfg_path = os.getenv("WAYFINDER_CONFIG_PATH", "config.json")
|
|
30
|
-
base = None
|
|
31
|
-
try:
|
|
32
|
-
with open(cfg_path) as f:
|
|
33
|
-
cfg = json.load(f)
|
|
34
|
-
system = cfg.get("system", {}) if isinstance(cfg, dict) else {}
|
|
35
|
-
candidate = system.get("api_base_url")
|
|
36
|
-
if isinstance(candidate, str) and candidate.strip():
|
|
37
|
-
base = candidate.strip()
|
|
38
|
-
except Exception:
|
|
39
|
-
# Config is optional; ignore errors and use fallback
|
|
40
|
-
pass
|
|
41
|
-
|
|
42
|
-
if not base:
|
|
43
|
-
# Provide a sensible default that includes the full API root
|
|
44
|
-
base = "https://wayfinder.ai/api/v1"
|
|
45
|
-
return base
|
|
46
|
-
|
|
47
|
-
WAYFINDER_API_URL: str = Field(default_factory=_compute_default_api_url)
|
|
48
|
-
|
|
49
|
-
# Network Configuration
|
|
50
|
-
NETWORK: str = Field(default="testnet") # mainnet, testnet, devnet
|
|
51
|
-
|
|
52
|
-
# Logging
|
|
53
|
-
LOG_LEVEL: str = Field(default="INFO")
|
|
54
|
-
LOG_FILE: str = Field(default="logs/strategy.log")
|
|
55
|
-
|
|
56
|
-
# Safety
|
|
57
|
-
DRY_RUN: bool = Field(default=False)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
# Core settings instance
|
|
61
|
-
settings = CoreSettings()
|
|
File without changes
|
|
File without changes
|