Commit Graph
209 Commits
Author SHA1 Message Date
Marvin Jones 6b1f016aee fix(lee): address PR #733 review comments
- RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID: restore the SHA256 derivation
  docstring that explains the constant instead of leaving it as an opaque
  byte array, and switch the array itself to a hex literal (hex-literal,
  already a workspace dependency) for readability.
- Rename the loader/loader_core crate to program_loader/program_loader_core
  to disambiguate it, across the directory, package name, workspace
  members/dependency alias, both dependent crates, and every call site.
2026-08-22 17:39:23 -04:00
Marvin Jones d81ea687ca refactor(lee): drop the loader guest binary, native-only Deploy
Deploy is not intended to ever run privately, and public dispatch
already always takes the native fast-path for it, so the guest ELF
had no real execution path left. Removes lez/programs/loader's guest
binary crate, its [[bin]] wiring, programs::loader(), and the
now-pointless guest-vs-native equivalence test along with the
test-only Program::execute_for_test it depended on.

loader_core (Instruction, ProgramData, execute_deploy) stays — native
dispatch still calls it directly. Deploy is now honestly just native
dispatch logic with a program-shaped interface, not a program with a
guest binary nobody executes.
2026-08-22 17:39:23 -04:00
Marvin Jones dcc0c4b950 feat(lee): add loader program with native Deploy dispatch fast-path
Introduces a new loader_program/loader_core crate pair implementing a
Deploy instruction that claims a program's ProgramData PDA account
(image_id, segment_number, update_auth, elf_segment), unifying
deployment with ordinary PublicTransaction dispatch instead of the
separate ProgramDeploymentTransaction path.

Measured against every real program in this repo, computing a
program's image_id inside the zkVM costs ~1,400-1,500 cycles per byte
of deployed bytecode, pushing real deployments to 500M-900M cycles
against the 32M public-execution cap (vs. ~27ms natively, since
ProgramDeploymentTransaction's equivalent check runs as a plain host
function today). To keep the unified dispatch path viable, Deploy is
special-cased in from_public_transaction: calls targeting the reserved
RESERVED_DEPLOYMENT_PROGRAM_ACCOUNT_ID run loader_core::execute_deploy
natively instead of through the interpreted guest executor, wrapped in
catch_unwind since the shared execute_deploy logic validates via
assert!/expect() like every other guest program, relying on that
boundary instead of the zkVM's own panic-to-Result conversion.

The loader guest binary is kept buildable and covered by a test that
runs it for real and asserts its output matches the native path
exactly, so the two can't silently drift apart.
2026-08-22 17:39:13 -04:00
7dac077487 test: add cucumber environment with initial ported integration tests (#741)
This PR introduces the initial Cucumber-based integration test framework for the LEZ, building on the testing-framework integration work started by @andrussal, adds the first set of Cucumber integration scenarios and establishes reusable infrastructure for future Cucumber scenarios.

---------

Co-authored-by: Andrus Salumets <salumets.andrus@gmail.com>
Co-authored-by: Sergio Chouhy <sergio.chouhy@gmail.com>
Co-authored-by: Sergio Chouhy <41742639+schouhy@users.noreply.github.com>
Co-authored-by: Roman <zajic@zajic.net>
Co-authored-by: Daniil Polyakov <arjentix@gmail.com>
Co-authored-by: Moudy <m.ellaz@hotmail.com>
Co-authored-by: andrussal <salumets.andrus@gmail.com>
2026-08-20 21:15:05 +02:00
moudyellaz cbdb5e7646 Merge remote-tracking branch 'origin/dev' into moudy/cross-zone-target-auth
# Conflicts:
#	test_fixtures/fixtures/prebuilt_sequencer_db.dump
2026-08-20 02:37:25 +02:00
moudyellaz 968a17f867 Merge remote-tracking branch 'origin/dev' into moudy/cross-zone-target-auth
# Conflicts:
#	Cargo.lock
#	artifacts/lez/programs/amm.bin
#	artifacts/lez/programs/associated_token_account.bin
#	artifacts/lez/programs/authenticated_transfer.bin
#	artifacts/lez/programs/bridge.bin
#	artifacts/lez/programs/bridge_lock.bin
#	artifacts/lez/programs/clock.bin
#	artifacts/lez/programs/cross_zone_inbox.bin
#	artifacts/lez/programs/cross_zone_outbox.bin
#	artifacts/lez/programs/faucet.bin
#	artifacts/lez/programs/pinata.bin
#	artifacts/lez/programs/pinata_token.bin
#	artifacts/lez/programs/ping_receiver.bin
#	artifacts/lez/programs/ping_sender.bin
#	artifacts/lez/programs/token.bin
#	artifacts/lez/programs/vault.bin
#	artifacts/lez/programs/wrapped_token.bin
#	test_fixtures/fixtures/prebuilt_sequencer_db.dump
2026-08-19 23:40:53 +02:00
Daniil Polyakov 6290f09127 fix(executor): make GetBlockRange bounded, non-over-allocating and non-blocking 2026-08-20 00:37:23 +03:00
Daniil Polyakov 7249f2f881 refactor(sequencer): actor architecture, phase 2: Storage Actor 2026-08-20 00:37:23 +03:00
Sergio Chouhy 219fd3aa3e chore: bump libp2p to 0.56 to match the bedrock dependency
The gossip code pins libp2p 0.55, whose libp2p-swarm-derive requirement
(=0.35.0) is unsatisfiable alongside the 0.56 tree pulled in by bedrock.
2026-08-13 19:36:59 -03:00
Sergio Chouhy 17b49f5a94 fix: verify l1 key in-guest 2026-08-13 18:47:50 -03:00
Sergio Chouhy 05f481ddb6 fix(lez): bump bedrock and remove hotfix for zone-sdk signing channel config bug 2026-08-13 18:47:50 -03:00
erhant a99112aa8f feat(lez): implement self-join/leave mechanism 2026-08-13 18:47:23 -03:00
erhantandClaude Fable 5 ebe4123386 Merge remote-tracking branch 'origin/dev' into erhant/sequencer-gossip
Resolves the actors-refactor (#691) collision: gossip now starts in
sequencer_service::run() after ExecutorActor construction (which exposes
its mempool handle), and the RPC-side publish hook threads through
RpcServerActor::new into the actor's Service.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 19:04:09 +03:00
Daniil Polyakov f91d0da8e1 refactor(sequencer): add test for mempool and bring back standalone feature 2026-08-12 22:50:50 +03:00
Daniil Polyakov 7541d7658b feat(sequencer): use actors in SequencerHandle 2026-08-12 22:34:14 +03:00
Daniil Polyakov 4ae9b30736 feat(sequencer): add RPC Server Actor 2026-08-12 22:34:14 +03:00
Daniil Polyakov 436908e08f feat(sequencer): add Executor actor 2026-08-12 22:34:14 +03:00
moudyellaz b1681b854f feat(cross-zone)!: let a target's peer sources be updated by a named authority
BREAKING CHANGE: WrappedTokenConfig and ReceiverConfig gain an authority field and CrossZoneConfig gains source_authority, so the config layouts change and every program image id moves.
2026-08-12 14:10:24 +02:00
erhant 9f46ea5f1c feat(sequencer): gossip tx mempool, rm announce logic just use Kademlia 2026-08-07 17:56:55 +03:00
erhant 2110381fe2 chore: fix toml formatting 2026-08-07 15:23:26 +03:00
erhant 87c6131a0e feat(sequencer): initialize gossip module 2026-08-07 12:59:24 +03:00
Sergio Chouhy 245c63d190 chore(workspace): bump bedrock rev 2026-08-06 16:41:06 -03:00
Daniil Polyakov ea36fa2e93 refactor(metrics): move metrics into a separate crates and reuse names in dashboard generation 2026-08-03 23:46:35 +03:00
Daniil Polyakov 008eb247e9 feat(tools): add dashboard generator 2026-08-03 23:46:34 +03:00
Daniil Polyakov 97071b575a feat(sequencer): add initial metrics 2026-08-03 23:46:34 +03:00
moudyellaz e752bd422c revert: compile dependencies at opt-level 3 in dev and test profiles 2026-08-02 04:20:44 +02:00
moudyellaz a410d054c5 perf(build): compile dependencies at opt-level 3 in dev and test profiles 2026-08-01 22:27:15 +02:00
Daniil Polyakov 50ac64c37d fix(bedrock): fix new bedrock image setup 2026-07-31 18:26:33 +03:00
Daniil Polyakov b9a0ebef6c feat(zone_sdk): update to a new bedrock & zone sdk 2026-07-31 18:25:56 +03:00
jonesmarvin8andDaniil Polyakov 914f14e870 refactor(keycard_wallet): replace keycard-py with keycard-rs (#595)
* refactor(keycard_wallet): replace keycard-py (pyo3) with native keycard-rs

Rewrites the Keycard integration to talk to the LEE-flavored applet
directly from Rust via keycard-rs (pinned git dependency), dropping the
pyo3 shim, python_path.rs, and the vendored keycard-py Python library
entirely. Verified end-to-end against real hardware: pairing, PIN
verification, mnemonic loading, BIP340 Schnorr signing, and transfers
between keycard and public/private accounts.

Also cleans up the pyo3 usage that had leaked into wallet's signing
path (signing.rs, account_manager.rs) beyond the keycard CLI itself,
and trims wallet_with_keycard.sh's Python setup down to just pyscard,
which is only needed by the force_unpower.py test helper now.

* Updated to v2 secure communication

* ci: install libpcsclite-dev for pcsc crate builds

* docs(keycard): clarify personalization is mandatory and document default CA

Reinstalling the applet via `./gradlew install` wipes any existing
personalization regardless of firmware source, which wasn't previously
called out and is a common source of "card not available" confusion.
Also state plainly that personalization is required before any command
works, and document keycard-rs's actual baked-in default CA public key
instead of only describing the override mechanism.

Export KEYCARD_CA_PUBLIC_KEY in all keycard test scripts so they work
against the dev/test-CA personalization flow they rely on.

* fix(keycard): address PR #595 review comments

- Propagate the load_mnemonic error instead of swallowing it behind
  is_ok(), matching every other command handler in this file.
- Add deny.toml allowing the keycard-rs git source, fixing the
  source-not-allowed failure in `cargo deny check`. Licenses and
  advisories checks still have pre-existing, separate failures not
  addressed here.
- Drop the pinned rev for the keycard-rs git dependency so it tracks
  the upstream default branch instead.

* chore(deny): trim deny.toml to essentials and allow all in-use licenses

Replace the full cargo-deny init template with just the two sections
that matter: the keycard-rs git-source allowance, and an explicit
license allow-list covering every license currently in the dependency
tree. cargo deny check now passes on sources, bans, and licenses;
advisories still fails on a pre-existing, unrelated RUSTSEC advisory.

* fix(deny): remove second config and add source to the original one

* chore: pin keycard-rs dependency and fix factory-reset debug-gate doc

* chore: regenerate test fixture and lockfile after rebase onto dev

---------

Co-authored-by: Daniil Polyakov <arjentix@gmail.com>
2026-07-23 15:50:30 -04:00
erhantandClaude Fable 5 8d09ffd733 feat(sequencer): two-tier chain state and multi-sequencer support
Decentralized-sequencing foundation: a shared chain_state crate (two-tier
head/final ChainState, apply_block, AcceptOutcome, StallReason, and the
absorbed channel-consistency machinery), turn-gated block production, the
publisher follow path for adopted/orphaned/finalized peer blocks, and
persistence that keeps disk order equal to apply order under the chain lock.

Rebased onto dev after #600/#606: chain_consistency is absorbed into
chain_state, the sequencer bootstrap's verify_and_reconstruct is re-wired
onto the two-tier ChainState (reconstruction applies channel history
through the final tier and persists via the follow-path primitives), and
test fixtures adopt the SequencerSetup builder extended with
with_bedrock_signing_key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 11:43:57 +03:00
Daniil Polyakov 2d5489c04e feat(sequencer): bootstrap state from Bedrock 2026-07-21 22:46:25 +03:00
moudyellaz eff31df9ce Merge origin/dev 2026-07-11 01:12:00 +02:00
Daniil Polyakov 89d2486970 feat(test_fixtures): apply zstd compression 2026-07-09 17:15:29 +03:00
Daniil Polyakov 7408955f08 feat!(wallet): wait for deploy tx inclusion in block
Breaking:
  1. Now a lot of wallet commands return `TransactionExecuted`, instead of `Empty`.
  2. Sequencer's `getTransaction()` RPC response changed from `tx` to `(tx, block_id)`
2026-07-09 00:32:53 +03:00
moudyellaz 71c9351727 feat(cross-zone): add interactive two-zone chat demo app 2026-07-04 00:47:20 +02:00
moudyellaz 4f75e29a3c Merge origin/main
Integrates origin/main (per-program-crate refactor) and re-homes the cross-zone messaging feature onto it.

BREAKING CHANGE: Genesis state root changes. This registers six builtin programs
(cross_zone_outbox, cross_zone_inbox, ping_sender, ping_receiver, bridge_lock,
wrapped_token) and seeds their genesis accounts (the wrapped_token authorized
minter config, the per-zone inbox config, and optional bridge-lock holdings).
Building the new cores alongside the existing builtins also enables serde/alloc
for the shared programs build, regenerating every builtin program image id. All
nodes must upgrade together.
2026-07-04 00:47:20 +02:00
agureev 8e084e22d1 Merge remote-tracking branch 'origin/dev' into artem/viewing-key-binding 2026-07-02 20:04:30 +04:00
agureev e4d55d8e37 chore: bump sponge fork, remove unstable flag 2026-06-25 15:00:57 +04:00
Daniil Polyakov d3e507f25d refactor!(artifacts): keep lee and lez artifacts separated 2026-06-24 18:10:41 +03:00
agureev 1744620692 doc: fix typo 2026-06-24 13:29:42 +04:00
moudyellaz 5d77359fd8 feat(cross-zone)!: add wrapped_token and bridge_lock programs
BREAKING CHANGE: registers the wrapped_token and bridge_lock builtin programs and seeds the wrapped_token config account at genesis, changing the genesis state.
2026-06-24 10:12:40 +02:00
agureev 0a9874afe5 feat: add a patched keccak dependency via a fork 2026-06-23 20:11:49 +04:00
erhant 735235efa1 fix(indexer)!: address @Arjentix comments on IndexerStatus 2026-06-23 15:57:33 +03:00
moudyellaz 42078d0305 test(cross-zone): add ping_receiver and a single-zone inbox dispatch test 2026-06-19 17:50:50 +02:00
moudyellaz 43ce9b5932 feat(cross-zone): add inbox and outbox core crates (envelope, replay key, dispatch builder) 2026-06-18 13:54:01 +02:00
Pravdyvy 0fae6aada2 Merge branch 'main' into Pravdyvy/programs-elfs-deployments 2026-06-17 10:36:19 +03:00
Daniil Polyakov e9e30ff019 feat(sequencer): implement bridge withdraw flow 2026-06-16 22:10:11 +03:00
jonesmarvin8 79ba5a1194 refactor(lee::signature) (#531)
* address issue 514

* Fixed clippy
2026-06-16 09:18:31 -04:00
Pravdyvy 93feaba5de Merge branch 'main' into Pravdyvy/programs-elfs-deployments 2026-06-15 14:15:33 +03:00