wayfinder-paths 0.1.8__py3-none-any.whl → 0.1.10__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (80) hide show
  1. wayfinder_paths/CONFIG_GUIDE.md +6 -15
  2. wayfinder_paths/adapters/balance_adapter/README.md +1 -2
  3. wayfinder_paths/adapters/balance_adapter/adapter.py +4 -4
  4. wayfinder_paths/adapters/brap_adapter/README.md +1 -1
  5. wayfinder_paths/adapters/brap_adapter/adapter.py +139 -74
  6. wayfinder_paths/adapters/hyperlend_adapter/adapter.py +0 -7
  7. wayfinder_paths/adapters/hyperliquid_adapter/adapter.py +0 -54
  8. wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py +1 -1
  9. wayfinder_paths/adapters/ledger_adapter/README.md +1 -1
  10. wayfinder_paths/adapters/moonwell_adapter/README.md +174 -0
  11. wayfinder_paths/adapters/moonwell_adapter/__init__.py +7 -0
  12. wayfinder_paths/adapters/moonwell_adapter/adapter.py +1226 -0
  13. wayfinder_paths/adapters/moonwell_adapter/test_adapter.py +635 -0
  14. wayfinder_paths/adapters/pool_adapter/README.md +1 -77
  15. wayfinder_paths/adapters/pool_adapter/adapter.py +0 -122
  16. wayfinder_paths/adapters/pool_adapter/examples.json +0 -57
  17. wayfinder_paths/adapters/pool_adapter/test_adapter.py +0 -86
  18. wayfinder_paths/adapters/token_adapter/README.md +1 -1
  19. wayfinder_paths/core/clients/ClientManager.py +1 -22
  20. wayfinder_paths/core/clients/WalletClient.py +0 -8
  21. wayfinder_paths/core/clients/WayfinderClient.py +7 -12
  22. wayfinder_paths/core/clients/__init__.py +0 -8
  23. wayfinder_paths/core/clients/protocols.py +0 -60
  24. wayfinder_paths/core/config.py +5 -45
  25. wayfinder_paths/core/constants/__init__.py +0 -2
  26. wayfinder_paths/core/constants/base.py +6 -2
  27. wayfinder_paths/core/constants/moonwell_abi.py +411 -0
  28. wayfinder_paths/core/services/base.py +7 -1
  29. wayfinder_paths/core/services/local_evm_txn.py +223 -222
  30. wayfinder_paths/core/services/local_token_txn.py +103 -92
  31. wayfinder_paths/core/services/web3_service.py +0 -2
  32. wayfinder_paths/core/settings.py +8 -8
  33. wayfinder_paths/core/strategies/Strategy.py +1 -5
  34. wayfinder_paths/core/strategies/descriptors.py +1 -1
  35. wayfinder_paths/core/utils/evm_helpers.py +7 -12
  36. wayfinder_paths/core/wallets/README.md +3 -6
  37. wayfinder_paths/run_strategy.py +62 -105
  38. wayfinder_paths/scripts/create_strategy.py +2 -27
  39. wayfinder_paths/scripts/make_wallets.py +1 -25
  40. wayfinder_paths/scripts/run_strategy.py +37 -9
  41. wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py +1 -3
  42. wayfinder_paths/strategies/basis_trading_strategy/strategy.py +87 -138
  43. wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py +96 -58
  44. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md +2 -17
  45. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json +4 -1
  46. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py +107 -29
  47. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py +53 -14
  48. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/README.md +108 -0
  49. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/examples.json +11 -0
  50. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/strategy.py +2975 -0
  51. wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py +886 -0
  52. wayfinder_paths/strategies/stablecoin_yield_strategy/README.md +0 -7
  53. wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py +2 -7
  54. wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py +0 -4
  55. wayfinder_paths/templates/adapter/README.md +5 -21
  56. wayfinder_paths/templates/adapter/adapter.py +1 -2
  57. wayfinder_paths/templates/adapter/test_adapter.py +1 -1
  58. wayfinder_paths/templates/strategy/README.md +4 -21
  59. wayfinder_paths/templates/strategy/test_strategy.py +0 -4
  60. wayfinder_paths/tests/test_smoke_manifest.py +17 -2
  61. {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.10.dist-info}/METADATA +64 -201
  62. {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.10.dist-info}/RECORD +64 -71
  63. wayfinder_paths/adapters/balance_adapter/manifest.yaml +0 -8
  64. wayfinder_paths/adapters/brap_adapter/manifest.yaml +0 -11
  65. wayfinder_paths/adapters/hyperlend_adapter/manifest.yaml +0 -10
  66. wayfinder_paths/adapters/hyperliquid_adapter/manifest.yaml +0 -8
  67. wayfinder_paths/adapters/ledger_adapter/manifest.yaml +0 -11
  68. wayfinder_paths/adapters/pool_adapter/manifest.yaml +0 -10
  69. wayfinder_paths/adapters/token_adapter/manifest.yaml +0 -6
  70. wayfinder_paths/core/clients/SimulationClient.py +0 -192
  71. wayfinder_paths/core/clients/TransactionClient.py +0 -63
  72. wayfinder_paths/core/engine/manifest.py +0 -97
  73. wayfinder_paths/scripts/validate_manifests.py +0 -213
  74. wayfinder_paths/strategies/basis_trading_strategy/manifest.yaml +0 -23
  75. wayfinder_paths/strategies/hyperlend_stable_yield_strategy/manifest.yaml +0 -7
  76. wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml +0 -17
  77. wayfinder_paths/templates/adapter/manifest.yaml +0 -6
  78. wayfinder_paths/templates/strategy/manifest.yaml +0 -8
  79. {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.10.dist-info}/LICENSE +0 -0
  80. {wayfinder_paths-0.1.8.dist-info → wayfinder_paths-0.1.10.dist-info}/WHEEL +0 -0
@@ -1,48 +1,45 @@
1
- wayfinder_paths/CONFIG_GUIDE.md,sha256=PN2ClAZ8FCF16_sstaUxbfvQkVAyXdtRvTrrj-qJPuk,13397
1
+ wayfinder_paths/CONFIG_GUIDE.md,sha256=p8eT2FC_dp4bBdezwGmQYLiefLNze-I6lY__UXv07zQ,12975
2
2
  wayfinder_paths/__init__.py,sha256=YgOg-PRPT3ROh0zg6hgQyQE-YFkFGw6TM77zDvB4_sE,427
3
3
  wayfinder_paths/abis/generic/erc20.json,sha256=geyzVzdTNt3u1XHKxi4seszP_GIWIzPTl0FYgiftRnM,9336
4
4
  wayfinder_paths/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- wayfinder_paths/adapters/balance_adapter/README.md,sha256=rRq--g4y7X7UOs1KK8c0e-4f-fItZEgHnaTRw0kR76I,3683
6
- wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=byfucmlGXT4_qGD4eeTvLw5X-2NHgHtiV0uOKp73CfE,8355
5
+ wayfinder_paths/adapters/balance_adapter/README.md,sha256=t8-QRfU49g9FmJ18xDGbN_k-ybWebBfM7s4bBrnyo-g,3635
6
+ wayfinder_paths/adapters/balance_adapter/adapter.py,sha256=2_OgZlHsN3js800TWwTWRoSUNn1YCnSFAY0SG6ddcAg,8379
7
7
  wayfinder_paths/adapters/balance_adapter/examples.json,sha256=3R1M4B_VsIy29viAuFT9nQbnQShWl8ZbU-rnSNWUW9U,129
8
- wayfinder_paths/adapters/balance_adapter/manifest.yaml,sha256=vp2VoQJf-TxFxgkTsUJ1AEeeOoImM_QjrGYCmjyEQYI,189
9
8
  wayfinder_paths/adapters/balance_adapter/test_adapter.py,sha256=Z8iTRU0Rv1UsODuVSo5q4j-DrTXMd4YRxvaxLdZE4Us,1878
10
- wayfinder_paths/adapters/brap_adapter/README.md,sha256=euWkSBR6OkYtebhvdNR_PL64sKbzKD5bg5hrYTIWZ1c,7905
9
+ wayfinder_paths/adapters/brap_adapter/README.md,sha256=H4_ep4r17DpQ0rnTSIbRsAdnK174NGBAcHNlHhvEA7o,7880
11
10
  wayfinder_paths/adapters/brap_adapter/__init__.py,sha256=jpqxZ-Bv_8kBo-lhgO_QCWaVZNq_WwlkNBHD4RsqOJg,90
12
- wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=OCXlNxIR7vQUktaoEeM55VcFOXR-PucNJW1NpBkNEUs,26828
11
+ wayfinder_paths/adapters/brap_adapter/adapter.py,sha256=uHS0HXQQYQVJOBM_POs2kHZJ9D7i2anOj4f5L40ebYM,30204
13
12
  wayfinder_paths/adapters/brap_adapter/examples.json,sha256=KWuAklUspd2uvk0s2ey8gczg4nbzhdwxQqzhascyMiQ,5287
14
- wayfinder_paths/adapters/brap_adapter/manifest.yaml,sha256=bJ8o4j9ZPjfnLxXxHfekoXKUHoBkXmWQ3nokTH1aya4,240
15
13
  wayfinder_paths/adapters/brap_adapter/test_adapter.py,sha256=w2q35tcE7j2QG53jSm_XZgIk7OKL4O51fnFuGMVRSNQ,10754
16
14
  wayfinder_paths/adapters/hyperlend_adapter/__init__.py,sha256=DsWOnEn-Tlu9ZoIoGaFeSqOYI3b4lXGVK3_FTntWpLw,139
17
- wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=QevMiOrztvTRHx7vA_dAQGX3ioUFdLY4aVOfsT-DXX8,10555
18
- wayfinder_paths/adapters/hyperlend_adapter/manifest.yaml,sha256=Ugc0jNf3txAQRGAXlVvTN3Mbdc4-fUMS1yVs0SZcBwI,259
15
+ wayfinder_paths/adapters/hyperlend_adapter/adapter.py,sha256=OiHIzhfTJTBk2iQs3px82DubhgTkuoPWHtgTPfAB7UQ,10260
19
16
  wayfinder_paths/adapters/hyperlend_adapter/test_adapter.py,sha256=iLnrALVnK7JWJV2KFDqBYZlr1ShW1tjHC-kCV6-FlgE,9558
20
17
  wayfinder_paths/adapters/hyperliquid_adapter/__init__.py,sha256=QpA258RzVbxzsha86HQduAuNVG0g0qvsI5OcZunQ8DQ,467
21
- wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=kG0oBi07OI4JNwDs14cGJ15qDSoNKX6_v-CUHlsctGQ,36598
18
+ wayfinder_paths/adapters/hyperliquid_adapter/adapter.py,sha256=qkU_Au0rqj_vf5O6j81EikrHDk8_M8uaxltQvI3dvbU,34516
22
19
  wayfinder_paths/adapters/hyperliquid_adapter/executor.py,sha256=uibNnfsgB_KMOYpZzaSDTsiKGQPIKwZyZ6uH34-Xu4A,17447
23
- wayfinder_paths/adapters/hyperliquid_adapter/manifest.yaml,sha256=IOK5kFaOuqqEcf3EuY5oXufEaUQNoz2oBXRGVbCdSXQ,206
24
20
  wayfinder_paths/adapters/hyperliquid_adapter/paired_filler.py,sha256=nOBsrAka8PKv5h8SuoJuLTH4HYS4n0vpTIADUCyDKlA,37546
25
21
  wayfinder_paths/adapters/hyperliquid_adapter/test_adapter.py,sha256=JEDeIMSTdrgcSy4BGSVB0CixQzl3NsKpukOZ9mRu3kE,4542
26
- wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=z3vi6AoIkQmOcUW1WyxIPWfv0SIuSNWNp9ABOIkBjzM,7689
22
+ wayfinder_paths/adapters/hyperliquid_adapter/test_adapter_live.py,sha256=lnlL0njECM6C4hVlsEZ4_7wtcixIBO8qqTRO6b1yGGg,7672
27
23
  wayfinder_paths/adapters/hyperliquid_adapter/test_utils.py,sha256=2gSrXJgtfrTqNOQIhBS92vUkfcwhFsMLgFRkf1bzLy8,7290
28
24
  wayfinder_paths/adapters/hyperliquid_adapter/utils.py,sha256=WjLEaNVvcB8FfYlTrwZBrmw7k2MLS5KhBeW4NNoLlVI,4254
29
- wayfinder_paths/adapters/ledger_adapter/README.md,sha256=OIFbJIlck91K3kBKbkPfOWUDx7tJgDjwCAcBLm7FNK4,4104
25
+ wayfinder_paths/adapters/ledger_adapter/README.md,sha256=_tGIpIkg-TCYddf8d4FhJvJuHV79iTizqePosKX2ekU,4079
30
26
  wayfinder_paths/adapters/ledger_adapter/__init__.py,sha256=DK9GShIUiQ57YKSqhCKoS43GCweBxi0lzkUQ9sYVxUA,96
31
27
  wayfinder_paths/adapters/ledger_adapter/adapter.py,sha256=6Fjxltvn9iXp_-CZtN7lDz1Xt0lWaNQX2drx6lgeryw,10260
32
28
  wayfinder_paths/adapters/ledger_adapter/examples.json,sha256=DdqTSe4vnBrfIycQVQQ_JZom7fBGHbL7MR4ppK9ljCY,3936
33
- wayfinder_paths/adapters/ledger_adapter/manifest.yaml,sha256=121VPXNpx13vO9qoBww47Wvpi29JLn5WoIFnudCkDYs,271
34
29
  wayfinder_paths/adapters/ledger_adapter/test_adapter.py,sha256=Z1-rPP9k5fI-8ofWMKgU3syzNegKGH_hGO6CKApQj1c,7470
35
- wayfinder_paths/adapters/pool_adapter/README.md,sha256=ttfG4aP_Y0Bl7DXxPlrAhrubOs9Yu0mtki3h7JqWvxQ,5293
30
+ wayfinder_paths/adapters/moonwell_adapter/README.md,sha256=PyQllVXgW0aUUoWhAZ5phLPAxtR9A5GkwesnZznckV8,5465
31
+ wayfinder_paths/adapters/moonwell_adapter/__init__.py,sha256=Gf6AM4BylxxPenUQ_cveUg70QcB9i61SIYaCsXMSjXw,135
32
+ wayfinder_paths/adapters/moonwell_adapter/adapter.py,sha256=DwUgY03ECTrIr8ulbp4_Ur_ezNK1dkLcNXAkFu3oIxU,45191
33
+ wayfinder_paths/adapters/moonwell_adapter/test_adapter.py,sha256=DLbbCW6ytjKY2C5aQUrW-YBFyrXjush9qbGWiuL42DM,23440
34
+ wayfinder_paths/adapters/pool_adapter/README.md,sha256=JJZ5V-RpDfG-D0-UxyLEYMorPCORNPUaaLpccB5Oslk,2848
36
35
  wayfinder_paths/adapters/pool_adapter/__init__.py,sha256=rv56pYzz2Gqiz33uoPJktCQRe3CRt8U9ry5GbjVgK3A,90
37
- wayfinder_paths/adapters/pool_adapter/adapter.py,sha256=D3J9Bx7urFZjuqfmexg-wDjngKfaeeXi5aNgQXQ2W_Y,7249
38
- wayfinder_paths/adapters/pool_adapter/examples.json,sha256=FS0cssPu2KB05MmzG4Hc0Ka0DzOn_0nogqfHBGLJns8,2295
39
- wayfinder_paths/adapters/pool_adapter/manifest.yaml,sha256=z-OQYBsl2RdV6M34RZzqtQTAFHtQod0po_JD_-9ElNM,217
40
- wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=AYk4YWf0H3FXNBc1NKVmXuLQvE7dpMU-QrCp0XWQYFw,5954
41
- wayfinder_paths/adapters/token_adapter/README.md,sha256=d2tMJte6HBu62CCYXdjS8GHZXj5f2fU03uZAO6pscBI,2698
36
+ wayfinder_paths/adapters/pool_adapter/adapter.py,sha256=-XfmOHqKIr2Q8iyfyKrwIv6bYlyTDDL0WX-XdtKGFqQ,2793
37
+ wayfinder_paths/adapters/pool_adapter/examples.json,sha256=3eLXQIECR3tmUJUeX5wAhiJwFwPMYsUhzkc1i8vUAX8,923
38
+ wayfinder_paths/adapters/pool_adapter/test_adapter.py,sha256=wtdr-IzfhTeS3oBjZLPHUxwYP-3o6tlir3kA6C7lbcE,2709
39
+ wayfinder_paths/adapters/token_adapter/README.md,sha256=TXn7pYQ6bCAiYNl-avem3_Hoz0p3JVyyThxObr59s8k,2673
42
40
  wayfinder_paths/adapters/token_adapter/__init__.py,sha256=nEmxrvffEygn3iKH3cZTNLkhnUUhlUAEtshmrFRAjq8,62
43
41
  wayfinder_paths/adapters/token_adapter/adapter.py,sha256=JEb7A8wJYHxENFhJ6upAgnQAbPZeVfYi6OGs1hiHxnA,3432
44
42
  wayfinder_paths/adapters/token_adapter/examples.json,sha256=RW-3xazj4wbTPl-AVrzduRH1NCXx8m7-06bRMOUJ-lc,3626
45
- wayfinder_paths/adapters/token_adapter/manifest.yaml,sha256=KQgbHAUaJ6JYjTlOJ9HGeRxwmICXVV01qRwW8wJPKMM,143
46
43
  wayfinder_paths/adapters/token_adapter/test_adapter.py,sha256=oEhV5OooRh1oGnaTTMKtdU9oqvHBKR25KgL6-ZB6Mzo,4304
47
44
  wayfinder_paths/config.example.json,sha256=gDvS7W-cbaNe2IV7Q72di_PYpCDKODojELaXdd77Gx4,605
48
45
  wayfinder_paths/conftest.py,sha256=pqDNijXn9_zmbAdkt_2a18UQLjtsDkNTBJVTgC6H2nA,1136
@@ -57,40 +54,38 @@ wayfinder_paths/core/analytics/stats.py,sha256=qE6h0j8TZAbqbVpDeYlVKe0YbV5CENQcH
57
54
  wayfinder_paths/core/analytics/test_analytics.py,sha256=DNkVTsbWPLc9I1eeCD5wsPPqUDgN-npbGRhBgMKn3GM,5580
58
55
  wayfinder_paths/core/clients/AuthClient.py,sha256=scz8GvnabNYAQq_XYDcLP2lf2LZqurQOixA7MMAfbCY,2796
59
56
  wayfinder_paths/core/clients/BRAPClient.py,sha256=-cL05ELlroi3pUfT_5nF8Axie2a0n19npnuP408bkAQ,3744
60
- wayfinder_paths/core/clients/ClientManager.py,sha256=2p8oEFnCxKCH_TBMKo9gMLAwzwLgeotdgFod8wpoa04,8135
57
+ wayfinder_paths/core/clients/ClientManager.py,sha256=pZ4e8XgwDYceCUBFyyemexAH8pqZCAN47iAVVwJWW2Q,7239
61
58
  wayfinder_paths/core/clients/HyperlendClient.py,sha256=6yAhojEbjrRC7YLckwGL_2z5lwI4xnrRVNzxspqKSTg,6173
62
59
  wayfinder_paths/core/clients/LedgerClient.py,sha256=M6VlG0yq3H4rQt6qRxc0QQVd7GoPXJpj2FcD0RM_C_k,14430
63
60
  wayfinder_paths/core/clients/PoolClient.py,sha256=EMIRRw7nh2bha-Qb5uOcIRgbnnu_v5FIvDU0D61nXGI,3475
64
- wayfinder_paths/core/clients/SimulationClient.py,sha256=ViQmXCQKwhpnZA-YkfIgArrpxGr1U11lZNlbBIak1MU,6364
65
61
  wayfinder_paths/core/clients/TokenClient.py,sha256=zg39K-uA1ObkNEcxoXviA1QYSd-fxQXxjBHFOeClY9E,2788
66
- wayfinder_paths/core/clients/TransactionClient.py,sha256=APs-8lMdgBnE40wOn5L8_lEdJ3DddTZFcQbW0tIfJWg,2040
67
- wayfinder_paths/core/clients/WalletClient.py,sha256=Vc2AwllBxUzkdZKKVRrPR4gl8mtvffRxz5QbrpxcH-0,2819
68
- wayfinder_paths/core/clients/WayfinderClient.py,sha256=lLdmD58gAyx5N4yYN4-IYjvRDVzwE3K408XuI07g6g4,10724
69
- wayfinder_paths/core/clients/__init__.py,sha256=oNq6fQW8hUnpkuIZxdbOTLPayJRLA6S-k8e7wqsH_7c,1581
70
- wayfinder_paths/core/clients/protocols.py,sha256=3TYdOdvz9en72_xA6sMHgahB21ZQFP5w86qE6pwo7YA,10117
62
+ wayfinder_paths/core/clients/WalletClient.py,sha256=xG-b5YW1Wps-Lw1JFR3OwAGq0oKMvgIp1crXWd31guE,2604
63
+ wayfinder_paths/core/clients/WayfinderClient.py,sha256=jhrCa3lQXVsp41y19GLztrSSFQiD6hSD2P8dWeHBoNE,10397
64
+ wayfinder_paths/core/clients/__init__.py,sha256=eKbB81C9ZphAKH1uKwkqOmVHtEwFdkDuZLVAQXQXa5M,1254
65
+ wayfinder_paths/core/clients/protocols.py,sha256=yUDz2dEnO-dDZY5pJfDtcvp5rtsoEQYE4G5IQTGLxfA,8469
71
66
  wayfinder_paths/core/clients/sdk_example.py,sha256=Y6mSyHfsWcOje6E-geNI0C4CQ6uyZaD3V9Q8kPM53eo,2969
72
- wayfinder_paths/core/config.py,sha256=A--KQp_EDLXhtituvk3WXPUP2SJv45IcNcm4G_nFMc0,16890
73
- wayfinder_paths/core/constants/__init__.py,sha256=KH-TtfNBJgp0WfKIxvHnvS521odH8RS3Qhl8cQhr4Ys,663
74
- wayfinder_paths/core/constants/base.py,sha256=9XEcgsT_0EMkCoMMdEkvQjjEW9G_8SM3chOBxPpWj00,1169
67
+ wayfinder_paths/core/config.py,sha256=ktogrNlE4DSf1DZONN4_C-sjjuoMFqQtS7chx2KDVYY,15382
68
+ wayfinder_paths/core/constants/__init__.py,sha256=upAVwHDgMXJ3DWaAuXo52UZktS8NZ17s5XwVH0qxgzg,591
69
+ wayfinder_paths/core/constants/base.py,sha256=BYQAD72XrsY6WRrOMIlUOpXLVANS7EYaS5Ell4Nj1H4,1551
75
70
  wayfinder_paths/core/constants/erc20_abi.py,sha256=3ljIyUl6FesoEa4uprwNo-nF0Q5s73M9WEqXLw6ONI4,3214
76
71
  wayfinder_paths/core/constants/hyperlend_abi.py,sha256=nIaqsfMl5-_InYN82pjz0FIKsT-AnNkwz0DIc9VrZSc,4331
72
+ wayfinder_paths/core/constants/moonwell_abi.py,sha256=ALb-kKdfF9aUtEHR8OlqvA-3zJ48N66RvVptTJyCfe4,13135
77
73
  wayfinder_paths/core/engine/StrategyJob.py,sha256=DqwkPu5JHp00xkDmj7kyUqs9U-VP0k-OBlVipjEzk14,7257
78
74
  wayfinder_paths/core/engine/__init__.py,sha256=WZ2KWnmOZnBocYrqdwq6EUHp6lmTyrKyXgHSHyQswnU,108
79
- wayfinder_paths/core/engine/manifest.py,sha256=rkrALipqwqR61lZu_lF1jJj1aqJk6ZskuXokcB1g0HI,3146
80
75
  wayfinder_paths/core/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- wayfinder_paths/core/services/base.py,sha256=Ip7fkRPvCibLs67n-0_ESrDR0t9lffGqY-4K2pJfoG8,5585
82
- wayfinder_paths/core/services/local_evm_txn.py,sha256=n0LJOH9-Gy9JDjMvz16Lk1PD9gpsuiw2EEW7PNmkzTI,16982
83
- wayfinder_paths/core/services/local_token_txn.py,sha256=S9RJq2_fm1sqmJmn83vMo69-GQLeCkQ-20rrv0ezU1g,8049
84
- wayfinder_paths/core/services/web3_service.py,sha256=_8sEpkWzSzp7dQR5OCwScypyOsEv5s2BeuO8TqB_H-w,1558
85
- wayfinder_paths/core/settings.py,sha256=VqNOU84OsX_6KAWr9JdPfyxtV14yTH1uZl2zuKeiJ3g,1921
86
- wayfinder_paths/core/strategies/Strategy.py,sha256=7Fn29fhCW3TJ1rJnWJHd4e5ndeDfFjNbeAgAazAynUs,9499
76
+ wayfinder_paths/core/services/base.py,sha256=cvfNoS8VXP7ksrZIjk4BYvqtSSueiHphcxny7Qt7VHY,5980
77
+ wayfinder_paths/core/services/local_evm_txn.py,sha256=kzJUOvHWLZ0ygRmYpVnJJTp48E072YpfD8R9IJJIzOM,16522
78
+ wayfinder_paths/core/services/local_token_txn.py,sha256=YQjuHjdyGwVfAZt3FGMkSKoc34bRiJrWRiR5pXJmL9U,8556
79
+ wayfinder_paths/core/services/web3_service.py,sha256=7iR7bfqfUQCQcdfEWVGqy04PZBtZTuzCDpfLt1a-4OI,1485
80
+ wayfinder_paths/core/settings.py,sha256=aJdy2bRcJtufr4TZnu30R2iv---Ru4s6nxKo-j22uKQ,1962
81
+ wayfinder_paths/core/strategies/Strategy.py,sha256=nEzry8V-FGSM-S1eBmT35Ba2cVOJn3hNNWenpTMAVv8,9455
87
82
  wayfinder_paths/core/strategies/__init__.py,sha256=2NjvvDw6sIQGUFV4Qo1olXTxUOY3GmCM8Ivz_J1FSmc,157
88
83
  wayfinder_paths/core/strategies/base.py,sha256=-s0qeiGZl5CHTUL2PavGXM7ACkNlaa0c4jeZR_4DuBM,155
89
- wayfinder_paths/core/strategies/descriptors.py,sha256=E8vi7ssaj6rglKVp1xl4PlUlJYLSoayXkTzsPb78vrs,1648
84
+ wayfinder_paths/core/strategies/descriptors.py,sha256=9eFf-gPNw1NO1o1eQqGlEgnz237IpAmrmZnIH3JD-ys,1642
90
85
  wayfinder_paths/core/utils/__init__.py,sha256=TEylMYHnG37Z3mizSmw28bUm0vyNBFzf0Nc8dB_7l1A,73
91
- wayfinder_paths/core/utils/evm_helpers.py,sha256=sJUGpwbc3jD9h1BaaYC4mPDs25S3YKyoY1NfvHq9BBg,6491
86
+ wayfinder_paths/core/utils/evm_helpers.py,sha256=D1NFanIdy7TcBHOFwYHAgnhENChaW34BNarFfauMX38,6230
92
87
  wayfinder_paths/core/utils/wallets.py,sha256=tGgVxDW2ZvkvJIb6yow1cirrqhQ67_X9IqxZocBEy2k,2438
93
- wayfinder_paths/core/wallets/README.md,sha256=gwzFapFnpArdIyUz0NdYOq5Nm9_uqDYuFddKAZJ0Ss4,3745
88
+ wayfinder_paths/core/wallets/README.md,sha256=GdO1RFUG_jZdVH6qeobHlr_c69hEDgLLrgqYCvj_dGs,3701
94
89
  wayfinder_paths/core/wallets/WalletManager.py,sha256=sptj0Dya9iM87BDzUktrYM_Mw33xyVJNrRUTVfBjHGw,1870
95
90
  wayfinder_paths/core/wallets/__init__.py,sha256=hIuhy64pJOs_8mAP7Zup28goXbT8qjBeeVYMkbqlyu8,315
96
91
  wayfinder_paths/policies/enso.py,sha256=oytco04eeGjiRbZPGFE1YpH4NxvV0tfVM14QmlyzjkY,428
@@ -102,48 +97,46 @@ wayfinder_paths/policies/hyperliquid.py,sha256=hAxNtWdxavwf_a-AnlXMOmEYakkNBkrPT
102
97
  wayfinder_paths/policies/moonwell.py,sha256=sKWLbruMKiW7Yh1DhXdVPRe0JBP-nooNybRz0G9PgvA,1605
103
98
  wayfinder_paths/policies/prjx.py,sha256=6kfZ6OQFroFHYJl4vSWT-svwwfvoHlS_ZrcHt8nmZMU,743
104
99
  wayfinder_paths/policies/util.py,sha256=r8xQLPvE3kU21_LG6VbkFI9sUSYltcsKunryZdHOUDA,912
105
- wayfinder_paths/run_strategy.py,sha256=HRj5iY2AFWaxRKXukKUKPxaXcz4YN-fb6anSLHJaeDg,14502
100
+ wayfinder_paths/run_strategy.py,sha256=TPtewPaNc4IjSLF83BKhEOYTJacnHNhiiyWjbEwb1oc,11830
106
101
  wayfinder_paths/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
- wayfinder_paths/scripts/create_strategy.py,sha256=rp2kkGXsmcAbOt1eZthV1iZ2yM6wAbjn4R10IATulOw,6275
108
- wayfinder_paths/scripts/make_wallets.py,sha256=_diYY5FzpLC5mFVIzZsQUBhlBCUQpvhxL5CtQW0qaT8,6298
109
- wayfinder_paths/scripts/run_strategy.py,sha256=EQDsE59mLHXR0HO7vzmzNsqSj-YpsuObC9tg2ZYVztA,3633
110
- wayfinder_paths/scripts/validate_manifests.py,sha256=sTJhCVTb8X0SFYozArVbX4AMAEv-0R1Imp4dpHfAuHE,7075
102
+ wayfinder_paths/scripts/create_strategy.py,sha256=a4TOYg7iNhnnV2A1emTfxo0mvZzW-Uitnksl5LDsPGQ,5357
103
+ wayfinder_paths/scripts/make_wallets.py,sha256=LkWr65mKtKMYlm2ZINsacvnIJ--A5c97xG9ZY1azVec,5242
104
+ wayfinder_paths/scripts/run_strategy.py,sha256=QXu30xL1DcyucF80VhH2ArzyOqcZkTi-4VFYD0D01f0,4453
111
105
  wayfinder_paths/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
106
  wayfinder_paths/strategies/basis_trading_strategy/README.md,sha256=rTUXQ2owEoPmXlfHcJfRFCwcQxlU3a4hOJGN5kaWWQ0,7176
113
107
  wayfinder_paths/strategies/basis_trading_strategy/__init__.py,sha256=kVcehFjBUtoi5xzSHI56jtDghsy0nYl6XIE6BI1l6aI,79
114
108
  wayfinder_paths/strategies/basis_trading_strategy/constants.py,sha256=PJ1WtSALxiuW1FXx-BF30ciFISEhO5VBfrSZyfhPuz0,45
115
109
  wayfinder_paths/strategies/basis_trading_strategy/examples.json,sha256=q2wlAH8Gr-LUJeamKzWL1EtChL3TBWe0HQ4_P-VCdqQ,429
116
- wayfinder_paths/strategies/basis_trading_strategy/manifest.yaml,sha256=cmvAizwBP_SoXvypal8CEHLNh4Du5M_RBKy37ScUjL0,1078
117
- wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=pkYJ3Ax7quuJUZT_AjB6PFNPM3iDmEE6xpXGthXa5UY,38748
118
- wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=pA11cJXTVuvwBiSc_BYsapshtKBK5FI_Xm-hKxJ9bhg,173962
119
- wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=cFw191y1ud-dtb8jBMTvEbmvhZAXJmLkHaQ3BQBxlXg,28964
110
+ wayfinder_paths/strategies/basis_trading_strategy/snapshot_mixin.py,sha256=Z1rgAfLGaSFFL2bS9_XPc7RzpY1Q74jZQGc86Yo_0DQ,38634
111
+ wayfinder_paths/strategies/basis_trading_strategy/strategy.py,sha256=jfLz0tuyqDhoWIGxuYRcPQLhJNeHV6aeBG5jSZIpsEo,171710
112
+ wayfinder_paths/strategies/basis_trading_strategy/test_strategy.py,sha256=FH0napmPYTzmflxfyqrqHujO9fmatYbXRH19LSsO_sA,31579
120
113
  wayfinder_paths/strategies/basis_trading_strategy/types.py,sha256=rlbouTUOVPLfGPzMbsf-fUmMcn0R_OsG-IdfiBJmmqI,845
121
114
  wayfinder_paths/strategies/config.py,sha256=5dv-8tWwoxH3Sxd9jtiw90shrLipEe3UlU-IYUBfciM,2762
122
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=8mjDUBkBEYp_GWkM0knbFIbJ2Nmb-63pNR09ztZ67qo,4596
123
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=72lu80KAzPG2Bqu_ct1I0qsnEFVs-lurwCXuHZrefck,95
124
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/manifest.yaml,sha256=__YWl6MEeTBLbNWwUyZjQky0ok1T8B1m8dHPQWtW454,240
125
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=VqHuuULeXZ5bA8g7cK9oD1kgXrK87N8Hxu8bnDBR1Cc,88820
126
- wayfinder_paths/strategies/hyperlend_stable_yield_strategy/test_strategy.py,sha256=xXPYV45EivXvKPuq-3sJP4Ce5m9GWfGzG40miOtwmxI,13371
127
- wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=Qj1b2bU5606pbZXsPf1WOtsx0erfBaXpRygxIDGVIgE,5211
115
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/README.md,sha256=2QYulV-rr_Q4rVJTn-Sd0Zurbi7f_1k6V5a808JaqfY,4182
116
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/examples.json,sha256=GbVo2p6QiG6M7Ma5s671lw8G9JwnMl1h0n9mrtt-ZS8,164
117
+ wayfinder_paths/strategies/hyperlend_stable_yield_strategy/strategy.py,sha256=hCcJk3YTPy5NSdWpHWXbAeLxjp4-zPY0MWeKb7qBBz4,91667
118
+ 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=Vt8Ce429dkiZRKjfx2c-PEEykp62mbjfBcvOCXe7yjY,4517
120
+ 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=sR6KbfEjBlCo6BCF2S3-IRd6Ir1cOF1pl4UNfts1Erg,125347
122
+ wayfinder_paths/strategies/moonwell_wsteth_loop_strategy/test_strategy.py,sha256=9PfA5AiTdsyWcd3weNgFaoYJ5iWirZSPFoUwSBts7BY,31248
123
+ wayfinder_paths/strategies/stablecoin_yield_strategy/README.md,sha256=KvIkgUdNuG5MGoKDQnth1BvIfQ9XVy6l0V2reYi9oR4,4954
128
124
  wayfinder_paths/strategies/stablecoin_yield_strategy/examples.json,sha256=pL1DNFEvYvXKK7xXD5oQYFPQj3Cm1ocKnk6r_iZk0IY,423
129
- wayfinder_paths/strategies/stablecoin_yield_strategy/manifest.yaml,sha256=rBb7-Fmub8twfKJgbBIiCWbwI2nLnuqBNyAJs36WhIg,750
130
- wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=6Ug2_cFx3nqw4Of5Oo1e9h1tQL1G3JXk2XcxNoq2Q0g,75607
131
- wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=StGLLqDwthmqYDKLo-Qo0XCUU0pEFD_H65smdxgpBGc,20125
132
- wayfinder_paths/templates/adapter/README.md,sha256=QcJ0cwXqqtj1VRK1wAs-unUphTPHdJwoIrIoSU4hTmA,3550
133
- wayfinder_paths/templates/adapter/adapter.py,sha256=8wdqcEwqb7XGUxl2gQvGnbFwhPi1h15ZJhB2lgtZieI,814
125
+ wayfinder_paths/strategies/stablecoin_yield_strategy/strategy.py,sha256=e9AW57Co_xffjm07BGTwPZ6COIHra2ri7ip8eYUXO6g,75424
126
+ wayfinder_paths/strategies/stablecoin_yield_strategy/test_strategy.py,sha256=z3vkiyELwJipWNjksdG3Vs6HIVE_y-UoHJCDezXMH60,19967
127
+ wayfinder_paths/templates/adapter/README.md,sha256=nQkJeAfHXXSJj_dXaiFq5LarpHGaDmxwgb0U9pxACqQ,2925
128
+ wayfinder_paths/templates/adapter/adapter.py,sha256=UGPvD8SNcrEtYQXRTUxvK9WZ9Bzx1Xwb8sr9zSbqnuc,763
134
129
  wayfinder_paths/templates/adapter/examples.json,sha256=KLHy3AgPIplAaZN0qY2A-HBMa1xXkMhIyusORovTD9w,79
135
- wayfinder_paths/templates/adapter/manifest.yaml,sha256=Xr46INOnH-R9ambF7GvzhTSZgxW3qPlOtt_04xH0_50,134
136
- wayfinder_paths/templates/adapter/test_adapter.py,sha256=ENjaZH-LMPGYUUbqsfXtvUQep51XjPQNv52i47rkaNk,1525
137
- wayfinder_paths/templates/strategy/README.md,sha256=c7iKlgkz0FPQC3xjMlXqYaDIwC_EKr0wJ6pCLfr2Oik,5664
130
+ wayfinder_paths/templates/adapter/test_adapter.py,sha256=PeG9ZZwx-cWXCDUKxrvj1cR8ljo9aXrKANZuz2hFAhk,1510
131
+ wayfinder_paths/templates/strategy/README.md,sha256=H3pOl_dy_dV3lsRluzV4omjwucJxT_OYBFvakeCFJTg,4972
138
132
  wayfinder_paths/templates/strategy/examples.json,sha256=s8UdlD5uxLITQrRMCqgiaAP0IE0tdnnLfX-Zn-OChIc,135
139
- wayfinder_paths/templates/strategy/manifest.yaml,sha256=Q13sIhfE7u0wMwa8oFwMZr_twwVMprMV4c_JEQNhkz8,289
140
133
  wayfinder_paths/templates/strategy/strategy.py,sha256=dso2jhVphsdKNd17JPwnFAFzU01-1kHlWrKPAKIKSWw,2024
141
- wayfinder_paths/templates/strategy/test_strategy.py,sha256=-ktqbtJ-lXr0CVGgjFkleWmdZeT2nsyL_zt7Hq1aC1g,7692
134
+ wayfinder_paths/templates/strategy/test_strategy.py,sha256=PwDVFTo7gql3WRqhhmyiBE9orfhXv46FBO989NQNxI0,7519
142
135
  wayfinder_paths/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
- wayfinder_paths/tests/test_smoke_manifest.py,sha256=YjVzHTWys5o6Ae2cUuuJPhk-QgKxT1InDFHLjpouRiY,1267
136
+ wayfinder_paths/tests/test_smoke_manifest.py,sha256=kTcIa4qikcspVh2ohQIk0aHUdIvBvcQBfNbm3PNiVvg,1636
144
137
  wayfinder_paths/tests/test_test_coverage.py,sha256=9NrZeVmP02D4W7Qc0XjciC05bhvdTCVibYjTGfa_GQk,7893
145
138
  wayfinder_paths/tests/test_utils.py,sha256=pxHT0QKFlyJeJo8bFnKXzWcOdi6t8rbJ0JFCBaFCBRQ,2112
146
- wayfinder_paths-0.1.8.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
147
- wayfinder_paths-0.1.8.dist-info/METADATA,sha256=xHD03utEsSU9sZijwc-UwDmK0kXBiUNUIcQgD0eDfXA,31404
148
- wayfinder_paths-0.1.8.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
149
- wayfinder_paths-0.1.8.dist-info/RECORD,,
139
+ wayfinder_paths-0.1.10.dist-info/LICENSE,sha256=dYKnlkC_xosBAEQNUvB6cHMuhFgcUtN0oBR7E8_aR2Y,1066
140
+ wayfinder_paths-0.1.10.dist-info/METADATA,sha256=Nyi2X5KQqUSKYoXjM7MQl_mnYZ8EIYbZ4t0BPwC-RSY,25656
141
+ wayfinder_paths-0.1.10.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
142
+ wayfinder_paths-0.1.10.dist-info/RECORD,,
@@ -1,8 +0,0 @@
1
- schema_version: "0.1"
2
- entrypoint: "adapters.balance_adapter.adapter.BalanceAdapter"
3
- capabilities:
4
- - "wallet_read"
5
- - "wallet_transfer"
6
- dependencies:
7
- - "TokenClient"
8
- - "WalletClient"
@@ -1,11 +0,0 @@
1
- schema_version: "0.1"
2
- entrypoint: "adapters.brap_adapter.adapter.BRAPAdapter"
3
- capabilities:
4
- - "swap.quote"
5
- - "swap.execute"
6
- - "bridge.quote"
7
- - "bridge.execute"
8
- - "route.optimize"
9
- - "fee.calculate"
10
- dependencies:
11
- - "BRAPClient"
@@ -1,10 +0,0 @@
1
- schema_version: "0.1"
2
- entrypoint: "adapters.hyperlend_adapter.adapter.HyperlendAdapter"
3
- capabilities:
4
- - "hyperlend.stable_markets.read"
5
- - "hyperlend.markets.query"
6
- - "hyperlend.assets_view.read"
7
- - "hyperlend.lend"
8
- dependencies:
9
- - "HyperlendClient"
10
-
@@ -1,8 +0,0 @@
1
- schema_version: "0.1"
2
- entrypoint: "adapters.hyperliquid_adapter.adapter.HyperliquidAdapter"
3
- capabilities:
4
- - "market.meta"
5
- - "market.funding"
6
- - "market.candles"
7
- - "market.orderbook"
8
- - "user.state"
@@ -1,11 +0,0 @@
1
- schema_version: "0.1"
2
- entrypoint: "adapters.ledger_adapter.adapter.LedgerAdapter"
3
- capabilities:
4
- - "ledger.read"
5
- - "ledger.write"
6
- - "strategy.transactions"
7
- - "strategy.deposits"
8
- - "strategy.withdrawals"
9
- - "strategy.operations"
10
- dependencies:
11
- - "LedgerClient"
@@ -1,10 +0,0 @@
1
- schema_version: "0.1"
2
- entrypoint: "adapters.pool_adapter.adapter.PoolAdapter"
3
- capabilities:
4
- - "pool.read"
5
- - "pool.analytics"
6
- - "pool.discovery"
7
- - "llama.data"
8
- - "pool.reports"
9
- dependencies:
10
- - "PoolClient"
@@ -1,6 +0,0 @@
1
- schema_version: "0.1"
2
- entrypoint: "adapters.token_adapter.adapter.TokenAdapter"
3
- capabilities:
4
- - "token.read"
5
- dependencies:
6
- - "TokenClient"
@@ -1,192 +0,0 @@
1
- """
2
- Simulation Client
3
- Handles blockchain transaction simulations via Gorlami/Tenderly
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- import time
9
- from typing import NotRequired, Required, TypedDict
10
-
11
- from loguru import logger
12
-
13
- from wayfinder_paths.core.clients.WayfinderClient import WayfinderClient
14
-
15
-
16
- class SimulationResult(TypedDict):
17
- """Simulation result structure"""
18
-
19
- success: Required[bool]
20
- gas_used: NotRequired[str | None]
21
- gas_price: NotRequired[str | None]
22
- balances: NotRequired[dict[str, str]]
23
- error: NotRequired[str | None]
24
-
25
-
26
- class SimulationClient(WayfinderClient):
27
- """Client for blockchain transaction simulations"""
28
-
29
- def __init__(self, api_key: str | None = None):
30
- super().__init__(api_key=api_key)
31
-
32
- async def simulate_send(
33
- self,
34
- from_address: str,
35
- to_address: str,
36
- token_address: str,
37
- amount: str,
38
- chain_id: int,
39
- initial_balances: dict[str, str],
40
- ) -> SimulationResult:
41
- """
42
- Simulate sending native ETH or ERC20 tokens.
43
-
44
- Args:
45
- from_address: Source wallet address
46
- to_address: Destination wallet address
47
- token_address: Token contract address (use 0x0 for native ETH)
48
- amount: Amount to send
49
- chain_id: Blockchain chain ID
50
- initial_balances: Initial token balances for simulation
51
-
52
- Returns:
53
- Simulation result data
54
- """
55
- logger.info(
56
- f"Simulating send: {amount} from {from_address} to {to_address} (chain {chain_id})"
57
- )
58
- start_time = time.time()
59
-
60
- url = f"{self.api_base_url}public/simulate/send/"
61
-
62
- payload = {
63
- "from_address": from_address,
64
- "to_address": to_address,
65
- "token_address": token_address,
66
- "amount": amount,
67
- "chain_id": chain_id,
68
- "initial_balances": initial_balances,
69
- }
70
-
71
- try:
72
- response = await self._request("POST", url, json=payload, headers={})
73
- response.raise_for_status()
74
- data = response.json()
75
- elapsed = time.time() - start_time
76
- logger.info(f"Simulation request completed successfully in {elapsed:.2f}s")
77
- return data.get("data", data)
78
- except Exception as e:
79
- elapsed = time.time() - start_time
80
- logger.error(f"Simulation request failed after {elapsed:.2f}s: {e}")
81
- raise
82
-
83
- async def simulate_approve(
84
- self,
85
- from_address: str,
86
- to_address: str,
87
- token_address: str,
88
- amount: str,
89
- chain_id: int,
90
- initial_balances: dict[str, str],
91
- clear_approval_first: bool = False,
92
- ) -> SimulationResult:
93
- """
94
- Simulate ERC20 token approval.
95
-
96
- Args:
97
- from_address: Address approving the tokens
98
- to_address: Address being approved to spend tokens
99
- token_address: ERC20 token contract address
100
- amount: Amount to approve
101
- chain_id: Blockchain chain ID
102
- initial_balances: Initial token balances for simulation
103
- clear_approval_first: Whether to clear existing approval before setting new one
104
-
105
- Returns:
106
- Simulation result data
107
- """
108
- logger.info(
109
- f"Simulating approval: {amount} from {from_address} to {to_address} (chain {chain_id})"
110
- )
111
- start_time = time.time()
112
-
113
- url = f"{self.api_base_url}public/simulate/approve/"
114
-
115
- payload = {
116
- "from_address": from_address,
117
- "to_address": to_address,
118
- "token_address": token_address,
119
- "amount": amount,
120
- "chain_id": chain_id,
121
- "initial_balances": initial_balances,
122
- "clear_approval_first": clear_approval_first,
123
- }
124
-
125
- try:
126
- response = await self._request("POST", url, json=payload, headers={})
127
- response.raise_for_status()
128
- data = response.json()
129
- elapsed = time.time() - start_time
130
- logger.info(f"Simulation request completed successfully in {elapsed:.2f}s")
131
- return data.get("data", data)
132
- except Exception as e:
133
- elapsed = time.time() - start_time
134
- logger.error(f"Simulation request failed after {elapsed:.2f}s: {e}")
135
- raise
136
-
137
- async def simulate_swap(
138
- self,
139
- from_token_address: str,
140
- to_token_address: str,
141
- from_chain_id: int,
142
- to_chain_id: int,
143
- amount: str,
144
- from_address: str,
145
- slippage: float,
146
- initial_balances: dict[str, str],
147
- ) -> SimulationResult:
148
- """
149
- Simulate token swap operation.
150
-
151
- Args:
152
- from_token_address: Source token contract address
153
- to_token_address: Destination token contract address
154
- from_chain_id: Source chain ID
155
- to_chain_id: Destination chain ID
156
- amount: Amount to swap
157
- from_address: Wallet address initiating swap
158
- slippage: Maximum slippage tolerance
159
- initial_balances: Initial token balances for simulation
160
-
161
- Returns:
162
- Simulation result data
163
- """
164
- logger.info(
165
- f"Simulating swap: {from_token_address} -> {to_token_address} (chain {from_chain_id} -> {to_chain_id})"
166
- )
167
- start_time = time.time()
168
-
169
- url = f"{self.api_base_url}public/simulate/swap/"
170
-
171
- payload = {
172
- "from_token_address": from_token_address,
173
- "to_token_address": to_token_address,
174
- "from_chain_id": from_chain_id,
175
- "to_chain_id": to_chain_id,
176
- "amount": amount,
177
- "from_address": from_address,
178
- "slippage": slippage,
179
- "initial_balances": initial_balances,
180
- }
181
-
182
- try:
183
- response = await self._request("POST", url, json=payload, headers={})
184
- response.raise_for_status()
185
- data = response.json()
186
- elapsed = time.time() - start_time
187
- logger.info(f"Simulation request completed successfully in {elapsed:.2f}s")
188
- return data.get("data", data)
189
- except Exception as e:
190
- elapsed = time.time() - start_time
191
- logger.error(f"Simulation request failed after {elapsed:.2f}s: {e}")
192
- raise
@@ -1,63 +0,0 @@
1
- """
2
- Transaction Client
3
- Handles transaction building, gas estimation, and monitoring
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- from typing import NotRequired, Required, TypedDict
9
-
10
- from wayfinder_paths.core.clients.AuthClient import AuthClient
11
- from wayfinder_paths.core.clients.WayfinderClient import WayfinderClient
12
- from wayfinder_paths.core.settings import settings
13
-
14
-
15
- class TransactionPayload(TypedDict):
16
- """Transaction payload structure"""
17
-
18
- from_address: Required[str]
19
- to_address: Required[str]
20
- token_address: Required[str]
21
- amount: Required[str]
22
- chain_id: Required[int]
23
- data: NotRequired[str | None]
24
- value: NotRequired[str | None]
25
- gas_limit: NotRequired[str | None]
26
- gas_price: NotRequired[str | None]
27
-
28
-
29
- class TransactionClient(WayfinderClient):
30
- """Client for transaction operations"""
31
-
32
- def __init__(self, api_key: str | None = None):
33
- super().__init__(api_key=api_key)
34
- self.api_base_url = f"{self.api_base_url}/transactions"
35
- self._auth_client: AuthClient | None = AuthClient(api_key=api_key)
36
-
37
- # ============== Protected (Auth Required) Endpoints ==============
38
-
39
- async def build_send(
40
- self,
41
- from_address: str,
42
- to_address: str,
43
- token_address: str,
44
- amount: float,
45
- chain_id: int,
46
- ) -> TransactionPayload:
47
- """
48
- Build a send transaction payload for EVM tokens/native transfers.
49
-
50
- GET /api/v1/public/transactions/build-send/?from_address=...&to_address=...&token_address=...&amount=...&chain_id=...
51
- """
52
- url = f"{settings.WAYFINDER_API_URL}/public/transactions/build-send/"
53
- params = {
54
- "from_address": from_address,
55
- "to_address": to_address,
56
- "token_address": token_address,
57
- "amount": str(amount),
58
- "chain_id": str(chain_id),
59
- }
60
- response = await self._authed_request("GET", url, params=params)
61
- response.raise_for_status()
62
- data = response.json()
63
- return data.get("data", data)
@@ -1,97 +0,0 @@
1
- from typing import Any
2
-
3
- import yaml
4
- from pydantic import BaseModel, Field, validator
5
-
6
-
7
- class AdapterRequirement(BaseModel):
8
- name: str = Field(
9
- ..., description="Adapter symbolic name (e.g., BALANCE, HYPERLIQUID)"
10
- )
11
- capabilities: list[str] = Field(default_factory=list)
12
-
13
-
14
- class AdapterManifest(BaseModel):
15
- schema_version: str = Field(default="0.1")
16
- entrypoint: str
17
- capabilities: list[str] = Field(default_factory=list)
18
- dependencies: list[str] = Field(default_factory=list)
19
-
20
- @validator("entrypoint")
21
- def validate_entrypoint(cls, v: str) -> str:
22
- if "." not in v:
23
- raise ValueError("entrypoint must be a full import path")
24
- return v
25
-
26
- @validator("capabilities")
27
- def validate_capabilities(cls, v: list[str]) -> list[str]:
28
- if not v:
29
- raise ValueError("capabilities cannot be empty")
30
- return v
31
-
32
- @validator("dependencies")
33
- def validate_dependencies(cls, v: list[str]) -> list[str]:
34
- if not v:
35
- raise ValueError("dependencies cannot be empty")
36
- return v
37
-
38
-
39
- class StrategyManifest(BaseModel):
40
- schema_version: str = Field(default="0.1")
41
- entrypoint: str = Field(
42
- ...,
43
- description="Python path to class, e.g. strategies.funding_rate_strategy.FundingRateStrategy",
44
- )
45
- name: str | None = Field(
46
- default=None,
47
- description="Unique name identifier for this strategy instance. Used to look up dedicated wallet in wallets.json by label.",
48
- )
49
- permissions: dict[str, Any] = Field(default_factory=dict)
50
- adapters: list[AdapterRequirement] = Field(default_factory=list)
51
-
52
- @validator("entrypoint")
53
- def validate_entrypoint(cls, v: str) -> str:
54
- if "." not in v:
55
- raise ValueError(
56
- "entrypoint must be a full import path to a Strategy class"
57
- )
58
- return v
59
-
60
- @validator("permissions")
61
- def validate_permissions(cls, v: dict) -> dict:
62
- if "policy" not in v:
63
- raise ValueError("permissions.policy is required")
64
- if not v["policy"]:
65
- raise ValueError("permissions.policy cannot be empty")
66
- return v
67
-
68
- @validator("adapters")
69
- def validate_adapters(cls, v: list) -> list:
70
- if not v:
71
- raise ValueError("adapters cannot be empty")
72
- return v
73
-
74
-
75
- def load_adapter_manifest(path: str) -> AdapterManifest:
76
- with open(path) as f:
77
- data = yaml.safe_load(f)
78
- return AdapterManifest(**data)
79
-
80
-
81
- def load_strategy_manifest(path: str) -> StrategyManifest:
82
- with open(path) as f:
83
- data = yaml.safe_load(f)
84
- return StrategyManifest(**data)
85
-
86
-
87
- def load_manifest(path: str) -> StrategyManifest:
88
- """Legacy function for backward compatibility."""
89
- return load_strategy_manifest(path)
90
-
91
-
92
- def validate_manifest(manifest: StrategyManifest) -> None:
93
- # Simple v0.1 rules: require at least one adapter and permissions.policy
94
- if not manifest.adapters:
95
- raise ValueError("Manifest must declare at least one adapter")
96
- if "policy" not in manifest.permissions:
97
- raise ValueError("Manifest.permissions must include 'policy'")