Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
e2999f8
feat(bridge-sdk): scaffold aleo-bridge-sdk with error taxonomy and ex…
iamalwaysuncomfortable Sep 16, 2026
10a2e80
feat(bridge-sdk): vendor keccak-256 and base58 primitives
iamalwaysuncomfortable Sep 16, 2026
fd156c2
feat(bridge-sdk): wire encoders — bech32m, hyperlane limbs, xReserve …
iamalwaysuncomfortable Sep 16, 2026
ca94473
feat(bridge-sdk): pinned veil registry (7 chains, 19 assets, 22 route…
iamalwaysuncomfortable Sep 16, 2026
3e7f95d
feat(bridge-sdk): status enum, plan/receipt/progress and result datac…
iamalwaysuncomfortable Sep 16, 2026
9441e06
fix(bridge-sdk): derive Progress.error for failed transfers and expor…
iamalwaysuncomfortable Sep 16, 2026
da7c50b
feat(bridge-sdk): AleoCall verb ladder with checkpointable delegate a…
iamalwaysuncomfortable Sep 16, 2026
759b0fb
fix(bridge-sdk): narrow duplicate-broadcast detection and document co…
iamalwaysuncomfortable Sep 16, 2026
ccdd98a
feat(bridge-sdk): Aleo-origin Hyperlane transfer_remote, IGP quote an…
iamalwaysuncomfortable Sep 16, 2026
becb6a2
fix(bridge-sdk): stop test_import_without_optional_extras leaking rei…
iamalwaysuncomfortable Sep 16, 2026
fbdbff1
feat(bridge-sdk): xReserve burn and private_mint builders, Circle att…
iamalwaysuncomfortable Sep 16, 2026
fd32605
fix(bridge-sdk): wrap Circle transport and JSON failures in Attestati…
iamalwaysuncomfortable Sep 17, 2026
92e82ac
feat(bridge-sdk): Sealance freeze-list Merkle tree and exclusion proofs
iamalwaysuncomfortable Sep 17, 2026
1961e77
feat(bridge-sdk): shield/unshield for ARC-20 and ARC-22 assets with r…
iamalwaysuncomfortable Sep 17, 2026
0c0870b
fix(bridge-sdk): reject mismatched recipient on ARC-20 unshield
iamalwaysuncomfortable Sep 17, 2026
3d5a798
feat(bridge-sdk): Bridge client with from_env/from_profile/status, Al…
iamalwaysuncomfortable Sep 17, 2026
e91e739
fix(bridge-sdk): read the USDCx freeze list from usdcx_freezelist.ale…
iamalwaysuncomfortable Sep 17, 2026
5a16070
fix(bridge-sdk): mapping_value returns None for a missing program
iamalwaysuncomfortable Sep 17, 2026
4564e30
test(bridge-sdk): gated read-only live checks (IGP quotes, mailbox an…
iamalwaysuncomfortable Sep 17, 2026
fc03b53
feat(bridge-sdk): version-1 checkpoint allowlist and FileCheckpointStore
iamalwaysuncomfortable Sep 17, 2026
cae4b1c
feat(bridge-sdk): Ethereum connection with three signer forms and fak…
iamalwaysuncomfortable Sep 17, 2026
5472d59
feat(bridge-sdk): EvmCall step runner with pre-poll checkpoints, EVM …
iamalwaysuncomfortable Sep 17, 2026
f753383
fix(bridge-sdk): AleoCall.__repr__ no longer leaks record/nonce literals
iamalwaysuncomfortable Sep 17, 2026
99ba28f
fix(bridge-sdk): Receipt.replace copies its dicts; to_progress raises…
iamalwaysuncomfortable Sep 17, 2026
2d51a6a
fix(bridge-sdk): freeze-list root check is fatal when unreadable
iamalwaysuncomfortable Sep 17, 2026
ffec2ab
fix(bridge-sdk): profile creation is exclusive (O_EXCL); home dir mod…
iamalwaysuncomfortable Sep 17, 2026
550cddb
fix(bridge-sdk): xreserve.burn validates mode before touching chain s…
iamalwaysuncomfortable Sep 17, 2026
9eacacb
fix(bridge-sdk): triaged minors from the plan-1 review
iamalwaysuncomfortable Sep 17, 2026
effc32c
test(bridge-sdk): prove eth.py fee arithmetic, legacy gasPrice path, …
iamalwaysuncomfortable Sep 17, 2026
3ec2703
feat(bridge-sdk): eth.quote_transfer_remote with native/collateral fe…
iamalwaysuncomfortable Sep 17, 2026
e17638d
feat(bridge): eth.transfer_remote with approval reset, DispatchId mes…
iamalwaysuncomfortable Sep 17, 2026
a25ef69
feat(bridge): eth.quote_deposit_usdc with hook data, wrapper-program …
iamalwaysuncomfortable Sep 17, 2026
629091c
fix(bridge-sdk): validate Hyperlane route metadata before contract ca…
iamalwaysuncomfortable Sep 17, 2026
357feb8
fix(bridge-sdk): validate xReserve route metadata before contract calls
iamalwaysuncomfortable Sep 17, 2026
ced692f
feat(bridge): eth.deposit_usdc with DepositedToRemote re-verification…
iamalwaysuncomfortable Sep 17, 2026
ea02432
feat(bridge-sdk): eth.source_status for approval and confirming branc…
iamalwaysuncomfortable Sep 17, 2026
b183690
feat(bridge-sdk): eth.recover_source log-scan recovery for Hyperlane …
iamalwaysuncomfortable Sep 17, 2026
9dad3fb
feat(bridge-sdk): Bridge.eth, bare Web3 wrapping, EVM env vars in fro…
iamalwaysuncomfortable Sep 17, 2026
6af1101
test(bridge-sdk): live Ethereum read checks and gated Sepolia USDC le…
iamalwaysuncomfortable Sep 17, 2026
12c77bb
docs(bridge-sdk): document bridge.eth in the README Ethereum section
iamalwaysuncomfortable Sep 17, 2026
491b528
fix(bridge-sdk): recover_source required semantics, chain-checked sta…
iamalwaysuncomfortable Sep 17, 2026
21054d9
feat(bridge-sdk): sealevel TransferRemote instruction data with veil'…
iamalwaysuncomfortable Sep 17, 2026
2ccbb48
test(bridge-sdk): leg-1 state files follow the rehearsal convention; …
iamalwaysuncomfortable Sep 17, 2026
119acc9
feat(bridge-sdk): decode sealevel IGP accounts and quote the lamport …
iamalwaysuncomfortable Sep 17, 2026
cd4574b
feat(bridge-sdk): sealevel route metadata, pure PDA derivation, and t…
iamalwaysuncomfortable Sep 17, 2026
b0b8606
feat(bridge-sdk): Solana sync JSON-RPC transport and connection (rpc_…
iamalwaysuncomfortable Sep 17, 2026
84ec18a
fix(bridge-sdk): DispatchId must come from the route's mailbox; xRese…
iamalwaysuncomfortable Sep 17, 2026
44c633c
fix(bridge-sdk): a checkpoint-store failure after broadcast never los…
iamalwaysuncomfortable Sep 17, 2026
a0c0b06
feat(bridge-sdk): plan-driven transfer_remote/deposit_usdc and quote …
iamalwaysuncomfortable Sep 17, 2026
1620df9
fix(bridge-sdk): bounded, chunked and wrapped recovery log scans
iamalwaysuncomfortable Sep 17, 2026
5eaede5
fix(bridge-sdk): native fee decimals, validated mailbox lookup, match…
iamalwaysuncomfortable Sep 17, 2026
9e8bd22
docs(bridge-sdk): note BRIDGE_LIVE_ETHEREUM_RPC_URL is an ordinary fr…
iamalwaysuncomfortable Sep 17, 2026
a27e302
refactor(bridge-sdk): promote _plan_for to _plan.build_plan with a ch…
iamalwaysuncomfortable Sep 17, 2026
1d5f7d6
feat(bridge-sdk): SolModule quote — IGP payment, network fee, rent an…
iamalwaysuncomfortable Sep 17, 2026
00801e5
feat(bridge-sdk): SolCall — partial sign, fee-payer signature, broadc…
iamalwaysuncomfortable Sep 17, 2026
22ddfa2
feat(bridge-sdk): Solana SOURCE_CONFIRMING status refresh with blockh…
iamalwaysuncomfortable Sep 17, 2026
987e541
feat(bridge-sdk): wire the Solana connection into Bridge (sol propert…
iamalwaysuncomfortable Sep 17, 2026
9914662
fix(bridge-sdk): SolCall polling — EXPIRED only without a status; log…
iamalwaysuncomfortable Sep 17, 2026
51c1b14
test(bridge-sdk): gated live Solana reads (IGP decode, leg 11 quote) …
iamalwaysuncomfortable Sep 17, 2026
7ecfaa7
feat(bridge): pure prepare() planner with veil step lists and route r…
iamalwaysuncomfortable Sep 17, 2026
d69a9ca
feat(bridge-sdk): quote() dispatch over protocol modules + duck-typed…
iamalwaysuncomfortable Sep 17, 2026
469acf2
fix(bridge-sdk): never lose a broadcast id, and verify the node echoe…
iamalwaysuncomfortable Sep 17, 2026
8d75c57
fix(bridge-sdk): a call is single-use once it has broadcast
iamalwaysuncomfortable Sep 17, 2026
77a27ab
fix(bridge-sdk): a Solana status row with no confirmation level is pr…
iamalwaysuncomfortable Sep 17, 2026
8cee394
fix(bridge-sdk): coerce solana= like ethereum=, and derive the status…
iamalwaysuncomfortable Sep 17, 2026
61197b5
fix(bridge-sdk): close Solana transports properly and never raise fro…
iamalwaysuncomfortable Sep 17, 2026
bfacc62
fix(bridge-sdk): keep the key out of tracebacks, re-resolve the route…
iamalwaysuncomfortable Sep 17, 2026
ff430bc
docs(bridge-sdk): document the Solana env aliases; drop two dead decl…
iamalwaysuncomfortable Sep 17, 2026
3a315d6
fix(bridge-sdk): name the missing recipient, and validate log_scan_ch…
iamalwaysuncomfortable Sep 17, 2026
6f52ced
feat(bridge-sdk): execute() with prove->checkpoint->broadcast Aleo le…
iamalwaysuncomfortable Sep 17, 2026
362b4e7
fix(bridge-sdk): arm the single-use guard on an echoed-hash mismatch;…
iamalwaysuncomfortable Sep 17, 2026
a0453a8
feat(bridge-sdk): get_status() branch table incl. nullifier-first inb…
iamalwaysuncomfortable Sep 17, 2026
027093d
fix(bridge-sdk): save-then-delete checkpoints, gate Aleo legs on the …
iamalwaysuncomfortable Sep 18, 2026
58fa861
feat(bridge-sdk): wait() with caller boundaries, until, transient-err…
iamalwaysuncomfortable Sep 18, 2026
86789bf
fix(bridge-sdk): stop _message_id aliasing source tx hashes and stop …
iamalwaysuncomfortable Sep 18, 2026
ea718ad
feat(bridge-sdk): recover() rebuilds progress from checkpoints withou…
iamalwaysuncomfortable Sep 18, 2026
a2c6a0e
fix(bridge-sdk): let get_status see a failing destination-balance read
iamalwaysuncomfortable Sep 18, 2026
2ccc64e
feat(bridge-sdk): resume() and complete() - idempotent rebroadcast, p…
iamalwaysuncomfortable Sep 18, 2026
13f2df0
fix(bridge-sdk): recover() rejects malformed deliveryVerification and…
iamalwaysuncomfortable Sep 18, 2026
82a5c92
feat(bridge-sdk): Bridge lifecycle methods, pending(), and additive p…
iamalwaysuncomfortable Sep 18, 2026
0f6d233
fix(bridge-sdk): resume requires the checkpointed xReserve hook; comp…
iamalwaysuncomfortable Sep 18, 2026
1720cdd
feat(bridge-sdk): agent tools over the lifecycle verbs with confirm-g…
iamalwaysuncomfortable Sep 18, 2026
6e628a7
fix(bridge-sdk): pending() is offline; Bridge.wait forwards the retry…
iamalwaysuncomfortable Sep 18, 2026
53595c3
fix(bridge-sdk): agent tools return checkpoints from reads, redact re…
iamalwaysuncomfortable Sep 18, 2026
f677316
feat(bridge-sdk): MCP stdio server over the agent tools
iamalwaysuncomfortable Sep 18, 2026
bb4bf73
feat(bridge-sdk): generate AGENTS.md from docstrings; python -m aleo_…
iamalwaysuncomfortable Sep 18, 2026
0b3d0e0
test(bridge-sdk): live harness config/helpers ported from veil, with …
iamalwaysuncomfortable Sep 18, 2026
5d67bc1
feat(bridge-sdk): live cases + rehearse CLI over the public lifecycle…
iamalwaysuncomfortable Sep 18, 2026
53472dd
docs(bridge-sdk): README section for the live tests
iamalwaysuncomfortable Sep 18, 2026
50aea16
fix(bridge-sdk): veil parity for the live cases — source confirmation…
iamalwaysuncomfortable Sep 18, 2026
062b65e
test(bridge-sdk): live lifecycle suite over every route, back and forth
iamalwaysuncomfortable Sep 18, 2026
bcdc4cf
docs(bridge-sdk): live-test commands, and PyNaCl is a base dependency
iamalwaysuncomfortable Sep 18, 2026
bdd8e00
docs(bridge-sdk): rewrite README for the full lifecycle SDK, agent/MC…
iamalwaysuncomfortable Sep 18, 2026
0b2dd7a
ci: add build-bridge and release-bridge jobs for aleo-bridge-sdk
iamalwaysuncomfortable Sep 18, 2026
1b2e445
fix(bridge-sdk): status() lists the in-flight transfers of the bound …
iamalwaysuncomfortable Sep 18, 2026
49dda70
fix(bridge-sdk): one unreadable checkpoint file no longer hides every…
iamalwaysuncomfortable Sep 22, 2026
a8fedf2
fix(bridge-sdk): an Aleo->EVM xReserve burn can now terminate
iamalwaysuncomfortable Sep 22, 2026
90ed85f
fix(bridge-sdk): the xReserve withdrawal fee is a quote assumption, a…
iamalwaysuncomfortable Sep 22, 2026
f4aadd6
docs(bridge-sdk): stop publishing the live acknowledgement strings, a…
iamalwaysuncomfortable Sep 22, 2026
9262490
fix(bridge-sdk): rehearse.py --recover can finish a testnet transfer
iamalwaysuncomfortable Sep 22, 2026
a887a72
fix(bridge-sdk): bridge_resume pre-checks the private nonce instead o…
iamalwaysuncomfortable Sep 22, 2026
78c6bc2
ci: assert on the aleo_bridge smoke output and pin AGENTS.md into the…
iamalwaysuncomfortable Sep 22, 2026
e27dbc0
fix(bridge-sdk): xReserve delivery baseline is net of the withdrawal …
iamalwaysuncomfortable Sep 22, 2026
dd52437
test(bridge-sdk): live harness skips the Hyperlane explorer lookup fo…
iamalwaysuncomfortable Sep 22, 2026
5130ac7
test(bridge-sdk): Aleo-origin legs complete without a message or dest…
iamalwaysuncomfortable Sep 22, 2026
afd6a32
fix(bridge-sdk): EIP-1559 tip floor, monotonic nonces, and dropped-tr…
iamalwaysuncomfortable Sep 22, 2026
7cedcea
fix(bridge-sdk): recovery log scans survive a lagging RPC head
iamalwaysuncomfortable Sep 22, 2026
7ef16f9
fix(bridge-sdk): dropped-transaction verdict is double-probed, keeps …
iamalwaysuncomfortable Sep 22, 2026
03cfe89
fix(bridge-sdk): dropped verdict precedes the history scan; resume su…
iamalwaysuncomfortable Sep 22, 2026
5a0ba1e
fix(bridge-sdk): a replaced transaction still visible as unmined coun…
iamalwaysuncomfortable Sep 22, 2026
f6a8204
test(bridge-sdk): the live harness follows a dropped-transaction verd…
iamalwaysuncomfortable Sep 22, 2026
bf8b4b1
fix(bridge-sdk): a dropped verdict re-reads the receipt and must agre…
iamalwaysuncomfortable Sep 22, 2026
a3030c1
fix(bridge-sdk): the dropped verdict's nonce cross-check tolerates a …
iamalwaysuncomfortable Sep 22, 2026
71b2d09
fix(bridge-sdk): FileCheckpointStore expands ~ in its directory
iamalwaysuncomfortable Sep 23, 2026
28442b5
docs: introduce bridge-sdk in the repo README; correct the package RE…
iamalwaysuncomfortable Sep 23, 2026
da3fe1f
feat(bridge-sdk): name routes with veil's quote selectors
iamalwaysuncomfortable Sep 23, 2026
e3c72f1
docs: repo README bridge example uses the route selector keywords
iamalwaysuncomfortable Sep 23, 2026
a31780d
docs(bridge-sdk): drop the veil brief pointer from the README
iamalwaysuncomfortable Sep 23, 2026
77a62a8
feat(bridge-sdk): Ethereum and Solana support install with the packag…
iamalwaysuncomfortable Sep 23, 2026
cc2c05d
docs(bridge-sdk): rewrite the README for the caller — supported trans…
iamalwaysuncomfortable Sep 24, 2026
406ddee
Revise bridge tutorials and simplify checkpoint loading
iamalwaysuncomfortable Sep 25, 2026
e36265a
Refine bridge documentation and align SDK versions at 0.5.1
iamalwaysuncomfortable Sep 25, 2026
af46e84
Add bridge tutorials and durable transfer journals
iamalwaysuncomfortable Sep 25, 2026
5fb8106
Rewrite SDK guide and include delegated proving dependencies by default
iamalwaysuncomfortable Sep 25, 2026
425e109
Update missing PyNaCl tests for default dependency
iamalwaysuncomfortable Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
425 changes: 358 additions & 67 deletions .agents/voice.md

Large diffs are not rendered by default.

82 changes: 76 additions & 6 deletions .github/workflows/sdk-wheels.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ on:
- 'sdk/**'
- 'sdk-abi/**'
- 'shield-swap-sdk/**'
- 'bridge-sdk/**'
- '.github/workflows/sdk-wheels.yml'
- '.github/workflows/sdk.yml'
branches:
Expand All @@ -18,6 +19,7 @@ on:
- 'sdk/**'
- 'sdk-abi/**'
- 'shield-swap-sdk/**'
- 'bridge-sdk/**'
- '.github/workflows/sdk-wheels.yml'
- '.github/workflows/sdk.yml'
workflow_dispatch:
Expand Down Expand Up @@ -271,17 +273,65 @@ jobs:
name: shield-swap-wheels-universal
path: shield-swap-sdk/dist

# aleo-bridge-sdk is pure Python (hatchling): one universal wheel + sdist.
# Tested against the built aleo-sdk wheel; installed WITH every extra for the
# suite and WITHOUT extras for the import smoke — an Aleo-only install must
# import (extras raise MissingExtraError at the point of use, never at import).
# Only the hermetic suite runs here (`-m "not live"`): no key, no live RPC.
build-bridge:
name: bridge-build
needs: [build]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: actions/download-artifact@v4
with:
name: wheels-linux-x86_64
path: sdk-dist
- name: Build wheel + sdist
run: |
pip install build
python -m build bridge-sdk --outdir bridge-sdk/dist
- name: Test against the built aleo-sdk wheel (hermetic only)
run: |
pip install sdk-dist/aleo_sdk-*.whl
pip install "$(ls bridge-sdk/dist/*.whl)[mcp]" pytest pytest-asyncio
cd bridge-sdk && python -m pytest -q -m "not live"
- name: AGENTS.md up to date
run: python bridge-sdk/codegen/gen_context.py --check
- name: Smoke test the bare wheel
run: |
cd "$RUNNER_TEMP"
python -c "import aleo_bridge, aleo_bridge.eth, aleo_bridge.sol, aleo_bridge.mcp; print('aleo-bridge-sdk', aleo_bridge.__version__)"
# Assert on the guide's content: `| head -1` alone exits 0 even when the wheel ships no
# AGENTS.md and the command prints nothing at all.
python -m aleo_bridge > agent-guide.txt
head -1 agent-guide.txt | grep -q '^# aleo-bridge'
- name: Smoke test wheel WITHOUT extras
run: |
pip uninstall -y aleo-bridge-sdk web3 eth-account solders solana mcp
pip install "$(ls bridge-sdk/dist/*.whl)"
python -c "import aleo_bridge; from aleo_bridge import Bridge, Ethereum, Solana, DEFAULT_REGISTRY; print(len(DEFAULT_REGISTRY.routes(include_unavailable=True, environment=None)), 'routes')"
- name: Upload wheel
uses: actions/upload-artifact@v4
with:
name: bridge-wheels-universal
path: bridge-sdk/dist

# Publishing uses PyPI trusted publishing (OIDC) — no token secret. Each
# package has its own job because a pending publisher must be unique per
# (repo, workflow, environment): the job's environment name must exactly
# match the publisher registered on PyPI for that project. All three gate
# on every build job, and they release strictly in dependency order:
# abi -> sdk -> shield-swap (shield-swap-sdk requires aleo-sdk on PyPI).
# match the publisher registered on PyPI for that project. All gate on
# every build job, and they release strictly in dependency order:
# abi -> sdk -> shield-swap / bridge (both require aleo-sdk on PyPI).
release-abi:
name: Release aleo-contract-abi-generator
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [build, sdist, build-abi, sdist-abi, build-shield-swap]
needs: [build, sdist, build-abi, sdist-abi, build-shield-swap, build-bridge]
environment: pypi-abi
permissions:
id-token: write
Expand All @@ -301,7 +351,7 @@ jobs:
name: Release aleo-sdk
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [build, sdist, build-abi, sdist-abi, build-shield-swap, release-abi]
needs: [build, sdist, build-abi, sdist-abi, build-shield-swap, build-bridge, release-abi]
environment: pypi
permissions:
id-token: write
Expand All @@ -321,7 +371,7 @@ jobs:
name: Release shield-swap-sdk
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [build, sdist, build-abi, sdist-abi, build-shield-swap, release-sdk]
needs: [build, sdist, build-abi, sdist-abi, build-shield-swap, build-bridge, release-sdk]
environment: pypi-shield-swap
permissions:
id-token: write
Expand All @@ -336,3 +386,23 @@ jobs:
with:
packages-dir: dist
skip-existing: true

release-bridge:
name: Release aleo-bridge-sdk
runs-on: ubuntu-latest
if: "startsWith(github.ref, 'refs/tags/')"
needs: [build, sdist, build-abi, sdist-abi, build-shield-swap, build-bridge, release-sdk]
environment: pypi-bridge
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
pattern: 'bridge-wheels-*'
merge-multiple: true
path: dist
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist
skip-existing: true
Loading
Loading