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
brawny/db/sqlite_new.py DELETED
@@ -1,191 +0,0 @@
1
- """SQLite database implementation.
2
-
3
- Slim execution layer with 4 primitives. All business operations live in db/ops/.
4
- Uses single connection with WAL mode.
5
-
6
- SQLite supports :name placeholders natively with dict params.
7
- """
8
-
9
- from __future__ import annotations
10
-
11
- import sqlite3
12
- import threading
13
- from contextlib import contextmanager
14
- from datetime import datetime, timezone
15
- from pathlib import Path
16
- from typing import Any, Iterator
17
-
18
- from brawny.db.base_new import Database, Dialect, IsolationLevel
19
- from brawny.model.errors import DatabaseError
20
-
21
-
22
- def _adapt_datetime(dt: datetime) -> str:
23
- """Adapt datetime to ISO format string for SQLite."""
24
- if dt.tzinfo is None:
25
- dt = dt.replace(tzinfo=timezone.utc)
26
- return dt.isoformat()
27
-
28
-
29
- def _convert_datetime(val: bytes) -> datetime:
30
- """Convert ISO format string from SQLite to datetime."""
31
- s = val.decode("utf-8")
32
- try:
33
- return datetime.fromisoformat(s)
34
- except ValueError:
35
- # Handle format without timezone
36
- return datetime.strptime(s, "%Y-%m-%d %H:%M:%S").replace(tzinfo=timezone.utc)
37
-
38
-
39
- # Register adapters globally
40
- sqlite3.register_adapter(datetime, _adapt_datetime)
41
- sqlite3.register_converter("TIMESTAMP", _convert_datetime)
42
-
43
-
44
- def _dict_factory(cursor: sqlite3.Cursor, row: tuple) -> dict[str, Any]:
45
- """Row factory that returns dict rows."""
46
- cols = [d[0] for d in cursor.description]
47
- return dict(zip(cols, row))
48
-
49
-
50
- class SQLiteDatabase(Database):
51
- """SQLite implementation with single connection.
52
-
53
- Uses WAL mode for better concurrency. Thread safety via lock.
54
- Queries use :name placeholders natively.
55
- """
56
-
57
- def __init__(self, database_path: str) -> None:
58
- """Initialize SQLite database.
59
-
60
- Args:
61
- database_path: Path to SQLite database file (or :memory:)
62
- """
63
- # Remove sqlite:/// prefix if present
64
- if database_path.startswith("sqlite:///"):
65
- database_path = database_path[10:]
66
-
67
- self._database_path = database_path
68
- self._conn: sqlite3.Connection | None = None
69
- self._lock = threading.RLock()
70
- self._in_transaction = False
71
-
72
- @property
73
- def dialect(self) -> Dialect:
74
- """Return dialect name for query selection."""
75
- return "sqlite"
76
-
77
- def connect(self) -> None:
78
- """Establish database connection."""
79
- if self._conn is not None:
80
- return
81
-
82
- # Create directory if needed
83
- if self._database_path != ":memory:":
84
- path = Path(self._database_path)
85
- path.parent.mkdir(parents=True, exist_ok=True)
86
-
87
- self._conn = sqlite3.connect(
88
- self._database_path,
89
- detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES,
90
- check_same_thread=False,
91
- timeout=30.0,
92
- isolation_level=None, # Autocommit mode - we manage transactions manually
93
- )
94
- self._conn.row_factory = _dict_factory
95
- # Enable foreign keys and WAL mode
96
- self._conn.execute("PRAGMA foreign_keys = ON")
97
- self._conn.execute("PRAGMA journal_mode = WAL")
98
-
99
- def close(self) -> None:
100
- """Close database connection."""
101
- if self._conn:
102
- self._conn.close()
103
- self._conn = None
104
-
105
- def is_connected(self) -> bool:
106
- """Check if database is connected."""
107
- return self._conn is not None
108
-
109
- def _ensure_connected(self) -> sqlite3.Connection:
110
- """Ensure connection exists and return it."""
111
- if self._conn is None:
112
- raise DatabaseError("Database not connected. Call connect() first.")
113
- return self._conn
114
-
115
- @contextmanager
116
- def transaction(
117
- self, isolation_level: IsolationLevel | None = None
118
- ) -> Iterator[None]:
119
- """Context manager for database transactions.
120
-
121
- Uses BEGIN IMMEDIATE for write transactions to avoid
122
- SQLITE_BUSY errors on concurrent writes.
123
-
124
- Args:
125
- isolation_level: Ignored on SQLite (BEGIN IMMEDIATE provides isolation)
126
- """
127
- conn = self._ensure_connected()
128
-
129
- with self._lock:
130
- if self._in_transaction:
131
- raise DatabaseError("Nested transactions are not supported")
132
-
133
- try:
134
- conn.execute("BEGIN IMMEDIATE")
135
- self._in_transaction = True
136
- yield
137
- conn.commit()
138
- except Exception:
139
- conn.rollback()
140
- raise
141
- finally:
142
- self._in_transaction = False
143
-
144
- def execute(self, query: str, params: dict[str, Any] | None = None) -> None:
145
- """Execute a query without returning results."""
146
- conn = self._ensure_connected()
147
- with self._lock:
148
- try:
149
- conn.execute(query, params or {})
150
- if not self._in_transaction:
151
- conn.commit()
152
- except sqlite3.Error as e:
153
- raise DatabaseError(f"SQLite query failed: {e}") from e
154
-
155
- def fetch_one(
156
- self, query: str, params: dict[str, Any] | None = None
157
- ) -> dict[str, Any] | None:
158
- """Execute a query and return single result or None."""
159
- conn = self._ensure_connected()
160
- with self._lock:
161
- try:
162
- cursor = conn.execute(query, params or {})
163
- return cursor.fetchone()
164
- except sqlite3.Error as e:
165
- raise DatabaseError(f"SQLite query failed: {e}") from e
166
-
167
- def fetch_all(
168
- self, query: str, params: dict[str, Any] | None = None
169
- ) -> list[dict[str, Any]]:
170
- """Execute a query and return all results."""
171
- conn = self._ensure_connected()
172
- with self._lock:
173
- try:
174
- cursor = conn.execute(query, params or {})
175
- return cursor.fetchall()
176
- except sqlite3.Error as e:
177
- raise DatabaseError(f"SQLite query failed: {e}") from e
178
-
179
- def execute_rowcount(
180
- self, query: str, params: dict[str, Any] | None = None
181
- ) -> int:
182
- """Execute a query and return affected row count."""
183
- conn = self._ensure_connected()
184
- with self._lock:
185
- try:
186
- cursor = conn.execute(query, params or {})
187
- if not self._in_transaction:
188
- conn.commit()
189
- return cursor.rowcount
190
- except sqlite3.Error as e:
191
- raise DatabaseError(f"SQLite query failed: {e}") from e
@@ -1,141 +0,0 @@
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,,