Block-driven Ethereum job/transaction execution framework
Project description
brawny
Block-driven Ethereum job and transaction execution framework, inspired by eth-brownie.
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.
Installation (Local Development)
# Clone and install the framework
git clone https://github.com/yearn/brawny.git
cd brawny
pip install -e .
Quick Start
# Create a new keeper project
mkdir my-keeper && cd my-keeper
brawny init
# Install your project (brawny is already installed from above)
pip install -e .
# Configure
cp .env.example .env
# Edit .env: set RPC_URL and BRAWNY_KEYSTORE_PASSWORD_WORKER
# Import a signer key (will prompt for password)
brawny accounts import --name worker --private-key 0xYOUR_PRIVATE_KEY
# Run
brawny start
See docs/quickstart.md for a longer walkthrough.
Project Structure
After brawny init, your project looks like:
my-keeper/
├── my_keeper/ # Your Python package
│ └── __init__.py
├── jobs/
│ ├── __init__.py
│ └── _examples.py # Reference implementations (not registered)
├── interfaces/ # Place ABI JSON files here
├── monitoring/ # Prometheus + Grafana stack
│ ├── docker-compose.yml
│ └── grafana/...
├── pyproject.toml
├── config.yaml
├── .env.example
├── .gitignore
└── AGENTS.md # AI agent guide for writing jobs
The AGENTS.md file contains a comprehensive guide for AI agents to generate correct, idiomatic jobs.
Minimal Job Example
Create jobs/harvester.py:
from brawny import Job, job, Contract, trigger, intent, block
@job(signer="worker")
class HarvestJob(Job):
name = "Harvest Example"
check_interval_blocks = 50
vault_address = "0xYourVault"
def check(self):
vault = Contract(self.vault_address)
pending = vault.pendingRewards()
if pending > 1_000_000_000_000_000_000:
return trigger(
reason="Harvest pending rewards",
data={"pending": pending},
idempotency_parts=[block.number // 50],
)
return None
def build_intent(self, trig):
vault = Contract(self.vault_address)
return intent(
signer_address=self._signer_name,
to_address=self.vault_address,
data=vault.harvest.encode_input(),
min_confirmations=2,
)
def alert_triggered(self, ctx):
return f"Harvest triggered: {ctx.trigger.data['pending'] / 1e18:.4f}"
def alert_confirmed(self, ctx):
return f"Harvest confirmed: {ctx.tx.hash}"
Docs
docs/quickstart.mddocs/cli.mddocs/job-lifecycle.mddocs/alerts.md
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file brawny-0.1.45.tar.gz.
File metadata
- Download URL: brawny-0.1.45.tar.gz
- Upload date:
- Size: 321.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d9073032e16d0c4e77f2097993714e8381ddf97abd96954948c8b1d96ea26251
|
|
| MD5 |
2ec694b20c6190c70d0537384a0e0bdf
|
|
| BLAKE2b-256 |
287e42433c289f1f30a343087f716e66c3af8862781519160abade789933a7ea
|
File details
Details for the file brawny-0.1.45-py3-none-any.whl.
File metadata
- Download URL: brawny-0.1.45-py3-none-any.whl
- Upload date:
- Size: 388.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92e8fdd0e64da09c5efb2672461b74aed8d1079a354ca3d5b9d2ad998eb2d01c
|
|
| MD5 |
5172db18155655f810c1f24abb2852c3
|
|
| BLAKE2b-256 |
b6f4398d54f25800ba7c60ac964717b110163b854d5e885574072cc9e7931a78
|