brawny 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.
Files changed (141) hide show
  1. brawny/__init__.py +106 -0
  2. brawny/_context.py +232 -0
  3. brawny/_rpc/__init__.py +38 -0
  4. brawny/_rpc/broadcast.py +172 -0
  5. brawny/_rpc/clients.py +98 -0
  6. brawny/_rpc/context.py +49 -0
  7. brawny/_rpc/errors.py +252 -0
  8. brawny/_rpc/gas.py +158 -0
  9. brawny/_rpc/manager.py +982 -0
  10. brawny/_rpc/selector.py +156 -0
  11. brawny/accounts.py +534 -0
  12. brawny/alerts/__init__.py +132 -0
  13. brawny/alerts/abi_resolver.py +530 -0
  14. brawny/alerts/base.py +152 -0
  15. brawny/alerts/context.py +271 -0
  16. brawny/alerts/contracts.py +635 -0
  17. brawny/alerts/encoded_call.py +201 -0
  18. brawny/alerts/errors.py +267 -0
  19. brawny/alerts/events.py +680 -0
  20. brawny/alerts/function_caller.py +364 -0
  21. brawny/alerts/health.py +185 -0
  22. brawny/alerts/routing.py +118 -0
  23. brawny/alerts/send.py +364 -0
  24. brawny/api.py +660 -0
  25. brawny/chain.py +93 -0
  26. brawny/cli/__init__.py +16 -0
  27. brawny/cli/app.py +17 -0
  28. brawny/cli/bootstrap.py +37 -0
  29. brawny/cli/commands/__init__.py +41 -0
  30. brawny/cli/commands/abi.py +93 -0
  31. brawny/cli/commands/accounts.py +632 -0
  32. brawny/cli/commands/console.py +495 -0
  33. brawny/cli/commands/contract.py +139 -0
  34. brawny/cli/commands/health.py +112 -0
  35. brawny/cli/commands/init_project.py +86 -0
  36. brawny/cli/commands/intents.py +130 -0
  37. brawny/cli/commands/job_dev.py +254 -0
  38. brawny/cli/commands/jobs.py +308 -0
  39. brawny/cli/commands/logs.py +87 -0
  40. brawny/cli/commands/maintenance.py +182 -0
  41. brawny/cli/commands/migrate.py +51 -0
  42. brawny/cli/commands/networks.py +253 -0
  43. brawny/cli/commands/run.py +249 -0
  44. brawny/cli/commands/script.py +209 -0
  45. brawny/cli/commands/signer.py +248 -0
  46. brawny/cli/helpers.py +265 -0
  47. brawny/cli_templates.py +1445 -0
  48. brawny/config/__init__.py +74 -0
  49. brawny/config/models.py +404 -0
  50. brawny/config/parser.py +633 -0
  51. brawny/config/routing.py +55 -0
  52. brawny/config/validation.py +246 -0
  53. brawny/daemon/__init__.py +14 -0
  54. brawny/daemon/context.py +69 -0
  55. brawny/daemon/core.py +702 -0
  56. brawny/daemon/loops.py +327 -0
  57. brawny/db/__init__.py +78 -0
  58. brawny/db/base.py +986 -0
  59. brawny/db/base_new.py +165 -0
  60. brawny/db/circuit_breaker.py +97 -0
  61. brawny/db/global_cache.py +298 -0
  62. brawny/db/mappers.py +182 -0
  63. brawny/db/migrate.py +349 -0
  64. brawny/db/migrations/001_init.sql +186 -0
  65. brawny/db/migrations/002_add_included_block.sql +7 -0
  66. brawny/db/migrations/003_add_broadcast_at.sql +10 -0
  67. brawny/db/migrations/004_broadcast_binding.sql +20 -0
  68. brawny/db/migrations/005_add_retry_after.sql +9 -0
  69. brawny/db/migrations/006_add_retry_count_column.sql +11 -0
  70. brawny/db/migrations/007_add_gap_tracking.sql +18 -0
  71. brawny/db/migrations/008_add_transactions.sql +72 -0
  72. brawny/db/migrations/009_add_intent_metadata.sql +5 -0
  73. brawny/db/migrations/010_add_nonce_gap_index.sql +9 -0
  74. brawny/db/migrations/011_add_job_logs.sql +24 -0
  75. brawny/db/migrations/012_add_claimed_by.sql +5 -0
  76. brawny/db/ops/__init__.py +29 -0
  77. brawny/db/ops/attempts.py +108 -0
  78. brawny/db/ops/blocks.py +83 -0
  79. brawny/db/ops/cache.py +93 -0
  80. brawny/db/ops/intents.py +296 -0
  81. brawny/db/ops/jobs.py +110 -0
  82. brawny/db/ops/logs.py +97 -0
  83. brawny/db/ops/nonces.py +322 -0
  84. brawny/db/postgres.py +2535 -0
  85. brawny/db/postgres_new.py +196 -0
  86. brawny/db/queries.py +584 -0
  87. brawny/db/sqlite.py +2733 -0
  88. brawny/db/sqlite_new.py +191 -0
  89. brawny/history.py +126 -0
  90. brawny/interfaces.py +136 -0
  91. brawny/invariants.py +155 -0
  92. brawny/jobs/__init__.py +26 -0
  93. brawny/jobs/base.py +287 -0
  94. brawny/jobs/discovery.py +233 -0
  95. brawny/jobs/job_validation.py +111 -0
  96. brawny/jobs/kv.py +125 -0
  97. brawny/jobs/registry.py +283 -0
  98. brawny/keystore.py +484 -0
  99. brawny/lifecycle.py +551 -0
  100. brawny/logging.py +290 -0
  101. brawny/metrics.py +594 -0
  102. brawny/model/__init__.py +53 -0
  103. brawny/model/contexts.py +319 -0
  104. brawny/model/enums.py +70 -0
  105. brawny/model/errors.py +194 -0
  106. brawny/model/events.py +93 -0
  107. brawny/model/startup.py +20 -0
  108. brawny/model/types.py +483 -0
  109. brawny/networks/__init__.py +96 -0
  110. brawny/networks/config.py +269 -0
  111. brawny/networks/manager.py +423 -0
  112. brawny/obs/__init__.py +67 -0
  113. brawny/obs/emit.py +158 -0
  114. brawny/obs/health.py +175 -0
  115. brawny/obs/heartbeat.py +133 -0
  116. brawny/reconciliation.py +108 -0
  117. brawny/scheduler/__init__.py +19 -0
  118. brawny/scheduler/poller.py +472 -0
  119. brawny/scheduler/reorg.py +632 -0
  120. brawny/scheduler/runner.py +708 -0
  121. brawny/scheduler/shutdown.py +371 -0
  122. brawny/script_tx.py +297 -0
  123. brawny/scripting.py +251 -0
  124. brawny/startup.py +76 -0
  125. brawny/telegram.py +393 -0
  126. brawny/testing.py +108 -0
  127. brawny/tx/__init__.py +41 -0
  128. brawny/tx/executor.py +1071 -0
  129. brawny/tx/fees.py +50 -0
  130. brawny/tx/intent.py +423 -0
  131. brawny/tx/monitor.py +628 -0
  132. brawny/tx/nonce.py +498 -0
  133. brawny/tx/replacement.py +456 -0
  134. brawny/tx/utils.py +26 -0
  135. brawny/utils.py +205 -0
  136. brawny/validation.py +69 -0
  137. brawny-0.1.13.dist-info/METADATA +156 -0
  138. brawny-0.1.13.dist-info/RECORD +141 -0
  139. brawny-0.1.13.dist-info/WHEEL +5 -0
  140. brawny-0.1.13.dist-info/entry_points.txt +2 -0
  141. brawny-0.1.13.dist-info/top_level.txt +1 -0
brawny/validation.py ADDED
@@ -0,0 +1,69 @@
1
+ """Startup validation — static checks only.
2
+
3
+ This module provides validation functions for job routing configuration.
4
+ These are run at startup to catch misconfigurations early.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import TYPE_CHECKING
10
+
11
+ from brawny.config.routing import resolve_job_groups
12
+
13
+ if TYPE_CHECKING:
14
+ from brawny.config import Config
15
+ from brawny.jobs.base import Job
16
+
17
+
18
+ def validate_job_routing(
19
+ config: "Config",
20
+ job_classes: dict[str, "Job"],
21
+ ) -> list[str]:
22
+ """Validate job routing configuration. Returns list of errors.
23
+
24
+ Checks:
25
+ - Validate read_group/broadcast_group exist in rpc_groups
26
+
27
+ Note: Signer validation is handled separately by validate_job() in registry.py
28
+ which checks against the actual keystore (not config.signers).
29
+
30
+ Does NOT:
31
+ - Make RPC calls (no probes)
32
+ - Validate runtime behavior
33
+
34
+ Args:
35
+ config: Application configuration
36
+ job_classes: Dict of job_id -> Job instance
37
+
38
+ Returns:
39
+ List of error messages (empty if valid)
40
+ """
41
+ errors: list[str] = []
42
+
43
+ for job_id, job_cls in job_classes.items():
44
+ try:
45
+ resolve_job_groups(config, job_cls)
46
+ except ValueError as exc:
47
+ errors.append(f"Job '{job_id}': {exc}")
48
+
49
+ return errors
50
+
51
+
52
+ def validate_startup(config: "Config", job_classes: dict[str, "Job"]) -> None:
53
+ """Validate at startup. Raises on error.
54
+
55
+ This function should be called during application startup after
56
+ config and jobs are loaded.
57
+
58
+ Args:
59
+ config: Application configuration
60
+ job_classes: Dict of job_id -> Job instance
61
+
62
+ Raises:
63
+ ValueError: If validation fails with list of errors
64
+ """
65
+ errors = validate_job_routing(config, job_classes)
66
+ if errors:
67
+ raise ValueError(
68
+ "Startup validation failed:\n" + "\n".join(f" - {e}" for e in errors)
69
+ )
@@ -0,0 +1,156 @@
1
+ Metadata-Version: 2.4
2
+ Name: brawny
3
+ Version: 0.1.13
4
+ Summary: Block-driven Ethereum job/transaction execution framework
5
+ Author-email: yearn <dev@yearn.fi>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/yearn/brawny
8
+ Project-URL: Documentation, https://github.com/yearn/brawny#readme
9
+ Project-URL: Repository, https://github.com/yearn/brawny.git
10
+ Project-URL: Issues, https://github.com/yearn/brawny/issues
11
+ Keywords: ethereum,web3,blockchain,jobs,transactions
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ Requires-Dist: web3<8.0,>=7.0
24
+ Requires-Dist: click<9.0,>=8.1
25
+ Requires-Dist: pyyaml<7.0,>=6.0
26
+ Requires-Dist: python-dotenv<2.0,>=1.0
27
+ Requires-Dist: structlog<25.0,>=24.1
28
+ Requires-Dist: httpx<1.0,>=0.26
29
+ Requires-Dist: psycopg[binary]<4.0,>=3.1
30
+ Requires-Dist: psycopg-pool<4.0,>=3.2
31
+ Requires-Dist: rich<14.0,>=13.0
32
+ Requires-Dist: prometheus-client<1.0,>=0.20
33
+ Requires-Dist: prompt_toolkit<4.0,>=3.0
34
+ Requires-Dist: pygments<3.0,>=2.17
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest<9.0,>=8.0; extra == "dev"
37
+ Requires-Dist: pytest-asyncio<1.0,>=0.23; extra == "dev"
38
+ Requires-Dist: pytest-cov<5.0,>=4.1; extra == "dev"
39
+ Requires-Dist: mypy<2.0,>=1.8; extra == "dev"
40
+ Requires-Dist: ruff<1.0,>=0.2; extra == "dev"
41
+ Requires-Dist: black<25.0,>=24.1; extra == "dev"
42
+ Requires-Dist: pre-commit<4.0,>=3.6; extra == "dev"
43
+ Provides-Extra: test
44
+ Requires-Dist: pytest<9.0,>=8.0; extra == "test"
45
+ Requires-Dist: pytest-asyncio<1.0,>=0.23; extra == "test"
46
+ Requires-Dist: pytest-cov<5.0,>=4.1; extra == "test"
47
+
48
+ # brawny
49
+
50
+ Block-driven Ethereum job and transaction execution framework, inspired by [eth-brownie](https://github.com/eth-brownie/brownie).
51
+
52
+ **Brownie-style ergonomics**: brawny mirrors Brownie's developer experience with familiar patterns—`accounts`, `Contract()`, `chain`, `history`, and an interactive console. If you've used Brownie, you'll feel right at home.
53
+
54
+ ## Installation (Local Development)
55
+
56
+ ```bash
57
+ # Clone and install the framework
58
+ git clone https://github.com/yearn/brawny.git
59
+ cd brawny
60
+ pip install -e .
61
+ ```
62
+
63
+ ## Quick Start
64
+
65
+ ```bash
66
+ # Create a new keeper project
67
+ mkdir my-keeper && cd my-keeper
68
+ brawny init
69
+
70
+ # Install your project (brawny is already installed from above)
71
+ pip install -e .
72
+
73
+ # Configure
74
+ cp .env.example .env
75
+ # Edit .env: set RPC_URL and BRAWNY_KEYSTORE_PASSWORD_WORKER
76
+
77
+ # Import a signer key (will prompt for password)
78
+ brawny accounts import --name worker --private-key 0xYOUR_PRIVATE_KEY
79
+
80
+ # Run
81
+ brawny start
82
+ ```
83
+
84
+ See `docs/quickstart.md` for a longer walkthrough.
85
+
86
+ ## Project Structure
87
+
88
+ After `brawny init`, your project looks like:
89
+
90
+ ```
91
+ my-keeper/
92
+ ├── my_keeper/ # Your Python package
93
+ │ └── __init__.py
94
+ ├── jobs/
95
+ │ ├── __init__.py
96
+ │ └── _examples.py # Reference implementations (not registered)
97
+ ├── interfaces/ # Place ABI JSON files here
98
+ ├── monitoring/ # Prometheus + Grafana stack
99
+ │ ├── docker-compose.yml
100
+ │ └── grafana/...
101
+ ├── pyproject.toml
102
+ ├── config.yaml
103
+ ├── .env.example
104
+ ├── .gitignore
105
+ └── AGENTS.md # AI agent guide for writing jobs
106
+ ```
107
+
108
+ The `AGENTS.md` file contains a comprehensive guide for AI agents to generate correct, idiomatic jobs.
109
+
110
+ ## Minimal Job Example
111
+
112
+ Create `jobs/harvester.py`:
113
+
114
+ ```python
115
+ from brawny import Job, job, Contract, trigger, intent, block
116
+
117
+
118
+ @job(signer="worker")
119
+ class HarvestJob(Job):
120
+ name = "Harvest Example"
121
+ check_interval_blocks = 50
122
+ vault_address = "0xYourVault"
123
+
124
+ def check(self):
125
+ vault = Contract(self.vault_address)
126
+ pending = vault.pendingRewards()
127
+ if pending > 1_000_000_000_000_000_000:
128
+ return trigger(
129
+ reason="Harvest pending rewards",
130
+ data={"pending": pending},
131
+ idempotency_parts=[block.number // 50],
132
+ )
133
+ return None
134
+
135
+ def build_intent(self, trig):
136
+ vault = Contract(self.vault_address)
137
+ return intent(
138
+ signer_address=self._signer_name,
139
+ to_address=self.vault_address,
140
+ data=vault.harvest.encode_input(),
141
+ min_confirmations=2,
142
+ )
143
+
144
+ def alert_triggered(self, ctx):
145
+ return f"Harvest triggered: {ctx.trigger.data['pending'] / 1e18:.4f}"
146
+
147
+ def alert_confirmed(self, ctx):
148
+ return f"Harvest confirmed: {ctx.tx.hash}"
149
+ ```
150
+
151
+ ## Docs
152
+
153
+ - `docs/quickstart.md`
154
+ - `docs/cli.md`
155
+ - `docs/job-lifecycle.md`
156
+ - `docs/alerts.md`
@@ -0,0 +1,141 @@
1
+ brawny/__init__.py,sha256=S3rU6-n_H1NQdNAghB4zSTgvAEuT4ln2eNii87Hm1Js,2344
2
+ brawny/_context.py,sha256=jDdUBpMxApxsGCwYouJN7lHYiX6ukPWyYakLQZ4xhD4,6614
3
+ brawny/accounts.py,sha256=IbAeHiTQ64a-f56sckAOAOkGPZ3tT3R9sQlsal94aNs,16206
4
+ brawny/api.py,sha256=4gxTRgak5lDIiVtJrWo-dOUyF0XmEaHnnFbhkO_lJJs,19217
5
+ brawny/chain.py,sha256=EzPViqzXspHHr6S1NHrlYLDN9Q-A4tPNry9ZMMqUva4,2213
6
+ brawny/cli_templates.py,sha256=6ZyvarLsNWJJIcm_YqYix85lpxRPxx_2lcubTdxa5JQ,37239
7
+ brawny/history.py,sha256=8ODRudA-iiPF12s9mRR78doOIcnlCwaNQhEc901x6Do,3192
8
+ brawny/interfaces.py,sha256=eJXjRh1HxeESaroItT-YCxsYlUceLw0ZmenZhR-H_LI,4393
9
+ brawny/invariants.py,sha256=_oj2KPfqf1dLajJN5yW-jzviC9SDX7PhHMbxKWPfhdc,5234
10
+ brawny/keystore.py,sha256=O0PPtXYmW48xd0040xRU2tN1fdCYTgiyOgQYv34tZeA,16764
11
+ brawny/lifecycle.py,sha256=zP4fOyiGPGhWQtnLnGqmS1sjW0K0Sis6m5Fr0xLg13k,20191
12
+ brawny/logging.py,sha256=FuXf8CJUxODVPdzWrK8oHTLBgIWtmhfTjsD_PJEfHJw,8937
13
+ brawny/metrics.py,sha256=w3s1objzFf-biPiw5-_KqR9Wpu4zSiEPMRUoWLw_mqQ,22450
14
+ brawny/reconciliation.py,sha256=_WFVf8fEKnkJVhTjThb0oTHXDM7njOOsLuTR5bU0Bik,3466
15
+ brawny/script_tx.py,sha256=fIsso5u30it94-XWYmi22aTImGzeQt97Ekjm3Ac3cas,9506
16
+ brawny/scripting.py,sha256=n-2i4oUUVajz1Q2ilU0SKNx3vE9X2kCr_7VuAiGVBAU,7867
17
+ brawny/startup.py,sha256=ChHzLR3dNv_4vxXG-uyp-XxgPCpbjRKkcIENyLhq_wg,2386
18
+ brawny/telegram.py,sha256=7TbzuL8UMQ2I572tAD_ktq4vhzqHaWLlj3-VMjwmT5w,11189
19
+ brawny/testing.py,sha256=tw33Fm9cljB1QJGvyAhzIPipbmVraLtvop24TA_GgHU,3448
20
+ brawny/utils.py,sha256=KGnBWklkg5J-vZEWm4WhHE1I-tHATAqK8r8I5N1-n-I,5167
21
+ brawny/validation.py,sha256=f63DcrEABO1qdCL_9RVk7QbOhstpFFgxtAP7lU5VNfQ,1893
22
+ brawny/_rpc/__init__.py,sha256=Tb-LjDx_n2Lglwnx2ZebcBnHKySiAnQZmLmfGi_0Uys,935
23
+ brawny/_rpc/broadcast.py,sha256=5RAYy1xm42k5oZiX8A7DR5M6yJnLZuQZM0UJyktiXcI,5477
24
+ brawny/_rpc/clients.py,sha256=fSKajPXXzQ2gZ6XnJikOpsFUJRm7xmx9YgNAXON_Dvg,3308
25
+ brawny/_rpc/context.py,sha256=7MtOkAuFhGxvFVqTPWXC6Jfmr4Ld8UGjO8S4OW0Gzx0,1222
26
+ brawny/_rpc/errors.py,sha256=FriHwPAnrBc9d5FMtgHxcvmbp0NOjNBxctE9t07LjgU,7550
27
+ brawny/_rpc/gas.py,sha256=f6MT51vJHH1UJQZndON_ksZ_IJM5vnm4EZPwnCyidNM,5453
28
+ brawny/_rpc/manager.py,sha256=cMG6CD-KlQTw-JkjNSnhstLrecxp489n4Rcgiw1r3BM,37464
29
+ brawny/_rpc/selector.py,sha256=UChAnDsmbB49z8TnrP1-z44FL0j-CYSbX1VMMVDfQ3M,5415
30
+ brawny/alerts/__init__.py,sha256=MykNI98oMx2RWH2t-2PLXo-rc3Hozqmno21BAQOOY-A,3314
31
+ brawny/alerts/abi_resolver.py,sha256=pF2Npsfq0Z0Uye1_Y6_61ze2IQ7DKLUJa1ZtAvO4m9M,17831
32
+ brawny/alerts/base.py,sha256=sKqh1rM55zj_SXEiSVAU7Cztc6oABghpmAVWzpnUhm4,4153
33
+ brawny/alerts/context.py,sha256=Qv2QhsUE2CwPjzmOqNLJp2vyaGzxZ9CoXE2dgP372Dg,8871
34
+ brawny/alerts/contracts.py,sha256=Hw321LIwBEJ4minH3RCiw3_k4RkCQKSeiyvm2KN210o,21714
35
+ brawny/alerts/encoded_call.py,sha256=DzKYop5U9ciNI-S8e3CAA-yLYVeQ2UlwogZ_LN5-oHQ,6755
36
+ brawny/alerts/errors.py,sha256=p4eXELXTAAorzGfKQ4ebgLoW3eRrOHAp-W6cIqklHQU,8379
37
+ brawny/alerts/events.py,sha256=T-HIim1c0t1ScYuMSb1YZ-HZglMJuh7jrlZvPfMR7OI,22830
38
+ brawny/alerts/function_caller.py,sha256=M_QNg0hMs_XuuT66CphXB2DQxtv0MPr_HUpNmBJBTHw,13459
39
+ brawny/alerts/health.py,sha256=KolaclVvBdGol9jN9-Qeu76vCan3peUqjeM9iKT1krs,6324
40
+ brawny/alerts/routing.py,sha256=r8UMxRihfVxVmr6PRwWgU-NCi8_xjAIdWakfyUL-ssA,3239
41
+ brawny/alerts/send.py,sha256=LLeimlqZ5lG98yNrPkDiVPWLq0RK5KYsX62SgNBWAgM,11838
42
+ brawny/cli/__init__.py,sha256=A96bKB68ldVoDafAhRf0_Jd4z6R4KaEenXs8131M5Ac,229
43
+ brawny/cli/app.py,sha256=xx7uyBjmKkFtqtdNIQJYgLhMTzgMIdRTBFZ-S2lnJP8,374
44
+ brawny/cli/bootstrap.py,sha256=cqqbw2_UFIOlPKtcphWWXyD-FqTMttTulXoZ4RHa7tk,1060
45
+ brawny/cli/helpers.py,sha256=10yoo1TyXUudcpRqxpuMzjZjKfufx0E3GMNIGACEI4Q,8729
46
+ brawny/cli/commands/__init__.py,sha256=ywymaH-keFP2ux9OCjVjvasfGh7C27huzy17MEcA_Jw,1830
47
+ brawny/cli/commands/abi.py,sha256=epaQIMcoLo952blPfFq-cPlZ6OFPW8-xjYBR2cq3qNM,2767
48
+ brawny/cli/commands/accounts.py,sha256=1OreYRUNhSnVIWoQp_NTeUA_1l7ZDpul0fCKueteEZg,19213
49
+ brawny/cli/commands/console.py,sha256=N_S2ghLLW6ken4l7-8UjPhvcsrjyPX6HckygkRuyu3g,17257
50
+ brawny/cli/commands/contract.py,sha256=bWzFsHnbFGmdAVj8ebdrRWr0AcR0n7eys_Psd5EH6I8,4327
51
+ brawny/cli/commands/health.py,sha256=fmunPEjWFXyOEML8cC8yNipMOvJprWLmtkOcYeP8BRI,3660
52
+ brawny/cli/commands/init_project.py,sha256=B6Cy9w2Z86kB8Gs9dAC6zCb9q_5FYBGSrmHmqUr63-c,2586
53
+ brawny/cli/commands/intents.py,sha256=4W96VmofUxjwUaV51T9vvT7BvquLl2g4z2NUdTGtET4,4717
54
+ brawny/cli/commands/job_dev.py,sha256=uYKnrJ2VzJVaTzxaDR3q6JcobucuawnkbEBVWVae1lU,8499
55
+ brawny/cli/commands/jobs.py,sha256=x_F5BZeEDL5sPd6crtcjONGT0AzdS1Z4eqwTsaoKcIE,10096
56
+ brawny/cli/commands/logs.py,sha256=aqyPthS-CBlM4n6GGufrefU0WZYI3EFmXZKcETgAx7s,2684
57
+ brawny/cli/commands/maintenance.py,sha256=224TNrqxKrAiMpgxIKhcQafJEaQu0U10EUyNw2qAPJY,6381
58
+ brawny/cli/commands/migrate.py,sha256=Xlc8wlG8kOJwz91wV-By-hX2rieBTtQDkwMRwrS15os,1649
59
+ brawny/cli/commands/networks.py,sha256=e3nkiTLgbDCHOiBMo6Y5WIwOetOpP3hnbUSRze3mHOc,8499
60
+ brawny/cli/commands/run.py,sha256=EUNv-ZL3QU_UwpLYGuC9PAPHxLqbYnLKVxu9byy8kBM,8599
61
+ brawny/cli/commands/script.py,sha256=ZHC2XKXCtUstMqvUiAdBWYOjIsqME4WL17AMDOClslg,6475
62
+ brawny/cli/commands/signer.py,sha256=5KJ0i2N10Zb0OFSBC-NGXf7nBBkBFt1m6fKKY1NiXzY,8716
63
+ brawny/config/__init__.py,sha256=Ty8HQ9t2b3OihV7xuakXTcF41tiqsQSo3di_SBoqqho,1722
64
+ brawny/config/models.py,sha256=aOdk1XYRCofgUoIUM8ORLxm4o_CBpWE6-rc9satA8KY,12833
65
+ brawny/config/parser.py,sha256=L2v_CurgUw7UUTyzfz6mqvO8LPtHn2e-1Q4Tj4YiHHw,23917
66
+ brawny/config/routing.py,sha256=AyeMsuzkqzEbW1XZMCAyK3ufTC4fyV4wcMLZHwt8L_w,1720
67
+ brawny/config/validation.py,sha256=WUkW18UKIP__VTIZM5bb_tFne6NRBp32ng6V9E5zRbE,7996
68
+ brawny/daemon/__init__.py,sha256=c3IDbNv7aaXej69nh4fOYdNjX2U144tVfU2CtSd2icQ,331
69
+ brawny/daemon/context.py,sha256=TEZYXfoeM6wFoX9I7uLgdc-6HZWBrNO-fyZVvCqqsxs,1832
70
+ brawny/daemon/core.py,sha256=62lxjUv3qgr81QkMo95Drl9_B8OoNfRFkXAwAx-PY5M,24679
71
+ brawny/daemon/loops.py,sha256=Mv1AUly_FOsbOHtrlxKi8QV4J1DqFXPfd6AKch_2SJk,11788
72
+ brawny/db/__init__.py,sha256=JqDFTFhAdW3g4NqsYpSmgAZqbfhtOzpCAD5PVP9RwnA,2479
73
+ brawny/db/base.py,sha256=I0KjhiM_avviYBzTM4WBEDcMwwDlloQbA-92UC7hSps,29218
74
+ brawny/db/base_new.py,sha256=NPjSCNvGw0BhOmAo5Dl0t1oZzMUMCXxCzeTL2xhXUHU,3976
75
+ brawny/db/circuit_breaker.py,sha256=pRyCz6P-2C9tFHlR-xomk7dmiMVgyYFBznHSog4H0QY,2984
76
+ brawny/db/global_cache.py,sha256=fvE23C0mo7Hj6kqYMIxegjd0pTh5IIX7Y0hivUA0Bwo,9339
77
+ brawny/db/mappers.py,sha256=lpB-tP-WExJqPe3kFja-xDw_lBj74ngzq9NVhG2xfIM,6139
78
+ brawny/db/migrate.py,sha256=BPFbo7GN9Ez8XjenQuFoUVbHG9OoqWq0A4e28tbv_N8,10092
79
+ brawny/db/postgres.py,sha256=v8hkP-GN6dkQzM_ZGzsfld0OJFE4GKJXYleZQVl2tJU,89969
80
+ brawny/db/postgres_new.py,sha256=sl-ozPPiEjsi0_O0Y8cMZrK3pQr4_f8UL7BoJSCwNP8,6712
81
+ brawny/db/queries.py,sha256=YXHdHPCIvbhSiJ_nWeCK9ll8W1ebWucu9V1ZleYhDgU,18472
82
+ brawny/db/sqlite.py,sha256=mNeevi1qWA1RtpsJYpG3pFXX51--6fdYwu60894N_v0,97570
83
+ brawny/db/sqlite_new.py,sha256=n9gS5mQNG5u7E3bA7JqF8ixBBN_LqpNuhcvn6bkaOcA,6434
84
+ brawny/db/migrations/001_init.sql,sha256=ej1svcWEIeeAprV3bIv9ACcKcYAj_stJwJalKRxU504,8291
85
+ brawny/db/migrations/002_add_included_block.sql,sha256=e8w0PABNspPiTY--SunB2K1uBTgPYiB01UuJ-L8Wg-k,204
86
+ brawny/db/migrations/003_add_broadcast_at.sql,sha256=DYqlvuw7Kvphps49UAl-Blau0j80Oh8XKEBjBCShEpk,267
87
+ brawny/db/migrations/004_broadcast_binding.sql,sha256=I6T_AI_aKgkmFcKYPaJua7sU4ZC1A967ykBeHhiFX1Q,884
88
+ brawny/db/migrations/005_add_retry_after.sql,sha256=3dCDnjyRa3y_om_IiJLZGNEzt2JcdA8hRJqIaAXtP2c,273
89
+ brawny/db/migrations/006_add_retry_count_column.sql,sha256=6weoQrcTyiQsbFe1BPvSDyr2f9nq1M_dMhuJbJsmBXw,489
90
+ brawny/db/migrations/007_add_gap_tracking.sql,sha256=SUNXm6j7PtiQa1Tw-Bk_mz0R6BeRxddlMGT08XpKlCs,671
91
+ brawny/db/migrations/008_add_transactions.sql,sha256=yLuuODC3PGR4kueWzmRvQ1bVL8UGn4c1IdzwtChztPE,3023
92
+ brawny/db/migrations/009_add_intent_metadata.sql,sha256=gP61XLMhlqRs0gGHlWim6AjsQeKJz6sRCBAX5INfObU,217
93
+ brawny/db/migrations/010_add_nonce_gap_index.sql,sha256=pRlt3OavdVizK7-9bvaJvTAUqhoBU6WM8y3Xb3Q-yr0,434
94
+ brawny/db/migrations/011_add_job_logs.sql,sha256=REwWRMM2VsuF2GfLcDcyZL-ujhetX-uonmkx6Ccirzk,771
95
+ brawny/db/migrations/012_add_claimed_by.sql,sha256=9Sr-iDrFoWIi5gtg6JjBJ1kJIVytwNjifEWoS0qBDbQ,209
96
+ brawny/db/ops/__init__.py,sha256=dF_bDv6TrYqBX-iM-3EO6zA71r-OybgstAITiCwTZI0,830
97
+ brawny/db/ops/attempts.py,sha256=O9_tsaZ5eDchkbvE07k9cwSgM7_XWae5gERZpERb5QU,3458
98
+ brawny/db/ops/blocks.py,sha256=CUyLi6zk18YXxzBKu_fLXXfeNmywshoXDDphWRvxZDU,2725
99
+ brawny/db/ops/cache.py,sha256=rGN1T8fl3c8mgLNB_EeyKd7zF3uMRbphk3f6Ii1rRkg,2710
100
+ brawny/db/ops/intents.py,sha256=-lyNsKxBNKA42JyRjzFZW18OwPnOa4g3BOx1Pm7q0Vo,9907
101
+ brawny/db/ops/jobs.py,sha256=_DZVENuiqpEpVnuEFTjSFsll8cD57DPxlKFvDpWPI6g,3276
102
+ brawny/db/ops/logs.py,sha256=49Z2G3fArHMK18lh-46uWvwkkoW5MOFXl59alcwdFko,2590
103
+ brawny/db/ops/nonces.py,sha256=ZUjIBoc3pwPLoBiVHNqLsi2qCfIESNO0QTTuC6qzPHU,10122
104
+ brawny/jobs/__init__.py,sha256=tko3VoRTh2YbzOJws0wuYGWQQEgnCQNGqIVldEYU2Po,694
105
+ brawny/jobs/base.py,sha256=0S6_Zlv0cdm08s2wiVYkVrVZKe3j_j_Qx3J5u-R63Bw,9537
106
+ brawny/jobs/discovery.py,sha256=JcjUwj9hDyCn7R_PjUMDxs6k5otdLx_y9gcbV_KUowU,7027
107
+ brawny/jobs/job_validation.py,sha256=PcHwGVhZGQ_bz6q7rTiJM0HVCP5rPXUVkMxjuFhoQrw,3031
108
+ brawny/jobs/kv.py,sha256=jjVgikiqib6NPxOu_pKbtdZ5aFWegVFa9e2Zovo54S4,3527
109
+ brawny/jobs/registry.py,sha256=WlYW4FApqeFje6cTkN9sOFMwOeXomhRRHXkIVCKCpfE,9396
110
+ brawny/model/__init__.py,sha256=8U2gUE20TB6vbFA3M06dsVN0pHVgSIHAYRZoUNVdViw,934
111
+ brawny/model/contexts.py,sha256=2omWbqo69G_J3QRAmMriF2kbEemOjuh6cABa8LgaBRg,10006
112
+ brawny/model/enums.py,sha256=p6xkqY1I7MsBczdMy5eqlxb4RPDYTn77yE9lef5Thh8,1535
113
+ brawny/model/errors.py,sha256=YdPjJ7Fj3-rx4XHteURUT8Pv0pdHhKnwMK1Ub6VLK5E,4522
114
+ brawny/model/events.py,sha256=Hq7zXXXDnhscy_uE4Dq6LYdp7hnFHpyaSWx3XUT6K-I,2496
115
+ brawny/model/startup.py,sha256=PeO5l-q6QPrmW8ibl0X_5hTOu922s9Vs5TKH_QiQRJI,487
116
+ brawny/model/types.py,sha256=NK523jfl4vnIwF5eViKJSxytKgxdZb892mQ6UPknL1Q,14819
117
+ brawny/networks/__init__.py,sha256=vSp4SKrp8W4pKPQ3xgBRBUaSZQ5cKTOOuIs4wy_VRvo,2767
118
+ brawny/networks/config.py,sha256=svx0wabynIUsq1ok2CMOFy6yVqNKW2HeY_uILjH_tWE,9562
119
+ brawny/networks/manager.py,sha256=22Vc8_Ld3EsHySBvJfCxTw8KtzKOYjyIUiQy07PMhLk,15308
120
+ brawny/obs/__init__.py,sha256=LZEUGcvTj5GphlX8r2QZChmjKzyA6Ejps-fPrzfnkNU,1486
121
+ brawny/obs/emit.py,sha256=8splCumkhX3zBYGmKp1DR6v42FDC4IDJ-SCPbRLLLys,4802
122
+ brawny/obs/health.py,sha256=j8SngL9gcjLxQpKZgYe5ILsWAb7zseQm4XLVlTFUqGM,5242
123
+ brawny/obs/heartbeat.py,sha256=QneRoISZ59g1tK6ulb7EpXxhhakzdmkSxKsr53LjSww,3826
124
+ brawny/scheduler/__init__.py,sha256=ecMObpBINPeqhGxR_GT1jhalQwkPS2ct-hphibxAVXk,547
125
+ brawny/scheduler/poller.py,sha256=yavj7QGvckgY2LOVzQgUgAb5Krqu6f4xM-h96yKNsVU,16823
126
+ brawny/scheduler/reorg.py,sha256=j0icKia2eAozbhMAVblTD_zNneEzzM4k8BmO_AlXGv4,23630
127
+ brawny/scheduler/runner.py,sha256=L1bw4yGwF-xmDkAkEjTYgEKyKgkZkVpHVURZv-pOUU4,26599
128
+ brawny/scheduler/shutdown.py,sha256=T3qfNffFTYNr-A4Gsh_gbOC8D9395dl1YCb1TGpcXy4,11444
129
+ brawny/tx/__init__.py,sha256=EAutSKQ5_SHfhmqylgHwqmPHqkJuPFFq0TmF3xCYEgs,1026
130
+ brawny/tx/executor.py,sha256=pB_pbM5tKB5QjKUVhl6BASFfrXwbMAk9hOeIFDimxDw,39527
131
+ brawny/tx/fees.py,sha256=x8LofoFtchD3YsjSLebxzl0M1kMDvHi8usfcOCDZ4Jw,1755
132
+ brawny/tx/intent.py,sha256=M2wIwtioHvSoggoL2lkhK1zD2bij6SDlGrJqqOERF-U,12093
133
+ brawny/tx/monitor.py,sha256=bJT4bj0yKblJikF-_PqqwsPZD8JxGU9D8ySq1al9boY,21508
134
+ brawny/tx/nonce.py,sha256=_opCcRBrScCVRh2q7wjKm_5wBtVIVJQ5pOrkD2Jslxk,16907
135
+ brawny/tx/replacement.py,sha256=IcxkhqIYt4S1TxEzZkxM0M_VbHLp6JRxP_X7nLJHTbM,15344
136
+ brawny/tx/utils.py,sha256=CKoxuqtyFkqgKuTgRCDbV3DwQUlTluPI-dFYSVWml0Q,592
137
+ brawny-0.1.13.dist-info/METADATA,sha256=hR_hxF6F62H29Yb-t-G3uAmwlyqvgvOEMk6gL9J0qbY,4931
138
+ brawny-0.1.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
139
+ brawny-0.1.13.dist-info/entry_points.txt,sha256=hIidVhlON00WJDOrxya-bycfP6Hsml9B2qGlrhZtzbw,43
140
+ brawny-0.1.13.dist-info/top_level.txt,sha256=CjjN4HE-2fk8M8ULl1YgEZz6Ar5LpiYLLC4eLl_HW4Y,7
141
+ brawny-0.1.13.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ brawny = brawny.cli:main
@@ -0,0 +1 @@
1
+ brawny