brawny 0.1.13__py3-none-any.whl → 0.1.22__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 (135) hide show
  1. brawny/__init__.py +2 -0
  2. brawny/_context.py +5 -5
  3. brawny/_rpc/__init__.py +36 -12
  4. brawny/_rpc/broadcast.py +14 -13
  5. brawny/_rpc/caller.py +243 -0
  6. brawny/_rpc/client.py +539 -0
  7. brawny/_rpc/clients.py +11 -11
  8. brawny/_rpc/context.py +23 -0
  9. brawny/_rpc/errors.py +465 -31
  10. brawny/_rpc/gas.py +7 -6
  11. brawny/_rpc/pool.py +18 -0
  12. brawny/_rpc/retry.py +266 -0
  13. brawny/_rpc/retry_policy.py +81 -0
  14. brawny/accounts.py +28 -9
  15. brawny/alerts/__init__.py +15 -18
  16. brawny/alerts/abi_resolver.py +212 -36
  17. brawny/alerts/base.py +2 -2
  18. brawny/alerts/contracts.py +77 -10
  19. brawny/alerts/errors.py +30 -3
  20. brawny/alerts/events.py +38 -5
  21. brawny/alerts/health.py +19 -13
  22. brawny/alerts/send.py +513 -55
  23. brawny/api.py +39 -11
  24. brawny/assets/AGENTS.md +325 -0
  25. brawny/async_runtime.py +48 -0
  26. brawny/chain.py +3 -3
  27. brawny/cli/commands/__init__.py +2 -0
  28. brawny/cli/commands/console.py +69 -19
  29. brawny/cli/commands/contract.py +2 -2
  30. brawny/cli/commands/controls.py +121 -0
  31. brawny/cli/commands/health.py +2 -2
  32. brawny/cli/commands/job_dev.py +6 -5
  33. brawny/cli/commands/jobs.py +99 -2
  34. brawny/cli/commands/maintenance.py +13 -29
  35. brawny/cli/commands/migrate.py +1 -0
  36. brawny/cli/commands/run.py +10 -3
  37. brawny/cli/commands/script.py +8 -3
  38. brawny/cli/commands/signer.py +143 -26
  39. brawny/cli/helpers.py +0 -3
  40. brawny/cli_templates.py +25 -349
  41. brawny/config/__init__.py +4 -1
  42. brawny/config/models.py +43 -57
  43. brawny/config/parser.py +268 -57
  44. brawny/config/validation.py +52 -15
  45. brawny/daemon/context.py +4 -2
  46. brawny/daemon/core.py +185 -63
  47. brawny/daemon/loops.py +166 -98
  48. brawny/daemon/supervisor.py +261 -0
  49. brawny/db/__init__.py +14 -26
  50. brawny/db/base.py +248 -151
  51. brawny/db/global_cache.py +11 -1
  52. brawny/db/migrate.py +175 -28
  53. brawny/db/migrations/001_init.sql +4 -3
  54. brawny/db/migrations/010_add_nonce_gap_index.sql +1 -1
  55. brawny/db/migrations/011_add_job_logs.sql +1 -2
  56. brawny/db/migrations/012_add_claimed_by.sql +2 -2
  57. brawny/db/migrations/013_attempt_unique.sql +10 -0
  58. brawny/db/migrations/014_add_lease_expires_at.sql +5 -0
  59. brawny/db/migrations/015_add_signer_alias.sql +14 -0
  60. brawny/db/migrations/016_runtime_controls_and_quarantine.sql +32 -0
  61. brawny/db/migrations/017_add_job_drain.sql +6 -0
  62. brawny/db/migrations/018_add_nonce_reset_audit.sql +20 -0
  63. brawny/db/migrations/019_add_job_cooldowns.sql +8 -0
  64. brawny/db/migrations/020_attempt_unique_initial.sql +7 -0
  65. brawny/db/ops/__init__.py +3 -25
  66. brawny/db/ops/logs.py +1 -2
  67. brawny/db/queries.py +47 -91
  68. brawny/db/serialized.py +65 -0
  69. brawny/db/sqlite/__init__.py +1001 -0
  70. brawny/db/sqlite/connection.py +231 -0
  71. brawny/db/sqlite/execute.py +116 -0
  72. brawny/db/sqlite/mappers.py +190 -0
  73. brawny/db/sqlite/repos/attempts.py +372 -0
  74. brawny/db/sqlite/repos/block_state.py +102 -0
  75. brawny/db/sqlite/repos/cache.py +104 -0
  76. brawny/db/sqlite/repos/intents.py +1021 -0
  77. brawny/db/sqlite/repos/jobs.py +200 -0
  78. brawny/db/sqlite/repos/maintenance.py +182 -0
  79. brawny/db/sqlite/repos/signers_nonces.py +566 -0
  80. brawny/db/sqlite/tx.py +119 -0
  81. brawny/http.py +194 -0
  82. brawny/invariants.py +11 -24
  83. brawny/jobs/base.py +8 -0
  84. brawny/jobs/job_validation.py +2 -1
  85. brawny/keystore.py +83 -7
  86. brawny/lifecycle.py +64 -12
  87. brawny/logging.py +0 -2
  88. brawny/metrics.py +84 -12
  89. brawny/model/contexts.py +111 -9
  90. brawny/model/enums.py +1 -0
  91. brawny/model/errors.py +18 -0
  92. brawny/model/types.py +47 -131
  93. brawny/network_guard.py +133 -0
  94. brawny/networks/__init__.py +5 -5
  95. brawny/networks/config.py +1 -7
  96. brawny/networks/manager.py +14 -11
  97. brawny/runtime_controls.py +74 -0
  98. brawny/scheduler/poller.py +11 -7
  99. brawny/scheduler/reorg.py +95 -39
  100. brawny/scheduler/runner.py +442 -168
  101. brawny/scheduler/shutdown.py +3 -3
  102. brawny/script_tx.py +3 -3
  103. brawny/telegram.py +53 -7
  104. brawny/testing.py +1 -0
  105. brawny/timeout.py +38 -0
  106. brawny/tx/executor.py +922 -308
  107. brawny/tx/intent.py +54 -16
  108. brawny/tx/monitor.py +31 -12
  109. brawny/tx/nonce.py +212 -90
  110. brawny/tx/replacement.py +69 -18
  111. brawny/tx/retry_policy.py +24 -0
  112. brawny/tx/stages/types.py +75 -0
  113. brawny/types.py +18 -0
  114. brawny/utils.py +41 -0
  115. {brawny-0.1.13.dist-info → brawny-0.1.22.dist-info}/METADATA +3 -3
  116. brawny-0.1.22.dist-info/RECORD +163 -0
  117. brawny/_rpc/manager.py +0 -982
  118. brawny/_rpc/selector.py +0 -156
  119. brawny/db/base_new.py +0 -165
  120. brawny/db/mappers.py +0 -182
  121. brawny/db/migrations/008_add_transactions.sql +0 -72
  122. brawny/db/ops/attempts.py +0 -108
  123. brawny/db/ops/blocks.py +0 -83
  124. brawny/db/ops/cache.py +0 -93
  125. brawny/db/ops/intents.py +0 -296
  126. brawny/db/ops/jobs.py +0 -110
  127. brawny/db/ops/nonces.py +0 -322
  128. brawny/db/postgres.py +0 -2535
  129. brawny/db/postgres_new.py +0 -196
  130. brawny/db/sqlite.py +0 -2733
  131. brawny/db/sqlite_new.py +0 -191
  132. brawny-0.1.13.dist-info/RECORD +0 -141
  133. {brawny-0.1.13.dist-info → brawny-0.1.22.dist-info}/WHEEL +0 -0
  134. {brawny-0.1.13.dist-info → brawny-0.1.22.dist-info}/entry_points.txt +0 -0
  135. {brawny-0.1.13.dist-info → brawny-0.1.22.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,24 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from brawny.tx.stages.types import RetryDecision
6
+
7
+
8
+ def decide(stage: str, error: Exception | None, attempt_state: dict[str, Any] | None = None) -> RetryDecision | None:
9
+ """Return a retry decision for a stage+error.
10
+
11
+ This is intentionally conservative; a None return means fail.
12
+ """
13
+ if error is None:
14
+ return None
15
+
16
+ # Default: retry with backoff handled by executor scheduling.
17
+ return RetryDecision(
18
+ retry_in_seconds=None,
19
+ same_endpoint=True,
20
+ rotate_endpoint=False,
21
+ increase_fees=False,
22
+ max_attempts_key=stage,
23
+ reason=type(error).__name__,
24
+ )
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from enum import Enum
5
+ from typing import Any
6
+
7
+ from brawny.timeout import Deadline
8
+
9
+ class StageName(str, Enum):
10
+ GAP_CHECK = "gap_check"
11
+ RESERVE_NONCE = "reserve_nonce"
12
+ BUILD_TX = "build_tx"
13
+ SIMULATE = "simulate"
14
+ SIGN = "sign"
15
+ BROADCAST = "broadcast"
16
+ MONITOR_TICK = "monitor_tick"
17
+ FINALIZE = "finalize"
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class RunContext:
22
+ intent: Any
23
+ chain_id: int
24
+ signer_address: str
25
+ to_address: str
26
+ job: Any | None
27
+ logger: Any
28
+ config: Any
29
+ rpc: Any
30
+ db: Any
31
+ nonce_manager: Any
32
+ keystore: Any
33
+ lifecycle: Any | None
34
+ deadline: Deadline
35
+
36
+
37
+ @dataclass(frozen=True)
38
+ class RetryDecision:
39
+ retry_in_seconds: float | None
40
+ same_endpoint: bool = True
41
+ rotate_endpoint: bool = False
42
+ increase_fees: bool = False
43
+ max_attempts_key: str | None = None
44
+ reason: str | None = None
45
+
46
+
47
+ @dataclass(frozen=True)
48
+ class Ok:
49
+ next_stage: StageName
50
+ data: dict[str, Any]
51
+
52
+
53
+ @dataclass(frozen=True)
54
+ class Retry:
55
+ next_stage: StageName
56
+ retry: RetryDecision
57
+ data: dict[str, Any]
58
+
59
+
60
+ @dataclass(frozen=True)
61
+ class Fail:
62
+ reason: str
63
+ fatal: bool
64
+ data: dict[str, Any]
65
+
66
+
67
+ StageResult = Ok | Retry | Fail
68
+
69
+
70
+ @dataclass
71
+ class StageOutcome:
72
+ done: bool
73
+ final: Any | None = None
74
+ next_stage: StageName | None = None
75
+ data: dict[str, Any] | None = None
brawny/types.py ADDED
@@ -0,0 +1,18 @@
1
+ """Shared runtime types for brawny."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from datetime import datetime
7
+ from uuid import UUID
8
+
9
+
10
+ @dataclass(frozen=True)
11
+ class ClaimedIntent:
12
+ """Minimal context for a claimed intent."""
13
+
14
+ intent_id: UUID
15
+ claim_token: str
16
+ claimed_by: str | None
17
+ lease_expires_at: datetime | None
18
+ claimed_at: datetime
brawny/utils.py CHANGED
@@ -34,6 +34,16 @@ def normalize_address(address: str) -> str:
34
34
  return address.lower()
35
35
 
36
36
 
37
+ def db_address(address: str) -> str:
38
+ """Canonicalize address for database storage and comparisons.
39
+
40
+ Enforces 0x-prefixed, 40-hex format and returns lowercase.
41
+ """
42
+ if not is_valid_address(address):
43
+ raise ValueError(f"Invalid address: {address}")
44
+ return address.lower()
45
+
46
+
37
47
  def checksum_address(address: str) -> str:
38
48
  """Convert address to checksum format for RPC calls.
39
49
 
@@ -202,4 +212,35 @@ def truncate(text: str, max_length: int, suffix: str = "...") -> str:
202
212
  """
203
213
  if len(text) <= max_length:
204
214
  return text
215
+ if max_length <= len(suffix):
216
+ return text[:max_length]
217
+ return text[: max_length - len(suffix)] + suffix
218
+
219
+
220
+ # =============================================================================
221
+ # Error Utilities
222
+ # =============================================================================
223
+
224
+ def serialize_error(e: BaseException) -> dict[str, object]:
225
+ """Serialize an exception into JSON-safe fields."""
226
+ message = str(e) or repr(e)
227
+ payload: dict[str, object] = {
228
+ "exc_type": e.__class__.__name__,
229
+ "error": message,
230
+ }
231
+ error_code = getattr(e, "error_code", None)
232
+ if error_code is not None:
233
+ payload["error_code"] = error_code
234
+ code = getattr(e, "code", None)
235
+ if code is not None:
236
+ payload["rpc_code"] = code
237
+ http_status = getattr(e, "status_code", None)
238
+ if http_status is not None:
239
+ payload["http_status"] = http_status
240
+ response = getattr(e, "response", None)
241
+ if response is not None:
242
+ status = getattr(response, "status_code", None)
243
+ if status is not None:
244
+ payload.setdefault("http_status", status)
245
+ return payload
205
246
  return text[: max_length - len(suffix)] + suffix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brawny
3
- Version: 0.1.13
3
+ Version: 0.1.22
4
4
  Summary: Block-driven Ethereum job/transaction execution framework
5
5
  Author-email: yearn <dev@yearn.fi>
6
6
  License: MIT
@@ -20,18 +20,18 @@ Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
21
  Requires-Python: >=3.10
22
22
  Description-Content-Type: text/markdown
23
+ Requires-Dist: eth-account<0.14,>=0.13
23
24
  Requires-Dist: web3<8.0,>=7.0
24
25
  Requires-Dist: click<9.0,>=8.1
25
26
  Requires-Dist: pyyaml<7.0,>=6.0
26
27
  Requires-Dist: python-dotenv<2.0,>=1.0
27
28
  Requires-Dist: structlog<25.0,>=24.1
28
29
  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
30
  Requires-Dist: rich<14.0,>=13.0
32
31
  Requires-Dist: prometheus-client<1.0,>=0.20
33
32
  Requires-Dist: prompt_toolkit<4.0,>=3.0
34
33
  Requires-Dist: pygments<3.0,>=2.17
34
+ Requires-Dist: cachetools<6.0,>=5.0
35
35
  Provides-Extra: dev
36
36
  Requires-Dist: pytest<9.0,>=8.0; extra == "dev"
37
37
  Requires-Dist: pytest-asyncio<1.0,>=0.23; extra == "dev"
@@ -0,0 +1,163 @@
1
+ brawny/__init__.py,sha256=R0srILgiQJbAQ9as4SKD81nTsBQ6Seut0mcWNqlb_rQ,2400
2
+ brawny/_context.py,sha256=ghaQXoheHKU_veU9OrZpPYMXpRe-jtVtWJI5c6iRdPk,6630
3
+ brawny/accounts.py,sha256=0CVnNdAcoQG-DsAUAnuVm-Zt9KiuyORIQpU7m95gj1U,16796
4
+ brawny/api.py,sha256=2-ZJlW6GVA7Q31HMNcYuRES-hw8iV1qGXjXGgt6-qqI,19922
5
+ brawny/async_runtime.py,sha256=9C-8MFwdh2FQBr34tEa7sUxmbUSi5_ayHgZxYGExnzo,1441
6
+ brawny/chain.py,sha256=_LljDgKSXMmUD-c-iPMryIP5_XYv5a_lGMQrWbWj1JE,2213
7
+ brawny/cli_templates.py,sha256=f3EZRiFZ5lG8dXDjy0SDCAhfVZfB-CBMmYZYyFXr8vs,25681
8
+ brawny/history.py,sha256=8ODRudA-iiPF12s9mRR78doOIcnlCwaNQhEc901x6Do,3192
9
+ brawny/http.py,sha256=K1zXOSNJAsyBfSv6fZr2EAoUsGSgQWTU4-NTkMYtxh0,6874
10
+ brawny/interfaces.py,sha256=eJXjRh1HxeESaroItT-YCxsYlUceLw0ZmenZhR-H_LI,4393
11
+ brawny/invariants.py,sha256=LSndcqfaP9oJFPB31T-F3qfQkcpGJxnEiVTwJRsAgHA,4659
12
+ brawny/keystore.py,sha256=sZwDe2xFlTxdGmFkCXO6RCQIEPeMjKMWBGo0wWAutU8,19597
13
+ brawny/lifecycle.py,sha256=_G3IwlfZ3iNfa-63BP-PZ3p0OkBsaaszTqpZPZ1Scm8,22302
14
+ brawny/logging.py,sha256=ZlDQGeNwTKkhusOPxxC9Q1D085-EM5nmHShg21P8_D4,8817
15
+ brawny/metrics.py,sha256=uj3QCujwB6NjquRRa2Kg6RQzosCIPgSbI9i7w_hqhPc,26665
16
+ brawny/network_guard.py,sha256=C96PTBTbxb2U8zuR_T8zVmdMh5doGNAQfmH8D5qEfic,4210
17
+ brawny/reconciliation.py,sha256=_WFVf8fEKnkJVhTjThb0oTHXDM7njOOsLuTR5bU0Bik,3466
18
+ brawny/runtime_controls.py,sha256=GbUbrRCauq9r3yKYJr7tuxOa3_yLmQ1Z66C8BC-gKqk,2375
19
+ brawny/script_tx.py,sha256=VWcvlSe_gB55pPeaZIfj76ziFhk93xSEgcLRUI53wrM,9521
20
+ brawny/scripting.py,sha256=n-2i4oUUVajz1Q2ilU0SKNx3vE9X2kCr_7VuAiGVBAU,7867
21
+ brawny/startup.py,sha256=ChHzLR3dNv_4vxXG-uyp-XxgPCpbjRKkcIENyLhq_wg,2386
22
+ brawny/telegram.py,sha256=uivnWEdClj7n5d5l9ufBU_HcalJkmQuZXLQm_CzC01s,12811
23
+ brawny/testing.py,sha256=9E7IdfQ5-v0ka0PswIoxDLkXTpxMmVyqKIk5epz_Xz8,3474
24
+ brawny/timeout.py,sha256=qglyGkw0OarTXfn4sWWoKTHJoeG79S-TqPGtLbnfTJo,1134
25
+ brawny/types.py,sha256=_9_9CXfOjYFtCvnqiRUPBEfI6XeDFjo3fe6YwxAfV_4,389
26
+ brawny/utils.py,sha256=LeX30if47lmOnfCDrgYaM39ZO_56fxc9w7tMYcez0D4,6601
27
+ brawny/validation.py,sha256=f63DcrEABO1qdCL_9RVk7QbOhstpFFgxtAP7lU5VNfQ,1893
28
+ brawny/_rpc/__init__.py,sha256=taUDckpept4lDycfYUFvFN6cbCPaTLdOQaoefAknsSE,1581
29
+ brawny/_rpc/broadcast.py,sha256=Ki0-mUKSnzz8548fb1BUnDA1S_qvJeyWBXOYlt_oTEg,5533
30
+ brawny/_rpc/caller.py,sha256=AYUxxLyO640Xpput0Ksw_20SGjjbmv6A-0E8hIMlrxo,8839
31
+ brawny/_rpc/client.py,sha256=4xQ9YHf3TdfY1OsNbN4IFUU5I3SIVLHumjrcP35zi74,17549
32
+ brawny/_rpc/clients.py,sha256=kP9VZ0_DelHKOcC6fgJjUENFxderg2n8GUHUStsj8AY,3160
33
+ brawny/_rpc/context.py,sha256=vZe7mdqOlD4Rw8I10VgQ9EYXJiHTTGrWW_nhd6lomcE,1973
34
+ brawny/_rpc/errors.py,sha256=lFIXMHz4JIL0vORM_EO1Cpd5UzWNsFDkNOcNOf6fN7w,23233
35
+ brawny/_rpc/gas.py,sha256=qRQkOqsR7yttpJKucvFHpOAJAhitSS0s1CMAEpXW5SQ,5581
36
+ brawny/_rpc/pool.py,sha256=UBTIkPgGzSRrmgWVkCWcwQ6mV1FmIrnajIahbrr_-sY,548
37
+ brawny/_rpc/retry.py,sha256=Dnq-8kjF1gccmXTGE7wu4MsnPMpADdsF8G3MkJhxN_k,8987
38
+ brawny/_rpc/retry_policy.py,sha256=-_LjTWdBU4HfXk4hWCR15FfsjjBVHRvpivSJrhnMpYU,2575
39
+ brawny/alerts/__init__.py,sha256=auN2ZnX4VRDao2YSgbpkM9NjXJ53zuuX5T1EZTs6tpk,3343
40
+ brawny/alerts/abi_resolver.py,sha256=9SFZ2hATxEu4dkQqbUL076raoA-ca2RT5aAsIPePczg,24336
41
+ brawny/alerts/base.py,sha256=6u6CViLdwlgRO4_VQs68IYQW-JfLYaIPAXTRotKXwkA,4149
42
+ brawny/alerts/context.py,sha256=Qv2QhsUE2CwPjzmOqNLJp2vyaGzxZ9CoXE2dgP372Dg,8871
43
+ brawny/alerts/contracts.py,sha256=q4vxRbpFSW911WpRUQQOLUJIzSCyCrV-1QyCPxCz63c,24072
44
+ brawny/alerts/encoded_call.py,sha256=DzKYop5U9ciNI-S8e3CAA-yLYVeQ2UlwogZ_LN5-oHQ,6755
45
+ brawny/alerts/errors.py,sha256=Lg_bOrHllfDONaEjJM2TeMg8lEhjA2eM_EA10S1cRy8,9630
46
+ brawny/alerts/events.py,sha256=PiKshaEvkxKs5qpGlSn6SJIc0H-i4bWBYVZgc8-Lrxk,24074
47
+ brawny/alerts/function_caller.py,sha256=M_QNg0hMs_XuuT66CphXB2DQxtv0MPr_HUpNmBJBTHw,13459
48
+ brawny/alerts/health.py,sha256=Cl1C-_kmZPaz-aOXk0znRClSAU3IuQUbX_oR2FztA50,6739
49
+ brawny/alerts/routing.py,sha256=r8UMxRihfVxVmr6PRwWgU-NCi8_xjAIdWakfyUL-ssA,3239
50
+ brawny/alerts/send.py,sha256=RKFyOy0pjjzKLu2JdeFEW3p2z2Q21_kkQuB0iC0c8KE,28265
51
+ brawny/assets/AGENTS.md,sha256=wMA5R8-5PWNgris7zO6ue2b2EuYEoceN1IBJPCXo3xs,11485
52
+ brawny/cli/__init__.py,sha256=A96bKB68ldVoDafAhRf0_Jd4z6R4KaEenXs8131M5Ac,229
53
+ brawny/cli/app.py,sha256=xx7uyBjmKkFtqtdNIQJYgLhMTzgMIdRTBFZ-S2lnJP8,374
54
+ brawny/cli/bootstrap.py,sha256=cqqbw2_UFIOlPKtcphWWXyD-FqTMttTulXoZ4RHa7tk,1060
55
+ brawny/cli/helpers.py,sha256=6sXZJkfA3y6j-HdI6PBYjGRwkPrIwo4IoG4_FMvdJHE,8564
56
+ brawny/cli/commands/__init__.py,sha256=ctQJTUNsJrOqQMzY1y9zkS4J39UzecSZ7fLOFVNpbSo,1929
57
+ brawny/cli/commands/abi.py,sha256=epaQIMcoLo952blPfFq-cPlZ6OFPW8-xjYBR2cq3qNM,2767
58
+ brawny/cli/commands/accounts.py,sha256=1OreYRUNhSnVIWoQp_NTeUA_1l7ZDpul0fCKueteEZg,19213
59
+ brawny/cli/commands/console.py,sha256=FjlnAjZlkeExvjbHaRmLQ1LP3vBub1lKEQ1wCX5n98E,18970
60
+ brawny/cli/commands/contract.py,sha256=UVMNMMYSD7P8gnamzfGmn80U7LCP2-5GC_t8589qxdk,4335
61
+ brawny/cli/commands/controls.py,sha256=h0cqiGQt5MMTV9es-kJ0fv9GGnRgw4PB2lUkJvhiPEw,3471
62
+ brawny/cli/commands/health.py,sha256=QS0KxxBWioWJvxZpxnYO_h3OuGwNsZYONY4Fi1bnTtA,3668
63
+ brawny/cli/commands/init_project.py,sha256=B6Cy9w2Z86kB8Gs9dAC6zCb9q_5FYBGSrmHmqUr63-c,2586
64
+ brawny/cli/commands/intents.py,sha256=4W96VmofUxjwUaV51T9vvT7BvquLl2g4z2NUdTGtET4,4717
65
+ brawny/cli/commands/job_dev.py,sha256=c_Td4PMkxLQbZ2LWUpAGYdirwZw7tla1QXEKDo9z0Y4,8475
66
+ brawny/cli/commands/jobs.py,sha256=q9g6rp5JNvcdd-kwOY9VDRo5nSIH3ir7zlF9uKrXYyQ,12977
67
+ brawny/cli/commands/logs.py,sha256=aqyPthS-CBlM4n6GGufrefU0WZYI3EFmXZKcETgAx7s,2684
68
+ brawny/cli/commands/maintenance.py,sha256=xRrqRTOYn9zyiKR09Wm7ZGDe8UlY3_t0vaOltkvDQ28,5560
69
+ brawny/cli/commands/migrate.py,sha256=TiIwXmugEOdzPkoKluohEPJDbzvG34xlw9GQpfsHI8Y,1688
70
+ brawny/cli/commands/networks.py,sha256=e3nkiTLgbDCHOiBMo6Y5WIwOetOpP3hnbUSRze3mHOc,8499
71
+ brawny/cli/commands/run.py,sha256=uzY862N1A7Q2ybDM8eFVglPQs5aQu9xAzv6oLeZ2MFE,8975
72
+ brawny/cli/commands/script.py,sha256=D5bWC2mjdTsOk3FIYtg3A1UhJVECZ1cvTrPxfK_CRX4,6715
73
+ brawny/cli/commands/signer.py,sha256=6adaVRx5vLZ7OcsmOnkq89YLLfbIinPkpxiIBY6Qd8E,13141
74
+ brawny/config/__init__.py,sha256=27KxvvaUQM5YPh86qVp53Xy9XW9mUPyMGIodNhdO8pk,1830
75
+ brawny/config/models.py,sha256=LBmLRE3cZnAR_1uj92wVWLG6hividbtTg2Vm9nwCtBw,12262
76
+ brawny/config/parser.py,sha256=LHN7iYZRDnz0e1oS6IzufwFWnt6Ht66ROSjz5kSh1zg,31906
77
+ brawny/config/routing.py,sha256=AyeMsuzkqzEbW1XZMCAyK3ufTC4fyV4wcMLZHwt8L_w,1720
78
+ brawny/config/validation.py,sha256=Fcj3OthFZYVFs1iGk4Db7-YQMmGVNZtaaaPC57EEBHk,9708
79
+ brawny/daemon/__init__.py,sha256=c3IDbNv7aaXej69nh4fOYdNjX2U144tVfU2CtSd2icQ,331
80
+ brawny/daemon/context.py,sha256=N2lSMxrqNvh1VLjJ6-ON0p7KiLuPLnDV2oiiTVx9ga0,1934
81
+ brawny/daemon/core.py,sha256=5Xmjw3KhPM7DHpON6Se8GwUzwfm89Qp9VbDMj9j4a28,29841
82
+ brawny/daemon/loops.py,sha256=lUm8Tz6JRgsBpY6viIV0hc8o6hknpiZzuy368LtaOkk,13264
83
+ brawny/daemon/supervisor.py,sha256=iosdAU9qO8xfgpaINam4WsqHajyxRHtbfUEJ9S2_j3U,9551
84
+ brawny/db/__init__.py,sha256=l4Y4eKLJD4H176Dbxc0p4j4jhA8eA1XIi4DZhbVAZts,1922
85
+ brawny/db/base.py,sha256=gDPu1sLUldunZC5Gk-8QTPH5hoxmy7VM6urGmmR86UA,31807
86
+ brawny/db/circuit_breaker.py,sha256=pRyCz6P-2C9tFHlR-xomk7dmiMVgyYFBznHSog4H0QY,2984
87
+ brawny/db/global_cache.py,sha256=wkhw48M0agwy09vBn1m8GP_IOUvDBMOS2GmnNLjAYyQ,9775
88
+ brawny/db/migrate.py,sha256=t6rF3yBvAXGWaFavNFh1yW9xTQIL9U652b23ye-9ED4,15137
89
+ brawny/db/queries.py,sha256=9S7N74ifY1gJ1YijxvZ4O1i17Zdy27XBcUtmOrL5Ao0,16979
90
+ brawny/db/serialized.py,sha256=Gxc1JytP38jHzubNsJBodMQt150yHQFhvSCPub0Rphc,1779
91
+ brawny/db/migrations/001_init.sql,sha256=BOsnoWaCvtq34sP3M9U74LLTKLeuIfN0JDV7ip8Lv9E,8369
92
+ brawny/db/migrations/002_add_included_block.sql,sha256=e8w0PABNspPiTY--SunB2K1uBTgPYiB01UuJ-L8Wg-k,204
93
+ brawny/db/migrations/003_add_broadcast_at.sql,sha256=DYqlvuw7Kvphps49UAl-Blau0j80Oh8XKEBjBCShEpk,267
94
+ brawny/db/migrations/004_broadcast_binding.sql,sha256=I6T_AI_aKgkmFcKYPaJua7sU4ZC1A967ykBeHhiFX1Q,884
95
+ brawny/db/migrations/005_add_retry_after.sql,sha256=3dCDnjyRa3y_om_IiJLZGNEzt2JcdA8hRJqIaAXtP2c,273
96
+ brawny/db/migrations/006_add_retry_count_column.sql,sha256=6weoQrcTyiQsbFe1BPvSDyr2f9nq1M_dMhuJbJsmBXw,489
97
+ brawny/db/migrations/007_add_gap_tracking.sql,sha256=SUNXm6j7PtiQa1Tw-Bk_mz0R6BeRxddlMGT08XpKlCs,671
98
+ brawny/db/migrations/009_add_intent_metadata.sql,sha256=gP61XLMhlqRs0gGHlWim6AjsQeKJz6sRCBAX5INfObU,217
99
+ brawny/db/migrations/010_add_nonce_gap_index.sql,sha256=LNokPOOjxPaWTybwKK501dvFZ5QDP75mBgDEjGyeK-0,409
100
+ brawny/db/migrations/011_add_job_logs.sql,sha256=Hic9MsRhsxn-eWFkbZx7dlrKzqoFP07kgqMsD7-sIEY,713
101
+ brawny/db/migrations/012_add_claimed_by.sql,sha256=hnb4PCBEhPqRUkfJJdEHCXNaHKwHRA9rEUn1uC5RfWs,192
102
+ brawny/db/migrations/013_attempt_unique.sql,sha256=3TbhfY7jg9oVX_EJE5aoHQuSHYDaZ4AUDwpBdLCyLCk,464
103
+ brawny/db/migrations/014_add_lease_expires_at.sql,sha256=eTjmSsr5rVr5yydPBdm5aOTjAHHeHlfhQobxg1JAlUw,200
104
+ brawny/db/migrations/015_add_signer_alias.sql,sha256=zTcJycnRjdXGnmFwwdF8dNJYZArWIxEdq9_25izRZCg,711
105
+ brawny/db/migrations/016_runtime_controls_and_quarantine.sql,sha256=veR5Lex4Js-RWF_NKdd7fsIggozZFuTnX54dBEnfMxY,1056
106
+ brawny/db/migrations/017_add_job_drain.sql,sha256=T0a3QVW2677DUkBOp4zFZtza96EDF6hjrNtRzZTSrnc,195
107
+ brawny/db/migrations/018_add_nonce_reset_audit.sql,sha256=JTLHdu6vMvB4VjycueemF-Qm6vb0UbUtkqBk1VQMFXM,729
108
+ brawny/db/migrations/019_add_job_cooldowns.sql,sha256=4c-XxyrN_iR6fAEiDlhPfLZzlD2UawhIa1njOg1CQSM,236
109
+ brawny/db/migrations/020_attempt_unique_initial.sql,sha256=1af25NEqPp5TQKq9d33PmE2l6SCiOgbcwx07lHZqoKI,278
110
+ brawny/db/ops/__init__.py,sha256=B3AV18MMbvfD8RyZydCuhc12OVtFYsvFNLGRJAVpEfQ,123
111
+ brawny/db/ops/logs.py,sha256=27QDMvYL8F4VrxhbZqzAH38WeSM0QVB3XDkSGI3YaG0,2560
112
+ brawny/db/sqlite/__init__.py,sha256=Hyy3XNexDouL--Bu5yQGRIJCsf18fhQEeS5uVdS5ZHo,33956
113
+ brawny/db/sqlite/connection.py,sha256=EBX_lmMXiIiNLZ5fI_L530z9duTVCJ6HPVI7ASNzvh0,7377
114
+ brawny/db/sqlite/execute.py,sha256=wJlOsgcfNyOBKwYewZH3DyPW5weuFSjGQDAhfn_bnU0,3586
115
+ brawny/db/sqlite/mappers.py,sha256=VTTPCkVGSB--lHk79nD24QLdqJ6dmIaHeMIgvSyDp9g,6196
116
+ brawny/db/sqlite/tx.py,sha256=YRUdznfUheMElCB1RA4VU5W1LjeHI7x2QGorkI0wOBk,3673
117
+ brawny/db/sqlite/repos/attempts.py,sha256=azPyLCU697iTuFGxqXGdYHtcPeHUoBCfeQhk5-FpyhM,12382
118
+ brawny/db/sqlite/repos/block_state.py,sha256=_f9-7dTdEiKt8NCmslTBg4kg5XF0yTKeRRFTADMYX1U,3416
119
+ brawny/db/sqlite/repos/cache.py,sha256=mUmZ20yGdjQXkdX0GGHZtG7vXC_cYgONVWtIhbdTdTY,3179
120
+ brawny/db/sqlite/repos/intents.py,sha256=YFcDRW243P1HzpvQynahLSo7EWGzUuZZUciwgCHybTs,32802
121
+ brawny/db/sqlite/repos/jobs.py,sha256=RQZjgG6WE2aHZUvUE7FGRgO-AioFdg5gSjdpkSE9Ow4,5490
122
+ brawny/db/sqlite/repos/maintenance.py,sha256=cc3otsezUFZU5ZVHjFuGAWznWnAQdYmewTHXmYhwEqA,5564
123
+ brawny/db/sqlite/repos/signers_nonces.py,sha256=hAhHc3NP6sosK5gK5G9uJK6tbLhp18FBtfNQxuBsPn8,17029
124
+ brawny/jobs/__init__.py,sha256=tko3VoRTh2YbzOJws0wuYGWQQEgnCQNGqIVldEYU2Po,694
125
+ brawny/jobs/base.py,sha256=Hrhst19Zw1Io0TZiSCdc3hQWApyHhOIekM7RoOtR7iE,9765
126
+ brawny/jobs/discovery.py,sha256=JcjUwj9hDyCn7R_PjUMDxs6k5otdLx_y9gcbV_KUowU,7027
127
+ brawny/jobs/job_validation.py,sha256=Nc17_zPiiK6Mxb0c2pljDRFwzjrEFLVOXYnkh9kU18A,3135
128
+ brawny/jobs/kv.py,sha256=jjVgikiqib6NPxOu_pKbtdZ5aFWegVFa9e2Zovo54S4,3527
129
+ brawny/jobs/registry.py,sha256=WlYW4FApqeFje6cTkN9sOFMwOeXomhRRHXkIVCKCpfE,9396
130
+ brawny/model/__init__.py,sha256=8U2gUE20TB6vbFA3M06dsVN0pHVgSIHAYRZoUNVdViw,934
131
+ brawny/model/contexts.py,sha256=tplkAjmC5M6AGtxUvbAAUMFNUKUpCZ3hjTqN8cLonlA,13463
132
+ brawny/model/enums.py,sha256=_rodASTdGg6VtTbRZUD3wX43tCzYeESwTSBRWxmaJOI,1569
133
+ brawny/model/errors.py,sha256=v5xcR-46BjNTrODGUlr-f4h_uQaevsDyRhF3w7_7fk0,4867
134
+ brawny/model/events.py,sha256=Hq7zXXXDnhscy_uE4Dq6LYdp7hnFHpyaSWx3XUT6K-I,2496
135
+ brawny/model/startup.py,sha256=PeO5l-q6QPrmW8ibl0X_5hTOu922s9Vs5TKH_QiQRJI,487
136
+ brawny/model/types.py,sha256=0H9Pu9ZDm8VVhSdfm7NYkX-oXVDX6w_sCbBVjjYHiRU,11728
137
+ brawny/networks/__init__.py,sha256=U7mFaogHGTt5NyBfV8_H-wSJChePDeAduZ-7mmhCPQU,2777
138
+ brawny/networks/config.py,sha256=HXMD0ZYiagSE62gWSHsZsZuOtEZti8ULilqF5KKMpTI,9221
139
+ brawny/networks/manager.py,sha256=46XBpABUb3ac1OP0QLFB7Y2DVYCpZ3OUBrF8vdVABPk,15407
140
+ brawny/obs/__init__.py,sha256=LZEUGcvTj5GphlX8r2QZChmjKzyA6Ejps-fPrzfnkNU,1486
141
+ brawny/obs/emit.py,sha256=8splCumkhX3zBYGmKp1DR6v42FDC4IDJ-SCPbRLLLys,4802
142
+ brawny/obs/health.py,sha256=j8SngL9gcjLxQpKZgYe5ILsWAb7zseQm4XLVlTFUqGM,5242
143
+ brawny/obs/heartbeat.py,sha256=QneRoISZ59g1tK6ulb7EpXxhhakzdmkSxKsr53LjSww,3826
144
+ brawny/scheduler/__init__.py,sha256=ecMObpBINPeqhGxR_GT1jhalQwkPS2ct-hphibxAVXk,547
145
+ brawny/scheduler/poller.py,sha256=3Hm79Pcr8CaJMVPZwqlPInMvGKDj1sSPNltWsXuElT4,17041
146
+ brawny/scheduler/reorg.py,sha256=FkBpXrQb58CfyiKJafclFblCVnrdiamNmBbNOmzL5oU,25801
147
+ brawny/scheduler/runner.py,sha256=3C1gCmWOZmy0bOstto35O1VjGSl7x8zN0RPQaywdrmU,38265
148
+ brawny/scheduler/shutdown.py,sha256=-zmAgm-1pY4tUX8LigvNxtX9mZSt56Kz3xcmD7Ek9fk,11444
149
+ brawny/tx/__init__.py,sha256=EAutSKQ5_SHfhmqylgHwqmPHqkJuPFFq0TmF3xCYEgs,1026
150
+ brawny/tx/executor.py,sha256=2Hqicfqeo_ppHCcjxQvVbDwlToOKqUIXVhTFMhwbX6o,62252
151
+ brawny/tx/fees.py,sha256=x8LofoFtchD3YsjSLebxzl0M1kMDvHi8usfcOCDZ4Jw,1755
152
+ brawny/tx/intent.py,sha256=-YIZcZJ_s9jygTyOJVqCAy3a8_9x1dGBR6QWO12y5Vw,13528
153
+ brawny/tx/monitor.py,sha256=KPYbozfI17cK69U55w3gO72j64QazVrH38tXm5Uc3iw,22284
154
+ brawny/tx/nonce.py,sha256=TorMhrzwY01Uv6L0te9K9UKrIZBUmb7xRCQQT2HD4fg,21434
155
+ brawny/tx/replacement.py,sha256=Lsv9E9BBnbpcw_pWpKSqTODnTfRgRXMrapJxpVn7-yI,17331
156
+ brawny/tx/retry_policy.py,sha256=_KlskT1hOxQOR7nDOJX-h0Fv73mdAhZ5xbiks4oSybM,683
157
+ brawny/tx/utils.py,sha256=CKoxuqtyFkqgKuTgRCDbV3DwQUlTluPI-dFYSVWml0Q,592
158
+ brawny/tx/stages/types.py,sha256=cNJH924z0wCgs_4JrrZfVCpF2ef-P6IevR2RzxcU9JI,1428
159
+ brawny-0.1.22.dist-info/METADATA,sha256=CX1dpGbRw-GKDUMmjHUj-yRngLtnuS7UBZSV3ppbX0w,4927
160
+ brawny-0.1.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
161
+ brawny-0.1.22.dist-info/entry_points.txt,sha256=hIidVhlON00WJDOrxya-bycfP6Hsml9B2qGlrhZtzbw,43
162
+ brawny-0.1.22.dist-info/top_level.txt,sha256=CjjN4HE-2fk8M8ULl1YgEZz6Ar5LpiYLLC4eLl_HW4Y,7
163
+ brawny-0.1.22.dist-info/RECORD,,