Python library for deploying on BattleChain and adopting Safe Harbor agreements. Mirrors cyfrin/battlechain-lib (Solidity).
Project description
battlechain-lib-py
Python library for deploying on BattleChain and adopting
Safe Harbor agreements. Mirrors
cyfrin/battlechain-lib (Solidity).
Boa-first, designed for Moccasin scripts.
Installation
uv add battlechain-lib-py
# or
pip install battlechain-lib-py
Requires Python ≥ 3.11.
Quick start
A minimal Moccasin script that deploys a contract, creates a Safe Harbor agreement, adopts it, and requests attack mode:
import boa
from eth_utils import keccak
import battlechain as bc
from src import MyVault # your Vyper contract
def moccasin_main() -> None:
# 1. Deploy through BattleChainDeployer (auto-registers with AttackRegistry)
vault = MyVault.deploy()
bc.track_deployment(vault.address)
# 2. Build agreement defaults — chain ID, CAIP-2 scope, and Safe Harbor URI
# are all picked automatically based on the active boa env.
details = bc.default_agreement_details(
protocol_name="MyProtocol",
contacts=[bc.Contact(name="Security Team", contact="sec@example.xyz")],
contracts=bc.deployed_contracts(),
recovery_address=boa.env.eoa,
chain_id=bc.TESTNET_CHAIN_ID,
)
# 3. Create + 14-day commitment + adopt, all in one call
agreement = bc.create_and_adopt_agreement(
details, owner=boa.env.eoa, salt=keccak(b"v1")
)
# 4. Enter attack mode — only valid on BattleChain
bc.request_attack_mode(agreement)
# 5. Verify source on the block explorer
bc.verify_contract(vault.address, "src/MyVault.vy:MyVault", "0.4.0")
Run with mox run script/deploy.py --network battlechain.
What's included
| Module | Mirrors | What it does |
|---|---|---|
battlechain.config |
src/BCConfig.sol |
Chain IDs, CAIP-2 ids, addresses, Safe Harbor URIs, override registration |
battlechain.types |
src/types/AgreementTypes.sol |
AgreementDetails, BountyTerms, BcAccount, BcChain, AgreementState |
battlechain.abi |
forge artifacts (out/) |
Auto-generated ABI fragments |
battlechain.builders |
BCSafeHarbor builders |
default_bounty_terms, default_agreement_details, … |
battlechain.deploy |
src/BCDeploy.sol |
bc_deploy_create / _create2 / _create3 + tracked deployments |
battlechain.safe_harbor |
src/BCSafeHarbor.sol |
create_and_adopt_agreement, request_attack_mode, … |
battlechain.query |
src/BCQuery.sol |
is_attackable (off-chain explorer API) + on-chain primitives |
battlechain.verify |
starter verify_contract.py |
Source verification via the explorer's Etherscan-compatible API |
battlechain.errors |
Solidity custom errors | Typed exceptions: NotBattleChainError, ApiFailedError, … |
battlechain.createx_chains |
src/CreateXChains.sol |
Registry of CreateX-supported chains |
Supported networks
| Network | Chain ID | Status |
|---|---|---|
| Mainnet | 626 | TBD (addresses pending) |
| Testnet | 627 | Available |
For local Anvil or unsupported chains, register addresses with config.set_overrides:
import battlechain.config as cfg
cfg.set_overrides(
chain_id=31337,
registry="0x…",
factory="0x…",
attack_registry="0x…",
deployer="0x…",
)
Reference
is_attackable(contract_address: str) -> bool
Mirrors BCQuery.isAttackable. Returns True if any Safe Harbor agreement
covering the contract is in UNDER_ATTACK or PROMOTION_REQUESTED. Resolves
coverage via the BattleChain block explorer (works for top-level and child
contracts).
import battlechain as bc
if bc.is_attackable("0x…"):
print("fair game under Safe Harbor")
For top-level-only on-chain checks (no HTTP), use is_top_level_contract_under_attack.
bc_deploy_create(init_code: bytes) -> str
Routes through BattleChainDeployer on BattleChain (auto-registers with the
AttackRegistry) and through CreateX on any of the 190+ supported chains.
bc_deploy_create2(salt, init_code) and bc_deploy_create3(salt, init_code)
work the same way.
Every deploy is tracked — call deployed_contracts() to get them all and pass
straight into default_agreement_details.
default_agreement_details(...) and friends
Build AgreementDetails with sensible defaults. On BattleChain it sets the
BattleChain CAIP-2 scope and BATTLECHAIN_SAFE_HARBOR_URI; on other chains it
falls back to the chain's eip155: scope and the generic Safe Harbor V3 URI.
The default bounty terms match BCSafeHarbor.defaultBountyTerms: 10%, $1M cap,
retainable, anonymous, no aggregate cap.
Network overrides
Same pattern as BCBase._setBcAddresses: register override addresses for any
chain and they take precedence over the canonical registry.
Contributing
See CONTRIBUTING.md for dev environment setup, the codegen flow, and the test suite.
License
Dual-licensed under MIT and Apache-2.0 at your option.
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 battlechain_lib_py-0.1.0.tar.gz.
File metadata
- Download URL: battlechain_lib_py-0.1.0.tar.gz
- Upload date:
- Size: 143.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea7c84fa86eb4a0bf14c1376d701b02b3a9fb3c61c64339c7cafbdf89644a8a6
|
|
| MD5 |
72521a99f0771424929596867e24e6a4
|
|
| BLAKE2b-256 |
4311a07d016b5d860d62405f1d502e2170bb15c486cdb825365e1498411cc725
|
Provenance
The following attestation bundles were made for battlechain_lib_py-0.1.0.tar.gz:
Publisher:
pypi-release.yml on Cyfrin/battlechain-lib-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
battlechain_lib_py-0.1.0.tar.gz -
Subject digest:
ea7c84fa86eb4a0bf14c1376d701b02b3a9fb3c61c64339c7cafbdf89644a8a6 - Sigstore transparency entry: 1451681351
- Sigstore integration time:
-
Permalink:
Cyfrin/battlechain-lib-py@675ef28b569ade9f81759d5200eb76e3977eac22 -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/Cyfrin
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-release.yml@675ef28b569ade9f81759d5200eb76e3977eac22 -
Trigger Event:
release
-
Statement type:
File details
Details for the file battlechain_lib_py-0.1.0-py3-none-any.whl.
File metadata
- Download URL: battlechain_lib_py-0.1.0-py3-none-any.whl
- Upload date:
- Size: 30.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9606d2fa12cedc5e8652564b3e81004aaa9b17c509d5459814b33c9d04d599c
|
|
| MD5 |
6e5edfa5ef42f14dd81a846e0faecc9a
|
|
| BLAKE2b-256 |
dcbc8a002dc427c76ec114b83b4aac03723ade7d2e9fe6a88de7bf4d0fcda993
|
Provenance
The following attestation bundles were made for battlechain_lib_py-0.1.0-py3-none-any.whl:
Publisher:
pypi-release.yml on Cyfrin/battlechain-lib-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
battlechain_lib_py-0.1.0-py3-none-any.whl -
Subject digest:
b9606d2fa12cedc5e8652564b3e81004aaa9b17c509d5459814b33c9d04d599c - Sigstore transparency entry: 1451681481
- Sigstore integration time:
-
Permalink:
Cyfrin/battlechain-lib-py@675ef28b569ade9f81759d5200eb76e3977eac22 -
Branch / Tag:
refs/tags/0.1.0 - Owner: https://github.com/Cyfrin
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-release.yml@675ef28b569ade9f81759d5200eb76e3977eac22 -
Trigger Event:
release
-
Statement type: