From d52c76e2b50b1cc8a2900d55eb429859422d5ba3 Mon Sep 17 00:00:00 2001 From: jonesmarvin8 <83104039+jonesmarvin8@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:06:42 -0400 Subject: [PATCH] refactor(lee): change `programs` shape (#720) * feat(lee): store deployed programs as Account-shaped state, keyed by AccountId Program-as-Account migration, first slice: V03State.programs becomes HashMap instead of HashMap, with the elf held directly in Account.data. The map key is derived from ProgramId via a new 1:1 From for AccountId conversion (both types are exactly 32 bytes) rather than a hash, since ProgramId is already content-derived from the elf. Account.program_owner stays ProgramId-typed everywhere - this only changes how deployed programs are stored and looked up host-side, not the dispatch/authorization model any guest program logic depends on. Dispatch resolves a ChainedCall's program_id by converting to AccountId, fetching the Account, and reconstructing a Program via new_unchecked for execution. DATA_MAX_LENGTH is raised from 100 KiB to 700 KiB to fit real program elfs (observed 375 KB-631 KB) directly in Account.data; noted in its docstring as a rough placeholder pending real transaction/block-size budget analysis. * fix(lee): store deployed programs as Account-shaped state, correct SeenShard cap Corrects lee/state_machine internals for the Program-as-Account migration and fixes SeenShard::MAX_DELIVERIES, which was still calibrated for the old 100 KiB DATA_MAX_LENGTH instead of the current 700 KiB cap. Rebuilds program artifacts and the sequencer test fixture to match. Co-Authored-By: Claude Sonnet 5 * address PR #720 review nits - Use FIXME instead of TODO for the temporary ProgramId->AccountId conversion, per review convention for patches guaranteed to be fixed later. - Derive cross_zone_inbox's MAX_DELIVERIES from DATA_MAX_LENGTH instead of a hand-recomputed literal, so it stays in sync automatically the next time the cap changes. * chore: regenerate artifacts after rebasing onto dev Binary program artifacts and the prebuilt sequencer DB dump were left as rebase-conflict placeholders; regenerated via `just build-artifacts` against the fully rebased source. --------- Co-authored-by: Claude Sonnet 5 --- .../privacy_preserving_circuit.bin | Bin 635316 -> 636096 bytes artifacts/lez/programs/amm.bin | Bin 519808 -> 519820 bytes .../lez/programs/associated_token_account.bin | Bin 433072 -> 433084 bytes .../lez/programs/authenticated_transfer.bin | Bin 387476 -> 387456 bytes artifacts/lez/programs/bridge.bin | Bin 409600 -> 409604 bytes artifacts/lez/programs/bridge_lock.bin | Bin 432492 -> 432468 bytes artifacts/lez/programs/clock.bin | Bin 390020 -> 390032 bytes artifacts/lez/programs/cross_zone_inbox.bin | Bin 460828 -> 460876 bytes artifacts/lez/programs/cross_zone_outbox.bin | Bin 414960 -> 415000 bytes artifacts/lez/programs/faucet.bin | Bin 403280 -> 403324 bytes artifacts/lez/programs/pinata.bin | Bin 375904 -> 375912 bytes artifacts/lez/programs/pinata_token.bin | Bin 382892 -> 382904 bytes artifacts/lez/programs/ping_receiver.bin | Bin 436544 -> 436520 bytes artifacts/lez/programs/ping_sender.bin | Bin 411548 -> 411556 bytes artifacts/lez/programs/sequencer_stake.bin | Bin 521736 -> 521756 bytes artifacts/lez/programs/token.bin | Bin 463176 -> 463184 bytes artifacts/lez/programs/vault.bin | Bin 395416 -> 395428 bytes artifacts/lez/programs/wrapped_token.bin | Bin 436160 -> 436156 bytes lee/state_machine/core/src/account/data.rs | 4 +- lee/state_machine/core/src/program/mod.rs | 13 ++++ lee/state_machine/src/state/mod.rs | 38 ++++++----- lee/state_machine/src/state/tests/genesis.rs | 7 +- lee/state_machine/src/state/tests/mod.rs | 60 +++++++++--------- .../src/validated_state_diff/mod.rs | 16 ++++- lez/programs/cross_zone_inbox/core/src/lib.rs | 21 ++++-- .../fixtures/prebuilt_sequencer_db.dump | Bin 761394 -> 758477 bytes 26 files changed, 102 insertions(+), 57 deletions(-) diff --git a/artifacts/lee/privacy_preserving_circuit/privacy_preserving_circuit.bin b/artifacts/lee/privacy_preserving_circuit/privacy_preserving_circuit.bin index 97567415d18f6a45044f1226fa7280a4b85499df..97e556711ba1c8ed85c0396e82adf1a3db40fe4f 100644 GIT binary patch delta 144861 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