iwa 0.0.14__tar.gz → 0.0.15__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. {iwa-0.0.14/src/iwa.egg-info → iwa-0.0.15}/PKG-INFO +1 -1
  2. {iwa-0.0.14 → iwa-0.0.15}/pyproject.toml +2 -2
  3. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/contracts/contract.py +27 -7
  4. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/pricing.py +18 -7
  5. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/service_manager/base.py +7 -3
  6. {iwa-0.0.14 → iwa-0.0.15/src/iwa.egg-info}/PKG-INFO +1 -1
  7. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_contract.py +9 -1
  8. {iwa-0.0.14 → iwa-0.0.15}/LICENSE +0 -0
  9. {iwa-0.0.14 → iwa-0.0.15}/README.md +0 -0
  10. {iwa-0.0.14 → iwa-0.0.15}/setup.cfg +0 -0
  11. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/__init__.py +0 -0
  12. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/__main__.py +0 -0
  13. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/__init__.py +0 -0
  14. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/chain/__init__.py +0 -0
  15. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/chain/errors.py +0 -0
  16. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/chain/interface.py +0 -0
  17. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/chain/manager.py +0 -0
  18. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/chain/models.py +0 -0
  19. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/chain/rate_limiter.py +0 -0
  20. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/cli.py +0 -0
  21. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/constants.py +0 -0
  22. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/contracts/__init__.py +0 -0
  23. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/contracts/abis/erc20.json +0 -0
  24. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/contracts/abis/multisend.json +0 -0
  25. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
  26. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/contracts/erc20.py +0 -0
  27. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/contracts/multisend.py +0 -0
  28. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/db.py +0 -0
  29. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/ipfs.py +0 -0
  30. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/keys.py +0 -0
  31. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/mnemonic.py +0 -0
  32. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/models.py +0 -0
  33. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/monitor.py +0 -0
  34. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/plugins.py +0 -0
  35. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/secrets.py +0 -0
  36. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/__init__.py +0 -0
  37. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/account.py +0 -0
  38. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/balance.py +0 -0
  39. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/plugin.py +0 -0
  40. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/safe.py +0 -0
  41. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/transaction.py +0 -0
  42. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/transfer/__init__.py +0 -0
  43. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/transfer/base.py +0 -0
  44. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/transfer/erc20.py +0 -0
  45. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/transfer/multisend.py +0 -0
  46. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/transfer/native.py +0 -0
  47. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/services/transfer/swap.py +0 -0
  48. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/tables.py +0 -0
  49. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/test.py +0 -0
  50. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/tests/test_wallet.py +0 -0
  51. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/types.py +0 -0
  52. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/ui.py +0 -0
  53. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/utils.py +0 -0
  54. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/core/wallet.py +0 -0
  55. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/__init__.py +0 -0
  56. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/__init__.py +0 -0
  57. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
  58. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
  59. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
  60. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/cow/types.py +0 -0
  61. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
  62. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/plugin.py +0 -0
  63. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/safe.py +0 -0
  64. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
  65. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
  66. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/__init__.py +0 -0
  67. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/constants.py +0 -0
  68. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
  69. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
  70. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
  71. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
  72. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
  73. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
  74. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
  75. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
  76. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
  77. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/activity_checker.py +0 -0
  78. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/base.py +0 -0
  79. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/mech.py +0 -0
  80. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
  81. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/service.py +0 -0
  82. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/contracts/staking.py +0 -0
  83. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/importer.py +0 -0
  84. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/mech_reference.py +0 -0
  85. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/models.py +0 -0
  86. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/plugin.py +0 -0
  87. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
  88. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
  89. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
  90. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
  91. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/service_manager/lifecycle.py +0 -0
  92. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/service_manager/mech.py +0 -0
  93. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
  94. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/conftest.py +0 -0
  95. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
  96. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
  97. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
  98. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
  99. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
  100. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
  101. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
  102. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
  103. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
  104. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
  105. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
  106. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
  107. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
  108. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
  109. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
  110. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
  111. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
  112. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
  113. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
  114. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
  115. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
  116. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tui/__init__.py +0 -0
  117. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/plugins/olas/tui/olas_view.py +0 -0
  118. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/__init__.py +0 -0
  119. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/check_profile.py +0 -0
  120. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/list_contracts.py +0 -0
  121. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/release.py +0 -0
  122. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/reset_env.py +0 -0
  123. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/reset_tenderly.py +0 -0
  124. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/restore_backup.py +0 -0
  125. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tools/wallet_check.py +0 -0
  126. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/__init__.py +0 -0
  127. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/app.py +0 -0
  128. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/modals/__init__.py +0 -0
  129. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/modals/base.py +0 -0
  130. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/rpc.py +0 -0
  131. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/screens/__init__.py +0 -0
  132. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/screens/wallets.py +0 -0
  133. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/tests/test_app.py +0 -0
  134. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/tests/test_rpc.py +0 -0
  135. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
  136. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/tests/test_widgets.py +0 -0
  137. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/widgets/__init__.py +0 -0
  138. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/widgets/base.py +0 -0
  139. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/tui/workers.py +0 -0
  140. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/dependencies.py +0 -0
  141. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/models.py +0 -0
  142. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/accounts.py +0 -0
  143. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/olas/__init__.py +0 -0
  144. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/olas/admin.py +0 -0
  145. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/olas/funding.py +0 -0
  146. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/olas/general.py +0 -0
  147. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/olas/services.py +0 -0
  148. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/olas/staking.py +0 -0
  149. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/state.py +0 -0
  150. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/swap.py +0 -0
  151. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/routers/transactions.py +0 -0
  152. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/server.py +0 -0
  153. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/static/app.js +0 -0
  154. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/static/index.html +0 -0
  155. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/static/style.css +0 -0
  156. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/tests/test_web_endpoints.py +0 -0
  157. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/tests/test_web_olas.py +0 -0
  158. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/tests/test_web_swap.py +0 -0
  159. {iwa-0.0.14 → iwa-0.0.15}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
  160. {iwa-0.0.14 → iwa-0.0.15}/src/iwa.egg-info/SOURCES.txt +0 -0
  161. {iwa-0.0.14 → iwa-0.0.15}/src/iwa.egg-info/dependency_links.txt +0 -0
  162. {iwa-0.0.14 → iwa-0.0.15}/src/iwa.egg-info/entry_points.txt +0 -0
  163. {iwa-0.0.14 → iwa-0.0.15}/src/iwa.egg-info/requires.txt +0 -0
  164. {iwa-0.0.14 → iwa-0.0.15}/src/iwa.egg-info/top_level.txt +0 -0
  165. {iwa-0.0.14 → iwa-0.0.15}/src/tests/legacy_cow.py +0 -0
  166. {iwa-0.0.14 → iwa-0.0.15}/src/tests/legacy_safe.py +0 -0
  167. {iwa-0.0.14 → iwa-0.0.15}/src/tests/legacy_transaction_retry_logic.py +0 -0
  168. {iwa-0.0.14 → iwa-0.0.15}/src/tests/legacy_tui.py +0 -0
  169. {iwa-0.0.14 → iwa-0.0.15}/src/tests/legacy_wallets_screen.py +0 -0
  170. {iwa-0.0.14 → iwa-0.0.15}/src/tests/legacy_web.py +0 -0
  171. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_account_service.py +0 -0
  172. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_balance_service.py +0 -0
  173. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_chain.py +0 -0
  174. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_chain_interface.py +0 -0
  175. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_chain_interface_coverage.py +0 -0
  176. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_cli.py +0 -0
  177. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_db.py +0 -0
  178. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_drain_coverage.py +0 -0
  179. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_erc20.py +0 -0
  180. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_gnosis_plugin.py +0 -0
  181. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_keys.py +0 -0
  182. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_legacy_wallet.py +0 -0
  183. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_main.py +0 -0
  184. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_migration.py +0 -0
  185. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_mnemonic.py +0 -0
  186. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_modals.py +0 -0
  187. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_models.py +0 -0
  188. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_monitor.py +0 -0
  189. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_multisend.py +0 -0
  190. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_plugin_service.py +0 -0
  191. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_pricing.py +0 -0
  192. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_rate_limiter.py +0 -0
  193. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_reset_tenderly.py +0 -0
  194. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_rpc_rotation.py +0 -0
  195. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_rpc_view.py +0 -0
  196. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_safe_coverage.py +0 -0
  197. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_safe_service.py +0 -0
  198. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_service_manager_integration.py +0 -0
  199. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_service_manager_structure.py +0 -0
  200. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_service_transaction.py +0 -0
  201. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_staking_router.py +0 -0
  202. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_staking_simple.py +0 -0
  203. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_tables.py +0 -0
  204. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_transaction_service.py +0 -0
  205. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_transfer_multisend.py +0 -0
  206. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_transfer_native.py +0 -0
  207. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_transfer_security.py +0 -0
  208. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_transfer_structure.py +0 -0
  209. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_transfer_swap_unit.py +0 -0
  210. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_ui_coverage.py +0 -0
  211. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_utils.py +0 -0
  212. {iwa-0.0.14 → iwa-0.0.15}/src/tests/test_workers.py +0 -0
  213. {iwa-0.0.14 → iwa-0.0.15}/src/tools/create_and_stake_service.py +0 -0
  214. {iwa-0.0.14 → iwa-0.0.15}/src/tools/verify_drain.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.14
3
+ Version: 0.0.15
4
4
  Summary: A secure, modular, and plugin-based framework for crypto agents and ops
5
5
  Requires-Python: <4.0,>=3.12
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "iwa"
3
- version = "0.0.14"
3
+ version = "0.0.15"
4
4
  description = "A secure, modular, and plugin-based framework for crypto agents and ops"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<4.0"
@@ -71,7 +71,7 @@ where = ["src"]
71
71
 
72
72
  [tool.ruff]
73
73
  line-length = 100
74
- target-version = "0.0.14"
74
+ target-version = "0.0.15"
75
75
  fix = true
76
76
 
77
77
  [tool.ruff.lint]
@@ -19,7 +19,18 @@ logger = configure_logger()
19
19
  ERROR_SELECTOR = "0x08c379a0" # Error(string)
20
20
  PANIC_SELECTOR = "0x4e487b71" # Panic(uint256)
21
21
 
22
+ # Global cache for ABIs and error selectors to avoid redundant disk I/O and parsing
23
+ # Format: {abi_path: {"abi": [...], "selectors": {...}}}
24
+ _ABI_CACHE: Dict[str, Dict[str, Any]] = {}
25
+
26
+
27
+ def clear_abi_cache() -> None:
28
+ """Clear the global ABI cache (mainly for testing)."""
29
+ global _ABI_CACHE
30
+ _ABI_CACHE = {}
31
+
22
32
  # Panic codes (from Solidity)
33
+ # ... (rest of PANIC_CODES) ...
23
34
  PANIC_CODES = {
24
35
  0x00: "Generic compiler inserted panic",
25
36
  0x01: "Assert failed",
@@ -46,16 +57,25 @@ class ContractInstance:
46
57
  self.abi = None
47
58
  self.chain_interface = ChainInterfaces().get(chain_name)
48
59
 
49
- with open(self.abi_path, "r", encoding="utf-8") as abi_file:
50
- contract_abi = json.load(abi_file)
60
+ # Check global cache first
61
+ cache_key = str(self.abi_path)
62
+ if cache_key in _ABI_CACHE:
63
+ self.abi = _ABI_CACHE[cache_key]["abi"]
64
+ self.error_selectors = _ABI_CACHE[cache_key]["selectors"]
65
+ else:
66
+ with open(self.abi_path, "r", encoding="utf-8") as abi_file:
67
+ contract_abi = json.load(abi_file)
68
+
69
+ if isinstance(contract_abi, dict) and "abi" in contract_abi:
70
+ self.abi = contract_abi.get("abi")
71
+ else:
72
+ self.abi = contract_abi
51
73
 
52
- if isinstance(contract_abi, dict) and "abi" in contract_abi:
53
- self.abi = contract_abi.get("abi")
54
- else:
55
- self.abi = contract_abi
74
+ self.error_selectors = self.load_error_selectors()
75
+ # Store in global cache
76
+ _ABI_CACHE[cache_key] = {"abi": self.abi, "selectors": self.error_selectors}
56
77
 
57
78
  self._contract_cache = None
58
- self.error_selectors = self.load_error_selectors()
59
79
 
60
80
  @property
61
81
  def contract(self) -> Contract:
@@ -12,12 +12,14 @@ from iwa.core.secrets import secrets
12
12
  # Global cache shared across all PriceService instances
13
13
  _PRICE_CACHE: Dict[str, Dict] = {}
14
14
  _CACHE_TTL = timedelta(minutes=30)
15
+ _NEGATIVE_CACHE_TTL = timedelta(minutes=5)
15
16
 
16
17
 
17
18
  class PriceService:
18
19
  """Service to fetch token prices from CoinGecko."""
19
20
 
20
21
  BASE_URL = "https://api.coingecko.com/api/v3"
22
+ DEMO_URL = "https://demo-api.coingecko.com/api/v3"
21
23
 
22
24
  def __init__(self):
23
25
  """Initialize PriceService."""
@@ -41,15 +43,16 @@ class PriceService:
41
43
  """
42
44
  cache_key = f"{token_id}_{vs_currency}"
43
45
 
44
- # Check global cache
46
+ # Check global cache (including negative cache)
45
47
  if cache_key in _PRICE_CACHE:
46
48
  entry = _PRICE_CACHE[cache_key]
47
- if datetime.now() - entry["timestamp"] < _CACHE_TTL:
49
+ ttl = _CACHE_TTL if entry["price"] is not None else _NEGATIVE_CACHE_TTL
50
+ if datetime.now() - entry["timestamp"] < ttl:
48
51
  return entry["price"]
49
52
 
50
53
  price = self._fetch_price_from_api(token_id, vs_currency)
51
- if price is not None:
52
- _PRICE_CACHE[cache_key] = {"price": price, "timestamp": datetime.now()}
54
+ # We always cache, even if price is None (negative caching)
55
+ _PRICE_CACHE[cache_key] = {"price": price, "timestamp": datetime.now()}
53
56
  return price
54
57
 
55
58
  def _fetch_price_from_api(self, token_id: str, vs_currency: str) -> Optional[float]:
@@ -57,7 +60,10 @@ class PriceService:
57
60
  max_retries = 2
58
61
  for attempt in range(max_retries + 1):
59
62
  try:
60
- url = f"{self.BASE_URL}/simple/price"
63
+ # Use demo URL if API key is present, otherwise standard URL
64
+ # NOTE: Demo URL is significantly more reliable for demo keys
65
+ base_url = self.DEMO_URL if self.api_key else self.BASE_URL
66
+ url = f"{base_url}/simple/price"
61
67
  params = {"ids": token_id, "vs_currencies": vs_currency}
62
68
  headers = {}
63
69
  if self.api_key:
@@ -69,6 +75,8 @@ class PriceService:
69
75
  logger.warning("CoinGecko API key invalid (401). Retrying without key...")
70
76
  self.api_key = None
71
77
  headers.pop("x-cg-demo-api-key", None)
78
+ # Re-run with base URL
79
+ url = f"{self.BASE_URL}/simple/price"
72
80
  response = requests.get(url, params=params, headers=headers, timeout=10)
73
81
 
74
82
  if response.status_code == 429:
@@ -87,13 +95,16 @@ class PriceService:
87
95
  if token_id in data and vs_currency in data[token_id]:
88
96
  return float(data[token_id][vs_currency])
89
97
 
90
- logger.warning(
98
+ # If we got response but price not found, it's likely a wrong ID
99
+ logger.debug(
91
100
  f"Price for {token_id} in {vs_currency} not found in response: {data}"
92
101
  )
93
102
  return None
94
103
 
95
104
  except Exception as e:
96
- logger.error(f"Failed to fetch price for {token_id} (Attempt {attempt + 1}): {e}")
105
+ # Only log error on last attempt to avoid spamming
106
+ if attempt == max_retries:
107
+ logger.error(f"Failed to fetch price for {token_id}: {e}")
97
108
  if attempt < max_retries:
98
109
  time.sleep(1)
99
110
  continue
@@ -51,6 +51,10 @@ class ServiceManagerBase:
51
51
 
52
52
  def _init_contracts(self, chain_name: str) -> None:
53
53
  """Initialize contracts for the given chain."""
54
+ # OPTIMIZATION: Skip if already initialized for this chain
55
+ if getattr(self, "chain_name", None) == chain_name.lower() and hasattr(self, "registry"):
56
+ return
57
+
54
58
  chain_interface = ChainInterfaces().get(chain_name)
55
59
 
56
60
  # Get protocol contracts from plugin-local constants
@@ -63,9 +67,9 @@ class ServiceManagerBase:
63
67
 
64
68
  self.registry = ServiceRegistryContract(registry_address, chain_name=chain_name)
65
69
  self.manager = ServiceManagerContract(manager_address, chain_name=chain_name)
66
- logger.info(f"[SM-INIT] ServiceManager initialized. Chain: {chain_name}")
67
- logger.info(f"[SM-INIT] Registry Address: {self.registry.address}")
68
- logger.info(f"[SM-INIT] Manager Address: {self.manager.address}")
70
+ logger.debug(f"[SM-INIT] ServiceManager initialized. Chain: {chain_name}")
71
+ logger.debug(f"[SM-INIT] Registry Address: {self.registry.address}")
72
+ logger.debug(f"[SM-INIT] Manager Address: {self.manager.address}")
69
73
  self.chain_interface = chain_interface
70
74
  self.chain_name = chain_name.lower()
71
75
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iwa
3
- Version: 0.0.14
3
+ Version: 0.0.15
4
4
  Summary: A secure, modular, and plugin-based framework for crypto agents and ops
5
5
  Requires-Python: <4.0,>=3.12
6
6
  Description-Content-Type: text/markdown
@@ -4,7 +4,15 @@ from unittest.mock import MagicMock, mock_open, patch
4
4
  import pytest
5
5
  from web3.exceptions import ContractCustomError
6
6
 
7
- from iwa.core.contracts.contract import ContractInstance
7
+ from iwa.core.contracts.contract import ContractInstance, clear_abi_cache
8
+
9
+
10
+ @pytest.fixture(autouse=True)
11
+ def clean_abi_cache():
12
+ """Clear global ABI cache before each test."""
13
+ clear_abi_cache()
14
+ yield
15
+ clear_abi_cache()
8
16
 
9
17
 
10
18
  @pytest.fixture
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes