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.
- brawny/__init__.py +2 -0
- brawny/_context.py +5 -5
- brawny/_rpc/__init__.py +36 -12
- brawny/_rpc/broadcast.py +14 -13
- brawny/_rpc/caller.py +243 -0
- brawny/_rpc/client.py +539 -0
- brawny/_rpc/clients.py +11 -11
- brawny/_rpc/context.py +23 -0
- brawny/_rpc/errors.py +465 -31
- brawny/_rpc/gas.py +7 -6
- brawny/_rpc/pool.py +18 -0
- brawny/_rpc/retry.py +266 -0
- brawny/_rpc/retry_policy.py +81 -0
- brawny/accounts.py +28 -9
- brawny/alerts/__init__.py +15 -18
- brawny/alerts/abi_resolver.py +212 -36
- brawny/alerts/base.py +2 -2
- brawny/alerts/contracts.py +77 -10
- brawny/alerts/errors.py +30 -3
- brawny/alerts/events.py +38 -5
- brawny/alerts/health.py +19 -13
- brawny/alerts/send.py +513 -55
- brawny/api.py +39 -11
- brawny/assets/AGENTS.md +325 -0
- brawny/async_runtime.py +48 -0
- brawny/chain.py +3 -3
- brawny/cli/commands/__init__.py +2 -0
- brawny/cli/commands/console.py +69 -19
- brawny/cli/commands/contract.py +2 -2
- brawny/cli/commands/controls.py +121 -0
- brawny/cli/commands/health.py +2 -2
- brawny/cli/commands/job_dev.py +6 -5
- brawny/cli/commands/jobs.py +99 -2
- brawny/cli/commands/maintenance.py +13 -29
- brawny/cli/commands/migrate.py +1 -0
- brawny/cli/commands/run.py +10 -3
- brawny/cli/commands/script.py +8 -3
- brawny/cli/commands/signer.py +143 -26
- brawny/cli/helpers.py +0 -3
- brawny/cli_templates.py +25 -349
- brawny/config/__init__.py +4 -1
- brawny/config/models.py +43 -57
- brawny/config/parser.py +268 -57
- brawny/config/validation.py +52 -15
- brawny/daemon/context.py +4 -2
- brawny/daemon/core.py +185 -63
- brawny/daemon/loops.py +166 -98
- brawny/daemon/supervisor.py +261 -0
- brawny/db/__init__.py +14 -26
- brawny/db/base.py +248 -151
- brawny/db/global_cache.py +11 -1
- brawny/db/migrate.py +175 -28
- brawny/db/migrations/001_init.sql +4 -3
- brawny/db/migrations/010_add_nonce_gap_index.sql +1 -1
- brawny/db/migrations/011_add_job_logs.sql +1 -2
- brawny/db/migrations/012_add_claimed_by.sql +2 -2
- brawny/db/migrations/013_attempt_unique.sql +10 -0
- brawny/db/migrations/014_add_lease_expires_at.sql +5 -0
- brawny/db/migrations/015_add_signer_alias.sql +14 -0
- brawny/db/migrations/016_runtime_controls_and_quarantine.sql +32 -0
- brawny/db/migrations/017_add_job_drain.sql +6 -0
- brawny/db/migrations/018_add_nonce_reset_audit.sql +20 -0
- brawny/db/migrations/019_add_job_cooldowns.sql +8 -0
- brawny/db/migrations/020_attempt_unique_initial.sql +7 -0
- brawny/db/ops/__init__.py +3 -25
- brawny/db/ops/logs.py +1 -2
- brawny/db/queries.py +47 -91
- brawny/db/serialized.py +65 -0
- brawny/db/sqlite/__init__.py +1001 -0
- brawny/db/sqlite/connection.py +231 -0
- brawny/db/sqlite/execute.py +116 -0
- brawny/db/sqlite/mappers.py +190 -0
- brawny/db/sqlite/repos/attempts.py +372 -0
- brawny/db/sqlite/repos/block_state.py +102 -0
- brawny/db/sqlite/repos/cache.py +104 -0
- brawny/db/sqlite/repos/intents.py +1021 -0
- brawny/db/sqlite/repos/jobs.py +200 -0
- brawny/db/sqlite/repos/maintenance.py +182 -0
- brawny/db/sqlite/repos/signers_nonces.py +566 -0
- brawny/db/sqlite/tx.py +119 -0
- brawny/http.py +194 -0
- brawny/invariants.py +11 -24
- brawny/jobs/base.py +8 -0
- brawny/jobs/job_validation.py +2 -1
- brawny/keystore.py +83 -7
- brawny/lifecycle.py +64 -12
- brawny/logging.py +0 -2
- brawny/metrics.py +84 -12
- brawny/model/contexts.py +111 -9
- brawny/model/enums.py +1 -0
- brawny/model/errors.py +18 -0
- brawny/model/types.py +47 -131
- brawny/network_guard.py +133 -0
- brawny/networks/__init__.py +5 -5
- brawny/networks/config.py +1 -7
- brawny/networks/manager.py +14 -11
- brawny/runtime_controls.py +74 -0
- brawny/scheduler/poller.py +11 -7
- brawny/scheduler/reorg.py +95 -39
- brawny/scheduler/runner.py +442 -168
- brawny/scheduler/shutdown.py +3 -3
- brawny/script_tx.py +3 -3
- brawny/telegram.py +53 -7
- brawny/testing.py +1 -0
- brawny/timeout.py +38 -0
- brawny/tx/executor.py +922 -308
- brawny/tx/intent.py +54 -16
- brawny/tx/monitor.py +31 -12
- brawny/tx/nonce.py +212 -90
- brawny/tx/replacement.py +69 -18
- brawny/tx/retry_policy.py +24 -0
- brawny/tx/stages/types.py +75 -0
- brawny/types.py +18 -0
- brawny/utils.py +41 -0
- {brawny-0.1.13.dist-info → brawny-0.1.22.dist-info}/METADATA +3 -3
- brawny-0.1.22.dist-info/RECORD +163 -0
- brawny/_rpc/manager.py +0 -982
- brawny/_rpc/selector.py +0 -156
- brawny/db/base_new.py +0 -165
- brawny/db/mappers.py +0 -182
- brawny/db/migrations/008_add_transactions.sql +0 -72
- brawny/db/ops/attempts.py +0 -108
- brawny/db/ops/blocks.py +0 -83
- brawny/db/ops/cache.py +0 -93
- brawny/db/ops/intents.py +0 -296
- brawny/db/ops/jobs.py +0 -110
- brawny/db/ops/nonces.py +0 -322
- brawny/db/postgres.py +0 -2535
- brawny/db/postgres_new.py +0 -196
- brawny/db/sqlite.py +0 -2733
- brawny/db/sqlite_new.py +0 -191
- brawny-0.1.13.dist-info/RECORD +0 -141
- {brawny-0.1.13.dist-info → brawny-0.1.22.dist-info}/WHEEL +0 -0
- {brawny-0.1.13.dist-info → brawny-0.1.22.dist-info}/entry_points.txt +0 -0
- {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.
|
|
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,,
|